1'use strict'; 2 3var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 4 5var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 6 7function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 8 9!function ($) { 10 11 "use strict"; 12 13 var FOUNDATION_VERSION = '6.3.1'; 14 15 // Global Foundation object 16 // This is attached to the window, or used as a module for AMD/Browserify 17 var Foundation = { 18 version: FOUNDATION_VERSION, 19 20 /** 21 * Stores initialized plugins. 22 */ 23 _plugins: {}, 24 25 /** 26 * Stores generated unique ids for plugin instances 27 */ 28 _uuids: [], 29 30 /** 31 * Returns a boolean for RTL support 32 */ 33 rtl: function rtl() { 34 return $('html').attr('dir') === 'rtl'; 35 }, 36 /** 37 * Defines a Foundation plugin, adding it to the `Foundation` namespace and the list of plugins to initialize when reflowing. 38 * @param {Object} plugin - The constructor of the plugin. 39 */ 40 plugin: function plugin(_plugin, name) { 41 // Object key to use when adding to global Foundation object 42 // Examples: Foundation.Reveal, Foundation.OffCanvas 43 var className = name || functionName(_plugin); 44 // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin 45 // Examples: data-reveal, data-off-canvas 46 var attrName = hyphenate(className); 47 48 // Add to the Foundation object and the plugins list (for reflowing) 49 this._plugins[attrName] = this[className] = _plugin; 50 }, 51 /** 52 * @function 53 * Populates the _uuids array with pointers to each individual plugin instance. 54 * Adds the `zfPlugin` data-attribute to programmatically created plugins to allow use of $(selector).foundation(method) calls. 55 * Also fires the initialization event for each plugin, consolidating repetitive code. 56 * @param {Object} plugin - an instance of a plugin, usually `this` in context. 57 * @param {String} name - the name of the plugin, passed as a camelCased string. 58 * @fires Plugin#init 59 */ 60 registerPlugin: function registerPlugin(plugin, name) { 61 var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase(); 62 plugin.uuid = this.GetYoDigits(6, pluginName); 63 64 if (!plugin.$element.attr('data-' + pluginName)) { 65 plugin.$element.attr('data-' + pluginName, plugin.uuid); 66 } 67 if (!plugin.$element.data('zfPlugin')) { 68 plugin.$element.data('zfPlugin', plugin); 69 } 70 /** 71 * Fires when the plugin has initialized. 72 * @event Plugin#init 73 */ 74 plugin.$element.trigger('init.zf.' + pluginName); 75 76 this._uuids.push(plugin.uuid); 77 78 return; 79 }, 80 /** 81 * @function 82 * Removes the plugins uuid from the _uuids array. 83 * Removes the zfPlugin data attribute, as well as the data-plugin-name attribute. 84 * Also fires the destroyed event for the plugin, consolidating repetitive code. 85 * @param {Object} plugin - an instance of a plugin, usually `this` in context. 86 * @fires Plugin#destroyed 87 */ 88 unregisterPlugin: function unregisterPlugin(plugin) { 89 var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor)); 90 91 this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1); 92 plugin.$element.removeAttr('data-' + pluginName).removeData('zfPlugin') 93 /** 94 * Fires when the plugin has been destroyed. 95 * @event Plugin#destroyed 96 */ 97 .trigger('destroyed.zf.' + pluginName); 98 for (var prop in plugin) { 99 plugin[prop] = null; //clean up script to prep for garbage collection. 100 } 101 return; 102 }, 103 104 /** 105 * @function 106 * Causes one or more active plugins to re-initialize, resetting event listeners, recalculating positions, etc. 107 * @param {String} plugins - optional string of an individual plugin key, attained by calling `$(element).data('pluginName')`, or string of a plugin class i.e. `'dropdown'` 108 * @default If no argument is passed, reflow all currently active plugins. 109 */ 110 reInit: function reInit(plugins) { 111 var isJQ = plugins instanceof $;
112 try { 113 if (isJQ) { 114 plugins.each(function () { 115 $(this).data('zfPlugin')._init(); 116 }); 117 } else { 118 var type = typeof plugins === 'undefined' ? 'undefined' : _typeof(plugins), 119 _this = this, 120 fns = { 121 'object': function object(plgs) { 122 plgs.forEach(function (p) { 123 p = hyphenate(p); 124 $('[data-' + p + ']').foundation('_init'); 125 }); 126 }, 127 'string': function string() { 128 plugins = hyphenate(plugins); 129 $('[data-' + plugins + ']').foundation('_init'); 130 }, 131 'undefined': function undefined() { 132 this['object'](Object.keys(_this._plugins)); 133 } 134 }; 135 fns[type](plugins); 136 } 137 } catch (err) { 138 console.error(err); 139 } finally { 140 return plugins; 141 } 142 }, 143 144 /** 145 * returns a random base-36 uid with namespacing 146 * @function 147 * @param {Number} length - number of random base-36 digits desired. Increase for more random strings. 148 * @param {String} namespace - name of plugin to be incorporated in uid, optional. 149 * @default {String} '' - if no plugin name is provided, nothing is appended to the uid. 150 * @returns {String} - unique id 151 */ 152 GetYoDigits: function GetYoDigits(length, namespace) { 153 length = length || 6; 154 return Math.round(Math.pow(36, length + 1) - Math.random() * Math.pow(36, length)).toString(36).slice(1) + (namespace ? '-' + namespace : ''); 155 }, 156 /** 157 * Initialize plugins on any elements within `elem` (and `elem` itself) that aren't already initialized. 158 * @param {Object} elem - jQuery object containing the element to check inside. Also checks the element itself, unless it's the `document` object. 159 * @param {String|Array} plugins - A list of plugins to initialize. Leave this out to initialize everything. 160 */ 161 reflow: function reflow(elem, plugins) { 162 163 // If plugins is undefined, just grab everything 164 if (typeof plugins === 'undefined') { 165 plugins = Object.keys(this._plugins); 166 } 167 // If plugins is a string, convert it to an array with one item 168 else if (typeof plugins === 'string') { 169 plugins = [plugins]; 170 } 171 172 var _this = this; 173 174 // Iterate through each plugin 175 $.each(plugins, function (i, name) { 176 // Get the current plugin 177 var plugin = _this._plugins[name]; 178 179 // Localize the search to all elements inside elem, as well as elem itself, unless elem === document 180 var $elem = $(elem).find('[data-' + name + ']').addBack('[data-' + name + ']'); 181 182 // For each plugin found, initialize it 183 $elem.each(function () { 184 var $el = $(this), 185 opts = {}; 186 // Don't double-dip on plugins 187 if ($el.data('zfPlugin')) { 188 console.warn("Tried to initialize " + name + " on an element that already has a Foundation plugin."); 189 return; 190 } 191 192 if ($el.attr('data-options')) { 193 var thing = $el.attr('data-options').split(';').forEach(function (e, i) { 194 var opt = e.split(':').map(function (el) { 195 return el.trim(); 196 }); 197 if (opt[0]) opts[opt[0]] = parseValue(opt[1]); 198 }); 199 } 200 try { 201 $el.data('zfPlugin', new plugin($(this), opts)); 202 } catch (er) { 203 console.error(er); 204 } finally { 205 return; 206 } 207 }); 208 }); 209 }, 210 getFnName: functionName, 211 transitionend: function transitionend($elem) { 212 var transitions = { 213 'transition': 'transitionend', 214 'WebkitTransition': 'webkitTransitionEnd', 215 'MozTransition': 'transitionend', 216 'OTransition': 'otransitionend' 217 }; 218 var elem = document.createElement('div'), 219 end; 220 221 for (var t in transitions) { 222 if (typeof elem.style[t] !== 'undefined') { 223 end = transitions[t]; 224 } 225 } 226 if (end) { 227 return end; 228 } else { 229 end = setTimeout(function () { 230 $elem.triggerHandler('transitionend', [$elem]); 231 }, 1); 232 return 'transitionend'; 233 } 234 } 235 }; 236 237 Foundation.util = { 238 /** 239 * Function for applying a debounce effect to a function call. 240 * @function 241 * @param {Function} func - Function to be called at end of timeout. 242 * @param {Number} delay - Time in ms to delay the call of `func`. 243 * @returns function 244 */ 245 throttle: function throttle(func, delay) { 246 var timer = null; 247 248 return function () { 249 var context = this, 250 args = arguments; 251 252 if (timer === null) { 253 timer = setTimeout(function () {
254 func.apply(context, args); 255 timer = null; 256 }, delay); 257 } 258 }; 259 } 260 }; 261 262 // TODO: consider not making this a jQuery function 263 // TODO: need way to reflow vs. re-initialize 264 /** 265 * The Foundation jQuery method. 266 * @param {String|Array} method - An action to perform on the current jQuery object. 267 */ 268 var foundation = function foundation(method) { 269 var type = typeof method === 'undefined' ? 'undefined' : _typeof(method), 270 $meta = $('meta.foundation-mq'), 271 $noJS = $('.no-js'); 272 273 if (!$meta.length) { 274 $('<meta class="foundation-mq">').appendTo(document.head); 275 } 276 if ($noJS.length) { 277 $noJS.removeClass('no-js'); 278 } 279 280 if (type === 'undefined') { 281 //needs to initialize the Foundation object, or an individual plugin. 282 Foundation.MediaQuery._init(); 283 Foundation.reflow(this); 284 } else if (type === 'string') { 285 //an individual method to invoke on a plugin or group of plugins 286 var args = Array.prototype.slice.call(arguments, 1); //collect all the arguments, if necessary 287 var plugClass = this.data('zfPlugin'); //determine the class of plugin 288 289 if (plugClass !== undefined && plugClass[method] !== undefined) { 290 //make sure both the class and method exist 291 if (this.length === 1) { 292 //if there's only one, call it directly. 293 plugClass[method].apply(plugClass, args); 294 } else { 295 this.each(function (i, el) { 296 //otherwise loop through the jQuery collection and invoke the method on each 297 plugClass[method].apply($(el).data('zfPlugin'), args); 298 }); 299 } 300 } else { 301 //error for no class or no method 302 throw new ReferenceError("We're sorry, '" + method + "' is not an available method for " + (plugClass ? functionName(plugClass) : 'this element') + '.'); 303 } 304 } else { 305 //error for invalid argument type 306 throw new TypeError('We\'re sorry, ' + type + ' is not a valid parameter. You must use a string representing the method you wish to invoke.'); 307 } 308 return this; 309 }; 310 311 window.Foundation = Foundation; 312 $.fn.foundation = foundation; 313 314 // Polyfill for requestAnimationFrame 315 (function () { 316 if (!Date.now || !window.Date.now) window.Date.now = Date.now = function () { 317 return new Date().getTime(); 318 }; 319 320 var vendors = ['webkit', 'moz']; 321 for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) { 322 var vp = vendors[i]; 323 window.requestAnimationFrame = window[vp + 'RequestAnimationFrame']; 324 window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame']; 325 } 326 if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) { 327 var lastTime = 0; 328 window.requestAnimationFrame = function (callback) { 329 var now = Date.now(); 330 var nextTime = Math.max(lastTime + 16, now); 331 return setTimeout(function () { 332 callback(lastTime = nextTime); 333 }, nextTime - now); 334 }; 335 window.cancelAnimationFrame = clearTimeout; 336 } 337 /** 338 * Polyfill for performance.now, required by rAF 339 */ 340 if (!window.performance || !window.performance.now) { 341 window.performance = { 342 start: Date.now(), 343 now: function now() { 344 return Date.now() - this.start; 345 } 346 }; 347 } 348 })(); 349 if (!Function.prototype.bind) { 350 Function.prototype.bind = function (oThis) { 351 if (typeof this !== 'function') { 352 // closest thing possible to the ECMAScript 5 353 // internal IsCallable function 354 throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); 355 } 356 357 var aArgs = Array.prototype.slice.call(arguments, 1), 358 fToBind = this, 359 fNOP = function fNOP() {}, 360 fBound = function fBound() { 361 return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); 362 }; 363 364 if (this.prototype) { 365 // native functions don't have a prototype 366 fNOP.prototype = this.prototype; 367 } 368 fBound.prototype = new fNOP(); 369 370 return fBound; 371 }; 372 } 373 // Polyfill to get the name of a function in IE9 374 function functionName(fn) { 375 if (Function.prototype.name === undefined) { 376 var funcNameRegex = /function\s([^(]{1,})\(/; 377 var results = funcNameRegex.exec(fn.toString()); 378 return results && results.length > 1 ? results[1].trim() : ""; 379 } else if (fn.prototype === undefined) { 380 return fn.constructor.name; 381 } else { 382 return fn.prototype.constructor.name; 383 } 384 } 385 function parseValue(str) { 386 if ('true' === str) return true;else if ('false' === str) return false;else if (!isNaN(str * 1)) return parseFloat(str); 387 return str; 388 } 389 // Convert PascalCase to kebab-case 390 // Thank you: http://stackoverflow.com/a/8955580 391 function hyphenate(str) { 392 return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); 393 } 394}(jQuery); 395 396'use strict'; 397 398!function ($) { 399 400 Foundation.Box = { 401 ImNotTouchingYou: ImNotTouchingYou, 402 GetDimensions: GetDimensions, 403 GetOffsets: GetOffsets 404 405 /** 406 * Compares the dimensions of an element to a container and determines collision events with container. 407 * @function 408 * @param {jQuery} element - jQuery object to test for collisions. 409 * @param {jQuery}
409 parent - jQuery object to use as bounding container. 410 * @param {Boolean} lrOnly - set to true to check left and right values only. 411 * @param {Boolean} tbOnly - set to true to check top and bottom values only. 412 * @default if no parent object passed, detects collisions with `window`. 413 * @returns {Boolean} - true if collision free, false if a collision in any direction. 414 */ 415 };function ImNotTouchingYou(element, parent, lrOnly, tbOnly) { 416 var eleDims = GetDimensions(element), 417 top, 418 bottom, 419 left, 420 right; 421 422 if (parent) { 423 var parDims = GetDimensions(parent); 424 425 bottom = eleDims.offset.top + eleDims.height <= parDims.height + parDims.offset.top; 426 top = eleDims.offset.top >= parDims.offset.top; 427 left = eleDims.offset.left >= parDims.offset.left; 428 right = eleDims.offset.left + eleDims.width <= parDims.width + parDims.offset.left; 429 } else { 430 bottom = eleDims.offset.top + eleDims.height <= eleDims.windowDims.height + eleDims.windowDims.offset.top; 431 top = eleDims.offset.top >= eleDims.windowDims.offset.top; 432 left = eleDims.offset.left >= eleDims.windowDims.offset.left; 433 right = eleDims.offset.left + eleDims.width <= eleDims.windowDims.width; 434 } 435 436 var allDirs = [bottom, top, left, right]; 437 438 if (lrOnly) { 439 return left === right === true; 440 } 441 442 if (tbOnly) { 443 return top === bottom === true; 444 } 445 446 return allDirs.indexOf(false) === -1; 447 }; 448 449 /** 450 * Uses native methods to return an object of dimension values. 451 * @function 452 * @param {jQuery || HTML} element - jQuery object or DOM element for which to get the dimensions. Can be any element other that document or window. 453 * @returns {Object} - nested object of integer pixel values 454 * TODO - if element is window, return only those values. 455 */ 456 function GetDimensions(elem, test) { 457 elem = elem.length ? elem[0] : elem; 458 459 if (elem === window || elem === document) { 460 throw new Error("I'm sorry, Dave. I'm afraid I can't do that."); 461 } 462 463 var rect = elem.getBoundingClientRect(), 464 parRect = elem.parentNode.getBoundingClientRect(), 465 winRect = document.body.getBoundingClientRect(), 466 winY = window.pageYOffset, 467 winX = window.pageXOffset; 468 469 return { 470 width: rect.width, 471 height: rect.height, 472 offset: { 473 top: rect.top + winY, 474 left: rect.left + winX 475 }, 476 parentDims: { 477 width: parRect.width, 478 height: parRect.height, 479 offset: { 480 top: parRect.top + winY, 481 left: parRect.left + winX 482 } 483 }, 484 windowDims: { 485 width: winRect.width, 486 height: winRect.height, 487 offset: { 488 top: winY, 489 left: winX 490 } 491 } 492 }; 493 } 494 495 /** 496 * Returns an object of top and left integer pixel values for dynamically rendered elements, 497 * such as: Tooltip, Reveal, and Dropdown 498 * @function 499 * @param {jQuery} element - jQuery object for the element being positioned. 500 * @param {jQuery} anchor - jQuery object for the element's anchor point. 501 * @param {String} position - a string relating to the desired position of the element, relative to it's anchor 502 * @param {Number} vOffset - integer pixel value of desired vertical separation between anchor and element. 503 * @param {Number} hOffset - integer pixel value of desired horizontal separation between anchor and element. 504 * @param {Boolean} isOverflow - if a collision event is detected, sets to true to default the element to full width - any desired offset. 505 * TODO alter/rewrite to work with `em` values as well/instead of pixels 506 */ 507 function GetOffsets(element, anchor, position, vOffset, hOffset, isOverflow) { 508 var $eleDims = GetDimensions(element), 509 $anchorDims = anchor ? GetDimensions(anchor) : null; 510 511 switch (position) { 512 case 'top': 513 return { 514 left: Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left,
515 top: $anchorDims.offset.top - ($eleDims.height + vOffset) 516 }; 517 break; 518 case 'left': 519 return { 520 left: $anchorDims.offset.left - ($eleDims.width + hOffset), 521 top: $anchorDims.offset.top 522 }; 523 break; 524 case 'right': 525 return { 526 left: $anchorDims.offset.left + $anchorDims.width + hOffset, 527 top: $anchorDims.offset.top 528 }; 529 break; 530 case 'center top': 531 return { 532 left: $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2, 533 top: $anchorDims.offset.top - ($eleDims.height + vOffset) 534 }; 535 break; 536 case 'center bottom': 537 return { 538 left: isOverflow ? hOffset : $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2, 539 top: $anchorDims.offset.top + $anchorDims.height + vOffset 540 }; 541 break; 542 case 'center left': 543 return { 544 left: $anchorDims.offset.left - ($eleDims.width + hOffset), 545 top: $anchorDims.offset.top + $anchorDims.height / 2 - $eleDims.height / 2 546 }; 547 break; 548 case 'center right': 549 return { 550 left: $anchorDims.offset.left + $anchorDims.width + hOffset + 1, 551 top: $anchorDims.offset.top + $anchorDims.height / 2 - $eleDims.height / 2 552 }; 553 break; 554 case 'center': 555 return { 556 left: $eleDims.windowDims.offset.left + $eleDims.windowDims.width / 2 - $eleDims.width / 2, 557 top: $eleDims.windowDims.offset.top + $eleDims.windowDims.height / 2 - $eleDims.height / 2 558 }; 559 break; 560 case 'reveal': 561 return { 562 left: ($eleDims.windowDims.width - $eleDims.width) / 2, 563 top: $eleDims.windowDims.offset.top + vOffset 564 }; 565 case 'reveal full': 566 return { 567 left: $eleDims.windowDims.offset.left, 568 top: $eleDims.windowDims.offset.top 569 }; 570 break; 571 case 'left bottom': 572 return { 573 left: $anchorDims.offset.left, 574 top: $anchorDims.offset.top + $anchorDims.height + vOffset 575 }; 576 break; 577 case 'right bottom': 578 return { 579 left: $anchorDims.offset.left + $anchorDims.width + hOffset - $eleDims.width, 580 top: $anchorDims.offset.top + $anchorDims.height + vOffset 581 }; 582 break; 583 default: 584 return { 585 left: Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left + hOffset, 586 top: $anchorDims.offset.top + $anchorDims.height + vOffset 587 }; 588 } 589 } 590}(jQuery); 591 592/******************************************* 593 * * 594 * This util was created by Marius Olbertz * 595 * Please thank Marius on GitHub /owlbertz * 596 * or the web http://www.mariusolbertz.de/ * 597 * * 598 ******************************************/ 599 600'use strict'; 601 602!function ($) { 603 604 var keyCodes = { 605 9: 'TAB', 606 13: 'ENTER', 607 27: 'ESCAPE', 608 32: 'SPACE', 609 37: 'ARROW_LEFT', 610 38: 'ARROW_UP', 611 39: 'ARROW_RIGHT', 612 40: 'ARROW_DOWN' 613 }; 614 615 var commands = {}; 616 617 var Keyboard = { 618 keys: getKeyCodes(keyCodes), 619 620 /** 621 * Parses the (keyboard) event and returns a String that represents its key 622 * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE 623 * @param {Event} event - the event generated by the event handler 624 * @return String key - String that represents the key pressed 625 */ 626 parseKey: function parseKey(event) { 627 var key = keyCodes[event.which || event.keyCode] || String.fromCharCode(event.which).toUpperCase(); 628 629 // Remove un-printable characters, e.g. for `fromCharCode` calls for CTRL only events 630 key = key.replace(/\W+/, ''); 631 632 if (event.shiftKey) key = 'SHIFT_' + key; 633 if (event.ctrlKey) key = 'CTRL_' + key; 634 if (event.altKey) key = 'ALT_' + key; 635 636 // Remove trailing underscore, in case only modifiers were used (e.g. only `CTRL_ALT`) 637 key = key.replace(/_$/, ''); 638 639 return key; 640 }, 641 642 643 /** 644 * Handles the given (keyboard) event 645 * @param {Event} event - the event generated by the event handler 646 * @param {String} component - Foundation component's name, e.g. Slider or Reveal 647 * @param {Objects} functions - collection of functions that are to be executed 648 */ 649 handleKey: function handleKey(event, component, functions) { 650 var commandList = commands[component], 651 keyCode = this.parseKey(event), 652 cmds, 653 command, 654 fn; 655 656 if (!commandList) return console.warn('Component not defined!'); 657 658 if (typeof commandList.ltr === 'undefined') { 659 // this component does not differentiate between ltr and rtl 660 cmds = commandList; // use plain list 661 } else {
662 // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa 663 if (Foundation.rtl()) cmds = $.extend({}, commandList.ltr, commandList.rtl);else cmds = $.extend({}, commandList.rtl, commandList.ltr); 664 } 665 command = cmds[keyCode]; 666 667 fn = functions[command]; 668 if (fn && typeof fn === 'function') { 669 // execute function if exists 670 var returnValue = fn.apply(); 671 if (functions.handled || typeof functions.handled === 'function') { 672 // execute function when event was handled 673 functions.handled(returnValue); 674 } 675 } else { 676 if (functions.unhandled || typeof functions.unhandled === 'function') { 677 // execute function when event was not handled 678 functions.unhandled(); 679 } 680 } 681 }, 682 683 684 /** 685 * Finds all focusable elements within the given `$element` 686 * @param {jQuery} $element - jQuery object to search within 687 * @return {jQuery} $focusable - all focusable elements within `$element` 688 */ 689 findFocusable: function findFocusable($element) { 690 if (!$element) { 691 return false; 692 } 693 return $element.find('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]').filter(function () { 694 if (!$(this).is(':visible') || $(this).attr('tabindex') < 0) { 695 return false; 696 } //only have visible elements and those that have a tabindex greater or equal 0 697 return true; 698 }); 699 }, 700 701 702 /** 703 * Returns the component name name 704 * @param {Object} component - Foundation component, e.g. Slider or Reveal 705 * @return String componentName 706 */ 707 708 register: function register(componentName, cmds) { 709 commands[componentName] = cmds; 710 }, 711 712 713 /** 714 * Traps the focus in the given element. 715 * @param {jQuery} $element jQuery object to trap the foucs into. 716 */ 717 trapFocus: function trapFocus($element) { 718 var $focusable = Foundation.Keyboard.findFocusable($element), 719 $firstFocusable = $focusable.eq(0), 720 $lastFocusable = $focusable.eq(-1); 721 722 $element.on('keydown.zf.trapfocus', function (event) { 723 if (event.target === $lastFocusable[0] && Foundation.Keyboard.parseKey(event) === 'TAB') { 724 event.preventDefault(); 725 $firstFocusable.focus(); 726 } else if (event.target === $firstFocusable[0] && Foundation.Keyboard.parseKey(event) === 'SHIFT_TAB') { 727 event.preventDefault(); 728 $lastFocusable.focus(); 729 } 730 }); 731 }, 732 733 /** 734 * Releases the trapped focus from the given element. 735 * @param {jQuery} $element jQuery object to release the focus for. 736 */ 737 releaseFocus: function releaseFocus($element) { 738 $element.off('keydown.zf.trapfocus'); 739 } 740 }; 741 742 /* 743 * Constants for easier comparing. 744 * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE 745 */ 746 function getKeyCodes(kcs) { 747 var k = {}; 748 for (var kc in kcs) { 749 k[kcs[kc]] = kcs[kc]; 750 }return k; 751 } 752 753 Foundation.Keyboard = Keyboard; 754}(jQuery); 755 756'use strict'; 757 758!function ($) { 759 760 // Default set of media queries 761 var defaultQueries = { 762 'default': 'only screen', 763 landscape: 'only screen and (orientation: landscape)', 764 portrait: 'only screen and (orientation: portrait)', 765 retina: 'only screen and (-webkit-min-device-pixel-ratio: 2),' + 'only screen and (min--moz-device-pixel-ratio: 2),' + 'only screen and (-o-min-device-pixel-ratio: 2/1),' + 'only screen and (min-device-pixel-ratio: 2),' + 'only screen and (min-resolution: 192dpi),' + 'only screen and (min-resolution: 2dppx)' 766 }; 767 768 var MediaQuery = { 769 queries: [], 770 771 current: '', 772 773 /** 774 * Initializes the media query helper, by extracting the breakpoint list from the CSS and activating the breakpoint watcher. 775 * @function 776 * @private 777 */ 778 _init: function _init() { 779 var self = this; 780 var extractedStyles = $('.foundation-mq').css('font-family'); 781 var namedQueries; 782 783 namedQueries = parseStyleToObject(extractedStyles); 784
785 for (var key in namedQueries) { 786 if (namedQueries.hasOwnProperty(key)) { 787 self.queries.push({ 788 name: key, 789 value: 'only screen and (min-width: ' + namedQueries[key] + ')' 790 }); 791 } 792 } 793 794 this.current = this._getCurrentSize(); 795 796 this._watcher(); 797 }, 798 799 800 /** 801 * Checks if the screen is at least as wide as a breakpoint. 802 * @function 803 * @param {String} size - Name of the breakpoint to check. 804 * @returns {Boolean} `true` if the breakpoint matches, `false` if it's smaller. 805 */ 806 atLeast: function atLeast(size) { 807 var query = this.get(size); 808 809 if (query) { 810 return window.matchMedia(query).matches; 811 } 812 813 return false; 814 }, 815 816 817 /** 818 * Checks if the screen matches to a breakpoint. 819 * @function 820 * @param {String} size - Name of the breakpoint to check, either 'small only' or 'small'. Omitting 'only' falls back to using atLeast() method. 821 * @returns {Boolean} `true` if the breakpoint matches, `false` if it does not. 822 */ 823 is: function is(size) { 824 size = size.trim().split(' '); 825 if (size.length > 1 && size[1] === 'only') { 826 if (size[0] === this._getCurrentSize()) return true; 827 } else { 828 return this.atLeast(size[0]); 829 } 830 return false; 831 }, 832 833 834 /** 835 * Gets the media query of a breakpoint. 836 * @function 837 * @param {String} size - Name of the breakpoint to get. 838 * @returns {String|null} - The media query of the breakpoint, or `null` if the breakpoint doesn't exist. 839 */ 840 get: function get(size) { 841 for (var i in this.queries) { 842 if (this.queries.hasOwnProperty(i)) { 843 var query = this.queries[i]; 844 if (size === query.name) return query.value; 845 } 846 } 847 848 return null; 849 }, 850 851 852 /** 853 * Gets the current breakpoint name by testing every breakpoint and returning the last one to match (the biggest one). 854 * @function 855 * @private 856 * @returns {String} Name of the current breakpoint. 857 */ 858 _getCurrentSize: function _getCurrentSize() { 859 var matched; 860 861 for (var i = 0; i < this.queries.length; i++) { 862 var query = this.queries[i]; 863 864 if (window.matchMedia(query.value).matches) { 865 matched = query; 866 } 867 } 868 869 if ((typeof matched === 'undefined' ? 'undefined' : _typeof(matched)) === 'object') { 870 return matched.name; 871 } else { 872 return matched; 873 } 874 }, 875 876 877 /** 878 * Activates the breakpoint watcher, which fires an event on the window whenever the breakpoint changes. 879 * @function 880 * @private 881 */ 882 _watcher: function _watcher() { 883 var _this2 = this; 884 885 $(window).on('resize.zf.mediaquery', function () { 886 var newSize = _this2._getCurrentSize(), 887 currentSize = _this2.current; 888 889 if (newSize !== currentSize) { 890 // Change the current media query 891 _this2.current = newSize; 892 893 // Broadcast the media query change on the window 894 $(window).trigger('changed.zf.mediaquery', [newSize, currentSize]); 895 } 896 }); 897 } 898 }; 899 900 Foundation.MediaQuery = MediaQuery; 901 902 // matchMedia() polyfill - Test a CSS media type/query in JS. 903 // Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license 904 window.matchMedia || (window.matchMedia = function () { 905 'use strict'; 906 907 // For browsers that support matchMedium api such as IE 9 and webkit 908 909 var styleMedia = window.styleMedia || window.media; 910 911 // For those that don't support matchMedium 912 if (!styleMedia) { 913 var style = document.createElement('style'), 914 script = document.getElementsByTagName('script')[0], 915 info = null; 916 917 style.type = 'text/css'; 918 style.id = 'matchmediajs-test'; 919 920 script && script.parentNode && script.parentNode.insertBefore(style, script); 921 922 // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers 923 info = 'getComputedStyle' in window && window.getComputedStyle(style, null) || style.currentStyle; 924 925 styleMedia = { 926 matchMedium: function matchMedium(media) { 927 var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; 928 929 // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers 930 if (style.styleSheet) { 931 style.styleSheet.cssText = text; 932 } else { 933 style.textContent = text; 934 } 935 936 // Test if media query is true or false 937 return info.width === '1px'; 938 } 939 }; 940 } 941 942 return function (media) { 943 return { 944 matches: styleMedia.matchMedium(media || 'all'), 945 media: media || 'all' 946 }; 947 }; 948 }()); 949 950 // Thank you: https://github.com/sindresorhus/query-string 951 function parseStyleToObject(str) { 952 var styleObject = {}; 953 954 if (typeof str !== 'string') { 955 return styleObject; 956 } 957 958 str = str.trim().slice(1, -1);
958 // browsers re-quote string style values 959 960 if (!str) { 961 return styleObject; 962 } 963 964 styleObject = str.split('&').reduce(function (ret, param) { 965 var parts = param.replace(/\+/g, ' ').split('='); 966 var key = parts[0]; 967 var val = parts[1]; 968 key = decodeURIComponent(key); 969 970 // missing `=` should be `null`: 971 // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters 972 val = val === undefined ? null : decodeURIComponent(val); 973 974 if (!ret.hasOwnProperty(key)) { 975 ret[key] = val; 976 } else if (Array.isArray(ret[key])) { 977 ret[key].push(val); 978 } else { 979 ret[key] = [ret[key], val]; 980 } 981 return ret; 982 }, {}); 983 984 return styleObject; 985 } 986 987 Foundation.MediaQuery = MediaQuery; 988}(jQuery); 989 990'use strict'; 991 992!function ($) { 993 994 /** 995 * Motion module. 996 * @module foundation.motion 997 */ 998 999 var initClasses = ['mui-enter', 'mui-leave']; 1000 var activeClasses = ['mui-enter-active', 'mui-leave-active']; 1001 1002 var Motion = { 1003 animateIn: function animateIn(element, animation, cb) { 1004 animate(true, element, animation, cb); 1005 }, 1006 1007 animateOut: function animateOut(element, animation, cb) { 1008 animate(false, element, animation, cb); 1009 } 1010 }; 1011 1012 function Move(duration, elem, fn) { 1013 var anim, 1014 prog, 1015 start = null; 1016 // console.log('called'); 1017 1018 if (duration === 0) { 1019 fn.apply(elem); 1020 elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]); 1021 return; 1022 } 1023 1024 function move(ts) { 1025 if (!start) start = ts; 1026 // console.log(start, ts); 1027 prog = ts - start; 1028 fn.apply(elem); 1029 1030 if (prog < duration) { 1031 anim = window.requestAnimationFrame(move, elem); 1032 } else { 1033 window.cancelAnimationFrame(anim); 1034 elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]); 1035 } 1036 } 1037 anim = window.requestAnimationFrame(move); 1038 } 1039 1040 /** 1041 * Animates an element in or out using a CSS transition class. 1042 * @function 1043 * @private 1044 * @param {Boolean} isIn - Defines if the animation is in or out. 1045 * @param {Object} element - jQuery or HTML object to animate. 1046 * @param {String} animation - CSS class to use. 1047 * @param {Function} cb - Callback to run when animation is finished. 1048 */ 1049 function animate(isIn, element, animation, cb) { 1050 element = $(element).eq(0); 1051 1052 if (!element.length) return; 1053 1054 var initClass = isIn ? initClasses[0] : initClasses[1]; 1055 var activeClass = isIn ? activeClasses[0] : activeClasses[1]; 1056 1057 // Set up the animation 1058 reset(); 1059 1060 element.addClass(animation).css('transition', 'none'); 1061 1062 requestAnimationFrame(function () { 1063 element.addClass(initClass); 1064 if (isIn) element.show(); 1065 }); 1066 1067 // Start the animation 1068 requestAnimationFrame(function () { 1069 element[0].offsetWidth; 1070 element.css('transition', '').addClass(activeClass); 1071 }); 1072 1073 // Clean up the animation when it finishes 1074 element.one(Foundation.transitionend(element), finish); 1075 1076 // Hides the element (for out animations), resets the element, and runs a callback 1077 function finish() { 1078 if (!isIn) element.hide(); 1079 reset(); 1080 if (cb) cb.apply(element); 1081 } 1082 1083 // Resets transitions and removes motion-specific classes 1084 function reset() { 1085 element[0].style.transitionDuration = 0; 1086 element.removeClass(initClass + ' ' + activeClass + ' ' + animation); 1087 } 1088 } 1089 1090 Foundation.Move = Move; 1091 Foundation.Motion = Motion; 1092}(jQuery); 1093 1094'use strict'; 1095 1096!function ($) { 1097 1098 var Nest = { 1099 Feather: function Feather(menu) { 1100 var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'zf'; 1101 1102 menu.attr('role', 'menubar'); 1103 1104 var items = menu.find('li').attr({ 'role': 'menuitem' }), 1105 subMenuClass = 'is-' + type + '-submenu', 1106 subItemClass = subMenuClass + '-item', 1107 hasSubClass = 'is-' + type + '-submenu-parent'; 1108 1109 items.each(function () { 1110 var $item = $(this), 1111 $sub = $item.children('ul'); 1112 1113 if ($sub.length) { 1114 $item.addClass(hasSubClass).attr({ 1115 'aria-haspopup': true, 1116 'aria-label': $item.children('a:first').text() 1117 }); 1118 // Note: Drilldowns behave differently in how they hide, and so need 1119 // additional attributes. We should look if this possibly over-generalized 1120 // utility (Nest) is appropriate when we rework menus in 6.4 1121 if (type === 'drilldown') { 1122 $item.attr({ 'aria-expanded': false }); 1123 } 1124 1125 $sub.addClass('submenu ' + subMenuClass).attr({ 1126 'data-submenu': '', 1127 'role': 'menu' 1128 }); 1129 if (type === 'drilldown') { 1130 $sub.attr({ 'aria-hidden': true }); 1131 } 1132 } 1133 1134 if ($item.parent('[data-submenu]').length) { 1135 $item.addClass('is-submenu-item ' + subItemClass); 1136 } 1137 }); 1138 1139 return; 1140 }, 1141 Burn: function Burn(menu, type) { 1142 var //items = menu.find('li'), 1143 subMenuClass = 'is-' + type + '-submenu', 1144 subItemClass = subMenuClass + '-item', 1145 hasSubClass = 'is-' + type + '-submenu-parent'; 1146 1147 menu.find('>li, .menu, .menu > li').removeClass(subMenuClass + ' ' + subItemClass + ' ' + hasSubClass + ' is-submenu-item submenu is-active').removeAttr('data-submenu').css('display', ''); 1148 1149 // console.log( menu.find('.' + subMenuClass + ', .' + subItemClass + ', .has-submenu, .is-submenu-item, .submenu, [data-submenu]') 1150 // .removeClass(subMenuClass + ' ' + subItemClass + ' has-submenu is-submenu-item submenu') 1151 // .removeAttr('data-submenu')); 1152 // items.each(function(){ 1153 // var $item = $(this), 1154 // $sub = $item.children('ul'); 1155 // if($item.parent('[data-submenu]').length){ 1156 // $item.removeClass('is-submenu-item ' + subItemClass); 1157 // } 1158 // if($sub.length){ 1159 // $item.removeClass('has-submenu'); 1160 // $sub.removeClass('submenu ' + subMenuClass).removeAttr('data-submenu'); 1161 // } 1162 // }); 1163 } 1164 }; 1165 1166 Foundation.Nest = Nest; 1167}(jQuery); 1168 1169'use strict'; 1170 1171!function ($) { 1172 1173 function Timer(elem, options, cb) { 1174 var _this = this, 1175 duration = options.duration, 1176 //options is an object for easily adding features later. 1177 nameSpace = Object.keys(elem.data())[0] || 'timer', 1178 remain = -1, 1179 start, 1180 timer; 1181 1182 this.isPaused = false;
1183 1184 this.restart = function () { 1185 remain = -1; 1186 clearTimeout(timer); 1187 this.start(); 1188 }; 1189 1190 this.start = function () { 1191 this.isPaused = false; 1192 // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. 1193 clearTimeout(timer); 1194 remain = remain <= 0 ? duration : remain; 1195 elem.data('paused', false); 1196 start = Date.now(); 1197 timer = setTimeout(function () { 1198 if (options.infinite) { 1199 _this.restart(); //rerun the timer. 1200 } 1201 if (cb && typeof cb === 'function') { 1202 cb(); 1203 } 1204 }, remain); 1205 elem.trigger('timerstart.zf.' + nameSpace); 1206 }; 1207 1208 this.pause = function () { 1209 this.isPaused = true; 1210 //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. 1211 clearTimeout(timer); 1212 elem.data('paused', true); 1213 var end = Date.now(); 1214 remain = remain - (end - start); 1215 elem.trigger('timerpaused.zf.' + nameSpace); 1216 }; 1217 } 1218 1219 /** 1220 * Runs a callback function when images are fully loaded. 1221 * @param {Object} images - Image(s) to check if loaded. 1222 * @param {Func} callback - Function to execute when image is fully loaded. 1223 */ 1224 function onImagesLoaded(images, callback) { 1225 var self = this, 1226 unloaded = images.length; 1227 1228 if (unloaded === 0) { 1229 callback(); 1230 } 1231 1232 images.each(function () { 1233 // Check if image is loaded 1234 if (this.complete || this.readyState === 4 || this.readyState === 'complete') { 1235 singleImageLoaded(); 1236 } 1237 // Force load the image 1238 else { 1239 // fix for IE. See https://css-tricks.com/snippets/jquery/fixing-load-in-ie-for-cached-images/ 1240 var src = $(this).attr('src'); 1241 $(this).attr('src', src + (src.indexOf('?') >= 0 ? '&' : '?') + new Date().getTime()); 1242 $(this).one('load', function () { 1243 singleImageLoaded(); 1244 }); 1245 } 1246 }); 1247 1248 function singleImageLoaded() { 1249 unloaded--; 1250 if (unloaded === 0) { 1251 callback(); 1252 } 1253 } 1254 } 1255 1256 Foundation.Timer = Timer; 1257 Foundation.onImagesLoaded = onImagesLoaded; 1258}(jQuery); 1259 1260//************************************************** 1261//**Work inspired by multiple jquery swipe plugins** 1262//**Done by Yohai Ararat *************************** 1263//************************************************** 1264(function ($) { 1265 1266 $.spotSwipe = { 1267 version: '1.0.0', 1268 enabled: 'ontouchstart' in document.documentElement, 1269 preventDefault: false, 1270 moveThreshold: 75, 1271 timeThreshold: 200 1272 }; 1273 1274 var startPosX, 1275 startPosY, 1276 startTime, 1277 elapsedTime, 1278 isMoving = false; 1279 1280 function onTouchEnd() { 1281 // alert(this); 1282 this.removeEventListener('touchmove', onTouchMove); 1283 this.removeEventListener('touchend', onTouchEnd); 1284 isMoving = false; 1285 } 1286 1287 function onTouchMove(e) { 1288 if ($.spotSwipe.preventDefault) { 1289 e.preventDefault(); 1290 } 1291 if (isMoving) { 1292 var x = e.touches[0].pageX; 1293 var y = e.touches[0].pageY; 1294 var dx = startPosX - x; 1295 var dy = startPosY - y; 1296 var dir; 1297 elapsedTime = new Date().getTime() - startTime; 1298 if (Math.abs(dx) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) { 1299 dir = dx > 0 ? 'left' : 'right'; 1300 } 1301 // else if(Math.abs(dy) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) { 1302 // dir = dy > 0 ? 'down' : 'up'; 1303 // } 1304 if (dir) { 1305 e.preventDefault(); 1306 onTouchEnd.call(this); 1307 $(this).trigger('swipe', dir).trigger('swipe' + dir); 1308 } 1309 } 1310 } 1311 1312 function onTouchStart(e) { 1313 if (e.touches.length == 1) { 1314 startPosX = e.touches[0].pageX; 1315 startPosY = e.touches[0].pageY; 1316 isMoving = true; 1317 startTime = new Date().getTime(); 1318 this.addEventListener('touchmove', onTouchMove, false); 1319 this.addEventListener('touchend', onTouchEnd, false); 1320 } 1321 } 1322 1323 function init() { 1324 this.addEventListener && this.addEventListener('touchstart', onTouchStart, false); 1325 } 1326 1327 function teardown() { 1328 this.removeEventListener('touchstart', onTouchStart); 1329 } 1330 1331 $.event.special.swipe = { setup: init }; 1332 1333 $.each(['left', 'up', 'down', 'right'], function () { 1334 $.event.special['swipe' + this] = { setup: function setup() { 1335 $(this).on('swipe', $.noop); 1336 } }; 1337 }); 1338})(jQuery); 1339/**************************************************** 1340 * Method for adding psuedo drag events to elements * 1341 ***************************************************/ 1342!function ($) { 1343 $.fn.addTouch = function () { 1344 this.each(function (i, el) { 1345 $(el).bind('touchstart touchmove touchend touchcancel', function () { 1346 //we pass the original event object because the jQuery event 1347 //object is normalized to w3c specs and does not provide the TouchList 1348 handleTouch(event); 1349 }); 1350 }); 1351 1352 var handleTouch = function handleTouch(event) { 1353 var touches = event.changedTouches, 1354 first = touches[0], 1355 eventTypes = { 1356 touchstart: 'mousedown', 1357 touchmove: 'mousemove', 1358 touchend: 'mouseup' 1359 }, 1360 type = eventTypes[event.type], 1361 simulatedEvent; 1362 1363 if ('MouseEvent' in window && typeof window.MouseEvent === 'function') { 1364 simulatedEvent = new window.MouseEvent(type, { 1365 'bubbles': true, 1366 'cancelable': true, 1367 'screenX': first.screenX, 1368 'screenY': first.screenY, 1369 'clientX': first.clientX, 1370 'clientY': first.clientY 1371 }); 1372 } else { 1373 simulatedEvent = document.createEvent('MouseEvent'); 1374 simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0 /*left*/, null); 1375 } 1376 first.target.dispatchEvent(simulatedEvent); 1377 }; 1378 }; 1379}(jQuery); 1380 1381//********************************** 1382//**From the jQuery Mobile Library** 1383//**need to recreate functionality**
1384//**and try to improve if possible** 1385//********************************** 1386 1387/* Removing the jQuery function **** 1388************************************ 1389 1390(function( $, window, undefined ) { 1391 1392 var $document = $( document ), 1393 // supportTouch = $.mobile.support.touch, 1394 touchStartEvent = 'touchstart'//supportTouch ? "touchstart" : "mousedown", 1395 touchStopEvent = 'touchend'//supportTouch ? "touchend" : "mouseup", 1396 touchMoveEvent = 'touchmove'//supportTouch ? "touchmove" : "mousemove"; 1397 1398 // setup new event shortcuts 1399 $.each( ( "touchstart touchmove touchend " + 1400 "swipe swipeleft swiperight" ).split( " " ), function( i, name ) { 1401 1402 $.fn[ name ] = function( fn ) { 1403 return fn ? this.bind( name, fn ) : this.trigger( name ); 1404 }; 1405 1406 // jQuery < 1.8 1407 if ( $.attrFn ) { 1408 $.attrFn[ name ] = true; 1409 } 1410 }); 1411 1412 function triggerCustomEvent( obj, eventType, event, bubble ) { 1413 var originalType = event.type; 1414 event.type = eventType; 1415 if ( bubble ) { 1416 $.event.trigger( event, undefined, obj ); 1417 } else { 1418 $.event.dispatch.call( obj, event ); 1419 } 1420 event.type = originalType; 1421 } 1422 1423 // also handles taphold 1424 1425 // Also handles swipeleft, swiperight 1426 $.event.special.swipe = { 1427 1428 // More than this horizontal displacement, and we will suppress scrolling. 1429 scrollSupressionThreshold: 30, 1430 1431 // More time than this, and it isn't a swipe. 1432 durationThreshold: 1000, 1433 1434 // Swipe horizontal displacement must be more than this. 1435 horizontalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30, 1436 1437 // Swipe vertical displacement must be less than this. 1438 verticalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30, 1439 1440 getLocation: function ( event ) { 1441 var winPageX = window.pageXOffset, 1442 winPageY = window.pageYOffset, 1443 x = event.clientX, 1444 y = event.clientY; 1445 1446 if ( event.pageY === 0 && Math.floor( y ) > Math.floor( event.pageY ) || 1447 event.pageX === 0 && Math.floor( x ) > Math.floor( event.pageX ) ) { 1448 1449 // iOS4 clientX/clientY have the value that should have been 1450 // in pageX/pageY. While pageX/page/ have the value 0 1451 x = x - winPageX; 1452 y = y - winPageY; 1453 } else if ( y < ( event.pageY - winPageY) || x < ( event.pageX - winPageX ) ) { 1454 1455 // Some Android browsers have totally bogus values for clientX/Y 1456 // when scrolling/zooming a page. Detectable since clientX/clientY 1457 // should never be smaller than pageX/pageY minus page scroll 1458 x = event.pageX - winPageX; 1459 y = event.pageY - winPageY; 1460 } 1461 1462 return { 1463 x: x, 1464 y: y 1465 }; 1466 }, 1467 1468 start: function( event ) { 1469 var data = event.originalEvent.touches ? 1470 event.originalEvent.touches[ 0 ] : event, 1471 location = $.event.special.swipe.getLocation( data ); 1472 return { 1473 time: ( new Date() ).getTime(), 1474 coords: [ location.x, location.y ], 1475 origin: $( event.target ) 1476 }; 1477 }, 1478 1479 stop: function( event ) { 1480 var data = event.originalEvent.touches ? 1481 event.originalEvent.touches[ 0 ] : event, 1482 location = $.event.special.swipe.getLocation( data ); 1483 return { 1484 time: ( new Date() ).getTime(), 1485 coords: [ location.x, location.y ] 1486 }; 1487 }, 1488 1489 handleSwipe: function( start, stop, thisObject, origTarget ) { 1490 if ( stop.time - start.time < $.event.special.swipe.durationThreshold && 1491 Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold && 1492 Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) { 1493 var direction = start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight"; 1494 1495 triggerCustomEvent( thisObject, "swipe", $.Event( "swipe", { target: origTarget, swipestart: start, swipestop: stop }), true ); 1496 triggerCustomEvent( thisObject, direction,$.Event( direction, { target: origTarget, swipestart: start, swipestop: stop } ), true ); 1497 return true; 1498 } 1499 return false; 1500 1501 }, 1502 1503 // This serves as a flag to ensure that at most one swipe event event is 1504 // in work at any given time 1505 eventInProgress: false, 1506 1507 setup: function() { 1508 var events, 1509 thisObject = this, 1510 $this = $( thisObject ), 1511 context = {}; 1512 1513 // Retrieve the events data for this element and add the swipe context 1514 events = $.data( this, "mobile-events" ); 1515 if ( !events ) { 1516 events = { length: 0 }; 1517 $.data( this, "mobile-events", events ); 1518 } 1519 events.length++; 1520 events.swipe = context; 1521 1522 context.start = function( event ) { 1523 1524 // Bail if we're already working on a swipe event 1525 if ( $.event.special.swipe.eventInProgress ) { 1526 return; 1527 } 1528 $.event.special.swipe.eventInProgress = true; 1529 1530 var stop, 1531 start = $.event.special.swipe.start( event ), 1532 origTarget = event.target, 1533 emitted = false;
1534 1535 context.move = function( event ) { 1536 if ( !start || event.isDefaultPrevented() ) { 1537 return; 1538 } 1539 1540 stop = $.event.special.swipe.stop( event ); 1541 if ( !emitted ) { 1542 emitted = $.event.special.swipe.handleSwipe( start, stop, thisObject, origTarget ); 1543 if ( emitted ) { 1544 1545 // Reset the context to make way for the next swipe event 1546 $.event.special.swipe.eventInProgress = false; 1547 } 1548 } 1549 // prevent scrolling 1550 if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) { 1551 event.preventDefault(); 1552 } 1553 }; 1554 1555 context.stop = function() { 1556 emitted = true; 1557 1558 // Reset the context to make way for the next swipe event 1559 $.event.special.swipe.eventInProgress = false; 1560 $document.off( touchMoveEvent, context.move ); 1561 context.move = null; 1562 }; 1563 1564 $document.on( touchMoveEvent, context.move ) 1565 .one( touchStopEvent, context.stop ); 1566 }; 1567 $this.on( touchStartEvent, context.start ); 1568 }, 1569 1570 teardown: function() { 1571 var events, context; 1572 1573 events = $.data( this, "mobile-events" ); 1574 if ( events ) { 1575 context = events.swipe; 1576 delete events.swipe; 1577 events.length--; 1578 if ( events.length === 0 ) { 1579 $.removeData( this, "mobile-events" ); 1580 } 1581 } 1582 1583 if ( context ) { 1584 if ( context.start ) { 1585 $( this ).off( touchStartEvent, context.start ); 1586 } 1587 if ( context.move ) { 1588 $document.off( touchMoveEvent, context.move ); 1589 } 1590 if ( context.stop ) { 1591 $document.off( touchStopEvent, context.stop ); 1592 } 1593 } 1594 } 1595 }; 1596 $.each({ 1597 swipeleft: "swipe.left", 1598 swiperight: "swipe.right" 1599 }, function( event, sourceEvent ) { 1600 1601 $.event.special[ event ] = { 1602 setup: function() { 1603 $( this ).bind( sourceEvent, $.noop ); 1604 }, 1605 teardown: function() { 1606 $( this ).unbind( sourceEvent ); 1607 } 1608 }; 1609 }); 1610})( jQuery, this ); 1611*/ 1612 1613'use strict'; 1614 1615!function ($) { 1616 1617 var MutationObserver = function () { 1618 var prefixes = ['WebKit', 'Moz', 'O', 'Ms', '']; 1619 for (var i = 0; i < prefixes.length; i++) { 1620 if (prefixes[i] + 'MutationObserver' in window) { 1621 return window[prefixes[i] + 'MutationObserver']; 1622 } 1623 } 1624 return false; 1625 }(); 1626 1627 var triggers = function triggers(el, type) { 1628 el.data(type).split(' ').forEach(function (id) { 1629 $('#' + id)[type === 'close' ? 'trigger' : 'triggerHandler'](type + '.zf.trigger', [el]); 1630 }); 1631 }; 1632 // Elements with [data-open] will reveal a plugin that supports it when clicked. 1633 $(document).on('click.zf.trigger', '[data-open]', function () { 1634 triggers($(this), 'open'); 1635 }); 1636 1637 // Elements with [data-close] will close a plugin that supports it when clicked. 1638 // If used without a value on [data-close], the event will bubble, allowing it to close a parent component. 1639 $(document).on('click.zf.trigger', '[data-close]', function () { 1640 var id = $(this).data('close'); 1641 if (id) { 1642 triggers($(this), 'close'); 1643 } else { 1644 $(this).trigger('close.zf.trigger'); 1645 } 1646 }); 1647 1648 // Elements with [data-toggle] will toggle a plugin that supports it when clicked. 1649 $(document).on('click.zf.trigger', '[data-toggle]', function () { 1650 var id = $(this).data('toggle'); 1651 if (id) { 1652 triggers($(this), 'toggle'); 1653 } else { 1654 $(this).trigger('toggle.zf.trigger'); 1655 } 1656 }); 1657 1658 // Elements with [data-closable] will respond to close.zf.trigger events. 1659 $(document).on('close.zf.trigger', '[data-closable]', function (e) { 1660 e.stopPropagation(); 1661 var animation = $(this).data('closable'); 1662 1663 if (animation !== '') { 1664 Foundation.Motion.animateOut($(this), animation, function () { 1665 $(this).trigger('closed.zf'); 1666 }); 1667 } else { 1668 $(this).fadeOut().trigger('closed.zf'); 1669 } 1670 }); 1671 1672 $(document).on('focus.zf.trigger blur.zf.trigger', '[data-toggle-focus]', function () { 1673 var id = $(this).data('toggle-focus'); 1674 $('#' + id).triggerHandler('toggle.zf.trigger', [$(this)]); 1675 }); 1676 1677 /** 1678 * Fires once after all other scripts have loaded 1679 * @function 1680 * @private 1681 */ 1682 $(window).on('load', function () { 1683 checkListeners(); 1684 }); 1685 1686 function checkListeners() { 1687 eventsListener(); 1688 resizeListener(); 1689 scrollListener(); 1690 closemeListener(); 1691 } 1692 1693 //******** only fires this function once on load, if there's something to watch ******** 1694 function closemeListener(pluginName) { 1695 var yetiBoxes = $('[data-yeti-box]'), 1696 plugNames = ['dropdown', 'tooltip', 'reveal']; 1697 1698 if (pluginName) { 1699 if (typeof pluginName === 'string') { 1700 plugNames.push(pluginName); 1701 } else if ((typeof pluginName === 'undefined' ? 'undefined' : _typeof(pluginName)) === 'object' && typeof pluginName[0] === 'string') { 1702 plugNames.concat(pluginName); 1703 } else { 1704 console.error('Plugin names must be strings'); 1705 } 1706 } 1707 if (yetiBoxes.length) { 1708 var listeners = plugNames.map(function (name) { 1709 return 'closeme.zf.' + name; 1710 }).join(' '); 1711 1712 $(window).off(listeners).on(listeners, function (e, pluginId) { 1713 var plugin = e.namespace.split('.')[0]; 1714 var plugins = $('[data-' + plugin + ']').not('[data-yeti-box="' + pluginId + '"]'); 1715 1716 plugins.each(function () { 1717 var _this = $(this); 1718 1719 _this.triggerHandler('close.zf.trigger', [_this]); 1720 }); 1721 }); 1722 } 1723 } 1724 1725 function resizeListener(debounce) { 1726 var timer = void 0, 1727 $nodes = $('[data-resize]'); 1728 if ($nodes.length) { 1729 $(window).off('resize.zf.trigger').on('resize.zf.trigger', function (e) { 1730 if (timer) { 1731 clearTimeout(timer); 1732 } 1733 1734 timer = setTimeout(function () { 1735 1736 if (!MutationObserver) { 1737 //fallback for IE 9 1738 $nodes.each(function () { 1739 $(this).triggerHandler('resizeme.zf.trigger'); 1740 }); 1741 } 1742 //trigger all listening elements and signal a resize event 1743 $nodes.attr('data-events', "resize"); 1744 }, debounce || 10); //default time to emit resize event 1745 }); 1746 } 1747 } 1748 1749 function scrollListener(debounce) { 1750 var timer = void 0, 1751 $nodes = $('[data-scroll]'); 1752 if ($nodes.length) { 1753 $(window).off('scroll.zf.trigger').on('scroll.zf.trigger', function (e) { 1754 if (timer) { 1755 clearTimeout(timer); 1756 } 1757 1758 timer = setTimeout(function () { 1759 1760 if (!MutationObserver) { 1761 //fallback for IE 9 1762 $nodes.each(function () { 1763 $(this).triggerHandler('scrollme.zf.trigger'); 1764 }); 1765 } 1766 //trigger all listening elements and signal a scroll event 1767 $nodes.attr('data-events', "scroll"); 1768 }, debounce || 10); //default time to emit scroll event 1769 }); 1770 } 1771 } 1772 1773 function eventsListener() { 1774 if (!MutationObserver) { 1775 return false;
1776 } 1777 var nodes = document.querySelectorAll('[data-resize], [data-scroll], [data-mutate]'); 1778 1779 //element callback 1780 var listeningElementsMutation = function listeningElementsMutation(mutationRecordsList) { 1781 var $target = $(mutationRecordsList[0].target); 1782 1783 //trigger the event handler for the element depending on type 1784 switch (mutationRecordsList[0].type) { 1785 1786 case "attributes": 1787 if ($target.attr("data-events") === "scroll" && mutationRecordsList[0].attributeName === "data-events") { 1788 $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]); 1789 } 1790 if ($target.attr("data-events") === "resize" && mutationRecordsList[0].attributeName === "data-events") { 1791 $target.triggerHandler('resizeme.zf.trigger', [$target]); 1792 } 1793 if (mutationRecordsList[0].attributeName === "style") { 1794 $target.closest("[data-mutate]").attr("data-events", "mutate"); 1795 $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]); 1796 } 1797 break; 1798 1799 case "childList": 1800 $target.closest("[data-mutate]").attr("data-events", "mutate"); 1801 $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]); 1802 break; 1803 1804 default: 1805 return false; 1806 //nothing 1807 } 1808 }; 1809 1810 if (nodes.length) { 1811 //for each element that needs to listen for resizing, scrolling, or mutation add a single observer 1812 for (var i = 0; i <= nodes.length - 1; i++) { 1813 var elementObserver = new MutationObserver(listeningElementsMutation); 1814 elementObserver.observe(nodes[i], { attributes: true, childList: true, characterData: false, subtree: true, attributeFilter: ["data-events", "style"] }); 1815 } 1816 } 1817 } 1818 1819 // ------------------------------------ 1820 1821 // [PH] 1822 // Foundation.CheckWatchers = checkWatchers; 1823 Foundation.IHearYou = checkListeners; 1824 // Foundation.ISeeYou = scrollListener; 1825 // Foundation.IFeelYou = closemeListener; 1826}(jQuery); 1827 1828'use strict'; 1829 1830!function ($) { 1831 1832 /** 1833 * Accordion module. 1834 * @module foundation.accordion 1835 * @requires foundation.util.keyboard 1836 * @requires foundation.util.motion 1837 */ 1838 1839 var Accordion = function () { 1840 /** 1841 * Creates a new instance of an accordion. 1842 * @class 1843 * @fires Accordion#init 1844 * @param {jQuery} element - jQuery object to make into an accordion. 1845 * @param {Object} options - a plain object with settings to override the default options. 1846 */ 1847 function Accordion(element, options) { 1848 _classCallCheck(this, Accordion); 1849 1850 this.$element = element; 1851 this.options = $.extend({}, Accordion.defaults, this.$element.data(), options); 1852 1853 this._init(); 1854 1855 Foundation.registerPlugin(this, 'Accordion'); 1856 Foundation.Keyboard.register('Accordion', { 1857 'ENTER': 'toggle', 1858 'SPACE': 'toggle', 1859 'ARROW_DOWN': 'next', 1860 'ARROW_UP': 'previous' 1861 }); 1862 } 1863 1864 /** 1865 * Initializes the accordion by animating the preset active pane(s). 1866 * @private 1867 */ 1868 1869 1870 _createClass(Accordion, [{ 1871 key: '_init', 1872 value: function _init() { 1873 var _this3 = this; 1874 1875 this.$element.attr('role', 'tablist'); 1876 this.$tabs = this.$element.children('[data-accordion-item]'); 1877 1878 this.$tabs.each(function (idx, el) { 1879 var $el = $(el), 1880 $content = $el.children('[data-tab-content]'), 1881 id = $content[0].id || Foundation.GetYoDigits(6, 'accordion'), 1882 linkId = el.id || id + '-label'; 1883 1884 $el.find('a:first').attr({ 1885 'aria-controls': id, 1886 'role': 'tab', 1887 'id': linkId, 1888 'aria-expanded': false, 1889 'aria-selected': false 1890 }); 1891 1892 $content.attr({ 'role': 'tabpanel', 'aria-labelledby': linkId, 'aria-hidden': true, 'id': id }); 1893 }); 1894 var $initActive = this.$element.find('.is-active').children('[data-tab-content]'); 1895 this.firstTimeInit = true; 1896 if ($initActive.length) { 1897 this.down($initActive, this.firstTimeInit); 1898 this.firstTimeInit = false;
1899 } 1900 1901 this._checkDeepLink = function () { 1902 var anchor = window.location.hash; 1903 //need a hash and a relevant anchor in this tabset 1904 if (anchor.length) { 1905 var $link = _this3.$element.find('[href$="' + anchor + '"]'), 1906 $anchor = $(anchor); 1907 1908 if ($link.length && $anchor) { 1909 if (!$link.parent('[data-accordion-item]').hasClass('is-active')) { 1910 _this3.down($anchor, _this3.firstTimeInit); 1911 _this3.firstTimeInit = false; 1912 }; 1913 1914 //roll up a little to show the titles 1915 if (_this3.options.deepLinkSmudge) { 1916 var _this = _this3; 1917 $(window).load(function () { 1918 var offset = _this.$element.offset(); 1919 $('html, body').animate({ scrollTop: offset.top }, _this.options.deepLinkSmudgeDelay); 1920 }); 1921 } 1922 1923 /** 1924 * Fires when the zplugin has deeplinked at pageload 1925 * @event Accordion#deeplink 1926 */ 1927 _this3.$element.trigger('deeplink.zf.accordion', [$link, $anchor]); 1928 } 1929 } 1930 }; 1931 1932 //use browser to open a tab, if it exists in this tabset 1933 if (this.options.deepLink) { 1934 this._checkDeepLink(); 1935 } 1936 1937 this._events(); 1938 } 1939 1940 /** 1941 * Adds event handlers for items within the accordion. 1942 * @private 1943 */ 1944 1945 }, { 1946 key: '_events', 1947 value: function _events() { 1948 var _this = this; 1949 1950 this.$tabs.each(function () { 1951 var $elem = $(this); 1952 var $tabContent = $elem.children('[data-tab-content]'); 1953 if ($tabContent.length) { 1954 $elem.children('a').off('click.zf.accordion keydown.zf.accordion').on('click.zf.accordion', function (e) { 1955 e.preventDefault(); 1956 _this.toggle($tabContent); 1957 }).on('keydown.zf.accordion', function (e) { 1958 Foundation.Keyboard.handleKey(e, 'Accordion', { 1959 toggle: function toggle() { 1960 _this.toggle($tabContent); 1961 }, 1962 next: function next() { 1963 var $a = $elem.next().find('a').focus(); 1964 if (!_this.options.multiExpand) { 1965 $a.trigger('click.zf.accordion'); 1966 } 1967 }, 1968 previous: function previous() { 1969 var $a = $elem.prev().find('a').focus(); 1970 if (!_this.options.multiExpand) { 1971 $a.trigger('click.zf.accordion'); 1972 } 1973 }, 1974 handled: function handled() { 1975 e.preventDefault(); 1976 e.stopPropagation(); 1977 } 1978 }); 1979 }); 1980 } 1981 }); 1982 if (this.options.deepLink) { 1983 $(window).on('popstate', this._checkDeepLink); 1984 } 1985 } 1986 1987 /** 1988 * Toggles the selected content pane's open/close state. 1989 * @param {jQuery} $target - jQuery object of the pane to toggle (`.accordion-content`). 1990 * @function 1991 */ 1992 1993 }, { 1994 key: 'toggle', 1995 value: function toggle($target) { 1996 if ($target.parent().hasClass('is-active')) { 1997 this.up($target); 1998 } else { 1999 this.down($target); 2000 } 2001 //either replace or update browser history 2002 if (this.options.deepLink) { 2003 var anchor = $target.prev('a').attr('href'); 2004 2005 if (this.options.updateHistory) { 2006 history.pushState({}, '', anchor); 2007 } else { 2008 history.replaceState({}, '', anchor); 2009 } 2010 } 2011 } 2012 2013 /** 2014 * Opens the accordion tab defined by `$target`. 2015 * @param {jQuery} $target - Accordion pane to open (`.accordion-content`). 2016 * @param {Boolean} firstTime - flag to determine if reflow should happen. 2017 * @fires Accordion#down 2018 * @function 2019 */ 2020 2021 }, { 2022 key: 'down', 2023 value: function down($target, firstTime) { 2024 var _this4 = this; 2025 2026 $target.attr('aria-hidden', false).parent('[data-tab-content]').addBack().parent().addClass('is-active'); 2027 2028 if (!this.options.multiExpand && !firstTime) { 2029 var $currentActive = this.$element.children('.is-active').children('[data-tab-content]'); 2030 if ($currentActive.length) { 2031 this.up($currentActive.not($target)); 2032 } 2033 } 2034 2035 $target.slideDown(this.options.slideSpeed, function () { 2036 /** 2037 * Fires when the tab is done opening. 2038 * @event Accordion#down 2039 */ 2040 _this4.$element.trigger('down.zf.accordion', [$target]); 2041 }); 2042 2043 $('#' + $target.attr('aria-labelledby')).attr({ 2044 'aria-expanded': true, 2045 'aria-selected': true 2046 }); 2047 } 2048 2049 /** 2050 * Closes the tab defined by `$target`. 2051 * @param {jQuery} $target - Accordion tab to close (`.accordion-content`). 2052 * @fires Accordion#up 2053 * @function 2054 */ 2055 2056 }, {
2057 key: 'up', 2058 value: function up($target) { 2059 var $aunts = $target.parent().siblings(), 2060 _this = this; 2061 2062 if (!this.options.allowAllClosed && !$aunts.hasClass('is-active') || !$target.parent().hasClass('is-active')) { 2063 return; 2064 } 2065 2066 // Foundation.Move(this.options.slideSpeed, $target, function(){ 2067 $target.slideUp(_this.options.slideSpeed, function () { 2068 /** 2069 * Fires when the tab is done collapsing up. 2070 * @event Accordion#up 2071 */ 2072 _this.$element.trigger('up.zf.accordion', [$target]); 2073 }); 2074 // }); 2075 2076 $target.attr('aria-hidden', true).parent().removeClass('is-active'); 2077 2078 $('#' + $target.attr('aria-labelledby')).attr({ 2079 'aria-expanded': false, 2080 'aria-selected': false 2081 }); 2082 } 2083 2084 /** 2085 * Destroys an instance of an accordion. 2086 * @fires Accordion#destroyed 2087 * @function 2088 */ 2089 2090 }, { 2091 key: 'destroy', 2092 value: function destroy() { 2093 this.$element.find('[data-tab-content]').stop(true).slideUp(0).css('display', ''); 2094 this.$element.find('a').off('.zf.accordion'); 2095 if (this.options.deepLink) { 2096 $(window).off('popstate', this._checkDeepLink); 2097 } 2098 2099 Foundation.unregisterPlugin(this); 2100 } 2101 }]); 2102 2103 return Accordion; 2104 }(); 2105 2106 Accordion.defaults = { 2107 /** 2108 * Amount of time to animate the opening of an accordion pane. 2109 * @option 2110 * @type {number} 2111 * @default 250 2112 */ 2113 slideSpeed: 250, 2114 /** 2115 * Allow the accordion to have multiple open panes. 2116 * @option 2117 * @type {boolean} 2118 * @default false 2119 */ 2120 multiExpand: false, 2121 /** 2122 * Allow the accordion to close all panes. 2123 * @option 2124 * @type {boolean} 2125 * @default false 2126 */ 2127 allowAllClosed: false, 2128 /** 2129 * Allows the window to scroll to content of pane specified by hash anchor 2130 * @option 2131 * @type {boolean} 2132 * @default false 2133 */ 2134 deepLink: false, 2135 2136 /** 2137 * Adjust the deep link scroll to make sure the top of the accordion panel is visible 2138 * @option 2139 * @type {boolean} 2140 * @default false 2141 */ 2142 deepLinkSmudge: false, 2143 2144 /** 2145 * Animation time (ms) for the deep link adjustment 2146 * @option 2147 * @type {number} 2148 * @default 300 2149 */ 2150 deepLinkSmudgeDelay: 300, 2151 2152 /** 2153 * Update the browser history with the open accordion 2154 * @option 2155 * @type {boolean} 2156 * @default false 2157 */ 2158 updateHistory: false 2159 }; 2160 2161 // Window exports 2162 Foundation.plugin(Accordion, 'Accordion'); 2163}(jQuery); 2164 2165'use strict'; 2166 2167!function ($) { 2168 2169 /** 2170 * Drilldown module. 2171 * @module foundation.drilldown 2172 * @requires foundation.util.keyboard 2173 * @requires foundation.util.motion 2174 * @requires foundation.util.nest 2175 */ 2176 2177 var Drilldown = function () { 2178 /** 2179 * Creates a new instance of a drilldown menu. 2180 * @class 2181 * @param {jQuery} element - jQuery object to make into an accordion menu. 2182 * @param {Object} options - Overrides to the default plugin settings. 2183 */ 2184 function Drilldown(element, options) { 2185 _classCallCheck(this, Drilldown); 2186 2187 this.$element = element; 2188 this.options = $.extend({}, Drilldown.defaults, this.$element.data(), options); 2189 2190 Foundation.Nest.Feather(this.$element, 'drilldown'); 2191 2192 this._init(); 2193 2194 Foundation.registerPlugin(this, 'Drilldown'); 2195 Foundation.Keyboard.register('Drilldown', { 2196 'ENTER': 'open', 2197 'SPACE': 'open', 2198 'ARROW_RIGHT': 'next', 2199 'ARROW_UP': 'up', 2200 'ARROW_DOWN': 'down', 2201 'ARROW_LEFT': 'previous', 2202 'ESCAPE': 'close', 2203 'TAB': 'down', 2204 'SHIFT_TAB': 'up' 2205 }); 2206 } 2207 2208 /** 2209 * Initializes the drilldown by creating jQuery collections of elements 2210 * @private 2211 */ 2212 2213 2214 _createClass(Drilldown, [{ 2215 key: '_init', 2216 value: function _init() { 2217 this.$submenuAnchors = this.$element.find('li.is-drilldown-submenu-parent').children('a'); 2218 this.$submenus = this.$submenuAnchors.parent('li').children('[data-submenu]'); 2219 this.$menuItems = this.$element.find('li').not('.js-drilldown-back').attr('role', 'menuitem').find('a'); 2220 this.$element.attr('data-mutate', this.$element.attr('data-drilldown') || Foundation.GetYoDigits(6, 'drilldown')); 2221 2222 this._prepareMenu(); 2223 this._registerEvents(); 2224 2225 this._keyboardEvents(); 2226 } 2227 2228 /** 2229 * prepares drilldown menu by setting attributes to links and elements 2230 * sets a min height to prevent content jumping 2231 * wraps the element if not already wrapped 2232 * @private 2233 * @function 2234 */ 2235 2236 }, {
vendor: 8,636 bytes, lines 2237-2466
2237 key: '_prepareMenu', 2238 value: function _prepareMenu() { 2239 var _this = this; 2240 // if(!this.options.holdOpen){ 2241 // this._menuLinkEvents(); 2242 // } 2243 this.$submenuAnchors.each(function () { 2244 var $link = $(this); 2245 var $sub = $link.parent(); 2246 if (_this.options.parentLink) { 2247 $link.clone().prependTo($sub.children('[data-submenu]')).wrap('<li class="is-submenu-parent-item is-submenu-item is-drilldown-submenu-item" role="menu-item"></li>'); 2248 } 2249 $link.data('savedHref', $link.attr('href')).removeAttr('href').attr('tabindex', 0); 2250 $link.children('[data-submenu]').attr({ 2251 'aria-hidden': true, 2252 'tabindex': 0, 2253 'role': 'menu' 2254 }); 2255 _this._events($link); 2256 }); 2257 this.$submenus.each(function () { 2258 var $menu = $(this), 2259 $back = $menu.find('.js-drilldown-back'); 2260 if (!$back.length) { 2261 switch (_this.options.backButtonPosition) { 2262 case "bottom": 2263 $menu.append(_this.options.backButton); 2264 break; 2265 case "top": 2266 $menu.prepend(_this.options.backButton); 2267 break; 2268 default: 2269 console.error("Unsupported backButtonPosition value '" + _this.options.backButtonPosition + "'"); 2270 } 2271 } 2272 _this._back($menu); 2273 }); 2274 2275 this.$submenus.addClass('invisible'); 2276 if (!this.options.autoHeight) { 2277 this.$submenus.addClass('drilldown-submenu-cover-previous'); 2278 } 2279 2280 // create a wrapper on element if it doesn't exist. 2281 if (!this.$element.parent().hasClass('is-drilldown')) { 2282 this.$wrapper = $(this.options.wrapper).addClass('is-drilldown'); 2283 if (this.options.animateHeight) this.$wrapper.addClass('animate-height'); 2284 this.$element.wrap(this.$wrapper); 2285 } 2286 // set wrapper 2287 this.$wrapper = this.$element.parent(); 2288 this.$wrapper.css(this._getMaxDims()); 2289 } 2290 }, { 2291 key: '_resize', 2292 value: function _resize() { 2293 this.$wrapper.css({ 'max-width': 'none', 'min-height': 'none' }); 2294 // _getMaxDims has side effects (boo) but calling it should update all other necessary heights & widths 2295 this.$wrapper.css(this._getMaxDims()); 2296 } 2297 2298 /** 2299 * Adds event handlers to elements in the menu. 2300 * @function 2301 * @private 2302 * @param {jQuery} $elem - the current menu item to add handlers to. 2303 */ 2304 2305 }, { 2306 key: '_events', 2307 value: function _events($elem) { 2308 var _this = this; 2309 2310 $elem.off('click.zf.drilldown').on('click.zf.drilldown', function (e) { 2311 if ($(e.target).parentsUntil('ul', 'li').hasClass('is-drilldown-submenu-parent')) { 2312 e.stopImmediatePropagation(); 2313 e.preventDefault(); 2314 } 2315 2316 // if(e.target !== e.currentTarget.firstElementChild){ 2317 // return false; 2318 // } 2319 _this._show($elem.parent('li')); 2320 2321 if (_this.options.closeOnClick) { 2322 var $body = $('body'); 2323 $body.off('.zf.drilldown').on('click.zf.drilldown', function (e) { 2324 if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target)) { 2325 return; 2326 } 2327 e.preventDefault(); 2328 _this._hideAll(); 2329 $body.off('.zf.drilldown'); 2330 }); 2331 } 2332 }); 2333 this.$element.on('mutateme.zf.trigger', this._resize.bind(this)); 2334 } 2335 2336 /** 2337 * Adds event handlers to the menu element. 2338 * @function 2339 * @private 2340 */ 2341 2342 }, { 2343 key: '_registerEvents', 2344 value: function _registerEvents() { 2345 if (this.options.scrollTop) { 2346 this._bindHandler = this._scrollTop.bind(this); 2347 this.$element.on('open.zf.drilldown hide.zf.drilldown closed.zf.drilldown', this._bindHandler); 2348 } 2349 } 2350 2351 /** 2352 * Scroll to Top of Element or data-scroll-top-element 2353 * @function 2354 * @fires Drilldown#scrollme 2355 */ 2356 2357 }, { 2358 key: '_scrollTop', 2359 value: function _scrollTop() { 2360 var _this = this; 2361 var $scrollTopElement = _this.options.scrollTopElement != '' ? $(_this.options.scrollTopElement) : _this.$element, 2362 scrollPos = parseInt($scrollTopElement.offset().top + _this.options.scrollTopOffset); 2363 $('html, body').stop(true).animate({ scrollTop: scrollPos }, _this.options.animationDuration, _this.options.animationEasing, function () { 2364 /** 2365 * Fires after the menu has scrolled 2366 * @event Drilldown#scrollme 2367 */ 2368 if (this === $('html')[0]) _this.$element.trigger('scrollme.zf.drilldown'); 2369 }); 2370 } 2371 2372 /** 2373 * Adds keydown event listener to `li`'s in the menu. 2374 * @private 2375 */ 2376 2377 }, { 2378 key: '_keyboardEvents', 2379 value: function _keyboardEvents() { 2380 var _this = this; 2381 2382 this.$menuItems.add(this.$element.find('.js-drilldown-back > a, .is-submenu-parent-item > a')).on('keydown.zf.drilldown', function (e) { 2383 var $element = $(this), 2384 $elements = $element.parent('li').parent('ul').children('li').children('a'), 2385 $prevElement, 2386 $nextElement; 2387 2388 $elements.each(function (i) { 2389 if ($(this).is($element)) { 2390 $prevElement = $elements.eq(Math.max(0, i - 1)); 2391 $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1)); 2392 return; 2393 } 2394 }); 2395 2396 Foundation.Keyboard.handleKey(e, 'Drilldown', { 2397 next: function next() { 2398 if ($element.is(_this.$submenuAnchors)) { 2399 _this._show($element.parent('li')); 2400 $element.parent('li').one(Foundation.transitionend($element), function () { 2401 $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus(); 2402 }); 2403 return true; 2404 } 2405 }, 2406 previous: function previous() { 2407 _this._hide($element.parent('li').parent('ul')); 2408 $element.parent('li').parent('ul').one(Foundation.transitionend($element), function () { 2409 setTimeout(function () { 2410 $element.parent('li').parent('ul').parent('li').children('a').first().focus(); 2411 }, 1); 2412 }); 2413 return true; 2414 }, 2415 up: function up() { 2416 $prevElement.focus(); 2417 // Don't tap focus on first element in root ul 2418 return !$element.is(_this.$element.find('> li:first-child > a')); 2419 }, 2420 down: function down() { 2421 $nextElement.focus(); 2422 // Don't tap focus on last element in root ul 2423 return !$element.is(_this.$element.find('> li:last-child > a')); 2424 }, 2425 close: function close() { 2426 // Don't close on element in root ul 2427 if (!$element.is(_this.$element.find('> li > a'))) { 2428 _this._hide($element.parent().parent()); 2429 $element.parent().parent().siblings('a').focus(); 2430 } 2431 }, 2432 open: function open() { 2433 if (!$element.is(_this.$menuItems)) { 2434 // not menu item means back button 2435 _this._hide($element.parent('li').parent('ul')); 2436 $element.parent('li').parent('ul').one(Foundation.transitionend($element), function () { 2437 setTimeout(function () { 2438 $element.parent('li').parent('ul').parent('li').children('a').first().focus(); 2439 }, 1); 2440 }); 2441 return true; 2442 } else if ($element.is(_this.$submenuAnchors)) { 2443 _this._show($element.parent('li')); 2444 $element.parent('li').one(Foundation.transitionend($element), function () { 2445 $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus(); 2446 }); 2447 return true; 2448 } 2449 }, 2450 handled: function handled(preventDefault) { 2451 if (preventDefault) { 2452 e.preventDefault(); 2453 } 2454 e.stopImmediatePropagation(); 2455 } 2456 }); 2457 }); // end keyboardAccess 2458 } 2459 2460 /** 2461 * Closes all open elements, and returns to root menu. 2462 * @function 2463 * @fires Drilldown#closed 2464 */ 2465 2466 }, {
2467 key: '_hideAll', 2468 value: function _hideAll() { 2469 var $elem = this.$element.find('.is-drilldown-submenu.is-active').addClass('is-closing'); 2470 if (this.options.autoHeight) this.$wrapper.css({ height: $elem.parent().closest('ul').data('calcHeight') }); 2471 $elem.one(Foundation.transitionend($elem), function (e) { 2472 $elem.removeClass('is-active is-closing'); 2473 }); 2474 /** 2475 * Fires when the menu is fully closed. 2476 * @event Drilldown#closed 2477 */ 2478 this.$element.trigger('closed.zf.drilldown'); 2479 } 2480 2481 /** 2482 * Adds event listener for each `back` button, and closes open menus. 2483 * @function 2484 * @fires Drilldown#back 2485 * @param {jQuery} $elem - the current sub-menu to add `back` event. 2486 */ 2487 2488 }, { 2489 key: '_back', 2490 value: function _back($elem) { 2491 var _this = this; 2492 $elem.off('click.zf.drilldown'); 2493 $elem.children('.js-drilldown-back').on('click.zf.drilldown', function (e) { 2494 e.stopImmediatePropagation(); 2495 // console.log('mouseup on back'); 2496 _this._hide($elem); 2497 2498 // If there is a parent submenu, call show 2499 var parentSubMenu = $elem.parent('li').parent('ul').parent('li'); 2500 if (parentSubMenu.length) { 2501 _this._show(parentSubMenu); 2502 } 2503 }); 2504 } 2505 2506 /** 2507 * Adds event listener to menu items w/o submenus to close open menus on click. 2508 * @function 2509 * @private 2510 */ 2511 2512 }, { 2513 key: '_menuLinkEvents', 2514 value: function _menuLinkEvents() { 2515 var _this = this; 2516 this.$menuItems.not('.is-drilldown-submenu-parent').off('click.zf.drilldown').on('click.zf.drilldown', function (e) { 2517 // e.stopImmediatePropagation(); 2518 setTimeout(function () { 2519 _this._hideAll(); 2520 }, 0); 2521 }); 2522 } 2523 2524 /** 2525 * Opens a submenu. 2526 * @function 2527 * @fires Drilldown#open 2528 * @param {jQuery} $elem - the current element with a submenu to open, i.e. the `li` tag. 2529 */ 2530 2531 }, { 2532 key: '_show', 2533 value: function _show($elem) { 2534 if (this.options.autoHeight) this.$wrapper.css({ height: $elem.children('[data-submenu]').data('calcHeight') }); 2535 $elem.attr('aria-expanded', true); 2536 $elem.children('[data-submenu]').addClass('is-active').removeClass('invisible').attr('aria-hidden', false); 2537 /** 2538 * Fires when the submenu has opened. 2539 * @event Drilldown#open 2540 */ 2541 this.$element.trigger('open.zf.drilldown', [$elem]); 2542 } 2543 }, { 2544 key: '_hide', 2545 2546 2547 /** 2548 * Hides a submenu 2549 * @function 2550 * @fires Drilldown#hide 2551 * @param {jQuery} $elem - the current sub-menu to hide, i.e. the `ul` tag. 2552 */ 2553 value: function _hide($elem) { 2554 if (this.options.autoHeight) this.$wrapper.css({ height: $elem.parent().closest('ul').data('calcHeight') }); 2555 var _this = this; 2556 $elem.parent('li').attr('aria-expanded', false); 2557 $elem.attr('aria-hidden', true).addClass('is-closing'); 2558 $elem.addClass('is-closing').one(Foundation.transitionend($elem), function () { 2559 $elem.removeClass('is-active is-closing'); 2560 $elem.blur().addClass('invisible'); 2561 }); 2562 /** 2563 * Fires when the submenu has closed. 2564 * @event Drilldown#hide 2565 */ 2566 $elem.trigger('hide.zf.drilldown', [$elem]); 2567 } 2568 2569 /** 2570 * Iterates through the nested menus to calculate the min-height, and max-width for the menu. 2571 * Prevents content jumping. 2572 * @function 2573 * @private 2574 */ 2575 2576 }, { 2577 key: '_getMaxDims', 2578 value: function _getMaxDims() { 2579 var maxHeight = 0, 2580 result = {}, 2581 _this = this; 2582 this.$submenus.add(this.$element).each(function () { 2583 var numOfElems = $(this).children('li').length; 2584 var height = Foundation.Box.GetDimensions(this).height; 2585 maxHeight = height > maxHeight ? height : maxHeight; 2586 if (_this.options.autoHeight) { 2587 $(this).data('calcHeight', height); 2588 if (!$(this).hasClass('is-drilldown-submenu')) result['height'] = height; 2589 } 2590 }); 2591 2592 if (!this.options.autoHeight) result['min-height'] = maxHeight + 'px'; 2593 2594 result['max-width'] = this.$element[0].getBoundingClientRect().width + 'px'; 2595 2596 return result; 2597 } 2598 2599 /** 2600 * Destroys the Drilldown Menu 2601 * @function 2602 */ 2603 2604 }, {
2605 key: 'destroy', 2606 value: function destroy() { 2607 if (this.options.scrollTop) this.$element.off('.zf.drilldown', this._bindHandler); 2608 this._hideAll(); 2609 this.$element.off('mutateme.zf.trigger'); 2610 Foundation.Nest.Burn(this.$element, 'drilldown'); 2611 this.$element.unwrap().find('.js-drilldown-back, .is-submenu-parent-item').remove().end().find('.is-active, .is-closing, .is-drilldown-submenu').removeClass('is-active is-closing is-drilldown-submenu').end().find('[data-submenu]').removeAttr('aria-hidden tabindex role'); 2612 this.$submenuAnchors.each(function () { 2613 $(this).off('.zf.drilldown'); 2614 }); 2615 2616 this.$submenus.removeClass('drilldown-submenu-cover-previous'); 2617 2618 this.$element.find('a').each(function () { 2619 var $link = $(this); 2620 $link.removeAttr('tabindex'); 2621 if ($link.data('savedHref')) { 2622 $link.attr('href', $link.data('savedHref')).removeData('savedHref'); 2623 } else { 2624 return; 2625 } 2626 }); 2627 Foundation.unregisterPlugin(this); 2628 } 2629 }]); 2630 2631 return Drilldown; 2632 }(); 2633 2634 Drilldown.defaults = { 2635 /** 2636 * Markup used for JS generated back button. Prepended or appended (see backButtonPosition) to submenu lists and deleted on `destroy` method, 'js-drilldown-back' class required. Remove the backslash (`\`) if copy and pasting. 2637 * @option 2638 * @type {string} 2639 * @default '<li class="js-drilldown-back"><a tabindex="0">Back</a></li>' 2640 */ 2641 backButton: '<li class="js-drilldown-back"><a tabindex="0">Back</a></li>', 2642 /** 2643 * Position the back button either at the top or bottom of drilldown submenus. Can be `'left'` or `'bottom'`. 2644 * @option 2645 * @type {string} 2646 * @default top 2647 */ 2648 backButtonPosition: 'top', 2649 /** 2650 * Markup used to wrap drilldown menu. Use a class name for independent styling; the JS applied class: `is-drilldown` is required. Remove the backslash (`\`) if copy and pasting. 2651 * @option 2652 * @type {string} 2653 * @default '<div></div>' 2654 */ 2655 wrapper: '<div></div>', 2656 /** 2657 * Adds the parent link to the submenu. 2658 * @option 2659 * @type {boolean} 2660 * @default false 2661 */ 2662 parentLink: false, 2663 /** 2664 * Allow the menu to return to root list on body click. 2665 * @option 2666 * @type {boolean} 2667 * @default false 2668 */ 2669 closeOnClick: false, 2670 /** 2671 * Allow the menu to auto adjust height. 2672 * @option 2673 * @type {boolean} 2674 * @default false 2675 */ 2676 autoHeight: false, 2677 /** 2678 * Animate the auto adjust height. 2679 * @option 2680 * @type {boolean} 2681 * @default false 2682 */ 2683 animateHeight: false, 2684 /** 2685 * Scroll to the top of the menu after opening a submenu or navigating back using the menu back button 2686 * @option 2687 * @type {boolean} 2688 * @default false 2689 */ 2690 scrollTop: false, 2691 /** 2692 * String jquery selector (for example 'body') of element to take offset().top from, if empty string the drilldown menu offset().top is taken 2693 * @option 2694 * @type {string} 2695 * @default '' 2696 */ 2697 scrollTopElement: '', 2698 /** 2699 * ScrollTop offset 2700 * @option 2701 * @type {number} 2702 * @default 0 2703 */ 2704 scrollTopOffset: 0, 2705 /** 2706 * Scroll animation duration 2707 * @option 2708 * @type {number} 2709 * @default 500 2710 */ 2711 animationDuration: 500, 2712 /** 2713 * Scroll animation easing. Can be `'swing'` or `'linear'`. 2714 * @option 2715 * @type {string} 2716 * @see {@link https://api.jquery.com/animate|JQuery animate} 2717 * @default 'swing' 2718 */ 2719 animationEasing: 'swing' 2720 // holdOpen: false 2721 }; 2722 2723 // Window exports 2724 Foundation.plugin(Drilldown, 'Drilldown'); 2725}(jQuery); 2726 2727'use strict'; 2728 2729!function ($) { 2730 2731 /** 2732 * Dropdown module. 2733 * @module foundation.dropdown 2734 * @requires foundation.util.keyboard 2735 * @requires foundation.util.box 2736 * @requires foundation.util.triggers 2737 */ 2738 2739 var Dropdown = function () { 2740 /** 2741 * Creates a new instance of a dropdown. 2742 * @class 2743 * @param {jQuery} element - jQuery object to make into a dropdown. 2744 * Object should be of the dropdown panel, rather than
2744its anchor. 2745 * @param {Object} options - Overrides to the default plugin settings. 2746 */ 2747 function Dropdown(element, options) { 2748 _classCallCheck(this, Dropdown); 2749 2750 this.$element = element; 2751 this.options = $.extend({}, Dropdown.defaults, this.$element.data(), options); 2752 this._init(); 2753 2754 Foundation.registerPlugin(this, 'Dropdown'); 2755 Foundation.Keyboard.register('Dropdown', { 2756 'ENTER': 'open', 2757 'SPACE': 'open', 2758 'ESCAPE': 'close' 2759 }); 2760 } 2761 2762 /** 2763 * Initializes the plugin by setting/checking options and attributes, adding helper variables, and saving the anchor. 2764 * @function 2765 * @private 2766 */ 2767 2768 2769 _createClass(Dropdown, [{ 2770 key: '_init', 2771 value: function _init() { 2772 var $id = this.$element.attr('id'); 2773 2774 this.$anchor = $('[data-toggle="' + $id + '"]').length ? $('[data-toggle="' + $id + '"]') : $('[data-open="' + $id + '"]'); 2775 this.$anchor.attr({ 2776 'aria-controls': $id, 2777 'data-is-focus': false, 2778 'data-yeti-box': $id, 2779 'aria-haspopup': true, 2780 'aria-expanded': false 2781 2782 }); 2783 2784 if (this.options.parentClass) { 2785 this.$parent = this.$element.parents('.' + this.options.parentClass); 2786 } else { 2787 this.$parent = null; 2788 } 2789 this.options.positionClass = this.getPositionClass(); 2790 this.counter = 4; 2791 this.usedPositions = []; 2792 this.$element.attr({ 2793 'aria-hidden': 'true', 2794 'data-yeti-box': $id, 2795 'data-resize': $id, 2796 'aria-labelledby': this.$anchor[0].id || Foundation.GetYoDigits(6, 'dd-anchor') 2797 }); 2798 this._events(); 2799 } 2800 2801 /** 2802 * Helper function to determine current orientation of dropdown pane. 2803 * @function 2804 * @returns {String} position - string value of a position class. 2805 */ 2806 2807 }, { 2808 key: 'getPositionClass', 2809 value: function getPositionClass() { 2810 var verticalPosition = this.$element[0].className.match(/(top|left|right|bottom)/g); 2811 verticalPosition = verticalPosition ? verticalPosition[0] : ''; 2812 var horizontalPosition = /float-(\S+)/.exec(this.$anchor[0].className); 2813 horizontalPosition = horizontalPosition ? horizontalPosition[1] : ''; 2814 var position = horizontalPosition ? horizontalPosition + ' ' + verticalPosition : verticalPosition; 2815 2816 return position; 2817 } 2818 2819 /** 2820 * Adjusts the dropdown panes orientation by adding/removing positioning classes. 2821 * @function 2822 * @private 2823 * @param {String} position - position class to remove. 2824 */ 2825 2826 }, { 2827 key: '_reposition', 2828 value: function _reposition(position) { 2829 this.usedPositions.push(position ? position : 'bottom'); 2830 //default, try switching to opposite side 2831 if (!position && this.usedPositions.indexOf('top') < 0) { 2832 this.$element.addClass('top'); 2833 } else if (position === 'top' && this.usedPositions.indexOf('bottom') < 0) { 2834 this.$element.removeClass(position); 2835 } else if (position === 'left' && this.usedPositions.indexOf('right') < 0) { 2836 this.$element.removeClass(position).addClass('right'); 2837 } else if (position === 'right' && this.usedPositions.indexOf('left') < 0) { 2838 this.$element.removeClass(position).addClass('left'); 2839 } 2840 2841 //if default change didn't work, try bottom or left first 2842 else if (!position && this.usedPositions.indexOf('top') > -1 && this.usedPositions.indexOf('left') < 0) { 2843 this.$element.addClass('left'); 2844 } else if (position === 'top' && this.usedPositions.indexOf('bottom') > -1 && this.usedPositions.indexOf('left') < 0) { 2845 this.$element.removeClass(position).addClass('left'); 2846 } else if (position === 'left' && this.usedPositions.indexOf('right') > -1 && this.usedPositions.indexOf('bottom') < 0) { 2847 this.$element.removeClass(position); 2848 } else if (position === 'right' && this.usedPositions.indexOf('left') > -1 && this.usedPositions.indexOf('bottom') < 0) { 2849 this.$element.removeClass(position); 2850 } 2851 //if nothing cleared, set to bottom 2852 else { 2853 this.$element.removeClass(position); 2854 } 2855 this.classChanged = true; 2856 this.counter--; 2857 } 2858 2859 /** 2860 * Sets the position and orientation of the dropdown pane, checks for c
2860ollisions. 2861 * Recursively calls itself if a collision is detected, with a new position class. 2862 * @function 2863 * @private 2864 */ 2865 2866 }, { 2867 key: '_setPosition', 2868 value: function _setPosition() { 2869 if (this.$anchor.attr('aria-expanded') === 'false') { 2870 return false; 2871 } 2872 var position = this.getPositionClass(), 2873 $eleDims = Foundation.Box.GetDimensions(this.$element), 2874 $anchorDims = Foundation.Box.GetDimensions(this.$anchor), 2875 _this = this, 2876 direction = position === 'left' ? 'left' : position === 'right' ? 'left' : 'top', 2877 param = direction === 'top' ? 'height' : 'width', 2878 offset = param === 'height' ? this.options.vOffset : this.options.hOffset; 2879 2880 if ($eleDims.width >= $eleDims.windowDims.width || !this.counter && !Foundation.Box.ImNotTouchingYou(this.$element, this.$parent)) { 2881 var newWidth = $eleDims.windowDims.width, 2882 parentHOffset = 0; 2883 if (this.$parent) { 2884 var $parentDims = Foundation.Box.GetDimensions(this.$parent), 2885 parentHOffset = $parentDims.offset.left; 2886 if ($parentDims.width < newWidth) { 2887 newWidth = $parentDims.width; 2888 } 2889 } 2890 2891 this.$element.offset(Foundation.Box.GetOffsets(this.$element, this.$anchor, 'center bottom', this.options.vOffset, this.options.hOffset + parentHOffset, true)).css({ 2892 'width': newWidth - this.options.hOffset * 2, 2893 'height': 'auto' 2894 }); 2895 this.classChanged = true; 2896 return false; 2897 } 2898 2899 this.$element.offset(Foundation.Box.GetOffsets(this.$element, this.$anchor, position, this.options.vOffset, this.options.hOffset)); 2900 2901 while (!Foundation.Box.ImNotTouchingYou(this.$element, this.$parent, true) && this.counter) { 2902 this._reposition(position); 2903 this._setPosition(); 2904 } 2905 } 2906 2907 /** 2908 * Adds event listeners to the element utilizing the triggers utility library. 2909 * @function 2910 * @private 2911 */ 2912 2913 }, { 2914 key: '_events', 2915 value: function _events() { 2916 var _this = this; 2917 this.$element.on({ 2918 'open.zf.trigger': this.open.bind(this), 2919 'close.zf.trigger': this.close.bind(this), 2920 'toggle.zf.trigger': this.toggle.bind(this), 2921 'resizeme.zf.trigger': this._setPosition.bind(this) 2922 }); 2923 2924 if (this.options.hover) { 2925 this.$anchor.off('mouseenter.zf.dropdown mouseleave.zf.dropdown').on('mouseenter.zf.dropdown', function () { 2926 var bodyData = $('body').data(); 2927 if (typeof bodyData.whatinput === 'undefined' || bodyData.whatinput === 'mouse') { 2928 clearTimeout(_this.timeout); 2929 _this.timeout = setTimeout(function () { 2930 _this.open(); 2931 _this.$anchor.data('hover', true); 2932 }, _this.options.hoverDelay); 2933 } 2934 }).on('mouseleave.zf.dropdown', function () { 2935 clearTimeout(_this.timeout); 2936 _this.timeout = setTimeout(function () { 2937 _this.close(); 2938 _this.$anchor.data('hover', false); 2939 }, _this.options.hoverDelay); 2940 }); 2941 if (this.options.hoverPane) { 2942 this.$element.off('mouseenter.zf.dropdown mouseleave.zf.dropdown').on('mouseenter.zf.dropdown', function () { 2943 clearTimeout(_this.timeout); 2944 }).on('mouseleave.zf.dropdown', function () { 2945 clearTimeout(_this.timeout); 2946 _this.timeout = setTimeout(function () { 2947 _this.close(); 2948 _this.$anchor.data('hover', false); 2949 }, _this.options.hoverDelay); 2950 }); 2951 } 2952 } 2953 this.$anchor.add(this.$element).on('keydown.zf.dropdown', function (e) { 2954 2955 var $target = $(this), 2956 visibleFocusableElements = Foundation.Keyboard.findFocusable(_this.$element); 2957 2958 Foundation.Keyboard.handleKey(e, 'Dropdown', { 2959 open: function open() { 2960 if ($target.is(_this.$anchor)) { 2961 _this.open(); 2962 _this.$element.attr('tabindex', -1).focus(); 2963 e.preventDefault(); 2964 } 2965 }, 2966 close: function close() { 2967 _this.close(); 2968 _this.$anchor.focus(); 2969 } 2970 }); 2971 }); 2972 } 2973 2974 /** 2975 * Adds an event handler to the body to close any dropdowns on a click. 2976 * @function 2977 * @private 2978 */ 2979 2980 }, {
2981 key: '_addBodyHandler', 2982 value: function _addBodyHandler() { 2983 var $body = $(document.body).not(this.$element), 2984 _this = this; 2985 $body.off('click.zf.dropdown').on('click.zf.dropdown', function (e) { 2986 if (_this.$anchor.is(e.target) || _this.$anchor.find(e.target).length) { 2987 return; 2988 } 2989 if (_this.$element.find(e.target).length) { 2990 return; 2991 } 2992 _this.close(); 2993 $body.off('click.zf.dropdown'); 2994 }); 2995 } 2996 2997 /** 2998 * Opens the dropdown pane, and fires a bubbling event to close other dropdowns. 2999 * @function 3000 * @fires Dropdown#closeme 3001 * @fires Dropdown#show 3002 */ 3003 3004 }, { 3005 key: 'open', 3006 value: function open() { 3007 // var _this = this; 3008 /** 3009 * Fires to close other open dropdowns, typically when dropdown is opening 3010 * @event Dropdown#closeme 3011 */ 3012 this.$element.trigger('closeme.zf.dropdown', this.$element.attr('id')); 3013 this.$anchor.addClass('hover').attr({ 'aria-expanded': true }); 3014 // this.$element/*.show()*/; 3015 this._setPosition(); 3016 this.$element.addClass('is-open').attr({ 'aria-hidden': false }); 3017 3018 if (this.options.autoFocus) { 3019 var $focusable = Foundation.Keyboard.findFocusable(this.$element); 3020 if ($focusable.length) { 3021 $focusable.eq(0).focus(); 3022 } 3023 } 3024 3025 if (this.options.closeOnClick) { 3026 this._addBodyHandler(); 3027 } 3028 3029 if (this.options.trapFocus) { 3030 Foundation.Keyboard.trapFocus(this.$element); 3031 } 3032 3033 /** 3034 * Fires once the dropdown is visible. 3035 * @event Dropdown#show 3036 */ 3037 this.$element.trigger('show.zf.dropdown', [this.$element]); 3038 } 3039 3040 /** 3041 * Closes the open dropdown pane. 3042 * @function 3043 * @fires Dropdown#hide 3044 */ 3045 3046 }, { 3047 key: 'close', 3048 value: function close() { 3049 if (!this.$element.hasClass('is-open')) { 3050 return false; 3051 } 3052 this.$element.removeClass('is-open').attr({ 'aria-hidden': true }); 3053 3054 this.$anchor.removeClass('hover').attr('aria-expanded', false); 3055 3056 if (this.classChanged) { 3057 var curPositionClass = this.getPositionClass(); 3058 if (curPositionClass) { 3059 this.$element.removeClass(curPositionClass); 3060 } 3061 this.$element.addClass(this.options.positionClass) 3062 /*.hide()*/.css({ height: '', width: '' }); 3063 this.classChanged = false; 3064 this.counter = 4; 3065 this.usedPositions.length = 0; 3066 } 3067 /** 3068 * Fires once the dropdown is no longer visible. 3069 * @event Dropdown#hide 3070 */ 3071 this.$element.trigger('hide.zf.dropdown', [this.$element]); 3072 3073 if (this.options.trapFocus) { 3074 Foundation.Keyboard.releaseFocus(this.$element); 3075 } 3076 } 3077 3078 /** 3079 * Toggles the dropdown pane's visibility. 3080 * @function 3081 */ 3082 3083 }, { 3084 key: 'toggle', 3085 value: function toggle() { 3086 if (this.$element.hasClass('is-open')) { 3087 if (this.$anchor.data('hover')) return; 3088 this.close(); 3089 } else { 3090 this.open(); 3091 } 3092 } 3093 3094 /** 3095 * Destroys the dropdown. 3096 * @function 3097 */ 3098 3099 }, { 3100 key: 'destroy', 3101 value: function destroy() { 3102 this.$element.off('.zf.trigger').hide(); 3103 this.$anchor.off('.zf.dropdown'); 3104 3105 Foundation.unregisterPlugin(this); 3106 } 3107 }]); 3108 3109 return Dropdown; 3110 }(); 3111 3112 Dropdown.defaults = { 3113 /** 3114 * Class that designates bounding container of Dropdown (default: window) 3115 * @option 3116 * @type {?string} 3117 * @default null 3118 */ 3119 parentClass: null, 3120 /** 3121 * Amount of time to delay opening a submenu on hover event. 3122 * @option 3123 * @type {number} 3124 * @default 250 3125 */ 3126 hoverDelay: 250, 3127 /** 3128 * Allow submenus to open on hover events 3129 * @option 3130 * @type {boolean} 3131 * @default false 3132 */ 3133 hover: false, 3134 /** 3135 * Don't close dropdown when hovering over dropdown pane 3136 * @option 3137 * @type {boolean} 3138 * @default false 3139 */ 3140 hoverPane: false, 3141 /** 3142 * Number of pixels between the dropdown pane and the triggering element on open. 3143 * @option 3144 * @type {number} 3145 * @default 1 3146 */ 3147 vOffset: 1, 3148 /** 3149 * Number of pixels between the dropdown pane and the triggering element on open. 3150 * @option 3151 * @type {number} 3152 * @default 1 3153 */ 3154 hOffset: 1, 3155 /** 3156 * Class applied to adjust open position. JS will test and fill this in. 3157 * @option 3158 * @type {string} 3159 * @default '' 3160 */ 3161 positionClass: '', 3162 /** 3163 * Allow the plugin to trap focus to the dropdown pane if opened with keyboard commands. 3164 * @option 3165 * @type {boolean} 3166 * @default false 3167 */ 3168 trapFocus: false, 3169 /** 3170 * Allow the plugin to set focus to the first focusable element within the pane, regardless of method of opening. 3171 * @option 3172 * @type {boolean} 3173 * @default false 3174 */ 3175 autoFocus: false, 3176 /** 3177 * Allows a click on the body to close the dropdown. 3178 * @option 3179 * @type {boolean} 3180 * @default false 3181 */ 3182 closeOnClick: false 3183 3184 // Window exports 3185 };Foundation.plugin(Dropdown, 'Dropdown'); 3186}(jQuery); 3187 3188'use strict'; 3189 3190!function ($) { 3191 3192 /** 3193 * DropdownMenu module. 3194 * @module foundation.dropdown-menu 3195 * @requires foundation.util.keyboard 3196 * @requires foundation.util.box 3197 * @requires foundation.util.nest 3198 */ 3199 3200 var DropdownMenu = function () { 3201 /** 3202 * Creates a new instance of DropdownMenu. 3203 * @class 3204 * @fires DropdownMenu#init 3205 * @param {jQuery} element - jQuery object to make into a dropdown menu. 3206 * @param {Object} options - Overrides to the default plugin settings. 3207 */ 3208 function DropdownMenu(element, options) { 3209 _classCallCheck(this, DropdownMenu); 3210 3211 this.$element = element; 3212 this.options = $.extend({}, DropdownMenu.defaults, this.$element.data(), options); 3213 3214 Foundation.Nest.Feather(this.$element, 'dropdown'); 3215 this._init(); 3216 3217 Foundation.registerPlugin(this, 'DropdownMenu'); 3218 Foundation.Keyboard.register('DropdownMenu', { 3219 'ENTER': 'open', 3220 'SPACE': 'open',
3221 'ARROW_RIGHT': 'next', 3222 'ARROW_UP': 'up', 3223 'ARROW_DOWN': 'down', 3224 'ARROW_LEFT': 'previous', 3225 'ESCAPE': 'close' 3226 }); 3227 } 3228 3229 /** 3230 * Initializes the plugin, and calls _prepareMenu 3231 * @private 3232 * @function 3233 */ 3234 3235 3236 _createClass(DropdownMenu, [{ 3237 key: '_init', 3238 value: function _init() { 3239 var subs = this.$element.find('li.is-dropdown-submenu-parent'); 3240 this.$element.children('.is-dropdown-submenu-parent').children('.is-dropdown-submenu').addClass('first-sub'); 3241 3242 this.$menuItems = this.$element.find('[role="menuitem"]'); 3243 this.$tabs = this.$element.children('[role="menuitem"]'); 3244 this.$tabs.find('ul.is-dropdown-submenu').addClass(this.options.verticalClass); 3245 3246 if (this.$element.hasClass(this.options.rightClass) || this.options.alignment === 'right' || Foundation.rtl() || this.$element.parents('.top-bar-right').is('*')) { 3247 this.options.alignment = 'right'; 3248 subs.addClass('opens-left'); 3249 } else { 3250 subs.addClass('opens-right'); 3251 } 3252 this.changed = false; 3253 this._events(); 3254 } 3255 }, { 3256 key: '_isVertical', 3257 value: function _isVertical() { 3258 return this.$tabs.css('display') === 'block'; 3259 } 3260 3261 /** 3262 * Adds event listeners to elements within the menu 3263 * @private 3264 * @function 3265 */ 3266 3267 }, { 3268 key: '_events', 3269 value: function _events() { 3270 var _this = this, 3271 hasTouch = 'ontouchstart' in window || typeof window.ontouchstart !== 'undefined', 3272 parClass = 'is-dropdown-submenu-parent'; 3273 3274 // used for onClick and in the keyboard handlers 3275 var handleClickFn = function handleClickFn(e) { 3276 var $elem = $(e.target).parentsUntil('ul', '.' + parClass), 3277 hasSub = $elem.hasClass(parClass), 3278 hasClicked = $elem.attr('data-is-click') === 'true', 3279 $sub = $elem.children('.is-dropdown-submenu'); 3280 3281 if (hasSub) { 3282 if (hasClicked) { 3283 if (!_this.options.closeOnClick || !_this.options.clickOpen && !hasTouch || _this.options.forceFollow && hasTouch) { 3284 return; 3285 } else { 3286 e.stopImmediatePropagation(); 3287 e.preventDefault(); 3288 _this._hide($elem); 3289 } 3290 } else { 3291 e.preventDefault(); 3292 e.stopImmediatePropagation(); 3293 _this._show($sub); 3294 $elem.add($elem.parentsUntil(_this.$element, '.' + parClass)).attr('data-is-click', true); 3295 } 3296 } 3297 }; 3298 3299 if (this.options.clickOpen || hasTouch) { 3300 this.$menuItems.on('click.zf.dropdownmenu touchstart.zf.dropdownmenu', handleClickFn); 3301 } 3302 3303 // Handle Leaf element Clicks 3304 if (_this.options.closeOnClickInside) { 3305 this.$menuItems.on('click.zf.dropdownmenu', function (e) { 3306 var $elem = $(this), 3307 hasSub = $elem.hasClass(parClass); 3308 if (!hasSub) { 3309 _this._hide(); 3310 } 3311 }); 3312 } 3313 3314 if (!this.options.disableHover) { 3315 this.$menuItems.on('mouseenter.zf.dropdownmenu', function (e) { 3316 var $elem = $(this), 3317 hasSub = $elem.hasClass(parClass); 3318 3319 if (hasSub) { 3320 clearTimeout($elem.data('_delay')); 3321 $elem.data('_delay', setTimeout(function () { 3322 _this._show($elem.children('.is-dropdown-submenu')); 3323 }, _this.options.hoverDelay)); 3324 } 3325 }).on('mouseleave.zf.dropdownmenu', function (e) { 3326 var $elem = $(this), 3327 hasSub = $elem.hasClass(parClass); 3328 if (hasSub && _this.options.autoclose) { 3329 if ($elem.attr('data-is-click') === 'true' && _this.options.clickOpen) { 3330 return false; 3331 } 3332 3333 clearTimeout($elem.data('_delay')); 3334 $elem.data('_delay', setTimeout(function () { 3335 _this._hide($elem); 3336 }, _this.options.closingTime)); 3337 } 3338 }); 3339 } 3340 this.$menuItems.on('keydown.zf.dropdownmenu', function (e) { 3341 var $element = $(e.target).parentsUntil('ul', '[role="menuitem"]'), 3342 isTab = _this.$tabs.index($element) > -1, 3343 $elements = isTab ? _this.$tabs : $element.siblings('li').add($element), 3344 $prevElement, 3345 $nextElement; 3346 3347 $elements.each(function (i) { 3348 if ($(this).is($element)) { 3349 $prevElement = $elements.eq(i - 1); 3350 $nextElement = $elements.eq(i + 1); 3351 return; 3352 } 3353 }); 3354 3355 var nextSibling = function nextSibling() { 3356 if (!$element.is(':last-child')) { 3357 $nextElement.children('a:first').focus(); 3358 e.preventDefault(); 3359 } 3360 }, 3361 prevSibling = function prevSibling() { 3362 $prevElement.children('a:first').focus(); 3363 e.preventDefault(); 3364 }, 3365 openSub = function openSub() {
3366 var $sub = $element.children('ul.is-dropdown-submenu'); 3367 if ($sub.length) { 3368 _this._show($sub); 3369 $element.find('li > a:first').focus(); 3370 e.preventDefault(); 3371 } else { 3372 return; 3373 } 3374 }, 3375 closeSub = function closeSub() { 3376 //if ($element.is(':first-child')) { 3377 var close = $element.parent('ul').parent('li'); 3378 close.children('a:first').focus(); 3379 _this._hide(close); 3380 e.preventDefault(); 3381 //} 3382 }; 3383 var functions = { 3384 open: openSub, 3385 close: function close() { 3386 _this._hide(_this.$element); 3387 _this.$menuItems.find('a:first').focus(); // focus to first element 3388 e.preventDefault(); 3389 }, 3390 handled: function handled() { 3391 e.stopImmediatePropagation(); 3392 } 3393 }; 3394 3395 if (isTab) { 3396 if (_this._isVertical()) { 3397 // vertical menu 3398 if (Foundation.rtl()) { 3399 // right aligned 3400 $.extend(functions, { 3401 down: nextSibling, 3402 up: prevSibling, 3403 next: closeSub, 3404 previous: openSub 3405 }); 3406 } else { 3407 // left aligned 3408 $.extend(functions, { 3409 down: nextSibling, 3410 up: prevSibling, 3411 next: openSub, 3412 previous: closeSub 3413 }); 3414 } 3415 } else { 3416 // horizontal menu 3417 if (Foundation.rtl()) { 3418 // right aligned 3419 $.extend(functions, { 3420 next: prevSibling, 3421 previous: nextSibling, 3422 down: openSub, 3423 up: closeSub 3424 }); 3425 } else { 3426 // left aligned 3427 $.extend(functions, { 3428 next: nextSibling, 3429 previous: prevSibling, 3430 down: openSub, 3431 up: closeSub 3432 }); 3433 } 3434 } 3435 } else { 3436 // not tabs -> one sub 3437 if (Foundation.rtl()) { 3438 // right aligned 3439 $.extend(functions, { 3440 next: closeSub, 3441 previous: openSub, 3442 down: nextSibling, 3443 up: prevSibling 3444 }); 3445 } else { 3446 // left aligned 3447 $.extend(functions, { 3448 next: openSub, 3449 previous: closeSub, 3450 down: nextSibling, 3451 up: prevSibling 3452 }); 3453 } 3454 } 3455 Foundation.Keyboard.handleKey(e, 'DropdownMenu', functions); 3456 }); 3457 } 3458 3459 /** 3460 * Adds an event handler to the body to close any dropdowns on a click. 3461 * @function 3462 * @private 3463 */ 3464 3465 }, { 3466 key: '_addBodyHandler', 3467 value: function _addBodyHandler() { 3468 var $body = $(document.body), 3469 _this = this; 3470 $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu').on('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu', function (e) { 3471 var $link = _this.$element.find(e.target); 3472 if ($link.length) { 3473 return; 3474 } 3475 3476 _this._hide(); 3477 $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu'); 3478 }); 3479 } 3480 3481 /** 3482 * Opens a dropdown pane, and checks for collisions first. 3483 * @param {jQuery} $sub - ul element that is a submenu to show 3484 * @function 3485 * @private 3486 * @fires DropdownMenu#show 3487 */ 3488 3489 }, { 3490 key: '_show', 3491 value: function _show($sub) { 3492 var idx = this.$tabs.index(this.$tabs.filter(function (i, el) { 3493 return $(el).find($sub).length > 0; 3494 })); 3495 var $sibs = $sub.parent('li.is-dropdown-submenu-parent').siblings('li.is-dropdown-submenu-parent'); 3496 this._hide($sibs, idx); 3497 $sub.css('visibility', 'hidden').addClass('js-dropdown-active').parent('li.is-dropdown-submenu-parent').addClass('is-active'); 3498 var clear = Foundation.Box.ImNotTouchingYou($sub, null, true); 3499 if (!clear) { 3500 var oldClass = this.options.alignment === 'left' ? '-right' : '-left', 3501 $parentLi = $sub.parent('.is-dropdown-submenu-parent'); 3502 $parentLi.removeClass('opens' + oldClass).addClass('opens-' + this.options.alignment); 3503 clear = Foundation.Box.ImNotTouchingYou($sub, null, true); 3504 if (!clear) { 3505 $parentLi.removeClass('opens-' + this.options.alignment).addClass('opens-inner'); 3506 } 3507 this.changed = true; 3508 } 3509 $sub.css('visibility', ''); 3510 if (this.options.closeOnClick) { 3511 this._addBodyHandler(); 3512 } 3513 /** 3514 * Fires when the new dropdown pane is visible. 3515 * @event DropdownMenu#show 3516 */ 3517 this.$element.trigger('show.zf.dropdownmenu', [$sub]); 3518 } 3519 3520 /** 3521 * Hides a single, currently open dropdown pane, if passed a parameter, otherwise, hides everything. 3522 * @function 3523 * @param {jQuery} $elem - element with a submenu to hide 3524 * @param {Number} idx - index of the $tabs collection to hide 3525 * @private 3526 */ 3527 3528 }, {
3529 key: '_hide', 3530 value: function _hide($elem, idx) { 3531 var $toClose; 3532 if ($elem && $elem.length) { 3533 $toClose = $elem; 3534 } else if (idx !== undefined) { 3535 $toClose = this.$tabs.not(function (i, el) { 3536 return i === idx; 3537 }); 3538 } else { 3539 $toClose = this.$element; 3540 } 3541 var somethingToClose = $toClose.hasClass('is-active') || $toClose.find('.is-active').length > 0; 3542 3543 if (somethingToClose) { 3544 $toClose.find('li.is-active').add($toClose).attr({ 3545 'data-is-click': false 3546 }).removeClass('is-active'); 3547 3548 $toClose.find('ul.js-dropdown-active').removeClass('js-dropdown-active'); 3549 3550 if (this.changed || $toClose.find('opens-inner').length) { 3551 var oldClass = this.options.alignment === 'left' ? 'right' : 'left'; 3552 $toClose.find('li.is-dropdown-submenu-parent').add($toClose).removeClass('opens-inner opens-' + this.options.alignment).addClass('opens-' + oldClass); 3553 this.changed = false; 3554 } 3555 /** 3556 * Fires when the open menus are closed. 3557 * @event DropdownMenu#hide 3558 */ 3559 this.$element.trigger('hide.zf.dropdownmenu', [$toClose]); 3560 } 3561 } 3562 3563 /** 3564 * Destroys the plugin. 3565 * @function 3566 */ 3567 3568 }, { 3569 key: 'destroy', 3570 value: function destroy() { 3571 this.$menuItems.off('.zf.dropdownmenu').removeAttr('data-is-click').removeClass('is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner'); 3572 $(document.body).off('.zf.dropdownmenu'); 3573 Foundation.Nest.Burn(this.$element, 'dropdown'); 3574 Foundation.unregisterPlugin(this); 3575 } 3576 }]); 3577 3578 return DropdownMenu; 3579 }(); 3580 3581 /** 3582 * Default settings for plugin 3583 */ 3584 3585 3586 DropdownMenu.defaults = { 3587 /** 3588 * Disallows hover events from opening submenus 3589 * @option 3590 * @type {boolean} 3591 * @default false 3592 */ 3593 disableHover: false, 3594 /** 3595 * Allow a submenu to automatically close on a mouseleave event, if not clicked open. 3596 * @option 3597 * @type {boolean} 3598 * @default true 3599 */ 3600 autoclose: true, 3601 /** 3602 * Amount of time to delay opening a submenu on hover event. 3603 * @option 3604 * @type {number} 3605 * @default 50 3606 */ 3607 hoverDelay: 50, 3608 /** 3609 * Allow a submenu to open/remain open on parent click event. Allows cursor to move away from menu. 3610 * @option 3611 * @type {boolean} 3612 * @default false 3613 */ 3614 clickOpen: false, 3615 /** 3616 * Amount of time to delay closing a submenu on a mouseleave event. 3617 * @option 3618 * @type {number} 3619 * @default 500 3620 */ 3621 3622 closingTime: 500, 3623 /** 3624 * Position of the menu relative to what direction the submenus should open. Handled by JS. Can be `'left'` or `'right'`. 3625 * @option 3626 * @type {string} 3627 * @default 'left' 3628 */ 3629 alignment: 'left', 3630 /** 3631 * Allow clicks on the body to close any open submenus. 3632 * @option 3633 * @type {boolean} 3634 * @default true 3635 */ 3636 closeOnClick: true, 3637 /** 3638 * Allow clicks on leaf anchor links to close any open submenus. 3639 * @option 3640 * @type {boolean} 3641 * @default true 3642 */ 3643 closeOnClickInside: true, 3644 /** 3645 * Class applied to vertical oriented menus, Foundation default is `vertical`. Update this if using your own class. 3646 * @option 3647 * @type {string} 3648 * @default 'vertical' 3649 */ 3650 verticalClass: 'vertical', 3651 /** 3652 * Class applied to right-side oriented menus, Foundation default is `align-right`. Update this if using your own class. 3653 * @option 3654 * @type {string} 3655 * @default 'align-right' 3656 */ 3657 rightClass: 'align-right', 3658 /** 3659 * Boolean to force overide the clicking of links to perform default action, on second touch event for mobile. 3660 * @option 3661 * @type {boolean} 3662 * @default true 3663 */ 3664 forceFollow: true 3665 }; 3666 3667 // Window exports 3668 Foundation.plugin(DropdownMenu, 'DropdownMenu'); 3669}(jQuery); 3670 3671'use strict'; 3672 3673!function ($) { 3674 3675 /** 3676 * ResponsiveMenu module. 3677 * @module foundation.responsiveMenu 3678 * @requires foundation.util.triggers 3679 * @requires foundation.util.mediaQuery 3680 */ 3681 3682 var ResponsiveMenu = function () { 3683 /** 3684 * Creates a new instance of a responsive menu. 3685 * @class 3686 * @fires ResponsiveMenu#init 3687 * @param {jQuery} element - jQuery object to make into a dropdown menu. 3688 * @param {Object} options - Overrides to the default plugin settings. 3689 */ 3690 function ResponsiveMenu(element, options) { 3691 _classCallCheck(this, ResponsiveMenu); 3692 3693 this.$element = $(element); 3694 this.rules = this.$element.data('responsive-menu'); 3695 this.currentMq = null; 3696 this.currentPlugin = null; 3697 3698 this._init(); 3699 this._events(); 3700 3701 Foundation.registerPlugin(this, 'ResponsiveMenu'); 3702 } 3703 3704 /** 3705 * Initializes the Menu by parsing the classes from the 'data-ResponsiveMenu' attribute on the element. 3706 * @function 3707 * @private 3708 */ 3709 3710 3711 _createClass(ResponsiveMenu, [{ 3712 key: '_init', 3713 value: function _init() { 3714 // The first time an Interchange plugin is initialized, this.rules is converted from a string of "classes" to an object of rules 3715 if (typeof this.rules === 'string') { 3716 var rulesTree = {}; 3717 3718 // Parse rules from "classes" pulled from data attribute 3719 var rules = this.rules.split(' '); 3720 3721 // Iterate through every rule found 3722 for (var i = 0; i < rules.length; i++) { 3723 var rule = rules[i].split('-'); 3724 var ruleSize = rule.length > 1 ? rule[0] : 'small'; 3725 var rulePlugin = rule.length > 1 ? rule[1] : rule[0]; 3726 3727 if (MenuPlugins[rulePlugin] !== null) { 3728 rulesTree[ruleSize] = MenuPlugins[rulePlugin]; 3729 } 3730 } 3731 3732 this.rules = rulesTree; 3733 } 3734 3735 if (!$.isEmptyObject(this.rules)) { 3736 this._checkMediaQueries(); 3737 } 3738 // Add data-mutate since children may need it. 3739 this.$element.attr('data-mutate', this.$element.attr('data-mutate') || Foundation.GetYoDigits(6, 'responsive-menu')); 3740 } 3741 3742 /** 3743 * Initializes events for the Menu. 3744 * @function 3745 * @private 3746 */ 3747 3748 }, {
3749 key: '_events', 3750 value: function _events() { 3751 var _this = this; 3752 3753 $(window).on('changed.zf.mediaquery', function () { 3754 _this._checkMediaQueries(); 3755 }); 3756 // $(window).on('resize.zf.ResponsiveMenu', function() { 3757 // _this._checkMediaQueries(); 3758 // }); 3759 } 3760 3761 /** 3762 * Checks the current screen width against available media queries. If the media query has changed, and the plugin needed has changed, the plugins will swap out. 3763 * @function 3764 * @private 3765 */ 3766 3767 }, { 3768 key: '_checkMediaQueries', 3769 value: function _checkMediaQueries() { 3770 var matchedMq, 3771 _this = this; 3772 // Iterate through each rule and find the last matching rule 3773 $.each(this.rules, function (key) { 3774 if (Foundation.MediaQuery.atLeast(key)) { 3775 matchedMq = key; 3776 } 3777 }); 3778 3779 // No match? No dice 3780 if (!matchedMq) return; 3781 3782 // Plugin already initialized? We good 3783 if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return; 3784 3785 // Remove existing plugin-specific CSS classes 3786 $.each(MenuPlugins, function (key, value) { 3787 _this.$element.removeClass(value.cssClass); 3788 }); 3789 3790 // Add the CSS class for the new plugin 3791 this.$element.addClass(this.rules[matchedMq].cssClass); 3792 3793 // Create an instance of the new plugin 3794 if (this.currentPlugin) this.currentPlugin.destroy(); 3795 this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {}); 3796 } 3797 3798 /** 3799 * Destroys the instance of the current plugin on this element, as well as the window resize handler that switches the plugins out. 3800 * @function 3801 */ 3802 3803 }, { 3804 key: 'destroy', 3805 value: function destroy() { 3806 this.currentPlugin.destroy(); 3807 $(window).off('.zf.ResponsiveMenu'); 3808 Foundation.unregisterPlugin(this); 3809 } 3810 }]); 3811 3812 return ResponsiveMenu; 3813 }(); 3814 3815 ResponsiveMenu.defaults = {}; 3816 3817 // The plugin matches the plugin classes with these plugin instances. 3818 var MenuPlugins = { 3819 dropdown: { 3820 cssClass: 'dropdown', 3821 plugin: Foundation._plugins['dropdown-menu'] || null 3822 }, 3823 drilldown: { 3824 cssClass: 'drilldown', 3825 plugin: Foundation._plugins['drilldown'] || null 3826 }, 3827 accordion: { 3828 cssClass: 'accordion-menu', 3829 plugin: Foundation._plugins['accordion-menu'] || null 3830 } 3831 }; 3832 3833 // Window exports 3834 Foundation.plugin(ResponsiveMenu, 'ResponsiveMenu'); 3835}(jQuery); 3836 3837'use strict'; 3838 3839!function ($) { 3840 3841 /** 3842 * ResponsiveToggle module. 3843 * @module foundation.responsiveToggle 3844 * @requires foundation.util.mediaQuery 3845 */ 3846 3847 var ResponsiveToggle = function () { 3848 /** 3849 * Creates a new instance of Tab Bar. 3850 * @class 3851 * @fires ResponsiveToggle#init 3852 * @param {jQuery} element - jQuery object to attach tab bar functionality to. 3853 * @param {Object} options - Overrides to the default plugin settings. 3854 */ 3855 function ResponsiveToggle(element, options) { 3856 _classCallCheck(this, ResponsiveToggle); 3857 3858 this.$element = $(element); 3859 this.options = $.extend({}, ResponsiveToggle.defaults, this.$element.data(), options); 3860 3861 this._init(); 3862 this._events(); 3863 3864 Foundation.registerPlugin(this, 'ResponsiveToggle'); 3865 } 3866 3867 /** 3868 * Initializes the tab bar by finding the target element, toggling element, and running update(). 3869 * @function 3870 * @private 3871 */ 3872 3873 3874 _createClass(ResponsiveToggle, [{ 3875 key: '_init', 3876 value: function _init() { 3877 var targetID = this.$element.data('responsive-toggle'); 3878 if (!targetID) { 3879 console.error('Your tab bar needs an ID of a Menu as the value of data-tab-bar.'); 3880 } 3881 3882 this.$targetMenu = $('#' + targetID); 3883 this.$toggler = this.$element.find('[data-toggle]').filter(function () { 3884 var target = $(this).data('toggle'); 3885 return target === targetID || target === ""; 3886 }); 3887 this.options = $.extend({}, this.options, this.$targetMenu.data()); 3888 3889 // If they were set, parse the animation classes 3890 if (this.options.animate) { 3891 var input = this.options.animate.split(' '); 3892 3893 this.animationIn = input[0]; 3894 this.animationOut = input[1] || null; 3895 } 3896 3897 this._update(); 3898 } 3899 3900 /** 3901 * Adds necessary event handlers for the tab bar to work. 3902 * @function 3903 * @private 3904 */ 3905 3906 }, {
3907 key: '_events', 3908 value: function _events() { 3909 var _this = this; 3910 3911 this._updateMqHandler = this._update.bind(this); 3912 3913 $(window).on('changed.zf.mediaquery', this._updateMqHandler); 3914 3915 this.$toggler.on('click.zf.responsiveToggle', this.toggleMenu.bind(this)); 3916 } 3917 3918 /** 3919 * Checks the current media query to determine if the tab bar should be visible or hidden. 3920 * @function 3921 * @private 3922 */ 3923 3924 }, { 3925 key: '_update', 3926 value: function _update() { 3927 // Mobile 3928 if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) { 3929 this.$element.show(); 3930 this.$targetMenu.hide(); 3931 } 3932 3933 // Desktop 3934 else { 3935 this.$element.hide(); 3936 this.$targetMenu.show(); 3937 } 3938 } 3939 3940 /** 3941 * Toggles the element attached to the tab bar. The toggle only happens if the screen is small enough to allow it. 3942 * @function 3943 * @fires ResponsiveToggle#toggled 3944 */ 3945 3946 }, { 3947 key: 'toggleMenu', 3948 value: function toggleMenu() { 3949 var _this5 = this; 3950 3951 if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) { 3952 /** 3953 * Fires when the element attached to the tab bar toggles. 3954 * @event ResponsiveToggle#toggled 3955 */ 3956 if (this.options.animate) { 3957 if (this.$targetMenu.is(':hidden')) { 3958 Foundation.Motion.animateIn(this.$targetMenu, this.animationIn, function () { 3959 _this5.$element.trigger('toggled.zf.responsiveToggle'); 3960 _this5.$targetMenu.find('[data-mutate]').triggerHandler('mutateme.zf.trigger'); 3961 }); 3962 } else { 3963 Foundation.Motion.animateOut(this.$targetMenu, this.animationOut, function () { 3964 _this5.$element.trigger('toggled.zf.responsiveToggle'); 3965 }); 3966 } 3967 } else { 3968 this.$targetMenu.toggle(0); 3969 this.$targetMenu.find('[data-mutate]').trigger('mutateme.zf.trigger'); 3970 this.$element.trigger('toggled.zf.responsiveToggle'); 3971 } 3972 } 3973 } 3974 }, { 3975 key: 'destroy', 3976 value: function destroy() { 3977 this.$element.off('.zf.responsiveToggle'); 3978 this.$toggler.off('.zf.responsiveToggle'); 3979 3980 $(window).off('changed.zf.mediaquery', this._updateMqHandler); 3981 3982 Foundation.unregisterPlugin(this); 3983 } 3984 }]); 3985 3986 return ResponsiveToggle; 3987 }(); 3988 3989 ResponsiveToggle.defaults = { 3990 /** 3991 * The breakpoint after which the menu is always shown, and the tab bar is hidden. 3992 * @option 3993 * @type {string} 3994 * @default 'medium' 3995 */ 3996 hideFor: 'medium', 3997 3998 /** 3999 * To decide if the toggle should be animated or not. 4000 * @option 4001 * @type {boolean} 4002 * @default false 4003 */ 4004 animate: false 4005 }; 4006 4007 // Window exports 4008 Foundation.plugin(ResponsiveToggle, 'ResponsiveToggle'); 4009}(jQuery); 4010 4011'use strict'; 4012 4013!function ($) { 4014 4015 /** 4016 * Reveal module. 4017 * @module foundation.reveal 4018 * @requires foundation.util.keyboard 4019 * @requires foundation.util.box 4020 * @requires foundation.util.triggers 4021 * @requires foundation.util.mediaQuery 4022 * @requires foundation.util.motion if using animations 4023 */ 4024 4025 var Reveal = function () { 4026 /** 4027 * Creates a new instance of Reveal. 4028 * @class 4029 * @param {jQuery} element - jQuery object to use for the modal. 4030 * @param {Object} options - optional parameters. 4031 */ 4032 function Reveal(element, options) { 4033 _classCallCheck(this, Reveal); 4034 4035 this.$element = element; 4036 this.options = $.extend({}, Reveal.defaults, this.$element.data(), options); 4037 this._init(); 4038 4039 Foundation.registerPlugin(this, 'Reveal'); 4040 Foundation.Keyboard.register('Reveal', { 4041 'ENTER': 'open', 4042 'SPACE': 'open', 4043 'ESCAPE': 'close' 4044 }); 4045 } 4046 4047 /** 4048 * Initializes the modal by adding the overlay and close buttons, (if selected). 4049 * @private 4050 */ 4051 4052 4053 _createClass(Reveal, [{ 4054 key: '_init', 4055 value: function _init() { 4056 this.id = this.$element.attr('id'); 4057 this.isActive = false;
4058 this.cached = { mq: Foundation.MediaQuery.current }; 4059 this.isMobile = mobileSniff(); 4060 4061 this.$anchor = $('[data-open="' + this.id + '"]').length ? $('[data-open="' + this.id + '"]') : $('[data-toggle="' + this.id + '"]'); 4062 this.$anchor.attr({ 4063 'aria-controls': this.id, 4064 'aria-haspopup': true, 4065 'tabindex': 0 4066 }); 4067 4068 if (this.options.fullScreen || this.$element.hasClass('full')) { 4069 this.options.fullScreen = true; 4070 this.options.overlay = false; 4071 } 4072 if (this.options.overlay && !this.$overlay) { 4073 this.$overlay = this._makeOverlay(this.id); 4074 } 4075 4076 this.$element.attr({ 4077 'role': 'dialog', 4078 'aria-hidden': true, 4079 'data-yeti-box': this.id, 4080 'data-resize': this.id 4081 }); 4082 4083 if (this.$overlay) { 4084 this.$element.detach().appendTo(this.$overlay); 4085 } else { 4086 this.$element.detach().appendTo($(this.options.appendTo)); 4087 this.$element.addClass('without-overlay'); 4088 } 4089 this._events(); 4090 if (this.options.deepLink && window.location.hash === '#' + this.id) { 4091 $(window).one('load.zf.reveal', this.open.bind(this)); 4092 } 4093 } 4094 4095 /** 4096 * Creates an overlay div to display behind the modal. 4097 * @private 4098 */ 4099 4100 }, { 4101 key: '_makeOverlay', 4102 value: function _makeOverlay() { 4103 return $('<div></div>').addClass('reveal-overlay').appendTo(this.options.appendTo); 4104 } 4105 4106 /** 4107 * Updates position of modal 4108 * TODO: Figure out if we actually need to cache these values or if it doesn't matter 4109 * @private 4110 */ 4111 4112 }, { 4113 key: '_updatePosition', 4114 value: function _updatePosition() { 4115 var width = this.$element.outerWidth(); 4116 var outerWidth = $(window).width(); 4117 var height = this.$element.outerHeight(); 4118 var outerHeight = $(window).height(); 4119 var left, top; 4120 if (this.options.hOffset === 'auto') { 4121 left = parseInt((outerWidth - width) / 2, 10); 4122 } else { 4123 left = parseInt(this.options.hOffset, 10); 4124 } 4125 if (this.options.vOffset === 'auto') { 4126 if (height > outerHeight) { 4127 top = parseInt(Math.min(100, outerHeight / 10), 10); 4128 } else { 4129 top = parseInt((outerHeight - height) / 4, 10); 4130 } 4131 } else { 4132 top = parseInt(this.options.vOffset, 10); 4133 } 4134 this.$element.css({ top: top + 'px' }); 4135 // only worry about left if we don't have an overlay or we havea horizontal offset, 4136 // otherwise we're perfectly in the middle 4137 if (!this.$overlay || this.options.hOffset !== 'auto') { 4138 this.$element.css({ left: left + 'px' }); 4139 this.$element.css({ margin: '0px' }); 4140 } 4141 } 4142 4143 /** 4144 * Adds event handlers for the modal. 4145 * @private 4146 */ 4147 4148 }, { 4149 key: '_events', 4150 value: function _events() { 4151 var _this6 = this; 4152 4153 var _this = this; 4154 4155 this.$element.on({ 4156 'open.zf.trigger': this.open.bind(this), 4157 'close.zf.trigger': function closeZfTrigger(event, $element) { 4158 if (event.target === _this.$element[0] || $(event.target).parents('[data-closable]')[0] === $element) { 4159 // only close reveal when it's explicitly called 4160 return _this6.close.apply(_this6); 4161 } 4162 }, 4163 'toggle.zf.trigger': this.toggle.bind(this), 4164 'resizeme.zf.trigger': function resizemeZfTrigger() { 4165 _this._updatePosition(); 4166 } 4167 }); 4168 4169 if (this.$anchor.length) { 4170 this.$anchor.on('keydown.zf.reveal', function (e) { 4171 if (e.which === 13 || e.which === 32) { 4172 e.stopPropagation(); 4173 e.preventDefault(); 4174 _this.open(); 4175 } 4176 }); 4177 } 4178 4179 if (this.options.closeOnClick && this.options.overlay) { 4180 this.$overlay.off('.zf.reveal').on('click.zf.reveal', function (e) { 4181 if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target) || !$.contains(document, e.target)) { 4182 return; 4183 } 4184 _this.close(); 4185 }); 4186 } 4187 if (this.options.deepLink) { 4188 $(window).on('popstate.zf.reveal:' + this.id, this._handleState.bind(this)); 4189 } 4190 } 4191 4192 /** 4193 * Handles modal methods on back/forward button clicks or any other event that triggers popstate. 4194 * @private 4195 */ 4196 4197 }, {
4198 key: '_handleState', 4199 value: function _handleState(e) { 4200 if (window.location.hash === '#' + this.id && !this.isActive) { 4201 this.open(); 4202 } else { 4203 this.close(); 4204 } 4205 } 4206 4207 /** 4208 * Opens the modal controlled by `this.$anchor`, and closes all others by default. 4209 * @function 4210 * @fires Reveal#closeme 4211 * @fires Reveal#open 4212 */ 4213 4214 }, { 4215 key: 'open', 4216 value: function open() { 4217 var _this7 = this; 4218 4219 if (this.options.deepLink) { 4220 var hash = '#' + this.id; 4221 4222 if (window.history.pushState) { 4223 window.history.pushState(null, null, hash); 4224 } else { 4225 window.location.hash = hash; 4226 } 4227 } 4228 4229 this.isActive = true; 4230 4231 // Make elements invisible, but remove display: none so we can get size and positioning 4232 this.$element.css({ 'visibility': 'hidden' }).show().scrollTop(0); 4233 if (this.options.overlay) { 4234 this.$overlay.css({ 'visibility': 'hidden' }).show(); 4235 } 4236 4237 this._updatePosition(); 4238 4239 this.$element.hide().css({ 'visibility': '' }); 4240 4241 if (this.$overlay) { 4242 this.$overlay.css({ 'visibility': '' }).hide(); 4243 if (this.$element.hasClass('fast')) { 4244 this.$overlay.addClass('fast'); 4245 } else if (this.$element.hasClass('slow')) { 4246 this.$overlay.addClass('slow'); 4247 } 4248 } 4249 4250 if (!this.options.multipleOpened) { 4251 /** 4252 * Fires immediately before the modal opens. 4253 * Closes any other modals that are currently open 4254 * @event Reveal#closeme 4255 */ 4256 this.$element.trigger('closeme.zf.reveal', this.id); 4257 } 4258 4259 var _this = this; 4260 4261 function addRevealOpenClasses() { 4262 if (_this.isMobile) { 4263 if (!_this.originalScrollPos) { 4264 _this.originalScrollPos = window.pageYOffset; 4265 } 4266 $('html, body').addClass('is-reveal-open'); 4267 } else { 4268 $('body').addClass('is-reveal-open'); 4269 } 4270 } 4271 // Motion UI method of reveal 4272 if (this.options.animationIn) { 4273 var afterAnimation = function afterAnimation() { 4274 _this.$element.attr({ 4275 'aria-hidden': false, 4276 'tabindex': -1 4277 }).focus(); 4278 addRevealOpenClasses(); 4279 Foundation.Keyboard.trapFocus(_this.$element); 4280 }; 4281 4282 if (this.options.overlay) { 4283 Foundation.Motion.animateIn(this.$overlay, 'fade-in'); 4284 } 4285 Foundation.Motion.animateIn(this.$element, this.options.animationIn, function () { 4286 if (_this7.$element) { 4287 // protect against object having been removed 4288 _this7.focusableElements = Foundation.Keyboard.findFocusable(_this7.$element); 4289 afterAnimation(); 4290 } 4291 }); 4292 } 4293 // jQuery method of reveal 4294 else { 4295 if (this.options.overlay) { 4296 this.$overlay.show(0); 4297 } 4298 this.$element.show(this.options.showDelay); 4299 } 4300 4301 // handle accessibility 4302 this.$element.attr({ 4303 'aria-hidden': false, 4304 'tabindex': -1 4305 }).focus(); 4306 Foundation.Keyboard.trapFocus(this.$element); 4307 4308 /** 4309 * Fires when the modal has successfully opened. 4310 * @event Reveal#open 4311 */ 4312 this.$element.trigger('open.zf.reveal'); 4313 4314 addRevealOpenClasses(); 4315 4316 setTimeout(function () { 4317 _this7._extraHandlers(); 4318 }, 0); 4319 } 4320 4321 /** 4322 * Adds extra event handlers for the body and window if necessary. 4323 * @private 4324 */ 4325 4326 }, { 4327 key: '_extraHandlers', 4328 value: function _extraHandlers() { 4329 var _this = this; 4330 if (!this.$element) { 4331 return; 4332 } // If we're in the middle of cleanup, don't freak out 4333 this.focusableElements = Foundation.Keyboard.findFocusable(this.$element); 4334 4335 if (!this.options.overlay && this.options.closeOnClick && !this.options.fullScreen) { 4336 $('body').on('click.zf.reveal', function (e) { 4337 if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target) || !$.contains(document, e.target)) { 4338 return; 4339 } 4340 _this.close(); 4341 }); 4342 } 4343 4344 if (this.options.closeOnEsc) { 4345 $(window).on('keydown.zf.reveal', function (e) { 4346 Foundation.Keyboard.handleKey(e, 'Reveal', { 4347 close: function close() { 4348 if (_this.options.closeOnEsc) { 4349 _this.close(); 4350 _this.$anchor.focus(); 4351 } 4352 } 4353 }); 4354 }); 4355 } 4356 4357 // lock focus within modal while tabbing 4358 this.$element.on('keydown.zf.reveal', function (e) { 4359 var $target = $(this); 4360 // handle keyboard event with keyboard util 4361 Foundation.Keyboard.handleKey(e, 'Reveal', { 4362 open: function open() { 4363 if (_this.$element.find(':focus').is(_this.$element.find('[data-close]'))) { 4364 setTimeout(function () { 4365 // set focus back to anchor if close button has been activated 4366 _this.$anchor.focus(); 4367 }, 1); 4368 } else if ($target.is(_this.focusableElements)) { 4369 // dont't trigger if acual element has focus (i.e. inputs, links, ...) 4370 _this.open(); 4371 } 4372 }, 4373 close: function close() { 4374 if (_this.options.closeOnEsc) { 4375 _this.close(); 4376 _this.$anchor.focus(); 4377 } 4378 }, 4379 handled: function handled(preventDefault) { 4380 if (preventDefault) { 4381 e.preventDefault(); 4382 } 4383 } 4384 }); 4385 }); 4386 } 4387 4388 /** 4389 * Closes the modal. 4390 * @function 4391 * @fires Reveal#closed 4392 */ 4393 4394 }, {
4395 key: 'close', 4396 value: function close() { 4397 if (!this.isActive || !this.$element.is(':visible')) { 4398 return false; 4399 } 4400 var _this = this; 4401 4402 // Motion UI method of hiding 4403 if (this.options.animationOut) { 4404 if (this.options.overlay) { 4405 Foundation.Motion.animateOut(this.$overlay, 'fade-out', finishUp); 4406 } else { 4407 finishUp(); 4408 } 4409 4410 Foundation.Motion.animateOut(this.$element, this.options.animationOut); 4411 } 4412 // jQuery method of hiding 4413 else { 4414 4415 this.$element.hide(this.options.hideDelay); 4416 4417 if (this.options.overlay) { 4418 this.$overlay.hide(0, finishUp); 4419 } else { 4420 finishUp(); 4421 } 4422 } 4423 4424 // Conditionals to remove extra event listeners added on open 4425 if (this.options.closeOnEsc) { 4426 $(window).off('keydown.zf.reveal'); 4427 } 4428 4429 if (!this.options.overlay && this.options.closeOnClick) { 4430 $('body').off('click.zf.reveal'); 4431 } 4432 4433 this.$element.off('keydown.zf.reveal'); 4434 4435 function finishUp() { 4436 if (_this.isMobile) { 4437 if ($('.reveal:visible').length === 0) { 4438 $('html, body').removeClass('is-reveal-open'); 4439 } 4440 if (_this.originalScrollPos) { 4441 $('body').scrollTop(_this.originalScrollPos); 4442 _this.originalScrollPos = null; 4443 } 4444 } else { 4445 if ($('.reveal:visible').length === 0) { 4446 $('body').removeClass('is-reveal-open'); 4447 } 4448 } 4449 4450 Foundation.Keyboard.releaseFocus(_this.$element); 4451 4452 _this.$element.attr('aria-hidden', true); 4453 4454 /** 4455 * Fires when the modal is done closing. 4456 * @event Reveal#closed 4457 */ 4458 _this.$element.trigger('closed.zf.reveal'); 4459 } 4460 4461 /** 4462 * Resets the modal content 4463 * This prevents a running video to keep going in the background 4464 */ 4465 if (this.options.resetOnClose) { 4466 this.$element.html(this.$element.html()); 4467 } 4468 4469 this.isActive = false; 4470 if (_this.options.deepLink) { 4471 if (window.history.replaceState) { 4472 window.history.replaceState('', document.title, window.location.href.replace('#' + this.id, '')); 4473 } else { 4474 window.location.hash = ''; 4475 } 4476 } 4477 } 4478 4479 /** 4480 * Toggles the open/closed state of a modal. 4481 * @function 4482 */ 4483 4484 }, { 4485 key: 'toggle', 4486 value: function toggle() { 4487 if (this.isActive) { 4488 this.close(); 4489 } else { 4490 this.open(); 4491 } 4492 } 4493 }, { 4494 key: 'destroy', 4495 4496 4497 /** 4498 * Destroys an instance of a modal. 4499 * @function 4500 */ 4501 value: function destroy() { 4502 if (this.options.overlay) { 4503 this.$element.appendTo($(this.options.appendTo)); // move $element outside of $overlay to prevent error unregisterPlugin() 4504 this.$overlay.hide().off().remove(); 4505 } 4506 this.$element.hide().off(); 4507 this.$anchor.off('.zf'); 4508 $(window).off('.zf.reveal:' + this.id); 4509 4510 Foundation.unregisterPlugin(this); 4511 } 4512 }]); 4513 4514 return Reveal; 4515 }(); 4516 4517 Reveal.defaults = { 4518 /** 4519 * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide. 4520 * @option 4521 * @type {string} 4522 * @default '' 4523 */ 4524 animationIn: '', 4525 /** 4526 * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide. 4527 * @option 4528 * @type {string} 4529 * @default '' 4530 */ 4531 animationOut: '', 4532 /** 4533 * Time, in ms, to delay the opening of a modal after a click if no animation used. 4534 * @option 4535 * @type {number} 4536 * @default 0 4537 */ 4538 showDelay: 0, 4539 /** 4540 * Time, in ms, to delay the closing of a modal after a click if no animation used. 4541 * @option 4542 * @type {number} 4543 * @default 0 4544 */ 4545 hideDelay: 0, 4546 /** 4547 * Allows a click on the body/overlay to close the modal. 4548 * @option 4549 * @type {boolean} 4550 * @default true 4551 */ 4552 closeOnClick: true, 4553 /** 4554 * Allows the modal to close if the user presses the `ESCAPE` key. 4555 * @option 4556 * @type {boolean} 4557 * @default true 4558 */ 4559 closeOnEsc: true, 4560 /** 4561 * If true, allows multiple modals to be displayed at once. 4562 * @option 4563 * @type {boolean} 4564 * @default false 4565 */ 4566 multipleOpened: false, 4567 /** 4568 * Distance, in pixels, the modal should push down from the top of the screen. 4569 * @option 4570 * @type {number|string} 4571 * @default auto 4572 */ 4573 vOffset: 'auto', 4574 /** 4575 * Distance, in pixels, the modal should push in from the side of the screen. 4576 * @option 4577 * @type {number|string} 4578 * @default auto 4579 */ 4580 hOffset: 'auto', 4581 /** 4582 * Allows the modal to be fullscreen, completely blocking out the rest of the view. JS checks for this as well. 4583 * @option 4584 * @type {boolean} 4585 * @default false 4586 */ 4587 fullScreen: false, 4588 /** 4589 * Percentage of screen height the modal should push up from the bottom of the view. 4590 * @option 4591 * @type {number} 4592 * @default 10 4593 */ 4594 btmOffsetPct: 10, 4595 /** 4596 * Allows the modal to generate an overlay div, which will cover the view when modal opens. 4597 * @option 4598 * @type {boolean} 4599 * @default true 4600 */ 4601 overlay: true, 4602 /** 4603 * Allows the modal to remove and reinject markup on close. Should be true if using video elements w/o using provider's api, otherwise, videos will continue to play in the background. 4604 * @option 4605 * @type {boolean} 4606 * @default false 4607 */ 4608 resetOnClose: false, 4609 /** 4610 * Allows the modal to alter the url on open/close, and allows the use of the `back` button to close modals. ALSO, allows a modal to auto-maniacally open on page load IF the hash === the modal'
4610s user-set id. 4611 * @option 4612 * @type {boolean} 4613 * @default false 4614 */ 4615 deepLink: false, 4616 /** 4617 * Allows the modal to append to custom div. 4618 * @option 4619 * @type {string} 4620 * @default "body" 4621 */ 4622 appendTo: "body" 4623 4624 }; 4625 4626 // Window exports 4627 Foundation.plugin(Reveal, 'Reveal'); 4628 4629 function iPhoneSniff() { 4630 return (/iP(ad|hone|od).*OS/.test(window.navigator.userAgent) 4631 ); 4632 } 4633 4634 function androidSniff() { 4635 return (/Android/.test(window.navigator.userAgent) 4636 ); 4637 } 4638 4639 function mobileSniff() { 4640 return iPhoneSniff() || androidSniff(); 4641 } 4642}(jQuery); 4643 4644'use strict'; 4645 4646!function ($) { 4647 4648 /** 4649 * Tabs module. 4650 * @module foundation.tabs 4651 * @requires foundation.util.keyboard 4652 * @requires foundation.util.timerAndImageLoader if tabs contain images 4653 */ 4654 4655 var Tabs = function () { 4656 /** 4657 * Creates a new instance of tabs. 4658 * @class 4659 * @fires Tabs#init 4660 * @param {jQuery} element - jQuery object to make into tabs. 4661 * @param {Object} options - Overrides to the default plugin settings. 4662 */ 4663 function Tabs(element, options) { 4664 _classCallCheck(this, Tabs); 4665 4666 this.$element = element; 4667 this.options = $.extend({}, Tabs.defaults, this.$element.data(), options); 4668 4669 this._init(); 4670 Foundation.registerPlugin(this, 'Tabs'); 4671 Foundation.Keyboard.register('Tabs', { 4672 'ENTER': 'open', 4673 'SPACE': 'open', 4674 'ARROW_RIGHT': 'next', 4675 'ARROW_UP': 'previous', 4676 'ARROW_DOWN': 'next', 4677 'ARROW_LEFT': 'previous' 4678 // 'TAB': 'next', 4679 // 'SHIFT_TAB': 'previous' 4680 }); 4681 } 4682 4683 /** 4684 * Initializes the tabs by showing and focusing (if autoFocus=true) the preset active tab. 4685 * @private 4686 */ 4687 4688 4689 _createClass(Tabs, [{ 4690 key: '_init', 4691 value: function _init() { 4692 var _this8 = this; 4693 4694 var _this = this; 4695 4696 this.$element.attr({ 'role': 'tablist' }); 4697 this.$tabTitles = this.$element.find('.' + this.options.linkClass); 4698 this.$tabContent = $('[data-tabs-content="' + this.$element[0].id + '"]'); 4699 4700 this.$tabTitles.each(function () { 4701 var $elem = $(this), 4702 $link = $elem.find('a'), 4703 isActive = $elem.hasClass('' + _this.options.linkActiveClass), 4704 hash = $link[0].hash.slice(1), 4705 linkId = $link[0].id ? $link[0].id : hash + '-label', 4706 $tabContent = $('#' + hash); 4707 4708 $elem.attr({ 'role': 'presentation' }); 4709 4710 $link.attr({ 4711 'role': 'tab', 4712 'aria-controls': hash, 4713 'aria-selected': isActive, 4714 'id': linkId 4715 }); 4716 4717 $tabContent.attr({ 4718 'role': 'tabpanel', 4719 'aria-hidden': !isActive, 4720 'aria-labelledby': linkId 4721 }); 4722 4723 if (isActive && _this.options.autoFocus) { 4724 $(window).load(function () { 4725 $('html, body').animate({ scrollTop: $elem.offset().top }, _this.options.deepLinkSmudgeDelay, function () { 4726 $link.focus(); 4727 }); 4728 }); 4729 } 4730 }); 4731 if (this.options.matchHeight) { 4732 var $images = this.$tabContent.find('img'); 4733 4734 if ($images.length) { 4735 Foundation.onImagesLoaded($images, this._setHeight.bind(this)); 4736 } else { 4737 this._setHeight(); 4738 } 4739 } 4740 4741 //current context-bound function to open tabs on page load or history popstate 4742 this._checkDeepLink = function () { 4743 var anchor = window.location.hash; 4744 //need a hash and a relevant anchor in this tabset 4745 if (anchor.length) { 4746 var $link = _this8.$element.find('[href$="' + anchor + '"]'); 4747 if ($link.length) { 4748 _this8.selectTab($(anchor), true); 4749 4750 //roll up a little to show the titles 4751 if (_this8.options.deepLinkSmudge) { 4752 var offset = _this8.$element.offset(); 4753 $('html, body').animate({ scrollTop: offset.top }, _this8.options.deepLinkSmudgeDelay); 4754 } 4755 4756 /** 4757 * Fires when the zplugin has deeplinked at pageload 4758 * @event Tabs#deeplink 4759 */ 4760 _this8.$element.trigger('deeplink.zf.tabs', [$link, $(anchor)]); 4761 } 4762 } 4763 }; 4764 4765 //use browser to open a tab, if it exists in this tabset 4766 if (this.options.deepLink) { 4767 this._checkDeepLink(); 4768 } 4769 4770 this._events(); 4771 } 4772 4773 /** 4774 * Adds event handlers for items within the tabs. 4775 * @private 4776 */ 4777 4778 }, {
4779 key: '_events', 4780 value: function _events() { 4781 this._addKeyHandler(); 4782 this._addClickHandler(); 4783 this._setHeightMqHandler = null; 4784 4785 if (this.options.matchHeight) { 4786 this._setHeightMqHandler = this._setHeight.bind(this); 4787 4788 $(window).on('changed.zf.mediaquery', this._setHeightMqHandler); 4789 } 4790 4791 if (this.options.deepLink) { 4792 $(window).on('popstate', this._checkDeepLink); 4793 } 4794 } 4795 4796 /** 4797 * Adds click handlers for items within the tabs. 4798 * @private 4799 */ 4800 4801 }, { 4802 key: '_addClickHandler', 4803 value: function _addClickHandler() { 4804 var _this = this; 4805 4806 this.$element.off('click.zf.tabs').on('click.zf.tabs', '.' + this.options.linkClass, function (e) { 4807 e.preventDefault(); 4808 e.stopPropagation(); 4809 _this._handleTabChange($(this)); 4810 }); 4811 } 4812 4813 /** 4814 * Adds keyboard event handlers for items within the tabs. 4815 * @private 4816 */ 4817 4818 }, { 4819 key: '_addKeyHandler', 4820 value: function _addKeyHandler() { 4821 var _this = this; 4822 4823 this.$tabTitles.off('keydown.zf.tabs').on('keydown.zf.tabs', function (e) { 4824 if (e.which === 9) return; 4825 4826 var $element = $(this), 4827 $elements = $element.parent('ul').children('li'), 4828 $prevElement, 4829 $nextElement; 4830 4831 $elements.each(function (i) { 4832 if ($(this).is($element)) { 4833 if (_this.options.wrapOnKeys) { 4834 $prevElement = i === 0 ? $elements.last() : $elements.eq(i - 1); 4835 $nextElement = i === $elements.length - 1 ? $elements.first() : $elements.eq(i + 1); 4836 } else { 4837 $prevElement = $elements.eq(Math.max(0, i - 1)); 4838 $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1)); 4839 } 4840 return; 4841 } 4842 }); 4843 4844 // handle keyboard event with keyboard util 4845 Foundation.Keyboard.handleKey(e, 'Tabs', { 4846 open: function open() { 4847 $element.find('[role="tab"]').focus(); 4848 _this._handleTabChange($element); 4849 }, 4850 previous: function previous() { 4851 $prevElement.find('[role="tab"]').focus(); 4852 _this._handleTabChange($prevElement); 4853 }, 4854 next: function next() { 4855 $nextElement.find('[role="tab"]').focus(); 4856 _this._handleTabChange($nextElement); 4857 }, 4858 handled: function handled() { 4859 e.stopPropagation(); 4860 e.preventDefault(); 4861 } 4862 }); 4863 }); 4864 } 4865 4866 /** 4867 * Opens the tab `$targetContent` defined by `$target`. Collapses active tab. 4868 * @param {jQuery} $target - Tab to open. 4869 * @param {boolean} historyHandled - browser has already handled a history update 4870 * @fires Tabs#change 4871 * @function 4872 */ 4873 4874 }, { 4875 key: '_handleTabChange', 4876 value: function _handleTabChange($target, historyHandled) { 4877 4878 /** 4879 * Check for active class on target. Collapse if exists. 4880 */ 4881 if ($target.hasClass('' + this.options.linkActiveClass)) { 4882 if (this.options.activeCollapse) { 4883 this._collapseTab($target); 4884 4885 /** 4886 * Fires when the zplugin has successfully collapsed tabs. 4887 * @event Tabs#collapse 4888 */ 4889 this.$element.trigger('collapse.zf.tabs', [$target]); 4890 } 4891 return; 4892 } 4893 4894 var $oldTab = this.$element.find('.' + this.options.linkClass + '.' + this.options.linkActiveClass), 4895 $tabLink = $target.find('[role="tab"]'), 4896 hash = $tabLink[0].hash, 4897 $targetContent = this.$tabContent.find(hash); 4898 4899 //close old tab 4900 this._collapseTab($oldTab); 4901 4902 //open new tab 4903 this._openTab($target); 4904 4905 //either replace or update browser history 4906 if (this.options.deepLink && !historyHandled) { 4907 var anchor = $target.find('a').attr('href'); 4908 4909 if (this.options.updateHistory) { 4910 history.pushState({}, '', anchor); 4911 } else { 4912 history.replaceState({}, '', anchor); 4913 } 4914 } 4915 4916 /** 4917 * Fires when the plugin has successfully changed tabs. 4918 * @event Tabs#change 4919 */ 4920 this.$element.trigger('change.zf.tabs', [$target, $targetContent]); 4921 4922 //fire to children a mutation event 4923 $targetContent.find("[data-mutate]").trigger("mutateme.zf.trigger"); 4924 } 4925 4926 /** 4927 * Opens the tab `$targetContent` defined by `$target`. 4928 * @param {jQuery} $target - Tab to Open. 4929 * @function 4930 */ 4931 4932 }, {
4933 key: '_openTab', 4934 value: function _openTab($target) { 4935 var $tabLink = $target.find('[role="tab"]'), 4936 hash = $tabLink[0].hash, 4937 $targetContent = this.$tabContent.find(hash); 4938 4939 $target.addClass('' + this.options.linkActiveClass); 4940 4941 $tabLink.attr({ 'aria-selected': 'true' }); 4942 4943 $targetContent.addClass('' + this.options.panelActiveClass).attr({ 'aria-hidden': 'false' }); 4944 } 4945 4946 /** 4947 * Collapses `$targetContent` defined by `$target`. 4948 * @param {jQuery} $target - Tab to Open. 4949 * @function 4950 */ 4951 4952 }, { 4953 key: '_collapseTab', 4954 value: function _collapseTab($target) { 4955 var $target_anchor = $target.removeClass('' + this.options.linkActiveClass).find('[role="tab"]').attr({ 'aria-selected': 'false' }); 4956 4957 $('#' + $target_anchor.attr('aria-controls')).removeClass('' + this.options.panelActiveClass).attr({ 'aria-hidden': 'true' }); 4958 } 4959 4960 /** 4961 * Public method for selecting a content pane to display. 4962 * @param {jQuery | String} elem - jQuery object or string of the id of the pane to display. 4963 * @param {boolean} historyHandled - browser has already handled a history update 4964 * @function 4965 */ 4966 4967 }, { 4968 key: 'selectTab', 4969 value: function selectTab(elem, historyHandled) { 4970 var idStr; 4971 4972 if ((typeof elem === 'undefined' ? 'undefined' : _typeof(elem)) === 'object') { 4973 idStr = elem[0].id; 4974 } else { 4975 idStr = elem; 4976 } 4977 4978 if (idStr.indexOf('#') < 0) { 4979 idStr = '#' + idStr; 4980 } 4981 4982 var $target = this.$tabTitles.find('[href$="' + idStr + '"]').parent('.' + this.options.linkClass); 4983 4984 this._handleTabChange($target, historyHandled); 4985 } 4986 }, { 4987 key: '_setHeight', 4988 4989 /** 4990 * Sets the height of each panel to the height of the tallest panel. 4991 * If enabled in options, gets called on media query change. 4992 * If loading content via external source, can be called directly or with _reflow. 4993 * If enabled with `data-match-height="true"`, tabs sets to equal height 4994 * @function 4995 * @private 4996 */ 4997 value: function _setHeight() { 4998 var max = 0, 4999 _this = this; // Lock down the `this` value for the root tabs object 5000 5001 this.$tabContent.find('.' + this.options.panelClass).css('height', '').each(function () { 5002 5003 var panel = $(this), 5004 isActive = panel.hasClass('' + _this.options.panelActiveClass); // get the options from the parent instead of trying to get them from the child 5005 5006 if (!isActive) { 5007 panel.css({ 'visibility': 'hidden', 'display': 'block' }); 5008 } 5009 5010 var temp = this.getBoundingClientRect().height; 5011 5012 if (!isActive) { 5013 panel.css({ 5014 'visibility': '', 5015 'display': '' 5016 }); 5017 } 5018 5019 max = temp > max ? temp : max; 5020 }).css('height', max + 'px'); 5021 } 5022 5023 /** 5024 * Destroys an instance of an tabs. 5025 * @fires Tabs#destroyed 5026 */ 5027 5028 }, { 5029 key: 'destroy', 5030 value: function destroy() { 5031 this.$element.find('.' + this.options.linkClass).off('.zf.tabs').hide().end().find('.' + this.options.panelClass).hide(); 5032 5033 if (this.options.matchHeight) { 5034 if (this._setHeightMqHandler != null) { 5035 $(window).off('changed.zf.mediaquery', this._setHeightMqHandler); 5036 } 5037 } 5038 5039 if (this.options.deepLink) { 5040 $(window).off('popstate', this._checkDeepLink); 5041 } 5042 5043 Foundation.unregisterPlugin(this); 5044 } 5045 }]); 5046 5047 return Tabs; 5048 }(); 5049 5050 Tabs.defaults = { 5051 /** 5052 * Allows the window to scroll to content of pane specified by hash anchor 5053 * @option 5054 * @type {boolean} 5055 * @default false 5056 */ 5057 deepLink: false, 5058 5059 /** 5060 * Adjust the deep link scroll to make sure the top of the tab panel is visible 5061 * @option 5062 * @type {boolean} 5063 * @default false 5064 */ 5065 deepLinkSmudge: false, 5066 5067 /** 5068 * Animation time (ms) for the deep link adjustment 5069 * @option 5070 * @type {number} 5071 * @default 300 5072 */ 5073 deepLinkSmudgeDelay: 300, 5074 5075 /** 5076 * Update the browser history with the open tab 5077 * @option 5078 * @type {boolean} 5079 * @default false 5080 */ 5081 updateHistory: false, 5082 5083 /** 5084 * Allows the window to scroll to content of active pane on load if set to true. 5085 * Not recommended if more than one tab panel per page. 5086 * @option 5087 * @type {boolean} 5088 * @default false 5089 */ 5090 autoFocus: false, 5091 5092 /** 5093 * Allows keyboard input to 'wrap' around the tab links. 5094 * @option 5095 * @type {boolean} 5096 * @default true 5097 */ 5098 wrapOnKeys: true, 5099 5100 /**
5101 * Allows the tab content panes to match heights if set to true. 5102 * @option 5103 * @type {boolean} 5104 * @default false 5105 */ 5106 matchHeight: false, 5107 5108 /** 5109 * Allows active tabs to collapse when clicked. 5110 * @option 5111 * @type {boolean} 5112 * @default false 5113 */ 5114 activeCollapse: false, 5115 5116 /** 5117 * Class applied to `li`'s in tab link list. 5118 * @option 5119 * @type {string} 5120 * @default 'tabs-title' 5121 */ 5122 linkClass: 'tabs-title', 5123 5124 /** 5125 * Class applied to the active `li` in tab link list. 5126 * @option 5127 * @type {string} 5128 * @default 'is-active' 5129 */ 5130 linkActiveClass: 'is-active', 5131 5132 /** 5133 * Class applied to the content containers. 5134 * @option 5135 * @type {string} 5136 * @default 'tabs-panel' 5137 */ 5138 panelClass: 'tabs-panel', 5139 5140 /** 5141 * Class applied to the active content container. 5142 * @option 5143 * @type {string} 5144 * @default 'is-active' 5145 */ 5146 panelActiveClass: 'is-active' 5147 }; 5148 5149 // Window exports 5150 Foundation.plugin(Tabs, 'Tabs'); 5151}(jQuery); 5152 5153'use strict'; 5154 5155!function ($) { 5156 5157 /** 5158 * Toggler module. 5159 * @module foundation.toggler 5160 * @requires foundation.util.motion 5161 * @requires foundation.util.triggers 5162 */ 5163 5164 var Toggler = function () { 5165 /** 5166 * Creates a new instance of Toggler. 5167 * @class 5168 * @fires Toggler#init 5169 * @param {Object} element - jQuery object to add the trigger to. 5170 * @param {Object} options - Overrides to the default plugin settings. 5171 */ 5172 function Toggler(element, options) { 5173 _classCallCheck(this, Toggler); 5174 5175 this.$element = element; 5176 this.options = $.extend({}, Toggler.defaults, element.data(), options); 5177 this.className = ''; 5178 5179 this._init(); 5180 this._events(); 5181 5182 Foundation.registerPlugin(this, 'Toggler'); 5183 } 5184 5185 /** 5186 * Initializes the Toggler plugin by parsing the toggle class from data-toggler, or animation classes from data-animate. 5187 * @function 5188 * @private 5189 */ 5190 5191 5192 _createClass(Toggler, [{ 5193 key: '_init', 5194 value: function _init() { 5195 var input; 5196 // Parse animation classes if they were set 5197 if (this.options.animate) { 5198 input = this.options.animate.split(' '); 5199 5200 this.animationIn = input[0]; 5201 this.animationOut = input[1] || null; 5202 } 5203 // Otherwise, parse toggle class 5204 else { 5205 input = this.$element.data('toggler'); 5206 // Allow for a . at the beginning of the string 5207 this.className = input[0] === '.' ? input.slice(1) : input; 5208 } 5209 5210 // Add ARIA attributes to triggers 5211 var id = this.$element[0].id; 5212 $('[data-open="' + id + '"], [data-close="' + id + '"], [data-toggle="' + id + '"]').attr('aria-controls', id); 5213 // If the target is hidden, add aria-hidden 5214 this.$element.attr('aria-expanded', this.$element.is(':hidden') ? false : true); 5215 } 5216 5217 /** 5218 * Initializes events for the toggle trigger. 5219 * @function 5220 * @private 5221 */ 5222 5223 }, { 5224 key: '_events', 5225 value: function _events() { 5226 this.$element.off('toggle.zf.trigger').on('toggle.zf.trigger', this.toggle.bind(this)); 5227 } 5228 5229 /** 5230 * Toggles the target class on the target element. An event is fired from the original trigger depending on if the resultant state was "on" or "off". 5231 * @function 5232 * @fires Toggler#on 5233 * @fires Toggler#off 5234 */ 5235 5236 }, { 5237 key: 'toggle', 5238 value: function toggle() { 5239 this[this.options.animate ? '_toggleAnimate' : '_toggleClass'](); 5240 } 5241 }, { 5242 key: '_toggleClass', 5243 value: function _toggleClass() { 5244 this.$element.toggleClass(this.className); 5245 5246 var isOn = this.$element.hasClass(this.className); 5247 if (isOn) { 5248 /** 5249 * Fires if the target element has the class after a toggle. 5250 * @event Toggler#on 5251 */ 5252 this.$element.trigger('on.zf.toggler'); 5253 } else { 5254 /** 5255 * Fires if the target element does not have the class after a toggle. 5256 * @event Toggler#off 5257 */ 5258 this.$element.trigger('off.zf.toggler'); 5259 } 5260 5261 this._updateARIA(isOn); 5262 this.$element.find('[data-mutate]').trigger('mutateme.zf.trigger'); 5263 } 5264 }, {
5265 key: '_toggleAnimate', 5266 value: function _toggleAnimate() { 5267 var _this = this; 5268 5269 if (this.$element.is(':hidden')) { 5270 Foundation.Motion.animateIn(this.$element, this.animationIn, function () { 5271 _this._updateARIA(true); 5272 this.trigger('on.zf.toggler'); 5273 this.find('[data-mutate]').trigger('mutateme.zf.trigger'); 5274 }); 5275 } else { 5276 Foundation.Motion.animateOut(this.$element, this.animationOut, function () { 5277 _this._updateARIA(false); 5278 this.trigger('off.zf.toggler'); 5279 this.find('[data-mutate]').trigger('mutateme.zf.trigger'); 5280 }); 5281 } 5282 } 5283 }, { 5284 key: '_updateARIA', 5285 value: function _updateARIA(isOn) { 5286 this.$element.attr('aria-expanded', isOn ? true : false); 5287 } 5288 5289 /** 5290 * Destroys the instance of Toggler on the element. 5291 * @function 5292 */ 5293 5294 }, { 5295 key: 'destroy', 5296 value: function destroy() { 5297 this.$element.off('.zf.toggler'); 5298 Foundation.unregisterPlugin(this); 5299 } 5300 }]); 5301 5302 return Toggler; 5303 }(); 5304 5305 Toggler.defaults = { 5306 /** 5307 * Tells the plugin if the element should animated when toggled. 5308 * @option 5309 * @type {boolean} 5310 * @default false 5311 */ 5312 animate: false 5313 }; 5314 5315 // Window exports 5316 Foundation.plugin(Toggler, 'Toggler'); 5317}(jQuery); 5318 5319'use strict'; 5320 5321!function ($) { 5322 5323 /** 5324 * ResponsiveAccordionTabs module. 5325 * @module foundation.responsiveAccordionTabs 5326 * @requires foundation.util.keyboard 5327 * @requires foundation.util.timerAndImageLoader 5328 * @requires foundation.util.motion 5329 * @requires foundation.accordion 5330 * @requires foundation.tabs 5331 */ 5332 5333 var ResponsiveAccordionTabs = function () { 5334 /** 5335 * Creates a new instance of a responsive accordion tabs. 5336 * @class 5337 * @fires ResponsiveAccordionTabs#init 5338 * @param {jQuery} element - jQuery object to make into a dropdown menu. 5339 * @param {Object} options - Overrides to the default plugin settings. 5340 */ 5341 function ResponsiveAccordionTabs(element, options) { 5342 _classCallCheck(this, ResponsiveAccordionTabs); 5343 5344 this.$element = $(element); 5345 this.options = $.extend({}, this.$element.data(), options); 5346 this.rules = this.$element.data('responsive-accordion-tabs'); 5347 this.currentMq = null; 5348 this.currentPlugin = null; 5349 if (!this.$element.attr('id')) { 5350 this.$element.attr('id', Foundation.GetYoDigits(6, 'responsiveaccordiontabs')); 5351 }; 5352 5353 this._init(); 5354 this._events(); 5355 5356 Foundation.registerPlugin(this, 'ResponsiveAccordionTabs'); 5357 } 5358 5359 /** 5360 * Initializes the Menu by parsing the classes from the 'data-responsive-accordion-tabs' attribute on the element. 5361 * @function 5362 * @private 5363 */ 5364 5365 5366 _createClass(ResponsiveAccordionTabs, [{ 5367 key: '_init', 5368 value: function _init() { 5369 // The first time an Interchange plugin is initialized, this.rules is converted from a string of "classes" to an object of rules 5370 if (typeof this.rules === 'string') { 5371 var rulesTree = {}; 5372 5373 // Parse rules from "classes" pulled from data attribute 5374 var rules = this.rules.split(' '); 5375 5376 // Iterate through every rule found 5377 for (var i = 0; i < rules.length; i++) { 5378 var rule = rules[i].split('-'); 5379 var ruleSize = rule.length > 1 ? rule[0] : 'small'; 5380 var rulePlugin = rule.length > 1 ? rule[1] : rule[0]; 5381 5382 if (MenuPlugins[rulePlugin] !== null) { 5383 rulesTree[ruleSize] = MenuPlugins[rulePlugin]; 5384 } 5385 } 5386 5387 this.rules = rulesTree; 5388 } 5389 5390 this._getAllOptions(); 5391 5392 if (!$.isEmptyObject(this.rules)) { 5393 this._checkMediaQueries(); 5394 } 5395 } 5396 }, { 5397 key: '_getAllOptions', 5398 value: function _getAllOptions() { 5399 //get all defaults and options 5400 var _this = this; 5401 _this.allOptions = {}; 5402 for (var key in MenuPlugins) { 5403 if (MenuPlugins.hasOwnProperty(key)) { 5404 var obj = MenuPlugins[key]; 5405 try { 5406 var dummyPlugin = $('<ul></ul>'); 5407 var tmpPlugin = new obj.plugin(dummyPlugin, _this.options); 5408 for (var keyKey in tmpPlugin.options) { 5409 if (tmpPlugin.options.hasOwnProperty(keyKey) && keyKey !== 'zfPlugin') { 5410 var objObj = tmpPlugin.options[keyKey]; 5411 _this.allOptions[keyKey] = objObj; 5412 } 5413 } 5414 tmpPlugin.destroy(); 5415 } catch (e) {} 5416 } 5417 } 5418 } 5419 5420 /** 5421 * Initializes events for the Menu. 5422 * @function 5423 * @private 5424 */ 5425 5426 }, {
vendor: 5,391 bytes, lines 5427-5548
5427 key: '_events', 5428 value: function _events() { 5429 var _this = this; 5430 5431 $(window).on('changed.zf.mediaquery', function () { 5432 _this._checkMediaQueries(); 5433 }); 5434 } 5435 5436 /** 5437 * Checks the current screen width against available media queries. If the media query has changed, and the plugin needed has changed, the plugins will swap out. 5438 * @function 5439 * @private 5440 */ 5441 5442 }, { 5443 key: '_checkMediaQueries', 5444 value: function _checkMediaQueries() { 5445 var matchedMq, 5446 _this = this; 5447 // Iterate through each rule and find the last matching rule 5448 $.each(this.rules, function (key) { 5449 if (Foundation.MediaQuery.atLeast(key)) { 5450 matchedMq = key; 5451 } 5452 }); 5453 5454 // No match? No dice 5455 if (!matchedMq) return; 5456 5457 // Plugin already initialized? We good 5458 if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return; 5459 5460 // Remove existing plugin-specific CSS classes 5461 $.each(MenuPlugins, function (key, value) { 5462 _this.$element.removeClass(value.cssClass); 5463 }); 5464 5465 // Add the CSS class for the new plugin 5466 this.$element.addClass(this.rules[matchedMq].cssClass); 5467 5468 // Create an instance of the new plugin 5469 if (this.currentPlugin) { 5470 //don't know why but on nested elements data zfPlugin get's lost 5471 if (!this.currentPlugin.$element.data('zfPlugin') && this.storezfData) this.currentPlugin.$element.data('zfPlugin', this.storezfData); 5472 this.currentPlugin.destroy(); 5473 } 5474 this._handleMarkup(this.rules[matchedMq].cssClass); 5475 this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {}); 5476 this.storezfData = this.currentPlugin.$element.data('zfPlugin'); 5477 } 5478 }, { 5479 key: '_handleMarkup', 5480 value: function _handleMarkup(toSet) { 5481 var _this = this, 5482 fromString = 'accordion'; 5483 var $panels = $('[data-tabs-content=' + this.$element.attr('id') + ']'); 5484 if ($panels.length) fromString = 'tabs'; 5485 if (fromString === toSet) { 5486 return; 5487 }; 5488 5489 var tabsTitle = _this.allOptions.linkClass ? _this.allOptions.linkClass : 'tabs-title'; 5490 var tabsPanel = _this.allOptions.panelClass ? _this.allOptions.panelClass : 'tabs-panel'; 5491 5492 this.$element.removeAttr('role'); 5493 var $liHeads = this.$element.children('.' + tabsTitle + ',[data-accordion-item]').removeClass(tabsTitle).removeClass('accordion-item').removeAttr('data-accordion-item'); 5494 var $liHeadsA = $liHeads.children('a').removeClass('accordion-title'); 5495 5496 if (fromString === 'tabs') { 5497 $panels = $panels.children('.' + tabsPanel).removeClass(tabsPanel).removeAttr('role').removeAttr('aria-hidden').removeAttr('aria-labelledby'); 5498 $panels.children('a').removeAttr('role').removeAttr('aria-controls').removeAttr('aria-selected'); 5499 } else { 5500 $panels = $liHeads.children('[data-tab-content]').removeClass('accordion-content'); 5501 }; 5502 5503 $panels.css({ display: '', visibility: '' }); 5504 $liHeads.css({ display: '', visibility: '' }); 5505 if (toSet === 'accordion') { 5506 $panels.each(function (key, value) { 5507 $(value).appendTo($liHeads.get(key)).addClass('accordion-content').attr('data-tab-content', '').removeClass('is-active').css({ height: '' }); 5508 $('[data-tabs-content=' + _this.$element.attr('id') + ']').after('<div id="tabs-placeholder-' + _this.$element.attr('id') + '"></div>').remove(); 5509 $liHeads.addClass('accordion-item').attr('data-accordion-item', ''); 5510 $liHeadsA.addClass('accordion-title'); 5511 }); 5512 } else if (toSet === 'tabs') { 5513 var $tabsContent = $('[data-tabs-content=' + _this.$element.attr('id') + ']'); 5514 var $placeholder = $('#tabs-placeholder-' + _this.$element.attr('id')); 5515 if ($placeholder.length) { 5516 $tabsContent = $('<div class="tabs-content"></div>').insertAfter($placeholder).attr('data-tabs-content', _this.$element.attr('id')); 5517 $placeholder.remove(); 5518 } else { 5519 $tabsContent = $('<div class="tabs-content"></div>').insertAfter(_this.$element).attr('data-tabs-content', _this.$element.attr('id')); 5520 }; 5521 $panels.each(function (key, value) { 5522 var tempValue = $(value).appendTo($tabsContent).addClass(tabsPanel); 5523 var hash = $liHeadsA.get(key).hash.slice(1); 5524 var id = $(value).attr('id') || Foundation.GetYoDigits(6, 'accordion'); 5525 if (hash !== id) { 5526 if (hash !== '') { 5527 $(value).attr('id', hash); 5528 } else { 5529 hash = id; 5530 $(value).attr('id', hash); 5531 $($liHeadsA.get(key)).attr('href', $($liHeadsA.get(key)).attr('href').replace('#', '') + '#' + hash); 5532 }; 5533 }; 5534 var isActive = $($liHeads.get(key)).hasClass('is-active'); 5535 if (isActive) { 5536 tempValue.addClass('is-active'); 5537 }; 5538 }); 5539 $liHeads.addClass(tabsTitle); 5540 }; 5541 } 5542 5543 /** 5544 * Destroys the instance of the current plugin on this element, as well as the window resize handler that switches the plugins out. 5545 * @function 5546 */ 5547 5548 }, {
5549 key: 'destroy', 5550 value: function destroy() { 5551 if (this.currentPlugin) this.currentPlugin.destroy(); 5552 $(window).off('.zf.ResponsiveAccordionTabs'); 5553 Foundation.unregisterPlugin(this); 5554 } 5555 }]); 5556 5557 return ResponsiveAccordionTabs; 5558 }(); 5559 5560 ResponsiveAccordionTabs.defaults = {}; 5561 5562 // The plugin matches the plugin classes with these plugin instances. 5563 var MenuPlugins = { 5564 tabs: { 5565 cssClass: 'tabs', 5566 plugin: Foundation._plugins.tabs || null 5567 }, 5568 accordion: { 5569 cssClass: 'accordion', 5570 plugin: Foundation._plugins.accordion || null 5571 } 5572 }; 5573 5574 // Window exports 5575 Foundation.plugin(ResponsiveAccordionTabs, 'ResponsiveAccordionTabs'); 5576}(jQuery); 5577 5578$(document).foundation(); 5579 5580$(document).ready(function () { 5581 5582 // Scroll to top of accordion item when active 5583 if (typeof themeAccordionItem === "function") { 5584 themeAccordionItem('.accordion'); 5585 } 5586 5587 // Back to results 5588 if (typeof themeBackToResults === "function") { 5589 themeBackToResults('.js-back-to-results'); 5590 } 5591 5592 // Cookie policy 5593 if (typeof themeCookiePolicy === "function") { 5594 themeCookiePolicy(); 5595 } 5596 5597 // Department selection for opening hours 5598 if (typeof themeDepartmentOpeningHours === "function" && ($('.branch--teaser').length || $('.branch--full').length)) { 5599 themeDepartmentOpeningHours(); 5600 } 5601 5602 // Adds a read more link if div over a certain height 5603 if (typeof themeExpand === "function" && Foundation.MediaQuery.current == 'small') { 5604 themeExpand('.page--home .page__description, .vehicle--full .vehicle__description', 300); 5605 } 5606 5607 // Click outside to close toggler 5608 if (typeof themeCloseToggler === "function" && $('#search').length && !Foundation.MediaQuery.atLeast('large')) { 5609 themeCloseToggler('#search'); 5610 } 5611 5612 // Swap prices if searching by monthly price on vehicle results 5613 if (typeof themeSwapPrices === "function") { 5614 themeSwapPrices(); 5615 } 5616 5617 // Ensures images load in tabs on vehicle details if video present 5618 if (typeof themeTabsVideo === "function") { 5619 themeTabsVideo(); 5620 } 5621 5622 // Ensures map loads in tabs on vehicle details 5623 if (typeof themeTabsMap === "function") { 5624 themeTabsMap(); 5625 } 5626 5627 // Fancybox lightbox 5628 $("[data-fancybox]").fancybox(); 5629 5630 // Slick carousel 5631 $('.page__primary-images > ul, .post__primary-images > ul, .custom-entry__primary-images > ul, .branch__primary-images > ul').slick({ 5632 autoplay: true, 5633 autoplaySpeed: 10000, 5634 infinite: true 5635 }); 5636 $('.page__secondary-images > ul, .post__secondary-images > ul, .custom-entry__secondary-images > ul, .branch__secondary-images > ul, .branch__logos > ul').slick({ 5637 infinite: false 5638 }); 5639 if (Foundation.MediaQuery.current == 'small') { 5640 $('.listing--block > ul').slick({ 5641 slidesToShow: 1, 5642 infinite: false 5643 }); 5644 } 5645 $('.listing--vehicle-compare .listing__list').slick({ 5646 slidesToShow: 1, 5647 infinite: false, 5648 mobileFirst: true, 5649 responsive: [{ 5650 breakpoint: 639, 5651 settings: { 5652 slidesToShow: 2 5653 } 5654 }, { 5655 breakpoint: 1023, 5656 settings: { 5657 slidesToShow: 4 5658 } 5659 }] 5660 }); 5661 $('.listing--vehicle-featured > ul, .listing--vehicle-latest > ul, .listing--vehicle-similar > ul').slick({ 5662 adaptiveHeight: true, 5663 slidesToShow: 1, 5664 infinite: false, 5665 mobileFirst: true, 5666 responsive: [{ 5667 breakpoint: 639, 5668 settings: { 5669 slidesToShow: 2 5670 } 5671 }, { 5672 breakpoint: 1023, 5673 settings: { 5674 slidesToShow: 3 5675 } 5676 }] 5677 }); 5678 $('.listing--vehicle-featured-sidebar > ul, .listing--vehicle-latest-sidebar > ul').slick({ 5679 adaptiveHeight: true, 5680 slidesToShow: 1, 5681 infinite: false 5682 }); 5683 $('.vehicle--full .vehicle__primary-images > ul').slick({ 5684 slidesToShow: 1, 5685 slidesToScroll: 1, 5686 adaptiveHeight: true, 5687 infinite: false, 5688 asNavFor: '.vehicle__primary-images-thumbnails > ul' 5689 }); 5690 $('.vehicle--full .vehicle__primary-images-thumbnails > ul').slick({ 5691 slidesToShow: 4, 5692 slidesToScroll: 4, 5693 focusOnSelect: true, 5694 infinite: false, 5695 asNavFor: '.vehicle__primary-images > ul', 5696 mobileFirst: true, 5697 responsive: [{ 5698 breakpoint: 767, 5699 settings: { 5700 slidesToShow: 3, 5701 slidesToScroll: 3 5702 } 5703 }, {
5704 breakpoint: 1023, 5705 settings: { 5706 slidesToShow: 5, 5707 slidesToScroll: 5 5708 } 5709 }] 5710 }); 5711 $('.vehicle--full .vehicle__secondary-images ul').slick({ 5712 slidesToShow: 1, 5713 infinite: false, 5714 mobileFirst: true, 5715 responsive: [{ 5716 breakpoint: 639, 5717 settings: { 5718 slidesToShow: 2 5719 } 5720 }, { 5721 breakpoint: 1023, 5722 settings: { 5723 slidesToShow: 3 5724 } 5725 }] 5726 }); 5727 5728 // Swipe to close toggler 5729 if ($('#search').length && !Foundation.MediaQuery.atLeast('large')) { 5730 $('#search').swipe({ 5731 swipeLeft: function swipeLeft(event, direction, distance, duration, fingerCount, fingerData) { 5732 $(this).foundation('toggle'); 5733 } 5734 }); 5735 } 5736 5737 // Vehicle results finance form toggle 5738 if ($(".listing__adjust-finance a").length) { 5739 $(".listing__adjust-finance a").click(function () { 5740 $(this).parent(".listing__adjust-finance").next(".listing__finance-form").slideToggle(); 5741 }); 5742 } 5743 5744 // Open reveal email vehicle form from url hash on vehicle details 5745 if (window.location.hash && window.location.hash == '#email-vehicle') { 5746 $('#email-vehicle').foundation('open'); 5747 } 5748}); 5749 5750// Vehicle search options toggle limit 5751var SearchBarOptionsLimitTo = 5; 5752 5753// Functions loaded after search filters updated on vehicle results 5754var afterReloadDealer = function afterReloadDealer() { 5755 // Swap prices if searching by monthly price on vehicle results 5756 if (typeof themeSwapPrices === "function") { 5757 themeSwapPrices(); 5758 } 5759}; 5760 5761// Disable fancybox lightbox hash module 5762$.fancybox.defaults.hash = false; 5763//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZvdW5kYXRpb24uY29yZS5qcyIsImZvdW5kYXRpb24udXRpbC5ib3guanMiLCJmb3VuZGF0aW9uLnV0aWwua2V5Ym9hcmQuanMiLCJmb3VuZGF0aW9uLnV0aWwubWVkaWFRdWVyeS5qcyIsImZvdW5kYXRpb24udXRpbC5tb3Rpb24uanMiLCJmb3VuZGF0aW9uLnV0aWwubmVzdC5qcyIsImZvdW5kYXRpb24udXRpbC50aW1lckFuZEltYWdlTG9hZGVyLmpzIiwiZm91bmRhdGlvbi51dGlsLnRvdWNoLmpzIiwiZm91bmRhdGlvbi51dGlsLnRyaWdnZXJzLmpzIiwiZm91bmRhdGlvbi5hY2NvcmRpb24uanMiLCJmb3VuZGF0aW9uLmRyaWxsZG93bi5qcyIsImZvdW5kYXRpb24uZHJvcGRvd24uanMiLCJmb3VuZGF0aW9uLmRyb3Bkb3duTWVudS5qcyIsImZvdW5kYXRpb24ucmVzcG9uc2l2ZU1lbnUuanMiLCJmb3VuZGF0aW9uLnJlc3BvbnNpdmVUb2dnbGUuanMiLCJmb3VuZGF0aW9uLnJldmVhbC5qcyIsImZvdW5kYXRpb24udGFicy5qcyIsImZvdW5kYXRpb24udG9nZ2xlci5qcyIsImZvdW5kYXRpb24uemYucmVzcG9uc2l2ZUFjY29yZGlvblRhYnMuanMiLCJhcHAuanMiXSwibmFtZXMiOlsiJCIsIkZPVU5EQVRJT05fVkVSU0lPTiIsIkZvdW5kYXRpb24iLCJ2ZXJzaW9uIiwiX3BsdWdpbnMiLCJfdXVpZHMiLCJydGwiLCJhdHRyIiwicGx1Z2luIiwibmFtZSIsImNsYXNzTmFtZSIsImZ1bmN0aW9uTmFtZSIsImF0dHJOYW1lIiwiaHlwaGVuYXRlIiwicmVnaXN0ZXJQbHVnaW4iLCJwbHVnaW5OYW1lIiwiY29uc3RydWN0b3IiLCJ0b0xvd2VyQ2FzZSIsInV1aWQiLCJHZXRZb0RpZ2l0cyIsIiRlbGVtZW50IiwiZGF0YSIsInRyaWdnZXIiLCJwdXNoIiwidW5yZWdpc3RlclBsdWdpbiIsInNwbGljZSIsImluZGV4T2YiLCJyZW1vdmVBdHRyIiwicmVtb3ZlRGF0YSIsInByb3AiLCJyZUluaXQiLCJwbHVnaW5zIiwiaXNKUSIsImVhY2giLCJfaW5pdCIsInR5cGUiLCJfdGhpcyIsImZucyIsInBsZ3MiLCJmb3JFYWNoIiwicCIsImZvdW5kYXRpb24iLCJPYmplY3QiLCJrZXlzIiwiZXJyIiwiY29uc29sZSIsImVycm9yIiwibGVuZ3RoIiwibmFtZXNwYWNlIiwiTWF0aCIsInJvdW5kIiwicG93IiwicmFuZG9tIiwidG9TdHJpbmciLCJzbGljZSIsInJlZmxvdyIsImVsZW0iLCJpIiwiJGVsZW0iLCJmaW5kIiwiYWRkQmFjayIsIiRlbCIsIm9wdHMiLCJ3YXJuIiwidGhpbmciLCJzcGxpdCIsImUiLCJvcHQiLCJtYXAiLCJlbCIsInRyaW0iLCJwYXJzZVZhbHVlIiwiZXIiLCJnZXRGbk5hbWUiLCJ0cmFuc2l0aW9uZW5kIiwidHJhbnNpdGlvbnMiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJlbmQiLCJ0Iiwic3R5bGUiLCJzZXRUaW1lb3V0IiwidHJpZ2dlckhhbmRsZXIiLCJ1dGlsIiwidGhyb3R0bGUiLCJmdW5jIiwiZGVsYXkiLCJ0aW1lciIsImNvbnRleHQiLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJtZXRob2QiLCIkbWV0YSIsIiRub0pTIiwiYXBwZW5kVG8iLCJoZWFkIiwicmVtb3ZlQ2xhc3MiLCJNZWRpYVF1ZXJ5IiwiQXJyYXkiLCJwcm90b3R5cGUiLCJjYWxsIiwicGx1Z0NsYXNzIiwidW5kZWZpbmVkIiwiUmVmZXJlbmNlRXJyb3IiLCJUeXBlRXJyb3IiLCJ3aW5kb3ciLCJmbiIsIkRhdGUiLCJub3ciLCJnZXRUaW1lIiwidmVuZG9ycyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInZwIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJ0ZXN0IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibGFzdFRpbWUiLCJjYWxsYmFjayIsIm5leHRUaW1lIiwibWF4IiwiY2xlYXJUaW1lb3V0IiwicGVyZm9ybWFuY2UiLCJzdGFydCIsIkZ1bmN0aW9uIiwiYmluZCIsIm9UaGlzIiwiYUFyZ3MiLCJmVG9CaW5kIiwiZk5PUCIsImZCb3VuZCIsImNvbmNhdCIsImZ1bmNOYW1lUmVnZXgiLCJyZXN1bHRzIiwiZXhlYyIsInN0ciIsImlzTmFOIiwicGFyc2VGbG9hdCIsInJlcGxhY2UiLCJqUXVlcnkiLCJCb3giLCJJbU5vdFRvdWNoaW5nWW91IiwiR2V0RGltZW5zaW9ucyIsIkdldE9mZnNldHMiLCJlbGVtZW50IiwicGFyZW50IiwibHJPbmx5IiwidGJPbmx5IiwiZWxlRGltcyIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsInBhckRpbXMiLCJvZmZzZXQiLCJoZWlnaHQiLCJ3aWR0aCIsIndpbmRvd0RpbXMiLCJhbGxEaXJzIiwiRXJyb3IiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicGFyUmVjdCIsInBhcmVudE5vZGUiLCJ3aW5SZWN0IiwiYm9keSIsIndpblkiLCJwYWdlWU9mZnNldCIsIndpblgiLCJwYWdlWE9mZnNldCIsInBhcmVudERpbXMiLCJhbmNob3IiLCJwb3NpdGlvbiIsInZPZmZzZXQiLCJoT2Zmc2V0IiwiaXNPdmVyZmxvdyIsIiRlbGVEaW1zIiwiJGFuY2hvckRpbXMiLCJrZXlDb2RlcyIsImNvbW1hbmRzIiwiS2V5Ym9hcmQiLCJnZXRLZXlDb2RlcyIsInBhcnNlS2V5IiwiZXZlbnQiLCJrZXkiLCJ3aGljaCIsImtleUNvZGUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJ0b1VwcGVyQ2FzZSIsInNoaWZ0S2V5IiwiY3RybEtleSIsImFsdEtleSIsImhhbmRsZUtleSIsImNvbXBvbmVudCIsImZ1bmN0aW9ucyIsImNvbW1hbmRMaXN0IiwiY21kcyIsIm
5763NvbW1hbmQiLCJsdHIiLCJleHRlbmQiLCJyZXR1cm5WYWx1ZSIsImhhbmRsZWQiLCJ1bmhhbmRsZWQiLCJmaW5kRm9jdXNhYmxlIiwiZmlsdGVyIiwiaXMiLCJyZWdpc3RlciIsImNvbXBvbmVudE5hbWUiLCJ0cmFwRm9jdXMiLCIkZm9jdXNhYmxlIiwiJGZpcnN0Rm9jdXNhYmxlIiwiZXEiLCIkbGFzdEZvY3VzYWJsZSIsIm9uIiwidGFyZ2V0IiwicHJldmVudERlZmF1bHQiLCJmb2N1cyIsInJlbGVhc2VGb2N1cyIsIm9mZiIsImtjcyIsImsiLCJrYyIsImRlZmF1bHRRdWVyaWVzIiwibGFuZHNjYXBlIiwicG9ydHJhaXQiLCJyZXRpbmEiLCJxdWVyaWVzIiwiY3VycmVudCIsInNlbGYiLCJleHRyYWN0ZWRTdHlsZXMiLCJjc3MiLCJuYW1lZFF1ZXJpZXMiLCJwYXJzZVN0eWxlVG9PYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsInZhbHVlIiwiX2dldEN1cnJlbnRTaXplIiwiX3dhdGNoZXIiLCJhdExlYXN0Iiwic2l6ZSIsInF1ZXJ5IiwiZ2V0IiwibWF0Y2hNZWRpYSIsIm1hdGNoZXMiLCJtYXRjaGVkIiwibmV3U2l6ZSIsImN1cnJlbnRTaXplIiwic3R5bGVNZWRpYSIsIm1lZGlhIiwic2NyaXB0IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpbmZvIiwiaWQiLCJpbnNlcnRCZWZvcmUiLCJnZXRDb21wdXRlZFN0eWxlIiwiY3VycmVudFN0eWxlIiwibWF0Y2hNZWRpdW0iLCJ0ZXh0Iiwic3R5bGVTaGVldCIsImNzc1RleHQiLCJ0ZXh0Q29udGVudCIsInN0eWxlT2JqZWN0IiwicmVkdWNlIiwicmV0IiwicGFyYW0iLCJwYXJ0cyIsInZhbCIsImRlY29kZVVSSUNvbXBvbmVudCIsImlzQXJyYXkiLCJpbml0Q2xhc3NlcyIsImFjdGl2ZUNsYXNzZXMiLCJNb3Rpb24iLCJhbmltYXRlSW4iLCJhbmltYXRpb24iLCJjYiIsImFuaW1hdGUiLCJhbmltYXRlT3V0IiwiTW92ZSIsImR1cmF0aW9uIiwiYW5pbSIsInByb2ciLCJtb3ZlIiwidHMiLCJpc0luIiwiaW5pdENsYXNzIiwiYWN0aXZlQ2xhc3MiLCJyZXNldCIsImFkZENsYXNzIiwic2hvdyIsIm9mZnNldFdpZHRoIiwib25lIiwiZmluaXNoIiwiaGlkZSIsInRyYW5zaXRpb25EdXJhdGlvbiIsIk5lc3QiLCJGZWF0aGVyIiwibWVudSIsIml0ZW1zIiwic3ViTWVudUNsYXNzIiwic3ViSXRlbUNsYXNzIiwiaGFzU3ViQ2xhc3MiLCIkaXRlbSIsIiRzdWIiLCJjaGlsZHJlbiIsIkJ1cm4iLCJUaW1lciIsIm9wdGlvbnMiLCJuYW1lU3BhY2UiLCJyZW1haW4iLCJpc1BhdXNlZCIsInJlc3RhcnQiLCJpbmZpbml0ZSIsInBhdXNlIiwib25JbWFnZXNMb2FkZWQiLCJpbWFnZXMiLCJ1bmxvYWRlZCIsImNvbXBsZXRlIiwicmVhZHlTdGF0ZSIsInNpbmdsZUltYWdlTG9hZGVkIiwic3JjIiwic3BvdFN3aXBlIiwiZW5hYmxlZCIsImRvY3VtZW50RWxlbWVudCIsIm1vdmVUaHJlc2hvbGQiLCJ0aW1lVGhyZXNob2xkIiwic3RhcnRQb3NYIiwic3RhcnRQb3NZIiwic3RhcnRUaW1lIiwiZWxhcHNlZFRpbWUiLCJpc01vdmluZyIsIm9uVG91Y2hFbmQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25Ub3VjaE1vdmUiLCJ4IiwidG91Y2hlcyIsInBhZ2VYIiwieSIsInBhZ2VZIiwiZHgiLCJkeSIsImRpciIsImFicyIsIm9uVG91Y2hTdGFydCIsImFkZEV2ZW50TGlzdGVuZXIiLCJpbml0IiwidGVhcmRvd24iLCJzcGVjaWFsIiwic3dpcGUiLCJzZXR1cCIsIm5vb3AiLCJhZGRUb3VjaCIsImhhbmRsZVRvdWNoIiwiY2hhbmdlZFRvdWNoZXMiLCJmaXJzdCIsImV2ZW50VHlwZXMiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJzaW11bGF0ZWRFdmVudCIsIk1vdXNlRXZlbnQiLCJzY3JlZW5YIiwic2NyZWVuWSIsImNsaWVudFgiLCJjbGllbnRZIiwiY3JlYXRlRXZlbnQiLCJpbml0TW91c2VFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJNdXRhdGlvbk9ic2VydmVyIiwicHJlZml4ZXMiLCJ0cmlnZ2VycyIsInN0b3BQcm9wYWdhdGlvbiIsImZhZGVPdXQiLCJjaGVja0xpc3RlbmVycyIsImV2ZW50c0xpc3RlbmVyIiwicmVzaXplTGlzdGVuZXIiLCJzY3JvbGxMaXN0ZW5lciIsImNsb3NlbWVMaXN0ZW5lciIsInlldGlCb3hlcyIsInBsdWdOYW1lcyIsImxpc3RlbmVycyIsImpvaW4iLCJwbHVnaW5JZCIsIm5vdCIsImRlYm91bmNlIiwiJG5vZGVzIiwibm9kZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwibGlzdGVuaW5nRWxlbWVudHNNdXRhdGlvbiIsIm11dGF0aW9uUmVjb3Jkc0xpc3QiLCIkdGFyZ2V0IiwiYXR0cmlidXRlTmFtZSIsImNsb3Nlc3QiLCJlbGVtZW50T2JzZXJ2ZXIiLCJvYnNlcnZlIiwiYXR0cmlidXRlcyIsImNoaWxkTGlzdCIsImNoYXJhY3RlckRhdGEiLCJzdWJ0cmVlIiwiYXR0cmlidXRlRmlsdGVyIiwiSUhlYXJZb3UiLCJBY2NvcmRpb24iLCJkZWZhdWx0cyIsIiR0YWJzIiwiaWR4IiwiJGNvbnRlbnQiLCJsaW5rSWQiLCIkaW5pdEFjdGl2ZSIsImZpcnN0VGltZUluaXQiLCJkb3duIiwiX2NoZWNrRGVlcExpbmsiLCJsb2NhdGlvbiIsImhhc2giLCIkbGluayIsIiRhbmNob3IiLCJoYXNDbGFzcyIsImRlZXBMaW5rU211ZGdlIiwibG9hZCIsInNjcm9sbFRvcCIsImRlZXBMaW5rU211ZGdlRGVsYXkiLCJkZWVwTGluayIsIl9ldmVudHMiLCIkdGFiQ29udGVudCIsInRvZ2dsZSIsIm5leHQiLCIkYSIsIm11bHRpRXhwYW5kIiwicHJldmlvdXMiLCJwcmV2IiwidXAiLCJ1cGRhdGVIaXN0b3J5IiwiaGlzdG9yeSIsInB1c2hTdGF0ZSIsInJlcGxhY2VTdGF0ZSIsImZpcnN0VGltZSIsIiRjdXJyZW50QWN0aXZlIiwic2xpZGVEb3duIiwic2xpZGVTcGVlZCIsIiRhdW50cyIsInNpYmxpbmdzIiwiYWxsb3dBbGxDbG9zZWQiLCJzbGlkZVVwIiwic3RvcCIsIkRyaWxsZG93biIsIiRzdWJtZW51QW5jaG9ycyIsIiRzdWJtZW51cyIsIiRtZW51SXRlbXMiLCJfcHJlcGFyZU1lbnUiLCJfcmVnaXN0ZXJFdmVudHMiLCJfa2V5Ym9hcmRFdmVudHMiLCJwYXJlbnRMaW5rIiwiY2xvbmUiLCJwcmVwZW5kVG8iLCJ3cmFwIiwiJG1lbnUiLCIkYmFjayIsImJhY2tCdXR0b25Qb3NpdGlvbiIsImFwcGVuZCIsImJhY2tCdXR0b24iLCJwcmVwZW5kIiwiX2JhY2siLCJhdXRvSGVpZ2h0IiwiJHdyYXBwZXIiLCJ3cmFwcGVyIiwiYW5pbWF0ZUhlaWdodCIsIl9nZXRNYXhEaW1zIiwicGFyZW50c1VudGlsIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiX3Nob3ciLCJjbG9zZU9uQ2xpY2siLCIkYm9keSIsImNvbn
5763RhaW5zIiwiX2hpZGVBbGwiLCJfcmVzaXplIiwiX2JpbmRIYW5kbGVyIiwiX3Njcm9sbFRvcCIsIiRzY3JvbGxUb3BFbGVtZW50Iiwic2Nyb2xsVG9wRWxlbWVudCIsInNjcm9sbFBvcyIsInBhcnNlSW50Iiwic2Nyb2xsVG9wT2Zmc2V0IiwiYW5pbWF0aW9uRHVyYXRpb24iLCJhbmltYXRpb25FYXNpbmciLCJhZGQiLCIkZWxlbWVudHMiLCIkcHJldkVsZW1lbnQiLCIkbmV4dEVsZW1lbnQiLCJtaW4iLCJfaGlkZSIsImNsb3NlIiwib3BlbiIsInBhcmVudFN1Yk1lbnUiLCJibHVyIiwibWF4SGVpZ2h0IiwicmVzdWx0IiwibnVtT2ZFbGVtcyIsInVud3JhcCIsInJlbW92ZSIsIkRyb3Bkb3duIiwiJGlkIiwicGFyZW50Q2xhc3MiLCIkcGFyZW50IiwicGFyZW50cyIsInBvc2l0aW9uQ2xhc3MiLCJnZXRQb3NpdGlvbkNsYXNzIiwiY291bnRlciIsInVzZWRQb3NpdGlvbnMiLCJ2ZXJ0aWNhbFBvc2l0aW9uIiwibWF0Y2giLCJob3Jpem9udGFsUG9zaXRpb24iLCJjbGFzc0NoYW5nZWQiLCJkaXJlY3Rpb24iLCJuZXdXaWR0aCIsInBhcmVudEhPZmZzZXQiLCIkcGFyZW50RGltcyIsIl9yZXBvc2l0aW9uIiwiX3NldFBvc2l0aW9uIiwiaG92ZXIiLCJib2R5RGF0YSIsIndoYXRpbnB1dCIsInRpbWVvdXQiLCJob3ZlckRlbGF5IiwiaG92ZXJQYW5lIiwidmlzaWJsZUZvY3VzYWJsZUVsZW1lbnRzIiwiYXV0b0ZvY3VzIiwiX2FkZEJvZHlIYW5kbGVyIiwiY3VyUG9zaXRpb25DbGFzcyIsIkRyb3Bkb3duTWVudSIsInN1YnMiLCJ2ZXJ0aWNhbENsYXNzIiwicmlnaHRDbGFzcyIsImFsaWdubWVudCIsImNoYW5nZWQiLCJoYXNUb3VjaCIsIm9udG91Y2hzdGFydCIsInBhckNsYXNzIiwiaGFuZGxlQ2xpY2tGbiIsImhhc1N1YiIsImhhc0NsaWNrZWQiLCJjbGlja09wZW4iLCJmb3JjZUZvbGxvdyIsImNsb3NlT25DbGlja0luc2lkZSIsImRpc2FibGVIb3ZlciIsImF1dG9jbG9zZSIsImNsb3NpbmdUaW1lIiwiaXNUYWIiLCJpbmRleCIsIm5leHRTaWJsaW5nIiwicHJldlNpYmxpbmciLCJvcGVuU3ViIiwiY2xvc2VTdWIiLCJfaXNWZXJ0aWNhbCIsIiRzaWJzIiwiY2xlYXIiLCJvbGRDbGFzcyIsIiRwYXJlbnRMaSIsIiR0b0Nsb3NlIiwic29tZXRoaW5nVG9DbG9zZSIsIlJlc3BvbnNpdmVNZW51IiwicnVsZXMiLCJjdXJyZW50TXEiLCJjdXJyZW50UGx1Z2luIiwicnVsZXNUcmVlIiwicnVsZSIsInJ1bGVTaXplIiwicnVsZVBsdWdpbiIsIk1lbnVQbHVnaW5zIiwiaXNFbXB0eU9iamVjdCIsIl9jaGVja01lZGlhUXVlcmllcyIsIm1hdGNoZWRNcSIsImNzc0NsYXNzIiwiZGVzdHJveSIsImRyb3Bkb3duIiwiZHJpbGxkb3duIiwiYWNjb3JkaW9uIiwiUmVzcG9uc2l2ZVRvZ2dsZSIsInRhcmdldElEIiwiJHRhcmdldE1lbnUiLCIkdG9nZ2xlciIsImlucHV0IiwiYW5pbWF0aW9uSW4iLCJhbmltYXRpb25PdXQiLCJfdXBkYXRlIiwiX3VwZGF0ZU1xSGFuZGxlciIsInRvZ2dsZU1lbnUiLCJoaWRlRm9yIiwiUmV2ZWFsIiwiaXNBY3RpdmUiLCJjYWNoZWQiLCJtcSIsImlzTW9iaWxlIiwibW9iaWxlU25pZmYiLCJmdWxsU2NyZWVuIiwib3ZlcmxheSIsIiRvdmVybGF5IiwiX21ha2VPdmVybGF5IiwiZGV0YWNoIiwib3V0ZXJXaWR0aCIsIm91dGVySGVpZ2h0IiwibWFyZ2luIiwiX3VwZGF0ZVBvc2l0aW9uIiwiX2hhbmRsZVN0YXRlIiwibXVsdGlwbGVPcGVuZWQiLCJhZGRSZXZlYWxPcGVuQ2xhc3NlcyIsIm9yaWdpbmFsU2Nyb2xsUG9zIiwiYWZ0ZXJBbmltYXRpb24iLCJmb2N1c2FibGVFbGVtZW50cyIsInNob3dEZWxheSIsIl9leHRyYUhhbmRsZXJzIiwiY2xvc2VPbkVzYyIsImZpbmlzaFVwIiwiaGlkZURlbGF5IiwicmVzZXRPbkNsb3NlIiwiaHRtbCIsInRpdGxlIiwiaHJlZiIsImJ0bU9mZnNldFBjdCIsImlQaG9uZVNuaWZmIiwiYW5kcm9pZFNuaWZmIiwiVGFicyIsIiR0YWJUaXRsZXMiLCJsaW5rQ2xhc3MiLCJsaW5rQWN0aXZlQ2xhc3MiLCJtYXRjaEhlaWdodCIsIiRpbWFnZXMiLCJfc2V0SGVpZ2h0Iiwic2VsZWN0VGFiIiwiX2FkZEtleUhhbmRsZXIiLCJfYWRkQ2xpY2tIYW5kbGVyIiwiX3NldEhlaWdodE1xSGFuZGxlciIsIl9oYW5kbGVUYWJDaGFuZ2UiLCJ3cmFwT25LZXlzIiwibGFzdCIsImhpc3RvcnlIYW5kbGVkIiwiYWN0aXZlQ29sbGFwc2UiLCJfY29sbGFwc2VUYWIiLCIkb2xkVGFiIiwiJHRhYkxpbmsiLCIkdGFyZ2V0Q29udGVudCIsIl9vcGVuVGFiIiwicGFuZWxBY3RpdmVDbGFzcyIsIiR0YXJnZXRfYW5jaG9yIiwiaWRTdHIiLCJwYW5lbENsYXNzIiwicGFuZWwiLCJ0ZW1wIiwiVG9nZ2xlciIsInRvZ2dsZUNsYXNzIiwiaXNPbiIsIl91cGRhdGVBUklBIiwiUmVzcG9uc2l2ZUFjY29yZGlvblRhYnMiLCJfZ2V0QWxsT3B0aW9ucyIsImFsbE9wdGlvbnMiLCJvYmoiLCJkdW1teVBsdWdpbiIsInRtcFBsdWdpbiIsImtleUtleSIsIm9iak9iaiIsInN0b3JlemZEYXRhIiwiX2hhbmRsZU1hcmt1cCIsInRvU2V0IiwiZnJvbVN0cmluZyIsIiRwYW5lbHMiLCJ0YWJzVGl0bGUiLCJ0YWJzUGFuZWwiLCIkbGlIZWFkcyIsIiRsaUhlYWRzQSIsImRpc3BsYXkiLCJ2aXNpYmlsaXR5IiwiYWZ0ZXIiLCIkdGFic0NvbnRlbnQiLCIkcGxhY2Vob2xkZXIiLCJpbnNlcnRBZnRlciIsInRlbXBWYWx1ZSIsInRhYnMiLCJyZWFkeSIsInRoZW1lQWNjb3JkaW9uSXRlbSIsInRoZW1lQmFja1RvUmVzdWx0cyIsInRoZW1lQ29va2llUG9saWN5IiwidGhlbWVEZXBhcnRtZW50T3BlbmluZ0hvdXJzIiwidGhlbWVFeHBhbmQiLCJ0aGVtZUNsb3NlVG9nZ2xlciIsInRoZW1lU3dhcFByaWNlcyIsInRoZW1lVGFic1ZpZGVvIiwidGhlbWVUYWJzTWFwIiwiZmFuY3lib3giLCJzbGljayIsImF1dG9wbGF5IiwiYXV0b3BsYXlTcGVlZCIsInNsaWRlc1RvU2hvdyIsIm1vYmlsZUZpcnN0IiwicmVzcG9uc2l2ZSIsImJyZWFrcG9pbnQiLCJzZXR0aW5ncyIsImFkYXB0aXZlSGVpZ2h0Iiwic2xpZGVzVG9TY3JvbGwiLCJhc05hdkZvciIsImZvY3VzT25TZWxlY3QiLCJzd2lwZUxlZnQiLCJkaXN0YW5jZSIsImZpbmdlckNvdW50IiwiZmluZ2VyRGF0YSIsImNsaWNrIiwic2xpZGVUb2dnbGUiLCJTZWFyY2hCYXJPcHRpb25zTGltaXRUbyIsImFmdGVyUmVsb2FkRGVhbGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLENBQUEsVUFBQUEsQ0FBQSxFQUFBOztBQUVBOztBQUVBLE1BQUFDLHFCQUFBLE9BQUE7O0FBRUE7QUFDQTtBQUNBLE1BQUFDLGFBQUE7QUFDQUMsYUFBQUYsa0JBREE7O0FBR0E7OztBQUdBRyxjQUFBLEVBTkE7O0FBUUE7OztBQUdBQyxZQUFBLEVBWEE7O0FBYUE7OztBQUdBQyxTQUFBLGVBQUE7QUFDQSxhQUFBTixFQU
5763FBLE1BQUEsRUFBQU8sSUFBQSxDQUFBLEtBQUEsTUFBQSxLQUFBO0FBQ0EsS0FsQkE7QUFtQkE7Ozs7QUFJQUMsWUFBQSxnQkFBQUEsT0FBQSxFQUFBQyxJQUFBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsVUFBQUMsWUFBQUQsUUFBQUUsYUFBQUgsT0FBQSxDQUFBO0FBQ0E7QUFDQTtBQUNBLFVBQUFJLFdBQUFDLFVBQUFILFNBQUEsQ0FBQTs7QUFFQTtBQUNBLFdBQUFOLFFBQUEsQ0FBQVEsUUFBQSxJQUFBLEtBQUFGLFNBQUEsSUFBQUYsT0FBQTtBQUNBLEtBakNBO0FBa0NBOzs7Ozs7Ozs7QUFTQU0sb0JBQUEsd0JBQUFOLE1BQUEsRUFBQUMsSUFBQSxFQUFBO0FBQ0EsVUFBQU0sYUFBQU4sT0FBQUksVUFBQUosSUFBQSxDQUFBLEdBQUFFLGFBQUFILE9BQUFRLFdBQUEsRUFBQUMsV0FBQSxFQUFBO0FBQ0FULGFBQUFVLElBQUEsR0FBQSxLQUFBQyxXQUFBLENBQUEsQ0FBQSxFQUFBSixVQUFBLENBQUE7O0FBRUEsVUFBQSxDQUFBUCxPQUFBWSxRQUFBLENBQUFiLElBQUEsV0FBQVEsVUFBQSxDQUFBLEVBQUE7QUFBQVAsZUFBQVksUUFBQSxDQUFBYixJQUFBLFdBQUFRLFVBQUEsRUFBQVAsT0FBQVUsSUFBQTtBQUFBO0FBQ0EsVUFBQSxDQUFBVixPQUFBWSxRQUFBLENBQUFDLElBQUEsQ0FBQSxVQUFBLENBQUEsRUFBQTtBQUFBYixlQUFBWSxRQUFBLENBQUFDLElBQUEsQ0FBQSxVQUFBLEVBQUFiLE1BQUE7QUFBQTtBQUNBOzs7O0FBSUFBLGFBQUFZLFFBQUEsQ0FBQUUsT0FBQSxjQUFBUCxVQUFBOztBQUVBLFdBQUFWLE1BQUEsQ0FBQWtCLElBQUEsQ0FBQWYsT0FBQVUsSUFBQTs7QUFFQTtBQUNBLEtBMURBO0FBMkRBOzs7Ozs7OztBQVFBTSxzQkFBQSwwQkFBQWhCLE1BQUEsRUFBQTtBQUNBLFVBQUFPLGFBQUFGLFVBQUFGLGFBQUFILE9BQUFZLFFBQUEsQ0FBQUMsSUFBQSxDQUFBLFVBQU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xVQUFBLENBQUEsUUFBQTtBQUNBO0FBSEEsS0FBQTtBQUtBOztBQUVBO0FBQ0EsTUFBQXpDLEVBQUEsNEJBQUEsRUFBQStDLE1BQUEsRUFBQTtBQUNBL0MsTUFBQSw0QkFBQSxFQUFBOHJCLEtBQUEsQ0FBQSxZQUFBO0FBQ0E5ckIsUUFBQSxJQUFBLEVBQUFrSixNQUFBLENBQUEsMEJBQUEsRUFBQXNSLElBQUEsQ0FBQSx3QkFBQSxFQUFBdVIsV0FBQTtBQUNBLEtBRkE7QUFHQTs7QUFFQTtBQUNBLE1BQUFybEIsT0FBQWlULFFBQUEsQ0FBQUMsSUFBQSxJQUFBbFQsT0FBQWlULFFBQUEsQ0FBQUMsSUFBQSxJQUFBLGdCQUFBLEVBQUE7QUFDQTVaLE1BQUEsZ0JBQUEsRUFBQXlDLFVBQUEsQ0FBQSxNQUFBO0FBQ0E7QUFFQSxDQXpLQTs7QUEyS0E7QUFDQSxJQUFBdXBCLDBCQUFBLENBQUE7O0FBRUE7QUFDQSxJQUFBQyxvQkFBQSxTQUFBQSxpQkFBQSxHQUFBO0FBQ0E7QUFDQSxNQUFBLE9BQUF2QixlQUFBLEtBQUEsVUFBQSxFQUFBO0FBQ0FBO0FBQ0E7QUFDQSxDQUx
5763BOztBQU9BO0FBQ0ExcUIsRUFBQTZxQixRQUFBLENBQUEzUixRQUFBLENBQUFVLElBQUEsR0FBQSxLQUFBIiwiZmlsZSI6ImFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiFmdW5jdGlvbigkKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgRk9VTkRBVElPTl9WRVJTSU9OID0gJzYuMy4xJztcblxuLy8gR2xvYmFsIEZvdW5kYXRpb24gb2JqZWN0XG4vLyBUaGlzIGlzIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3csIG9yIHVzZWQgYXMgYSBtb2R1bGUgZm9yIEFNRC9Ccm93c2VyaWZ5XG52YXIgRm91bmRhdGlvbiA9IHtcbiAgdmVyc2lvbjogRk9VTkRBVElPTl9WRVJTSU9OLFxuXG4gIC8qKlxuICAgKiBTdG9yZXMgaW5pdGlhbGl6ZWQgcGx1Z2lucy5cbiAgICovXG4gIF9wbHVnaW5zOiB7fSxcblxuICAvKipcbiAgICogU3RvcmVzIGdlbmVyYXRlZCB1bmlxdWUgaWRzIGZvciBwbHVnaW4gaW5zdGFuY2VzXG4gICAqL1xuICBfdXVpZHM6IFtdLFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBmb3IgUlRMIHN1cHBvcnRcbiAgICovXG4gIHJ0bDogZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gJCgnaHRtbCcpLmF0dHIoJ2RpcicpID09PSAncnRsJztcbiAgfSxcbiAgLyoqXG4gICAqIERlZmluZXMgYSBGb3VuZGF0aW9uIHBsdWdpbiwgYWRkaW5nIGl0IHRvIHRoZSBgRm91bmRhdGlvbmAgbmFtZXNwYWNlIGFuZCB0aGUgbGlzdCBvZiBwbHVnaW5zIHRvIGluaXRpYWxpemUgd2hlbiByZWZsb3dpbmcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwbHVnaW4gLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHBsdWdpbjogZnVuY3Rpb24ocGx1Z2luLCBuYW1lKSB7XG4gICAgLy8gT2JqZWN0IGtleSB0byB1c2Ugd2hlbiBhZGRpbmcgdG8gZ2xvYmFsIEZvdW5kYXRpb24gb2JqZWN0XG4gICAgLy8gRXhhbXBsZXM6IEZvdW5kYXRpb24uUmV2ZWFsLCBGb3VuZGF0aW9uLk9mZkNhbnZhc1xuICAgIHZhciBjbGFzc05hbWUgPSAobmFtZSB8fCBmdW5jdGlvbk5hbWUocGx1Z2luKSk7XG4gICAgLy8gT2JqZWN0IGtleSB0byB1c2Ugd2hlbiBzdG9yaW5nIHRoZSBwbHVnaW4sIGFsc28gdXNlZCB0byBjcmVhdGUgdGhlIGlkZW50aWZ5aW5nIGRhdGEgYXR0cmlidXRlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gRXhhbXBsZXM6IGRhdGEtcmV2ZWFsLCBkYXRhLW9mZi1jYW52YXNcbiAgICB2YXIgYXR0ck5hbWUgID0gaHlwaGVuYXRlKGNsYXNzTmFtZSk7XG5cbiAgICAvLyBBZGQgdG8gdGhlIEZvdW5kYXRpb24gb2JqZWN0IGFuZCB0aGUgcGx1Z2lucyBsaXN0IChmb3IgcmVmbG93aW5nKVxuICAgIHRoaXMuX3BsdWdpbnNbYXR0ck5hbWVdID0gdGhpc1tjbGFzc05hbWVdID0gcGx1Z2luO1xuICB9LFxuICAvKipcbiAgICogQGZ1bmN0aW9uXG4gICAqIFBvcHVsYXRlcyB0aGUgX3V1aWRzIGFycmF5IHdpdGggcG9pbnRlcnMgdG8gZWFjaCBpbmRpdmlkdWFsIHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQWRkcyB0aGUgYHpmUGx1Z2luYCBkYXRhLWF0dHJpYnV0ZSB0byBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZWQgcGx1Z2lucyB0byBhbGxvdyB1c2Ugb2YgJChzZWxlY3RvcikuZm91bmRhdGlvbihtZXRob2QpIGNhbGxzLlxuICAgKiBBbHNvIGZpcmVzIHRoZSBpbml0aWFsaXphdGlvbiBldmVudCBmb3IgZWFjaCBwbHVnaW4sIGNvbnNvbGlkYXRpbmcgcmVwZXRpdGl2ZSBjb2RlLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGx1Z2luIC0gYW4gaW5zdGFuY2Ugb2YgYSBwbHVnaW4sIHVzdWFsbHkgYHRoaXNgIGluIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiwgcGFzc2VkIGFzIGEgY2FtZWxDYXNlZCBzdHJpbmcuXG4gICAqIEBmaXJlcyBQbHVnaW4jaW5pdFxuICAgKi9cbiAgcmVnaXN0ZXJQbHVnaW46IGZ1bmN0aW9uKHBsdWdpbiwgbmFtZSl7XG4gICAgdmFyIHBsdWdpbk5hbWUgPSBuYW1lID8gaHlwaGVuYXRlKG5hbWUpIDogZnVuY3Rpb25OYW1lKHBsdWdpbi5jb25zdHJ1Y3RvcikudG9Mb3dlckNhc2UoKTtcbiAgICBwbHVnaW4udXVpZCA9IHRoaXMuR2V0WW9EaWdpdHMoNiwgcGx1Z2luTmFtZSk7XG5cbiAgICBpZighcGx1Z2luLiRlbGVtZW50LmF0dHIoYGRhdGEtJHtwbHVnaW5OYW1lfWApKXsgcGx1Z2luLiRlbGVtZW50LmF0dHIoYGRhdGEtJHtwbHVnaW5OYW1lfWAsIHBsdWdpbi51dWlkKTsgfVxuICAgIGlmKCFwbHVnaW4uJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nKSl7IHBsdWdpbi4kZWxlbWVudC5kYXRhKCd6ZlBsdWdpbicsIHBsdWdpbik7IH1cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBwbHVnaW4gaGFzIGluaXRpYWxpemVkLlxuICAgICAgICAgICAqIEBldmVudCBQbHVnaW4jaW5pdFxuICAgICAgICAgICAqL1xuICAgIHBsdWdpbi4kZWxlbWVudC50cmlnZ2VyKGBpbml0LnpmLiR7cGx1Z2luTmFtZX1gKTtcblxuICAgIHRoaXMuX3V1aWRzLnB1c2gocGx1Z2luLnV1aWQpO1xuXG4gICAgcmV0dXJuO1xuICB9LFxuICAvKipcbiAgICogQGZ1bmN0aW9uXG4gICAqIFJlbW92ZXMgdGhlIHBsdWdpbnMgdXVpZCBmcm9tIHRoZSBfdXVpZHMgYXJyYXkuXG4gICAqIFJlbW92ZXMgdGhlIHpmUGx1Z2luIGRhdGEgYXR0cmlidXRlLCBhcyB3ZWxsIGFzIHRoZSBkYXRhLXBsdWdpbi1uYW1lIGF0dHJpYnV0ZS5cbiAgICogQWxzbyBmaXJlcyB0aGUgZGVzdHJveWVkIGV2ZW50IGZvciB0aGUgcGx1Z2luLCBjb25zb2xpZGF0aW5nIHJlcGV0aXRpdmUgY29kZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBsdWdpbiAtIGFuIGluc3RhbmNlIG9mIGEgcGx1Z2luLCB1c3VhbGx5IGB0aGlzYCBpbiBjb250ZXh0LlxuICAgKiBAZmlyZXMgUGx1Z2luI2Rlc3Ryb3llZFxuICAgKi9cbiAgdW5yZWdpc3RlclBsdWdpbjogZnVuY3Rpb24ocGx1Z2luKXtcbiAgICB2YXIgcGx1Z2luTmFtZSA9IGh5cGhlbmF0ZShmdW5jdGlvbk5hbWUocGx1Z2luLiRlbGVtZW50LmRhdGEoJ3pmUGx1Z2luJykuY29uc3RydWN0b3IpKTtcblxuICAgIHRoaXMuX3V1aWRzLnNwbGljZSh0aGlzLl91dWlkcy5pbmRleE9mKHBsdWdpbi51dWlkKSwgMSk7XG4gICAgcGx1Z2luLiRlbGVtZW50LnJlbW92ZUF0dHIoYGRhdGEtJHtwbHVnaW5OYW1lfWApLnJlbW92ZURhdGEoJ3pmUGx1Z2luJylcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBwbHVnaW4gaGFzIGJlZW4gZGVzdHJveWVkLlxuICAgICAgICAgICAqIEBldmVudCBQbHVnaW4jZGVzdHJveWVkXG4gICAgICAgICAgICovXG4gICAgICAgICAgLnRyaWdnZXIoYGRlc3Ryb3llZC56Zi4ke3BsdWdpbk5hbWV9YCk7XG4gICAgZm9yKHZhciBwcm9wIGluIHBsdWdpbil7XG4gICAgICBwbHVnaW5bcHJvcF0gPSBudWxsOy8vY2xlYW4gdXAgc2NyaXB0IHRvIHByZXAgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAZnVuY3Rpb25cbiAgICogQ2F1c2VzIG9uZSBvciBtb3JlIGFjdGl2ZSBwbHVnaW5zIHRvIHJlLWluaXRpYWxpemUsIHJlc2V0dGluZyBldmVudCBsaXN0ZW5lcnMsIHJlY2FsY3VsYXRpbmcgcG9zaXRpb25zLCBldGMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwbHVnaW5zIC0gb3B0aW9uYWwgc3RyaW5nIG9mIGFuIGluZGl2aWR1YWwgcGx1Z2luIGtleSwgYXR0YWluZWQgYnkgY2FsbGluZyBgJChlbGVtZW50KS5kYXRhKCdwbHVnaW5OYW1lJylgLCBvciBzdHJpbmcgb2YgYSBwbHVnaW4gY2xhc3MgaS5lLiBgJ2Ryb3Bkb3duJ2BcbiAgICogQGRlZmF1bHQgSWYgbm8gYXJndW1lbnQgaXMgcGFzc2VkLCByZWZsb3cgYWxsIGN1cnJlbnRseSBhY3RpdmUgcGx1Z2lucy5cbiAgICovXG4gICByZUluaXQ6IGZ1bmN0aW9uKHBsdWdpbnMpe1xuICAgICB2Y
5763XIgaXNKUSA9IHBsdWdpbnMgaW5zdGFuY2VvZiAkO1xuICAgICB0cnl7XG4gICAgICAgaWYoaXNKUSl7XG4gICAgICAgICBwbHVnaW5zLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgICAgICAgJCh0aGlzKS5kYXRhKCd6ZlBsdWdpbicpLl9pbml0KCk7XG4gICAgICAgICB9KTtcbiAgICAgICB9ZWxzZXtcbiAgICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHBsdWdpbnMsXG4gICAgICAgICBfdGhpcyA9IHRoaXMsXG4gICAgICAgICBmbnMgPSB7XG4gICAgICAgICAgICdvYmplY3QnOiBmdW5jdGlvbihwbGdzKXtcbiAgICAgICAgICAgICBwbGdzLmZvckVhY2goZnVuY3Rpb24ocCl7XG4gICAgICAgICAgICAgICBwID0gaHlwaGVuYXRlKHApO1xuICAgICAgICAgICAgICAgJCgnW2RhdGEtJysgcCArJ10nKS5mb3VuZGF0aW9uKCdfaW5pdCcpO1xuICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICB9LFxuICAgICAgICAgICAnc3RyaW5nJzogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICBwbHVnaW5zID0gaHlwaGVuYXRlKHBsdWdpbnMpO1xuICAgICAgICAgICAgICQoJ1tkYXRhLScrIHBsdWdpbnMgKyddJykuZm91bmRhdGlvbignX2luaXQnKTtcbiAgICAgICAgICAgfSxcbiAgICAgICAgICAgJ3VuZGVmaW5lZCc6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgdGhpc1snb2JqZWN0J10oT2JqZWN0LmtleXMoX3RoaXMuX3BsdWdpbnMpKTtcbiAgICAgICAgICAgfVxuICAgICAgICAgfTtcbiAgICAgICAgIGZuc1t0eXBlXShwbHVnaW5zKTtcbiAgICAgICB9XG4gICAgIH1jYXRjaChlcnIpe1xuICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgfWZpbmFsbHl7XG4gICAgICAgcmV0dXJuIHBsdWdpbnM7XG4gICAgIH1cbiAgIH0sXG5cbiAgLyoqXG4gICAqIHJldHVybnMgYSByYW5kb20gYmFzZS0zNiB1aWQgd2l0aCBuYW1lc3BhY2luZ1xuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCAtIG51bWJlciBvZiByYW5kb20gYmFzZS0zNiBkaWdpdHMgZGVzaXJlZC4gSW5jcmVhc2UgZm9yIG1vcmUgcmFuZG9tIHN0cmluZ3MuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2UgLSBuYW1lIG9mIHBsdWdpbiB0byBiZSBpbmNvcnBvcmF0ZWQgaW4gdWlkLCBvcHRpb25hbC5cbiAgICogQGRlZmF1bHQge1N0cmluZ30gJycgLSBpZiBubyBwbHVnaW4gbmFtZSBpcyBwcm92aWRlZCwgbm90aGluZyBpcyBhcHBlbmRlZCB0byB0aGUgdWlkLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSAtIHVuaXF1ZSBpZFxuICAgKi9cbiAgR2V0WW9EaWdpdHM6IGZ1bmN0aW9uKGxlbmd0aCwgbmFtZXNwYWNlKXtcbiAgICBsZW5ndGggPSBsZW5ndGggfHwgNjtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoTWF0aC5wb3coMzYsIGxlbmd0aCArIDEpIC0gTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDM2LCBsZW5ndGgpKSkudG9TdHJpbmcoMzYpLnNsaWNlKDEpICsgKG5hbWVzcGFjZSA/IGAtJHtuYW1lc3BhY2V9YCA6ICcnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgcGx1Z2lucyBvbiBhbnkgZWxlbWVudHMgd2l0aGluIGBlbGVtYCAoYW5kIGBlbGVtYCBpdHNlbGYpIHRoYXQgYXJlbid0IGFscmVhZHkgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtIC0galF1ZXJ5IG9iamVjdCBjb250YWluaW5nIHRoZSBlbGVtZW50IHRvIGNoZWNrIGluc2lkZS4gQWxzbyBjaGVja3MgdGhlIGVsZW1lbnQgaXRzZWxmLCB1bmxlc3MgaXQncyB0aGUgYGRvY3VtZW50YCBvYmplY3QuXG4gICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBwbHVnaW5zIC0gQSBsaXN0IG9mIHBsdWdpbnMgdG8gaW5pdGlhbGl6ZS4gTGVhdmUgdGhpcyBvdXQgdG8gaW5pdGlhbGl6ZSBldmVyeXRoaW5nLlxuICAgKi9cbiAgcmVmbG93OiBmdW5jdGlvbihlbGVtLCBwbHVnaW5zKSB7XG5cbiAgICAvLyBJZiBwbHVnaW5zIGlzIHVuZGVmaW5lZCwganVzdCBncmFiIGV2ZXJ5dGhpbmdcbiAgICBpZiAodHlwZW9mIHBsdWdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwbHVnaW5zID0gT2JqZWN0LmtleXModGhpcy5fcGx1Z2lucyk7XG4gICAgfVxuICAgIC8vIElmIHBsdWdpbnMgaXMgYSBzdHJpbmcsIGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgd2l0aCBvbmUgaXRlbVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwbHVnaW5zID09PSAnc3RyaW5nJykge1xuICAgICAgcGx1Z2lucyA9IFtwbHVnaW5zXTtcbiAgICB9XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcGx1Z2luXG4gICAgJC5lYWNoKHBsdWdpbnMsIGZ1bmN0aW9uKGksIG5hbWUpIHtcbiAgICAgIC8vIEdldCB0aGUgY3VycmVudCBwbHVnaW5cbiAgICAgIHZhciBwbHVnaW4gPSBfdGhpcy5fcGx1Z2luc1tuYW1lXTtcblxuICAgICAgLy8gTG9jYWxpemUgdGhlIHNlYXJjaCB0byBhbGwgZWxlbWVudHMgaW5zaWRlIGVsZW0sIGFzIHdlbGwgYXMgZWxlbSBpdHNlbGYsIHVubGVzcyBlbGVtID09PSBkb2N1bWVudFxuICAgICAgdmFyICRlbGVtID0gJChlbGVtKS5maW5kKCdbZGF0YS0nK25hbWUrJ10nKS5hZGRCYWNrKCdbZGF0YS0nK25hbWUrJ10nKTtcblxuICAgICAgLy8gRm9yIGVhY2ggcGx1Z2luIGZvdW5kLCBpbml0aWFsaXplIGl0XG4gICAgICAkZWxlbS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2Y
5763XIgJGVsID0gJCh0aGlzKSxcbiAgICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgLy8gRG9uJ3QgZG91YmxlLWRpcCBvbiBwbHVnaW5zXG4gICAgICAgIGlmICgkZWwuZGF0YSgnemZQbHVnaW4nKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIlRyaWVkIHRvIGluaXRpYWxpemUgXCIrbmFtZStcIiBvbiBhbiBlbGVtZW50IHRoYXQgYWxyZWFkeSBoYXMgYSBGb3VuZGF0aW9uIHBsdWdpbi5cIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoJGVsLmF0dHIoJ2RhdGEtb3B0aW9ucycpKXtcbiAgICAgICAgICB2YXIgdGhpbmcgPSAkZWwuYXR0cignZGF0YS1vcHRpb25zJykuc3BsaXQoJzsnKS5mb3JFYWNoKGZ1bmN0aW9uKGUsIGkpe1xuICAgICAgICAgICAgdmFyIG9wdCA9IGUuc3BsaXQoJzonKS5tYXAoZnVuY3Rpb24oZWwpeyByZXR1cm4gZWwudHJpbSgpOyB9KTtcbiAgICAgICAgICAgIGlmKG9wdFswXSkgb3B0c1tvcHRbMF1dID0gcGFyc2VWYWx1ZShvcHRbMV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAkZWwuZGF0YSgnemZQbHVnaW4nLCBuZXcgcGx1Z2luKCQodGhpcyksIG9wdHMpKTtcbiAgICAgICAgfWNhdGNoKGVyKXtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyKTtcbiAgICAgICAgfWZpbmFsbHl7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0Rm5OYW1lOiBmdW5jdGlvbk5hbWUsXG4gIHRyYW5zaXRpb25lbmQ6IGZ1bmN0aW9uKCRlbGVtKXtcbiAgICB2YXIgdHJhbnNpdGlvbnMgPSB7XG4gICAgICAndHJhbnNpdGlvbic6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAgICdXZWJraXRUcmFuc2l0aW9uJzogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuICAgICAgJ01velRyYW5zaXRpb24nOiAndHJhbnNpdGlvbmVuZCcsXG4gICAgICAnT1RyYW5zaXRpb24nOiAnb3RyYW5zaXRpb25lbmQnXG4gICAgfTtcbiAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgICAgICBlbmQ7XG5cbiAgICBmb3IgKHZhciB0IGluIHRyYW5zaXRpb25zKXtcbiAgICAgIGlmICh0eXBlb2YgZWxlbS5zdHlsZVt0XSAhPT0gJ3VuZGVmaW5lZCcpe1xuICAgICAgICBlbmQgPSB0cmFuc2l0aW9uc1t0XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYoZW5kKXtcbiAgICAgIHJldHVybiBlbmQ7XG4gICAgfWVsc2V7XG4gICAgICBlbmQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICRlbGVtLnRyaWdnZXJIYW5kbGVyKCd0cmFuc2l0aW9uZW5kJywgWyRlbGVtXSk7XG4gICAgICB9LCAxKTtcbiAgICAgIHJldHVybiAndHJhbnNpdGlvbmVuZCc7XG4gICAgfVxuICB9XG59O1xuXG5Gb3VuZGF0aW9uLnV0aWwgPSB7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiBmb3IgYXBwbHlpbmcgYSBkZWJvdW5jZSBlZmZlY3QgdG8gYSBmdW5jdGlvbiBjYWxsLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyAtIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgdGltZW91dC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbGF5IC0gVGltZSBpbiBtcyB0byBkZWxheSB0aGUgY2FsbCBvZiBgZnVuY2AuXG4gICAqIEByZXR1cm5zIGZ1bmN0aW9uXG4gICAqL1xuICB0aHJvdHRsZTogZnVuY3Rpb24gKGZ1bmMsIGRlbGF5KSB7XG4gICAgdmFyIHRpbWVyID0gbnVsbDtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
5763XIgY29udGV4dCA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICAgIGlmICh0aW1lciA9PT0gbnVsbCkge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuLy8gVE9ETzogY29uc2lkZXIgbm90IG1ha2luZyB0aGlzIGEgalF1ZXJ5IGZ1bmN0aW9uXG4vLyBUT0RPOiBuZWVkIHdheSB0byByZWZsb3cgdnMuIHJlLWluaXRpYWxpemVcbi8qKlxuICogVGhlIEZvdW5kYXRpb24galF1ZXJ5IG1ldGhvZC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBtZXRob2QgLSBBbiBhY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgY3VycmVudCBqUXVlcnkgb2JqZWN0LlxuICovXG52YXIgZm91bmRhdGlvbiA9IGZ1bmN0aW9uKG1ldGhvZCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBtZXRob2QsXG4gICAgICAkbWV0YSA9ICQoJ21ldGEuZm91bmRhdGlvbi1tcScpLFxuICAgICAgJG5vSlMgPSAkKCcubm8tanMnKTtcblxuICBpZighJG1ldGEubGVuZ3RoKXtcbiAgICAkKCc8bWV0YSBjbGFzcz1cImZvdW5kYXRpb24tbXFcIj4nKS5hcHBlbmRUbyhkb2N1bWVudC5oZWFkKTtcbiAgfVxuICBpZigkbm9KUy5sZW5ndGgpe1xuICAgICRub0pTLnJlbW92ZUNsYXNzKCduby1qcycpO1xuICB9XG5cbiAgaWYodHlwZSA9PT0gJ3VuZGVmaW5lZCcpey8vbmVlZHMgdG8gaW5pdGlhbGl6ZSB0aGUgRm91bmRhdGlvbiBvYmplY3QsIG9yIGFuIGluZGl2aWR1YWwgcGx1Z2luLlxuICAgIEZvdW5kYXRpb24uTWVkaWFRdWVyeS5faW5pdCgpO1xuICAgIEZvdW5kYXRpb24ucmVmbG93KHRoaXMpO1xuICB9ZWxzZSBpZih0eXBlID09PSAnc3RyaW5nJyl7Ly9hbiBpbmRpdmlkdWFsIG1ldGhvZCB0byBpbnZva2Ugb24gYSBwbHVnaW4gb3IgZ3JvdXAgb2YgcGx1Z2luc1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsvL2NvbGxlY3QgYWxsIHRoZSBhcmd1bWVudHMsIGlmIG5lY2Vzc2FyeVxuICAgIHZhciBwbHVnQ2xhc3MgPSB0aGlzLmRhdGEoJ3pmUGx1Z2luJyk7Ly9kZXRlcm1pbmUgdGhlIGNsYXNzIG9mIHBsdWdpblxuXG4gICAgaWYocGx1Z0NsYXNzICE9PSB1bmRlZmluZWQgJiYgcGx1Z0NsYXNzW21ldGhvZF0gIT09IHVuZGVmaW5lZCl7Ly9tYWtlIHN1cmUgYm90aCB0aGUgY2xhc3MgYW5kIG1ldGhvZCBleGlzdFxuICAgICAgaWYodGhpcy5sZW5ndGggPT09IDEpey8vaWYgdGhlcmUncyBvbmx5IG9uZSwgY2FsbCBpdCBkaXJlY3RseS5cbiAgICAgICAgICBwbHVnQ2xhc3NbbWV0aG9kXS5hcHBseShwbHVnQ2xhc3MsIGFyZ3MpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbihpLCBlbCl7Ly9vdGhlcndpc2UgbG9vcCB0aHJvdWdoIHRoZSBqUXVlcnkgY29sbGVjdGlvbiBhbmQgaW52b2tlIHRoZSBtZXRob2Qgb24gZWFjaFxuICAgICAgICAgIHBsdWdDbGFzc1ttZXRob2RdLmFwcGx5KCQoZWwpLmRhdGEoJ3pmUGx1Z2luJyksIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9ZWxzZXsvL2Vycm9yIGZvciBubyBjbGFzcyBvciBubyBtZXRob2RcbiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcIldlJ3JlIHNvcnJ5LCAnXCIgKyBtZXRob2QgKyBcIicgaXMgbm90IGFuIGF2YWlsYWJsZSBtZXRob2QgZm9yIFwiICsgKHBsdWdDbGFzcyA/IGZ1bmN0aW9uTmFtZShwbHVnQ2xhc3MpIDogJ3RoaXMgZWxlbWVudCcpICsgJy4nKTtcbiAgICB9XG4gIH1lbHNley8vZXJyb3IgZm9yIGludmFsaWQgYXJndW1lbnQgdHlwZVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFdlJ3JlIHNvcnJ5LCAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIHBhcmFtZXRlci4gWW91IG11c3QgdXNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbWV0aG9kIHlvdSB3aXNoIHRvIGludm9rZS5gKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbndpbmRvdy5Gb3VuZGF0aW9uID0gRm91bmRhdGlvbjtcbiQuZm4uZm91bmRhdGlvbiA9IGZvdW5kYXRpb247XG5cbi8vIFBvbHlmaWxsIGZvciByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbihmdW5jdGlvbigpIHtcbiAgaWYgKCFEYXRlLm5vdyB8fCAhd2luZG93LkRhdGUubm93KVxuICAgIHdpbmRvdy5EYXRlLm5vdyA9IERhdGUubm93ID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgfTtcblxuICB2YXIgdmVuZG9ycyA9IFsnd2Via2l0JywgJ21veiddO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHZlbmRvcnMubGVuZ3RoICYmICF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lOyArK2kpIHtcbiAgICAgIHZhciB2cCA9IHZlbmRvcnNbaV07XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93W3ZwKydSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9ICh3aW5kb3dbdnArJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdpbmRvd1t2cCsnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ10pO1xuICB9XG4gIGlmICgvaVAoYWR8aG9uZXxvZCkuKk9TIDYvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpXG4gICAgfHwgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgIXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSkge1xuICAgIHZhciBsYXN0VGltZSA9IDA7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICB2Y
5763XIgbmV4dFRpbWUgPSBNYXRoLm1heChsYXN0VGltZSArIDE2LCBub3cpO1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgY2FsbGJhY2sobGFzdFRpbWUgPSBuZXh0VGltZSk7IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lIC0gbm93KTtcbiAgICB9O1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGNsZWFyVGltZW91dDtcbiAgfVxuICAvKipcbiAgICogUG9seWZpbGwgZm9yIHBlcmZvcm1hbmNlLm5vdywgcmVxdWlyZWQgYnkgckFGXG4gICAqL1xuICBpZighd2luZG93LnBlcmZvcm1hbmNlIHx8ICF3aW5kb3cucGVyZm9ybWFuY2Uubm93KXtcbiAgICB3aW5kb3cucGVyZm9ybWFuY2UgPSB7XG4gICAgICBzdGFydDogRGF0ZS5ub3coKSxcbiAgICAgIG5vdzogZnVuY3Rpb24oKXsgcmV0dXJuIERhdGUubm93KCkgLSB0aGlzLnN0YXJ0OyB9XG4gICAgfTtcbiAgfVxufSkoKTtcbmlmICghRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpIHtcbiAgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbihvVGhpcykge1xuICAgIGlmICh0eXBlb2YgdGhpcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gY2xvc2VzdCB0aGluZyBwb3NzaWJsZSB0byB0aGUgRUNNQVNjcmlwdCA1XG4gICAgICAvLyBpbnRlcm5hbCBJc0NhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAtIHdoYXQgaXMgdHJ5aW5nIHRvIGJlIGJvdW5kIGlzIG5vdCBjYWxsYWJsZScpO1xuICAgIH1cblxuICAgIHZhciBhQXJncyAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgZlRvQmluZCA9IHRoaXMsXG4gICAgICAgIGZOT1AgICAgPSBmdW5jdGlvbigpIHt9LFxuICAgICAgICBmQm91bmQgID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGZUb0JpbmQuYXBwbHkodGhpcyBpbnN0YW5jZW9mIGZOT1BcbiAgICAgICAgICAgICAgICAgPyB0aGlzXG4gICAgICAgICAgICAgICAgIDogb1RoaXMsXG4gICAgICAgICAgICAgICAgIGFBcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgICAgIH07XG5cbiAgICBpZiAodGhpcy5wcm90b3R5cGUpIHtcbiAgICAgIC8vIG5hdGl2ZSBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSBhIHByb3RvdHlwZVxuICAgICAgZk5PUC5wcm90b3R5cGUgPSB0aGlzLnByb3RvdHlwZTtcbiAgICB9XG4gICAgZkJvdW5kLnByb3RvdHlwZSA9IG5ldyBmTk9QKCk7XG5cbiAgICByZXR1cm4gZkJvdW5kO1xuICB9O1xufVxuLy8gUG9seWZpbGwgdG8gZ2V0IHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gaW4gSUU5XG5mdW5jdGlvbiBmdW5jdGlvbk5hbWUoZm4pIHtcbiAgaWYgKEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZnVuY05hbWVSZWdleCA9IC9mdW5jdGlvblxccyhbXihdezEsfSlcXCgvO1xuICAgIHZhciByZXN1bHRzID0gKGZ1bmNOYW1lUmVnZXgpLmV4ZWMoKGZuKS50b1N0cmluZygpKTtcbiAgICByZXR1cm4gKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAxKSA/IHJlc3VsdHNbMV0udHJpbSgpIDogXCJcIjtcbiAgfVxuICBlbHNlIGlmIChmbi5wcm90b3R5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmbi5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiBmbi5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gcGFyc2VWYWx1ZShzdHIpe1xuICBpZiAoJ3RydWUnID09PSBzdHIpIHJldHVybiB0cnVlO1xuICBlbHNlIGlmICgnZmFsc2UnID09PSBzdHIpIHJldHVybiBmYWxzZTtcbiAgZWxzZSBpZiAoIWlzTmFOKHN0ciAqIDEpKSByZXR1cm4gcGFyc2VGbG9hdChzdHIpO1xuICByZXR1cm4gc3RyO1xufVxuLy8gQ29udmVydCBQYXNjYWxDYXNlIHRvIGtlYmFiLWNhc2Vcbi8vIFRoYW5rIHlvdTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvODk1NTU4MFxuZnVuY3Rpb24gaHlwaGVuYXRlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKCk7XG59XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuRm91bmRhdGlvbi5Cb3ggPSB7XG4gIEltTm90VG91Y2hpbmdZb3U6IEltTm90VG91Y2hpbmdZb3UsXG4gIEdldERpbWVuc2lvbnM6IEdldERpbWVuc2lvbnMsXG4gIEdldE9mZnNldHM6IEdldE9mZnNldHNcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0aGUgZGltZW5zaW9ucyBvZiBhbiBlbGVtZW50IHRvIGEgY29udGFpbmVyIGFuZCBkZXRlcm1pbmVzIGNvbGxpc2lvbiBldmVudHMgd2l0aCBjb250YWluZXIuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IC0galF1ZXJ5IG9iamVjdCB0byB0ZXN0IGZvciBjb2xsaXNpb25zLlxuICogQHBhcmFtIHtqUXVlcnl9IHBhcmVudCAtIGpRdWVyeSBvYmplY3QgdG8gdXNlIGFzIGJvdW5kaW5nIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbHJPbmx5IC0gc2V0IHRvIHRydWUgdG8gY2hlY2sgbGVmdCBhbmQgcmlnaHQgdmFsdWVzIG9ubHkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRiT25seSAtIHNldCB0byB0cnVlIHRvIGNoZWNrIHRvcCBhbmQgYm90dG9tIHZhbHVlcyBvbmx5LlxuICogQGRlZmF1bHQgaWYgbm8gcGFyZW50IG9iamVjdCBwYXNzZWQsIGRldGVjdHMgY29sbGlzaW9ucyB3aXRoIGB3aW5kb3dgLlxuICogQHJldHVybnMge0Jvb2xlYW59IC0gdHJ1ZSBpZiBjb2xsaXNpb24gZnJlZSwgZmFsc2UgaWYgYSBjb2xsaXNpb24gaW4gYW55IGRpcmVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gSW1Ob3RUb3VjaGluZ1lvdShlbGVtZW50LCBwYXJlbnQsIGxyT25seSwgdGJPbmx5KSB7XG4gIHZhciBlbGVEaW1zID0gR2V0RGltZW5zaW9ucyhlbGVtZW50KSxcbiAgICAgIHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodDtcblxuICBpZiAocGFyZW50KSB7XG4gICAgdmFyIHBhckRpbXMgPSBHZXREaW1lbnNpb25zKHBhcmVudCk7XG5cbiAgICBib3R0b20gPSAoZWxlRGltcy5vZmZzZXQudG9wICsgZWxlRGltcy5oZWlnaHQgPD0gcGFyRGltcy5oZWlnaHQgKyBwYXJEaW1zLm9mZnNldC50b3ApO1xuICAgIHRvcCAgICA9IChlbGVEaW1zLm9mZnNldC50b3AgPj0gcGFyRGltcy5vZmZzZXQudG9wKTtcbiAgICBsZWZ0ICAgPSAoZWxlRGltcy5vZmZzZXQubGVmdCA+PSBwYXJEaW1zLm9mZnNldC5sZWZ0KTtcbiAgICByaWdodCAgPSAoZWxlRGltcy5vZmZzZXQubGVmdCArIGVsZURpbXMud2lkdGggPD0gcGFyRGltcy53aWR0aCArIHBhckRpbXMub2Zmc2V0LmxlZnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIGJvdHRvbSA9IChlbGVEaW1zLm9mZnNldC50b3AgKyBlbGVEaW1zLmhlaWdodCA8PSBlbGVEaW1zLndpbmRvd0RpbXMuaGVpZ2h0ICsgZWxlRGltcy53aW5kb3dEaW1zLm9mZnNldC50b3ApO1xuICAgIHRvcCAgICA9IChlbGVEaW1zLm9mZnNldC50b3AgPj0gZWxlRGltcy53aW5kb3dEaW1zLm9mZnNldC50b3ApO1xuICAgIGxlZnQgICA9IChlbGVEaW1zLm9mZnNldC5sZWZ0ID49IGVsZURpbXMud2luZG93RGltcy5vZmZzZXQubGVmdCk7XG4gICAgcmlnaHQgID0gKGVsZURpbXMub2Zmc2V0LmxlZnQgKyBlbGVEaW1zLndpZHRoIDw9IGVsZURpbXMud2luZG93RGltcy53aWR0aCk7XG4gIH1cblxuICB2Y
5763XIgYWxsRGlycyA9IFtib3R0b20sIHRvcCwgbGVmdCwgcmlnaHRdO1xuXG4gIGlmIChsck9ubHkpIHtcbiAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgPT09IHRydWU7XG4gIH1cblxuICBpZiAodGJPbmx5KSB7XG4gICAgcmV0dXJuIHRvcCA9PT0gYm90dG9tID09PSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGFsbERpcnMuaW5kZXhPZihmYWxzZSkgPT09IC0xO1xufTtcblxuLyoqXG4gKiBVc2VzIG5hdGl2ZSBtZXRob2RzIHRvIHJldHVybiBhbiBvYmplY3Qgb2YgZGltZW5zaW9uIHZhbHVlcy5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtqUXVlcnkgfHwgSFRNTH0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3Qgb3IgRE9NIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgZGltZW5zaW9ucy4gQ2FuIGJlIGFueSBlbGVtZW50IG90aGVyIHRoYXQgZG9jdW1lbnQgb3Igd2luZG93LlxuICogQHJldHVybnMge09iamVjdH0gLSBuZXN0ZWQgb2JqZWN0IG9mIGludGVnZXIgcGl4ZWwgdmFsdWVzXG4gKiBUT0RPIC0gaWYgZWxlbWVudCBpcyB3aW5kb3csIHJldHVybiBvbmx5IHRob3NlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gR2V0RGltZW5zaW9ucyhlbGVtLCB0ZXN0KXtcbiAgZWxlbSA9IGVsZW0ubGVuZ3RoID8gZWxlbVswXSA6IGVsZW07XG5cbiAgaWYgKGVsZW0gPT09IHdpbmRvdyB8fCBlbGVtID09PSBkb2N1bWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkknbSBzb3JyeSwgRGF2ZS4gSSdtIGFmcmFpZCBJIGNhbid0IGRvIHRoYXQuXCIpO1xuICB9XG5cbiAgdmFyIHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgcGFyUmVjdCA9IGVsZW0ucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHdpblJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgd2luWSA9IHdpbmRvdy5wYWdlWU9mZnNldCxcbiAgICAgIHdpblggPSB3aW5kb3cucGFnZVhPZmZzZXQ7XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgIG9mZnNldDoge1xuICAgICAgdG9wOiByZWN0LnRvcCArIHdpblksXG4gICAgICBsZWZ0OiByZWN0LmxlZnQgKyB3aW5YXG4gICAgfSxcbiAgICBwYXJlbnREaW1zOiB7XG4gICAgICB3aWR0aDogcGFyUmVjdC53aWR0aCxcbiAgICAgIGhlaWdodDogcGFyUmVjdC5oZWlnaHQsXG4gICAgICBvZmZzZXQ6IHtcbiAgICAgICAgdG9wOiBwYXJSZWN0LnRvcCArIHdpblksXG4gICAgICAgIGxlZnQ6IHBhclJlY3QubGVmdCArIHdpblhcbiAgICAgIH1cbiAgICB9LFxuICAgIHdpbmRvd0RpbXM6IHtcbiAgICAgIHdpZHRoOiB3aW5SZWN0LndpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5SZWN0LmhlaWdodCxcbiAgICAgIG9mZnNldDoge1xuICAgICAgICB0b3A6IHdpblksXG4gICAgICAgIGxlZnQ6IHdpblhcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCBvZiB0b3AgYW5kIGxlZnQgaW50ZWdlciBwaXhlbCB2YWx1ZXMgZm9yIGR5bmFtaWNhbGx5IHJlbmRlcmVkIGVsZW1lbnRzLFxuICogc3VjaCBhczogVG9vbHRpcCwgUmV2ZWFsLCBhbmQgRHJvcGRvd25cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IGZvciB0aGUgZWxlbWVudCBiZWluZyBwb3NpdGlvbmVkLlxuICogQHBhcmFtIHtqUXVlcnl9IGFuY2hvciAtIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBlbGVtZW50J3MgYW5jaG9yIHBvaW50LlxuICogQHBhcmFtIHtTdHJpbmd9IHBvc2l0aW9uIC0gYSBzdHJpbmcgcmVsYXRpbmcgdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQsIHJlbGF0aXZlIHRvIGl0J3MgYW5jaG9yXG4gKiBAcGFyYW0ge051bWJlcn0gdk9mZnNldCAtIGludGVnZXIgcGl4ZWwgdmFsdWUgb2YgZGVzaXJlZCB2ZXJ0aWNhbCBzZXBhcmF0aW9uIGJldHdlZW4gYW5jaG9yIGFuZCBlbGVtZW50LlxuICogQHBhcmFtIHtOdW1iZXJ9IGhPZmZzZXQgLSBpbnRlZ2VyIHBpeGVsIHZhbHVlIG9mIGRlc2lyZWQgaG9yaXpvbnRhbCBzZXBhcmF0aW9uIGJldHdlZW4gYW5jaG9yIGFuZCBlbGVtZW50LlxuICogQHBhcmFtIHtCb29sZWFufSBpc092ZXJmbG93IC0gaWYgYSBjb2xsaXNpb24gZXZlbnQgaXMgZGV0ZWN0ZWQsIHNldHMgdG8gdHJ1ZSB0byBkZWZhdWx0IHRoZSBlbGVtZW50IHRvIGZ1bGwgd2lkdGggLSBhbnkgZGVzaXJlZCBvZmZzZXQuXG4gKiBUT0RPIGFsdGVyL3Jld3JpdGUgdG8gd29yayB3aXRoIGBlbWAgdmFsdWVzIGFzIHdlbGwvaW5zdGVhZCBvZiBwaXhlbHNcbiAqL1xuZnVuY3Rpb24gR2V0T2Zmc2V0cyhlbGVtZW50LCBhbmNob3IsIHBvc2l0aW9uLCB2T2Zmc2V0LCBoT2Zmc2V0LCBpc092ZXJmbG93KSB7XG4gIHZhciAkZWxlRGltcyA9IEdldERpbWVuc2lvbnMoZWxlbWVudCksXG4gICAgICAkYW5jaG9yRGltcyA9IGFuY2hvciA/IEdldERpbWVuc2lvbnMoYW5jaG9yKSA6IG51bGw7XG5cbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAoRm91bmRhdGlvbi5ydGwoKSA/ICRhbmNob3JEaW1zLm9mZnNldC5sZWZ0IC0gJGVsZURpbXMud2lkdGggKyAkYW5jaG9yRGltcy53aWR0aCA6ICRhbmNob3JEaW1zLm9mZnNldC5sZWZ0KSxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wIC0gKCRlbGVEaW1zLmhlaWdodCArIHZPZmZzZXQpXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6ICRhbmNob3JEaW1zLm9mZnNldC5sZWZ0IC0gKCRlbGVEaW1zLndpZHRoICsgaE9mZnNldCksXG4gICAgICAgIHRvcDogJGFuY2hvckRpbXMub2Zmc2V0LnRvcFxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgKyAkYW5jaG9yRGltcy53aWR0aCArIGhPZmZzZXQsXG4gICAgICAgI
5763HRvcDogJGFuY2hvckRpbXMub2Zmc2V0LnRvcFxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2VudGVyIHRvcCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAoJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgKyAoJGFuY2hvckRpbXMud2lkdGggLyAyKSkgLSAoJGVsZURpbXMud2lkdGggLyAyKSxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wIC0gKCRlbGVEaW1zLmhlaWdodCArIHZPZmZzZXQpXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjZW50ZXIgYm90dG9tJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IGlzT3ZlcmZsb3cgPyBoT2Zmc2V0IDogKCgkYW5jaG9yRGltcy5vZmZzZXQubGVmdCArICgkYW5jaG9yRGltcy53aWR0aCAvIDIpKSAtICgkZWxlRGltcy53aWR0aCAvIDIpKSxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wICsgJGFuY2hvckRpbXMuaGVpZ2h0ICsgdk9mZnNldFxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2VudGVyIGxlZnQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgLSAoJGVsZURpbXMud2lkdGggKyBoT2Zmc2V0KSxcbiAgICAgICAgdG9wOiAoJGFuY2hvckRpbXMub2Zmc2V0LnRvcCArICgkYW5jaG9yRGltcy5oZWlnaHQgLyAyKSkgLSAoJGVsZURpbXMuaGVpZ2h0IC8gMilcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NlbnRlciByaWdodCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAkYW5jaG9yRGltcy5vZmZzZXQubGVmdCArICRhbmNob3JEaW1zLndpZHRoICsgaE9mZnNldCArIDEsXG4gICAgICAgIHRvcDogKCRhbmNob3JEaW1zLm9mZnNldC50b3AgKyAoJGFuY2hvckRpbXMuaGVpZ2h0IC8gMikpIC0gKCRlbGVEaW1zLmhlaWdodCAvIDIpXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjZW50ZXInOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogKCRlbGVEaW1zLndpbmRvd0RpbXMub2Zmc2V0LmxlZnQgKyAoJGVsZURpbXMud2luZG93RGltcy53aWR0aCAvIDIpKSAtICgkZWxlRGltcy53aWR0aCAvIDIpLFxuICAgICAgICB0b3A6ICgkZWxlRGltcy53aW5kb3dEaW1zLm9mZnNldC50b3AgKyAoJGVsZURpbXMud2luZG93RGltcy5oZWlnaHQgLyAyKSkgLSAoJGVsZURpbXMuaGVpZ2h0IC8gMilcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JldmVhbCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAoJGVsZURpbXMud2luZG93RGltcy53aWR0aCAtICRlbGVEaW1zLndpZHRoKSAvIDIsXG4gICAgICAgIHRvcDogJGVsZURpbXMud2luZG93RGltcy5vZmZzZXQudG9wICsgdk9mZnNldFxuICAgICAgfVxuICAgIGNhc2UgJ3JldmVhbCBmdWxsJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6ICRlbGVEaW1zLndpbmRvd0RpbXMub2Zmc2V0LmxlZnQsXG4gICAgICAgIHRvcDogJGVsZURpbXMud2luZG93RGltcy5vZmZzZXQudG9wXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0IGJvdHRvbSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAkYW5jaG9yRGltcy5vZmZzZXQubGVmdCxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wICsgJGFuY2hvckRpbXMuaGVpZ2h0ICsgdk9mZnNldFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0IGJvdHRvbSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAkYW5jaG9yRGltcy5vZmZzZXQubGVmdCArICRhbmNob3JEaW1zLndpZHRoICsgaE9mZnNldCAtICRlbGVEaW1zLndpZHRoLFxuICAgICAgICB0b3A6ICRhbmNob3JEaW1zLm9mZnNldC50b3AgKyAkYW5jaG9yRGltcy5oZWlnaHQgKyB2T2Zmc2V0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IChGb3VuZGF0aW9uLnJ0bCgpID8gJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgLSAkZWxlRGltcy53aWR0aCArICRhbmNob3JEaW1zLndpZHRoIDogJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgKyBoT2Zmc2V0KSxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wICsgJGFuY2hvckRpbXMuaGVpZ2h0ICsgdk9mZnNldFxuICAgICAgfVxuICB9XG59XG5cbn0oalF1ZXJ5KTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogVGhpcyB1dGlsIHdhcyBjcmVhdGVkIGJ5IE1hcml1cyBPbGJlcnR6ICpcbiAqIFBsZWFzZSB0aGFuayBNYXJpdXMgb24gR2l0SHViIC9vd2xiZXJ0eiAqXG4gKiBvciB0aGUgd2ViIGh0dHA6Ly93d3cubWFyaXVzb2xiZXJ0ei5kZS8gKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuY29uc3Qga2V5Q29kZXMgPSB7XG4gIDk6ICdUQUInLFxuICAxMzogJ0VOVEVSJyxcbiAgMjc6ICdFU0NBUEUnLFxuICAzMjogJ1NQQUNFJyxcbiAgMzc6ICdBUlJPV19MRUZUJyxcbiAgMzg6ICdBUlJPV19VUCcsXG4gIDM5OiAnQVJST1dfUklHSFQnLFxuICA0MDogJ0FSUk9XX0RPV04nXG59XG5cbnZhciBjb21tYW5kcyA9IHt9XG5cbnZhciBLZXlib2FyZCA9IHtcbiAga2V5czogZ2V0S2V5Q29kZXMoa2V5Q29kZXMpLFxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIChrZXlib2FyZCkgZXZlbnQgYW5kIHJldHVybnMgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIGl0cyBrZXlcbiAgICogQ2FuIGJlIHVzZWQgbGlrZSBGb3VuZGF0aW9uLnBhcnNlS2V5KGV2ZW50KSA9PT0gRm91bmRhdGlvbi5rZXlzLlNQQUNFXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gdGhlIGV2ZW50IGdlbmVyYXRlZCBieSB0aGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcmV0dXJuIFN0cmluZyBrZXkgLSBTd
5763HJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBrZXkgcHJlc3NlZFxuICAgKi9cbiAgcGFyc2VLZXkoZXZlbnQpIHtcbiAgICB2YXIga2V5ID0ga2V5Q29kZXNbZXZlbnQud2hpY2ggfHwgZXZlbnQua2V5Q29kZV0gfHwgU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC53aGljaCkudG9VcHBlckNhc2UoKTtcblxuICAgIC8vIFJlbW92ZSB1bi1wcmludGFibGUgY2hhcmFjdGVycywgZS5nLiBmb3IgYGZyb21DaGFyQ29kZWAgY2FsbHMgZm9yIENUUkwgb25seSBldmVudHNcbiAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFxXKy8sICcnKTtcblxuICAgIGlmIChldmVudC5zaGlmdEtleSkga2V5ID0gYFNISUZUXyR7a2V5fWA7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkpIGtleSA9IGBDVFJMXyR7a2V5fWA7XG4gICAgaWYgKGV2ZW50LmFsdEtleSkga2V5ID0gYEFMVF8ke2tleX1gO1xuXG4gICAgLy8gUmVtb3ZlIHRyYWlsaW5nIHVuZGVyc2NvcmUsIGluIGNhc2Ugb25seSBtb2RpZmllcnMgd2VyZSB1c2VkIChlLmcuIG9ubHkgYENUUkxfQUxUYClcbiAgICBrZXkgPSBrZXkucmVwbGFjZSgvXyQvLCAnJyk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBnaXZlbiAoa2V5Ym9hcmQpIGV2ZW50XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gdGhlIGV2ZW50IGdlbmVyYXRlZCBieSB0aGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29tcG9uZW50IC0gRm91bmRhdGlvbiBjb21wb25lbnQncyBuYW1lLCBlLmcuIFNsaWRlciBvciBSZXZlYWxcbiAgICogQHBhcmFtIHtPYmplY3RzfSBmdW5jdGlvbnMgLSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSB0byBiZSBleGVjdXRlZFxuICAgKi9cbiAgaGFuZGxlS2V5KGV2ZW50LCBjb21wb25lbnQsIGZ1bmN0aW9ucykge1xuICAgIHZhciBjb21tYW5kTGlzdCA9IGNvbW1hbmRzW2NvbXBvbmVudF0sXG4gICAgICBrZXlDb2RlID0gdGhpcy5wYXJzZUtleShldmVudCksXG4gICAgICBjbWRzLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGZuO1xuXG4gICAgaWYgKCFjb21tYW5kTGlzdCkgcmV0dXJuIGNvbnNvbGUud2FybignQ29tcG9uZW50IG5vdCBkZWZpbmVkIScpO1xuXG4gICAgaWYgKHR5cGVvZiBjb21tYW5kTGlzdC5sdHIgPT09ICd1bmRlZmluZWQnKSB7IC8vIHRoaXMgY29tcG9uZW50IGRvZXMgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBsdHIgYW5kIHJ0bFxuICAgICAgICBjbWRzID0gY29tbWFuZExpc3Q7IC8vIHVzZSBwbGFpbiBsaXN0XG4gICAgfSBlbHNlIHsgLy8gbWVyZ2UgbHRyIGFuZCBydGw6IGlmIGRvY3VtZW50IGlzIHJ0bCwgcnRsIG92ZXJ3cml0ZXMgbHRyIGFuZCB2aWNlIHZlcnNhXG4gICAgICAgIGlmIChGb3VuZGF0aW9uLnJ0bCgpKSBjbWRzID0gJC5leHRlbmQoe30sIGNvbW1hbmRMaXN0Lmx0ciwgY29tbWFuZExpc3QucnRsKTtcblxuICAgICAgICBlbHNlIGNtZHMgPSAkLmV4dGVuZCh7fSwgY29tbWFuZExpc3QucnRsLCBjb21tYW5kTGlzdC5sdHIpO1xuICAgIH1cbiAgICBjb21tYW5kID0gY21kc1trZXlDb2RlXTtcblxuICAgIGZuID0gZnVuY3Rpb25zW2NvbW1hbmRdO1xuICAgIGlmIChmbiAmJiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHsgLy8gZXhlY3V0ZSBmdW5jdGlvbiAgaWYgZXhpc3RzXG4gICAgICB2Y
5763XIgcmV0dXJuVmFsdWUgPSBmbi5hcHBseSgpO1xuICAgICAgaWYgKGZ1bmN0aW9ucy5oYW5kbGVkIHx8IHR5cGVvZiBmdW5jdGlvbnMuaGFuZGxlZCA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBleGVjdXRlIGZ1bmN0aW9uIHdoZW4gZXZlbnQgd2FzIGhhbmRsZWRcbiAgICAgICAgICBmdW5jdGlvbnMuaGFuZGxlZChyZXR1cm5WYWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmdW5jdGlvbnMudW5oYW5kbGVkIHx8IHR5cGVvZiBmdW5jdGlvbnMudW5oYW5kbGVkID09PSAnZnVuY3Rpb24nKSB7IC8vIGV4ZWN1dGUgZnVuY3Rpb24gd2hlbiBldmVudCB3YXMgbm90IGhhbmRsZWRcbiAgICAgICAgICBmdW5jdGlvbnMudW5oYW5kbGVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzIHdpdGhpbiB0aGUgZ2l2ZW4gYCRlbGVtZW50YFxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIHNlYXJjaCB3aXRoaW5cbiAgICogQHJldHVybiB7alF1ZXJ5fSAkZm9jdXNhYmxlIC0gYWxsIGZvY3VzYWJsZSBlbGVtZW50cyB3aXRoaW4gYCRlbGVtZW50YFxuICAgKi9cbiAgZmluZEZvY3VzYWJsZSgkZWxlbWVudCkge1xuICAgIGlmKCEkZWxlbWVudCkge3JldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiAkZWxlbWVudC5maW5kKCdhW2hyZWZdLCBhcmVhW2hyZWZdLCBpbnB1dDpub3QoW2Rpc2FibGVkXSksIHNlbGVjdDpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgYnV0dG9uOm5vdChbZGlzYWJsZWRdKSwgaWZyYW1lLCBvYmplY3QsIGVtYmVkLCAqW3RhYmluZGV4XSwgKltjb250ZW50ZWRpdGFibGVdJykuZmlsdGVyKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCEkKHRoaXMpLmlzKCc6dmlzaWJsZScpIHx8ICQodGhpcykuYXR0cigndGFiaW5kZXgnKSA8IDApIHsgcmV0dXJuIGZhbHNlOyB9IC8vb25seSBoYXZlIHZpc2libGUgZWxlbWVudHMgYW5kIHRob3NlIHRoYXQgaGF2ZSBhIHRhYmluZGV4IGdyZWF0ZXIgb3IgZXF1YWwgMFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBuYW1lIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbXBvbmVudCAtIEZvdW5kYXRpb24gY29tcG9uZW50LCBlLmcuIFNsaWRlciBvciBSZXZlYWxcbiAgICogQHJldHVybiBTdHJpbmcgY29tcG9uZW50TmFtZVxuICAgKi9cblxuICByZWdpc3Rlcihjb21wb25lbnROYW1lLCBjbWRzKSB7XG4gICAgY29tbWFuZHNbY29tcG9uZW50TmFtZV0gPSBjbWRzO1xuICB9LCAgXG5cbiAgLyoqXG4gICAqIFRyYXBzIHRoZSBmb2N1cyBpbiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICogQHBhcmFtICB7alF1ZXJ5fSAkZWxlbWVudCAgalF1ZXJ5IG9iamVjdCB0byB0cmFwIHRoZSBmb3VjcyBpbnRvLlxuICAgKi9cbiAgdHJhcEZvY3VzKCRlbGVtZW50KSB7XG4gICAgdmFyICRmb2N1c2FibGUgPSBGb3VuZGF0aW9uLktleWJvYXJkLmZpbmRGb2N1c2FibGUoJGVsZW1lbnQpLFxuICAgICAgICAkZmlyc3RGb2N1c2FibGUgPSAkZm9jdXNhYmxlLmVxKDApLFxuICAgICAgICAkbGFzdEZvY3VzYWJsZSA9ICRmb2N1c2FibGUuZXEoLTEpO1xuXG4gICAgJGVsZW1lbnQub24oJ2tleWRvd24uemYudHJhcGZvY3VzJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09ICRsYXN0Rm9jdXNhYmxlWzBdICYmIEZvdW5kYXRpb24uS2V5Ym9hcmQucGFyc2VLZXkoZXZlbnQpID09PSAnVEFCJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAkZmlyc3RGb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGV2ZW50LnRhcmdldCA9PT0gJGZpcnN0Rm9jdXNhYmxlWzBdICYmIEZvdW5kYXRpb24uS2V5Ym9hcmQucGFyc2VLZXkoZXZlbnQpID09PSAnU0hJRlRfVEFCJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAkbGFzdEZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIHRyYXBwZWQgZm9jdXMgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICogQHBhcmFtICB7alF1ZXJ5fSAkZWxlbWVudCAgalF1ZXJ5IG9iamVjdCB0byByZWxlYXNlIHRoZSBmb2N1cyBmb3IuXG4gICAqL1xuICByZWxlYXNlRm9jdXMoJGVsZW1lbnQpIHtcbiAgICAkZWxlbWVudC5vZmYoJ2tleWRvd24uemYudHJhcGZvY3VzJyk7XG4gIH1cbn1cblxuLypcbiAqIENvbnN0YW50cyBmb3IgZWFzaWVyIGNvbXBhcmluZy5cbiAqIENhbiBiZSB1c2VkIGxpa2UgRm91bmRhdGlvbi5wYXJzZUtleShldmVudCkgPT09IEZvdW5kYXRpb24ua2V5cy5TUEFDRVxuICovXG5mdW5jdGlvbiBnZXRLZXlDb2RlcyhrY3MpIHtcbiAgdmFyIGsgPSB7fTtcbiAgZm9yICh2YXIga2MgaW4ga2NzKSBrW2tjc1trY11dID0ga2NzW2tjXTtcbiAgcmV0dXJuIGs7XG59XG5cbkZvdW5kYXRpb24uS2V5Ym9hcmQgPSBLZXlib2FyZDtcblxufShqUXVlcnkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4hZnVuY3Rpb24oJCkge1xuXG4vLyBEZWZhdWx0IHNldCBvZiBtZWRpYSBxdWVyaWVzXG5jb25zdCBkZWZhdWx0UXVlcmllcyA9IHtcbiAgJ2RlZmF1bHQnIDogJ29ubHkgc2NyZWVuJyxcbiAgbGFuZHNjYXBlIDogJ29ubHkgc2NyZWVuIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSknLFxuICBwb3J0cmFpdCA6ICdvbmx5IHNjcmVlbiBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknLFxuICByZXRpbmEgOiAnb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLCcgK1xuICAgICdvbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMiksJyArXG4gICAgJ29ubHkgc2NyZWVuIGFuZCAoLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzogMi8xKSwnICtcbiAgICAnb25seSBzY3JlZW4gYW5kIChtaW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwnICtcbiAgICAnb25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbj
5763ogMTkyZHBpKSwnICtcbiAgICAnb25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMmRwcHgpJ1xufTtcblxudmFyIE1lZGlhUXVlcnkgPSB7XG4gIHF1ZXJpZXM6IFtdLFxuXG4gIGN1cnJlbnQ6ICcnLFxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgbWVkaWEgcXVlcnkgaGVscGVyLCBieSBleHRyYWN0aW5nIHRoZSBicmVha3BvaW50IGxpc3QgZnJvbSB0aGUgQ1NTIGFuZCBhY3RpdmF0aW5nIHRoZSBicmVha3BvaW50IHdhdGNoZXIuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2luaXQoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBleHRyYWN0ZWRTdHlsZXMgPSAkKCcuZm91bmRhdGlvbi1tcScpLmNzcygnZm9udC1mYW1pbHknKTtcbiAgICB2YXIgbmFtZWRRdWVyaWVzO1xuXG4gICAgbmFtZWRRdWVyaWVzID0gcGFyc2VTdHlsZVRvT2JqZWN0KGV4dHJhY3RlZFN0eWxlcyk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gbmFtZWRRdWVyaWVzKSB7XG4gICAgICBpZihuYW1lZFF1ZXJpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBzZWxmLnF1ZXJpZXMucHVzaCh7XG4gICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgIHZhbHVlOiBgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICR7bmFtZWRRdWVyaWVzW2tleV19KWBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5fZ2V0Q3VycmVudFNpemUoKTtcblxuICAgIHRoaXMuX3dhdGNoZXIoKTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzY3JlZW4gaXMgYXQgbGVhc3QgYXMgd2lkZSBhcyBhIGJyZWFrcG9pbnQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2l6ZSAtIE5hbWUgb2YgdGhlIGJyZWFrcG9pbnQgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGJyZWFrcG9pbnQgbWF0Y2hlcywgYGZhbHNlYCBpZiBpdCdzIHNtYWxsZXIuXG4gICAqL1xuICBhdExlYXN0KHNpemUpIHtcbiAgICB2YXIgcXVlcnkgPSB0aGlzLmdldChzaXplKTtcblxuICAgIGlmIChxdWVyeSkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKHF1ZXJ5KS5tYXRjaGVzO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzY3JlZW4gbWF0Y2hlcyB0byBhIGJyZWFrcG9pbnQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2l6ZSAtIE5hbWUgb2YgdGhlIGJyZWFrcG9pbnQgdG8gY2hlY2ssIGVpdGhlciAnc21hbGwgb25seScgb3IgJ3NtYWxsJy4gT21pdHRpbmcgJ29ubHknIGZhbGxzIGJhY2sgdG8gdXNpbmcgYXRMZWFzdCgpIG1ldGhvZC5cbiAgICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgYnJlYWtwb2ludCBtYXRjaGVzLCBgZmFsc2VgIGlmIGl0IGRvZXMgbm90LlxuICAgKi9cbiAgaXMoc2l6ZSkge1xuICAgIHNpemUgPSBzaXplLnRyaW0oKS5zcGxpdCgnICcpO1xuICAgIGlmKHNpemUubGVuZ3RoID4gMSAmJiBzaXplWzFdID09PSAnb25seScpIHtcbiAgICAgIGlmKHNpemVbMF0gPT09IHRoaXMuX2dldEN1cnJlbnRTaXplKCkpIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5hdExlYXN0KHNpemVbMF0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG1lZGlhIHF1ZXJ5IG9mIGEgYnJlYWtwb2ludC5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzaXplIC0gTmFtZSBvZiB0aGUgYnJlYWtwb2ludCB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtTdHJpbmd8bnVsbH0gLSBUaGUgbWVkaWEgcXVlcnkgb2YgdGhlIGJyZWFrcG9pbnQsIG9yIGBudWxsYCBpZiB0aGUgYnJlYWtwb2ludCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cbiAgZ2V0KHNpemUpIHtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMucXVlcmllcykge1xuICAgICAgaWYodGhpcy5xdWVyaWVzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIHZhciBxdWVyeSA9IHRoaXMucXVlcmllc1tpXTtcbiAgICAgICAgaWYgKHNpemUgPT09IHF1ZXJ5Lm5hbWUpIHJldHVybiBxdWVyeS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBicmVha3BvaW50IG5hbWUgYnkgdGVzdGluZyBldmVyeSBicmVha3BvaW50IGFuZCByZXR1cm5pbmcgdGhlIGxhc3Qgb25lIHRvIG1hdGNoICh0aGUgYmlnZ2VzdCBvbmUpLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge1N0cmluZ30gTmFtZSBvZiB0aGUgY3VycmVudCBicmVha3BvaW50LlxuICAgKi9cbiAgX2dldEN1cnJlbnRTaXplKCkge1xuICAgIHZhciBtYXRjaGVkO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVyeSA9IHRoaXMucXVlcmllc1tpXTtcblxuICAgICAgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKHF1ZXJ5LnZhbHVlKS5tYXRjaGVzKSB7XG4gICAgICAgIG1hdGNoZWQgPSBxdWVyeTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1hdGNoZWQgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlZC5uYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWF0Y2hlZDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyB0aGUgYnJlYWtwb2ludCB3YXRjaGVyLCB3aGljaCBmaXJlcyBhbiBldmVudCBvbiB0aGUgd2luZG93IHdoZW5ldmVyIHRoZSBicmVha3BvaW50IGNoYW5nZXMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3dhdGNoZXIoKSB7XG4gICAgJCh3aW5kb3cpLm9uKCdyZXNpemUuemYubWVkaWFxdWVyeScsICgpID0+IHtcbiAgICAgIHZhciBuZXdTaXplID0gdGhpcy5fZ2V0Q3VycmVudFNpemUoKSwgY3VycmVudFNpemUgPSB0aGlzLmN1cnJlbnQ7XG5cbiAgICAgIGlmIChuZXdTaXplICE9PSBjdXJyZW50U2l6ZSkge1xuICAgICAgICAvLyBDaGFuZ2UgdGhlIGN1cnJlbnQgbWVkaWEgcXVlcnlcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gbmV3U2l6ZTtcblxuICAgICAgICAvLyBCcm9hZGNhc3QgdGhlIG1lZGlhIHF1ZXJ5IGNoYW5nZSBvbiB0aGUgd2luZG93XG4gICAgICAgICQo
5763d2luZG93KS50cmlnZ2VyKCdjaGFuZ2VkLnpmLm1lZGlhcXVlcnknLCBbbmV3U2l6ZSwgY3VycmVudFNpemVdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuRm91bmRhdGlvbi5NZWRpYVF1ZXJ5ID0gTWVkaWFRdWVyeTtcblxuLy8gbWF0Y2hNZWRpYSgpIHBvbHlmaWxsIC0gVGVzdCBhIENTUyBtZWRpYSB0eXBlL3F1ZXJ5IGluIEpTLlxuLy8gQXV0aG9ycyAmIGNvcHlyaWdodCAoYykgMjAxMjogU2NvdHQgSmVobCwgUGF1bCBJcmlzaCwgTmljaG9sYXMgWmFrYXMsIERhdmlkIEtuaWdodC4gRHVhbCBNSVQvQlNEIGxpY2Vuc2VcbndpbmRvdy5tYXRjaE1lZGlhIHx8ICh3aW5kb3cubWF0Y2hNZWRpYSA9IGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gRm9yIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBtYXRjaE1lZGl1bSBhcGkgc3VjaCBhcyBJRSA5IGFuZCB3ZWJraXRcbiAgdmFyIHN0eWxlTWVkaWEgPSAod2luZG93LnN0eWxlTWVkaWEgfHwgd2luZG93Lm1lZGlhKTtcblxuICAvLyBGb3IgdGhvc2UgdGhhdCBkb24ndCBzdXBwb3J0IG1hdGNoTWVkaXVtXG4gIGlmICghc3R5bGVNZWRpYSkge1xuICAgIHZhciBzdHlsZSAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSxcbiAgICBzY3JpcHQgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXSxcbiAgICBpbmZvICAgICAgICA9IG51bGw7XG5cbiAgICBzdHlsZS50eXBlICA9ICd0ZXh0L2Nzcyc7XG4gICAgc3R5bGUuaWQgICAgPSAnbWF0Y2htZWRpYWpzLXRlc3QnO1xuXG4gICAgc2NyaXB0ICYmIHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzdHlsZSwgc2NyaXB0KTtcblxuICAgIC8vICdzdHlsZS5jdXJyZW50U3R5bGUnIGlzIHVzZWQgYnkgSUUgPD0gOCBhbmQgJ3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlJyBmb3IgYWxsIG90aGVyIGJyb3dzZXJzXG4gICAgaW5mbyA9ICgnZ2V0Q29tcHV0ZWRTdHlsZScgaW4gd2luZG93KSAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzdHlsZSwgbnVsbCkgfHwgc3R5bGUuY3VycmVudFN0eWxlO1xuXG4gICAgc3R5bGVNZWRpYSA9IHtcbiAgICAgIG1hdGNoTWVkaXVtKG1lZGlhKSB7XG4gICAgICAgIHZhciB0ZXh0ID0gYEBtZWRpYSAke21lZGlhfXsgI21hdGNobWVkaWFqcy10ZXN0IHsgd2lkdGg6IDFweDsgfSB9YDtcblxuICAgICAgICAvLyAnc3R5bGUuc3R5bGVTaGVldCcgaXMgdXNlZCBieSBJRSA8PSA4IGFuZCAnc3R5bGUudGV4dENvbnRlbnQnIGZvciBhbGwgb3RoZXIgYnJvd3NlcnNcbiAgICAgICAgaWYgKHN0eWxlLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSB0ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlc3QgaWYgbWVkaWEgcXVlcnkgaXMgdHJ1ZSBvciBmYWxzZVxuICAgICAgICByZXR1cm4gaW5mby53aWR0aCA9PT0gJzFweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG1lZGlhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hdGNoZXM6IHN0eWxlTWVkaWEubWF0Y2hNZWRpdW0obWVkaWEgfHwgJ2FsbCcpLFxuICAgICAgbWVkaWE6IG1lZGlhIHx8ICdhbGwnXG4gICAgfTtcbiAgfVxufSgpKTtcblxuLy8gVGhhbmsgeW91OiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZ1xuZnVuY3Rpb24gcGFyc2VTdHlsZVRvT2JqZWN0KHN0cikge1xuICB2YXIgc3R5bGVPYmplY3QgPSB7fTtcblxuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3R5bGVPYmplY3Q7XG4gIH1cblxuICBzdHIgPSBzdHIudHJpbSgpLnNsaWNlKDEsIC0xKTsgLy8gYnJvd3NlcnMgcmUtcXVvdGUgc3RyaW5nIHN0eWxlIHZhbHVlc1xuXG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuIHN0eWxlT2JqZWN0O1xuICB9XG5cbiAgc3R5bGVPYmplY3QgPSBzdHIuc3BsaXQoJyYnKS5yZWR1Y2UoZnVuY3Rpb24ocmV0LCBwYXJhbSkge1xuICAgIHZhciBwYXJ0cyA9IHBhcmFtLnJlcGxhY2UoL1xcKy9nLCAnICcpLnNwbGl0KCc9Jyk7XG4gICAgdmFyIGtleSA9IHBhcnRzWzBdO1xuICAgIHZhciB2YWwgPSBwYXJ0c1sxXTtcbiAgICBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5KTtcblxuICAgIC8vIG1pc3NpbmcgYD1gIHNob3VsZCBiZSBgbnVsbGA6XG4gICAgLy8gaHR0cDovL3czLm9yZy9UUi8yMDEyL1dELXVybC0yMDEyMDUyNC8jY29sbGVjdC11cmwtcGFyYW1ldGVyc1xuICAgIHZhbCA9IHZhbCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudCh2YWwpO1xuXG4gICAgaWYgKCFyZXQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0W2tleV0gPSB2YWw7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJldFtrZXldKSkge1xuICAgICAgcmV0W2tleV0ucHVzaCh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXRba2V5XSA9IFtyZXRba2V5XSwgdmFsXTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSwge30pO1xuXG4gIHJldHVybiBzdHlsZU9iamVjdDtcbn1cblxuRm91bmRhdGlvbi5NZWRpYVF1ZXJ5ID0gTWVkaWFRdWVyeTtcblxufShqUXVlcnkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4hZnVuY3Rpb24oJCkge1xuXG4vKipcbiAqIE1vdGlvbiBtb2R1bGUuXG4gKiBAbW9kdWxlIGZvdW5kYXRpb24ubW90aW9uXG4gKi9cblxuY29uc3QgaW5pdENsYXNzZXMgICA9IFsnbXVpLWVudGVyJywgJ211aS1sZWF2ZSddO1xuY29uc3QgYWN0aXZlQ2xhc3NlcyA9IFsnbXVpLWVudGVyLWFjdGl2ZScsICdtdWktbGVhdmUtYWN0aXZlJ107XG5cbmNvbnN0IE1vdGlvbiA9IHtcbiAgYW5pbWF0ZUluOiBmdW5jdGlvbihlbGVtZW50LCBhbmltYXRpb24sIGNiKSB7XG4gICAgYW5pbWF0ZSh0cnVlLCBlbGVtZW50LCBhbmltYXRpb24sIGNiKTtcbiAgfSxcblxuICBhbmltYXRlT3V0OiBmdW5jdGlvbihlbGVtZW50LCBhbmltYXRpb24sIGNiKSB7XG4gICAgYW5pbWF0ZShmYWxzZSwgZWxlbWVudCwgYW5pbWF0aW9uLCBjYik7XG4gIH1cbn1cblxuZnVuY3Rpb24gTW92ZShkdXJhdGlvbiwgZWxlbSwgZm4pe1xuICB2YXIgYW5pbSwgcHJvZywgc3RhcnQgPSBudWxsO1xuICAvLyBjb25zb2xlLmxvZygnY2FsbGVkJyk7XG5cbiAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgZm4uYXBwbHkoZWxlbSk7XG4gICAgZWxlbS50cmlnZ2VyKCdmaW5pc2hlZC56Zi5hbmltYXRlJywgW2VsZW1dKS50cmlnZ2VySGFuZGxlcignZmluaXNoZWQuemYuYW5pbWF0ZScsIFtlbGVtXSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZnVuY3Rpb24gbW92ZSh0cyl7XG4gICAgaWYoIXN0YXJ0KSBzdGFydCA9IHRzO1
5763xuICAgIC8vIGNvbnNvbGUubG9nKHN0YXJ0LCB0cyk7XG4gICAgcHJvZyA9IHRzIC0gc3RhcnQ7XG4gICAgZm4uYXBwbHkoZWxlbSk7XG5cbiAgICBpZihwcm9nIDwgZHVyYXRpb24peyBhbmltID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShtb3ZlLCBlbGVtKTsgfVxuICAgIGVsc2V7XG4gICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbSk7XG4gICAgICBlbGVtLnRyaWdnZXIoJ2ZpbmlzaGVkLnpmLmFuaW1hdGUnLCBbZWxlbV0pLnRyaWdnZXJIYW5kbGVyKCdmaW5pc2hlZC56Zi5hbmltYXRlJywgW2VsZW1dKTtcbiAgICB9XG4gIH1cbiAgYW5pbSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobW92ZSk7XG59XG5cbi8qKlxuICogQW5pbWF0ZXMgYW4gZWxlbWVudCBpbiBvciBvdXQgdXNpbmcgYSBDU1MgdHJhbnNpdGlvbiBjbGFzcy5cbiAqIEBmdW5jdGlvblxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbiAtIERlZmluZXMgaWYgdGhlIGFuaW1hdGlvbiBpcyBpbiBvciBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtIGpRdWVyeSBvciBIVE1MIG9iamVjdCB0byBhbmltYXRlLlxuICogQHBhcmFtIHtTdHJpbmd9IGFuaW1hdGlvbiAtIENTUyBjbGFzcyB0byB1c2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiAtIENhbGxiYWNrIHRvIHJ1biB3aGVuIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC5cbiAqL1xuZnVuY3Rpb24gYW5pbWF0ZShpc0luLCBlbGVtZW50LCBhbmltYXRpb24sIGNiKSB7XG4gIGVsZW1lbnQgPSAkKGVsZW1lbnQpLmVxKDApO1xuXG4gIGlmICghZWxlbWVudC5sZW5ndGgpIHJldHVybjtcblxuICB2YXIgaW5pdENsYXNzID0gaXNJbiA/IGluaXRDbGFzc2VzWzBdIDogaW5pdENsYXNzZXNbMV07XG4gIHZhciBhY3RpdmVDbGFzcyA9IGlzSW4gPyBhY3RpdmVDbGFzc2VzWzBdIDogYWN0aXZlQ2xhc3Nlc1sxXTtcblxuICAvLyBTZXQgdXAgdGhlIGFuaW1hdGlvblxuICByZXNldCgpO1xuXG4gIGVsZW1lbnRcbiAgICAuYWRkQ2xhc3MoYW5pbWF0aW9uKVxuICAgIC5jc3MoJ3RyYW5zaXRpb24nLCAnbm9uZScpO1xuXG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgZWxlbWVudC5hZGRDbGFzcyhpbml0Q2xhc3MpO1xuICAgIGlmIChpc0luKSBlbGVtZW50LnNob3coKTtcbiAgfSk7XG5cbiAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvblxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgIGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGg7XG4gICAgZWxlbWVudFxuICAgICAgLmNzcygndHJhbnNpdGlvbicsICcnKVxuICAgICAgLmFkZENsYXNzKGFjdGl2ZUNsYXNzKTtcbiAgfSk7XG5cbiAgLy8gQ2xlYW4gdXAgdGhlIGFuaW1hdGlvbiB3aGVuIGl0IGZpbmlzaGVzXG4gIGVsZW1lbnQub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZChlbGVtZW50KSwgZmluaXNoKTtcblxuICAvLyBIaWRlcyB0aGUgZWxlbWVudCAoZm9yIG91dCBhbmltYXRpb25zKSwgcmVzZXRzIHRoZSBlbGVtZW50LCBhbmQgcnVucyBhIGNhbGxiYWNrXG4gIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICBpZiAoIWlzSW4pIGVsZW1lbnQuaGlkZSgpO1xuICAgIHJlc2V0KCk7XG4gICAgaWYgKGNiKSBjYi5hcHBseShlbGVtZW50KTtcbiAgfVxuXG4gIC8vIFJlc2V0cyB0cmFuc2l0aW9ucyBhbmQgcmVtb3ZlcyBtb3Rpb24tc3BlY2lmaWMgY2xhc3Nlc1xuICBmdW5jdGlvbiByZXNldCgpIHtcbiAgICBlbGVtZW50WzBdLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IDA7XG4gICAgZWxlbWVudC5yZW1vdmVDbGFzcyhgJHtpbml0Q2xhc3N9ICR7YWN0aXZlQ2xhc3N9ICR7YW5pbWF0aW9ufWApO1xuICB9XG59XG5cbkZvdW5kYXRpb24uTW92ZSA9IE1vdmU7XG5Gb3VuZGF0aW9uLk1vdGlvbiA9IE1vdGlvbjtcblxufShqUXVlcnkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4hZnVuY3Rpb24oJCkge1xuXG5jb25zdCBOZXN0ID0ge1xuICBGZWF0aGVyKG1lbnUsIHR5cGUgPSAnemYnKSB7XG4gICAgbWVudS5hdHRyKCdyb2xlJywgJ21lbnViYXInKTtcblxuICAgIHZhciBpdGVtcyA9IG1lbnUuZmluZCgnbGknKS5hdHRyKHsncm9sZSc6ICdtZW51aXRlbSd9KSxcbiAgICAgICAgc3ViTWVudUNsYXNzID0gYGlzLSR7dHlwZX0tc3VibWVudWAsXG4gICAgICAgIHN1Ykl0ZW1DbGFzcyA9IGAke3N1Yk1lbnVDbGFzc30taXRlbWAsXG4gICAgICAgIGhhc1N1YkNsYXNzID0gYGlzLSR7dHlwZX0tc3VibWVudS1wYXJlbnRgO1xuXG4gICAgaXRlbXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciAkaXRlbSA9ICQodGhpcyksXG4gICAgICAgICAgJHN1YiA9ICRpdGVtLmNoaWxkcmVuKCd1bCcpO1xuXG4gICAgICBpZiAoJHN1Yi5sZW5ndGgpIHtcbiAgICAgICAgJGl0ZW1cbiAgICAgICAgICAuYWRkQ2xhc3MoaGFzU3ViQ2xhc3MpXG4gICAgICAgICAgLmF0dHIoe1xuICAgICAgICAgICAgJ2FyaWEtaGFzcG9wdXAnOiB0cnVlLFxuICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiAkaXRlbS5jaGlsZHJlbignYTpmaXJzdCcpLnRleHQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIE5vdGU6ICBEcmlsbGRvd25zIGJlaGF2ZSBkaWZmZXJlbnRseSBpbiBob3cgdGhleSBoaWRlLCBhbmQgc28gbmVlZFxuICAgICAgICAgIC8vIGFkZGl0aW9uYWwgYXR0cmlidXRlcy4gIFdlIHNob3VsZCBsb29rIGlmIHRoaXMgcG9zc2libHkgb3Zlci1nZW5lcmFsaXplZFxuICAgICAgICAgIC8vIHV0aWxpdHkgKE5lc3QpIGlzIGFwcHJvcHJpYXRlIHdoZW4gd2UgcmV3b3JrIG1lbnVzIGluIDYuNFxuICAgICAgICAgIGlmKHR5cGUgPT09ICdkcmlsbGRvd24nKSB7XG4gICAgICAgICAgICAkaXRlbS5hdHRyKHsnYXJpYS1leHBhbmRlZCc6IGZhbHNlfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICRzdWJcbiAgICAgICAgICAuYWRkQ2xhc3MoYHN1Ym1lbnUgJHtzdWJNZW51Q2xhc3N9YClcbiAgICAgICAgICAuYXR0cih7XG4gICAgICAgICAgICAnZGF0YS1zdWJtZW51JzogJycsXG4gICAgICAgICAgICAncm9sZSc6ICdtZW51J1xuICAgICAgICAgIH0pO1xuICAgICAgICBpZih0eXBlID09PSAnZHJpbGxkb3duJykge1xuICAgICAgICAgICRzdWIuYXR0cih7J2FyaWEtaGlkZGVuJzogdHJ1ZX0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgkaXRlbS5wYXJlbnQoJ1tkYXRhLXN1Ym1lbnVdJykubGVuZ3RoKSB7XG4gICAgICAgICRpdGVtLmFkZENsYXNzKGBpcy1zdWJtZW51LWl0ZW0gJHtzdWJJdGVtQ2xhc3N9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgQnVybihtZW51LCB0eX
5763BlKSB7XG4gICAgdmFyIC8vaXRlbXMgPSBtZW51LmZpbmQoJ2xpJyksXG4gICAgICAgIHN1Yk1lbnVDbGFzcyA9IGBpcy0ke3R5cGV9LXN1Ym1lbnVgLFxuICAgICAgICBzdWJJdGVtQ2xhc3MgPSBgJHtzdWJNZW51Q2xhc3N9LWl0ZW1gLFxuICAgICAgICBoYXNTdWJDbGFzcyA9IGBpcy0ke3R5cGV9LXN1Ym1lbnUtcGFyZW50YDtcblxuICAgIG1lbnVcbiAgICAgIC5maW5kKCc+bGksIC5tZW51LCAubWVudSA+IGxpJylcbiAgICAgIC5yZW1vdmVDbGFzcyhgJHtzdWJNZW51Q2xhc3N9ICR7c3ViSXRlbUNsYXNzfSAke2hhc1N1YkNsYXNzfSBpcy1zdWJtZW51LWl0ZW0gc3VibWVudSBpcy1hY3RpdmVgKVxuICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtc3VibWVudScpLmNzcygnZGlzcGxheScsICcnKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKCAgICAgIG1lbnUuZmluZCgnLicgKyBzdWJNZW51Q2xhc3MgKyAnLCAuJyArIHN1Ykl0ZW1DbGFzcyArICcsIC5oYXMtc3VibWVudSwgLmlzLXN1Ym1lbnUtaXRlbSwgLnN1Ym1lbnUsIFtkYXRhLXN1Ym1lbnVdJylcbiAgICAvLyAgICAgICAgICAgLnJlbW92ZUNsYXNzKHN1Yk1lbnVDbGFzcyArICcgJyArIHN1Ykl0ZW1DbGFzcyArICcgaGFzLXN1Ym1lbnUgaXMtc3VibWVudS1pdGVtIHN1Ym1lbnUnKVxuICAgIC8vICAgICAgICAgICAucmVtb3ZlQXR0cignZGF0YS1zdWJtZW51JykpO1xuICAgIC8vIGl0ZW1zLmVhY2goZnVuY3Rpb24oKXtcbiAgICAvLyAgIHZhciAkaXRlbSA9ICQodGhpcyksXG4gICAgLy8gICAgICAgJHN1YiA9ICRpdGVtLmNoaWxkcmVuKCd1bCcpO1xuICAgIC8vICAgaWYoJGl0ZW0ucGFyZW50KCdbZGF0YS1zdWJtZW51XScpLmxlbmd0aCl7XG4gICAgLy8gICAgICRpdGVtLnJlbW92ZUNsYXNzKCdpcy1zdWJtZW51LWl0ZW0gJyArIHN1Ykl0ZW1DbGFzcyk7XG4gICAgLy8gICB9XG4gICAgLy8gICBpZigkc3ViLmxlbmd0aCl7XG4gICAgLy8gICAgICRpdGVtLnJlbW92ZUNsYXNzKCdoYXMtc3VibWVudScpO1xuICAgIC8vICAgICAkc3ViLnJlbW92ZUNsYXNzKCdzdWJtZW51ICcgKyBzdWJNZW51Q2xhc3MpLnJlbW92ZUF0dHIoJ2RhdGEtc3VibWVudScpO1xuICAgIC8vICAgfVxuICAgIC8vIH0pO1xuICB9XG59XG5cbkZvdW5kYXRpb24uTmVzdCA9IE5lc3Q7XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuZnVuY3Rpb24gVGltZXIoZWxlbSwgb3B0aW9ucywgY2IpIHtcbiAgdmFyIF90aGlzID0gdGhpcyxcbiAgICAgIGR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiwvL29wdGlvbnMgaXMgYW4gb2JqZWN0IGZvciBlYXNpbHkgYWRkaW5nIGZlYXR1cmVzIGxhdGVyLlxuICAgICAgbmFtZVNwYWNlID0gT2JqZWN0LmtleXMoZWxlbS5kYXRhKCkpWzBdIHx8ICd0aW1lcicsXG4gICAgICByZW1haW4gPSAtMSxcbiAgICAgIHN0YXJ0LFxuICAgICAgdGltZXI7XG5cbiAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuXG4gIHRoaXMucmVzdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIHJlbWFpbiA9IC0xO1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcbiAgICAvLyBpZighZWxlbS5kYXRhKCdwYXVzZWQnKSl7IHJldHVybiBmYWxzZTsgfS8vbWF5YmUgaW1wbGVtZW50IHRoaXMgc2FuaXR5IGNoZWNrIGlmIHVzZWQgZm9yIG90aGVyIHRoaW5ncy5cbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIHJlbWFpbiA9IHJlbWFpbiA8PSAwID8gZHVyYXRpb24gOiByZW1haW47XG4gICAgZWxlbS5kYXRhKCdwYXVzZWQnLCBmYWxzZSk7XG4gICAgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgaWYob3B0aW9ucy5pbmZpbml0ZSl7XG4gICAgICAgIF90aGlzLnJlc3RhcnQoKTsvL3JlcnVuIHRoZSB0aW1lci5cbiAgICAgIH1cbiAgICAgIGlmIChjYiAmJiB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHsgY2IoKTsgfVxuICAgIH0sIHJlbWFpbik7XG4gICAgZWxlbS50cmlnZ2VyKGB0aW1lcnN0YXJ0LnpmLiR7bmFtZVNwYWNlfWApO1xuICB9XG5cbiAgdGhpcy5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuICAgIC8vaWYoZWxlbS5kYXRhKCdwYXVzZWQnKSl7IHJldHVybiBmYWxzZTsgfS8vbWF5YmUgaW1wbGVtZW50IHRoaXMgc2FuaXR5IGNoZWNrIGlmIHVzZWQgZm9yIG90aGVyIHRoaW5ncy5cbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIGVsZW0uZGF0YSgncGF1c2VkJywgdHJ1ZSk7XG4gICAgdmFyIGVuZCA9IERhdGUubm93KCk7XG4gICAgcmVtYWluID0gcmVtYWluIC0gKGVuZCAtIHN0YXJ0KTtcbiAgICBlbGVtLnRyaWdnZXIoYHRpbWVycGF1c2VkLnpmLiR7bmFtZVNwYWNlfWApO1xuICB9XG59XG5cbi8qKlxuICogUnVucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gaW1hZ2VzIGFyZSBmdWxseSBsb2FkZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gaW1hZ2VzIC0gSW1hZ2UocykgdG8gY2hlY2sgaWYgbG9hZGVkLlxuICogQHBhcmFtIHtGdW5jfSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiBpbWFnZSBpcyBmdWxseSBsb2FkZWQuXG4gKi9cbmZ1bmN0aW9uIG9uSW1hZ2VzTG9h
5763ZGVkKGltYWdlcywgY2FsbGJhY2spe1xuICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICB1bmxvYWRlZCA9IGltYWdlcy5sZW5ndGg7XG5cbiAgaWYgKHVubG9hZGVkID09PSAwKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIGltYWdlcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIC8vIENoZWNrIGlmIGltYWdlIGlzIGxvYWRlZFxuICAgIGlmICh0aGlzLmNvbXBsZXRlIHx8ICh0aGlzLnJlYWR5U3RhdGUgPT09IDQpIHx8ICh0aGlzLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpKSB7XG4gICAgICBzaW5nbGVJbWFnZUxvYWRlZCgpO1xuICAgIH1cbiAgICAvLyBGb3JjZSBsb2FkIHRoZSBpbWFnZVxuICAgIGVsc2Uge1xuICAgICAgLy8gZml4IGZvciBJRS4gU2VlIGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vc25pcHBldHMvanF1ZXJ5L2ZpeGluZy1sb2FkLWluLWllLWZvci1jYWNoZWQtaW1hZ2VzL1xuICAgICAgdmFyIHNyYyA9ICQodGhpcykuYXR0cignc3JjJyk7XG4gICAgICAkKHRoaXMpLmF0dHIoJ3NyYycsIHNyYyArIChzcmMuaW5kZXhPZignPycpID49IDAgPyAnJicgOiAnPycpICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpKSk7XG4gICAgICAkKHRoaXMpLm9uZSgnbG9hZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzaW5nbGVJbWFnZUxvYWRlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiBzaW5nbGVJbWFnZUxvYWRlZCgpIHtcbiAgICB1bmxvYWRlZC0tO1xuICAgIGlmICh1bmxvYWRlZCA9PT0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbn1cblxuRm91bmRhdGlvbi5UaW1lciA9IFRpbWVyO1xuRm91bmRhdGlvbi5vbkltYWdlc0xvYWRlZCA9IG9uSW1hZ2VzTG9h
5763ZGVkO1xuXG59KGpRdWVyeSk7XG4iLCIvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyoqV29yayBpbnNwaXJlZCBieSBtdWx0aXBsZSBqcXVlcnkgc3dpcGUgcGx1Z2lucyoqXG4vLyoqRG9uZSBieSBZb2hhaSBBcmFyYXQgKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4oZnVuY3Rpb24oJCkge1xuXG4gICQuc3BvdFN3aXBlID0ge1xuICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgZW5hYmxlZDogJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgIHByZXZlbnREZWZhdWx0OiBmYWxzZSxcbiAgICBtb3ZlVGhyZXNob2xkOiA3NSxcbiAgICB0aW1lVGhyZXNob2xkOiAyMDBcbiAgfTtcblxuICB2YXIgICBzdGFydFBvc1gsXG4gICAgICAgIHN0YXJ0UG9zWSxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbGFwc2VkVGltZSxcbiAgICAgICAgaXNNb3ZpbmcgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBvblRvdWNoRW5kKCkge1xuICAgIC8vICBhbGVydCh0aGlzKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgaXNNb3ZpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGUpIHtcbiAgICBpZiAoJC5zcG90U3dpcGUucHJldmVudERlZmF1bHQpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgaWYoaXNNb3ZpbmcpIHtcbiAgICAgIHZhciB4ID0gZS50b3VjaGVzWzBdLnBhZ2VYO1xuICAgICAgdmFyIHkgPSBlLnRvdWNoZXNbMF0ucGFnZVk7XG4gICAgICB2Y
5763XIgZHggPSBzdGFydFBvc1ggLSB4O1xuICAgICAgdmFyIGR5ID0gc3RhcnRQb3NZIC0geTtcbiAgICAgIHZhciBkaXI7XG4gICAgICBlbGFwc2VkVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnRUaW1lO1xuICAgICAgaWYoTWF0aC5hYnMoZHgpID49ICQuc3BvdFN3aXBlLm1vdmVUaHJlc2hvbGQgJiYgZWxhcHNlZFRpbWUgPD0gJC5zcG90U3dpcGUudGltZVRocmVzaG9sZCkge1xuICAgICAgICBkaXIgPSBkeCA+IDAgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSBpZihNYXRoLmFicyhkeSkgPj0gJC5zcG90U3dpcGUubW92ZVRocmVzaG9sZCAmJiBlbGFwc2VkVGltZSA8PSAkLnNwb3RTd2lwZS50aW1lVGhyZXNob2xkKSB7XG4gICAgICAvLyAgIGRpciA9IGR5ID4gMCA/ICdkb3duJyA6ICd1cCc7XG4gICAgICAvLyB9XG4gICAgICBpZihkaXIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvblRvdWNoRW5kLmNhbGwodGhpcyk7XG4gICAgICAgICQodGhpcykudHJpZ2dlcignc3dpcGUnLCBkaXIpLnRyaWdnZXIoYHN3aXBlJHtkaXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PSAxKSB7XG4gICAgICBzdGFydFBvc1ggPSBlLnRvdWNoZXNbMF0ucGFnZVg7XG4gICAgICBzdGFydFBvc1kgPSBlLnRvdWNoZXNbMF0ucGFnZVk7XG4gICAgICBpc01vdmluZyA9IHRydWU7XG4gICAgICBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIGZhbHNlKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoRW5kLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIgJiYgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG4gIH1cblxuICBmdW5jdGlvbiB0ZWFyZG93bigpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQpO1xuICB9XG5cbiAgJC5ldmVudC5zcGVjaWFsLnN3aXBlID0geyBzZXR1cDogaW5pdCB9O1xuXG4gICQuZWFjaChbJ2xlZnQnLCAndXAnLCAnZG93bicsICdyaWdodCddLCBmdW5jdGlvbiAoKSB7XG4gICAgJC5ldmVudC5zcGVjaWFsW2Bzd2lwZSR7dGhpc31gXSA9IHsgc2V0dXA6IGZ1bmN0aW9uKCl7XG4gICAgICAkKHRoaXMpLm9uKCdzd2lwZScsICQubm9vcCk7XG4gICAgfSB9O1xuICB9KTtcbn0pKGpRdWVyeSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogTWV0aG9kIGZvciBhZGRpbmcgcHN1ZWRvIGRyYWcgZXZlbnRzIHRvIGVsZW1lbnRzICpcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4hZnVuY3Rpb24oJCl7XG4gICQuZm4uYWRkVG91Y2ggPSBmdW5jdGlvbigpe1xuICAgIHRoaXMuZWFjaChmdW5jdGlvbihpLGVsKXtcbiAgICAgICQoZWwpLmJpbmQoJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsJyxmdW5jdGlvbigpe1xuICAgICAgICAvL3dlIHBhc3MgdGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdCBiZWNhdXNlIHRoZSBqUXVlcnkgZXZlbnRcbiAgICAgICAgLy9vYmplY3QgaXMgbm9ybWFsaXplZCB0byB3M2Mgc3BlY3MgYW5kIGRvZXMgbm90IHByb3ZpZGUgdGhlIFRvdWNoTGlzdFxuICAgICAgICBoYW5kbGVUb3VjaChldmVudCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHZhciBoYW5kbGVUb3VjaCA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgICAgZmlyc3QgPSB0b3VjaGVzWzBdLFxuICAgICAgICAgIGV2ZW50VHlwZXMgPSB7XG4gICAgICAgICAgICB0b3VjaHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgICAgICAgICAgIHRvdWNobW92ZTogJ21vdXNlbW92ZScsXG4gICAgICAgICAgICB0b3VjaGVuZDogJ21vdXNldXAnXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlID0gZXZlbnRUeXBlc1tldmVudC50eXBlXSxcbiAgICAgICAgICBzaW11bGF0ZWRFdmVudFxuICAgICAgICA7XG5cbiAgICAgIGlmKCdNb3VzZUV2ZW50JyBpbiB3aW5kb3cgJiYgdHlwZW9mIHdpbmRvdy5Nb3VzZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHNpbXVsYXRlZEV2ZW50ID0gbmV3IHdpbmRvdy5Nb3VzZUV2ZW50KHR5cGUsIHtcbiAgICAgICAgICAnYnViYmxlcyc6IHRydWUsXG4gICAgICAgICAgJ2NhbmNlbGFibG
5763UnOiB0cnVlLFxuICAgICAgICAgICdzY3JlZW5YJzogZmlyc3Quc2NyZWVuWCxcbiAgICAgICAgICAnc2NyZWVuWSc6IGZpcnN0LnNjcmVlblksXG4gICAgICAgICAgJ2NsaWVudFgnOiBmaXJzdC5jbGllbnRYLFxuICAgICAgICAgICdjbGllbnRZJzogZmlyc3QuY2xpZW50WVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpbXVsYXRlZEV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnQnKTtcbiAgICAgICAgc2ltdWxhdGVkRXZlbnQuaW5pdE1vdXNlRXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAxLCBmaXJzdC5zY3JlZW5YLCBmaXJzdC5zY3JlZW5ZLCBmaXJzdC5jbGllbnRYLCBmaXJzdC5jbGllbnRZLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMC8qbGVmdCovLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGZpcnN0LnRhcmdldC5kaXNwYXRjaEV2ZW50KHNpbXVsYXRlZEV2ZW50KTtcbiAgICB9O1xuICB9O1xufShqUXVlcnkpO1xuXG5cbi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8qKkZyb20gdGhlIGpRdWVyeSBNb2JpbGUgTGlicmFyeSoqXG4vLyoqbmVlZCB0byByZWNyZWF0ZSBmdW5jdGlvbmFsaXR5Kipcbi8vKiphbmQgdHJ5IHRvIGltcHJvdmUgaWYgcG9zc2libGUqKlxuLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbi8qIFJlbW92aW5nIHRoZSBqUXVlcnkgZnVuY3Rpb24gKioqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbihmdW5jdGlvbiggJCwgd2luZG93LCB1bmRlZmluZWQgKSB7XG5cblx0dmFyICRkb2N1bWVudCA9ICQoIGRvY3VtZW50ICksXG5cdFx0Ly8gc3VwcG9ydFRvdWNoID0gJC5tb2JpbGUuc3VwcG9ydC50b3VjaCxcblx0XHR0b3VjaFN0YXJ0RXZlbnQgPSAndG91Y2hzdGFydCcvL3N1cHBvcnRUb3VjaCA/IFwidG91Y2hzdGFydFwiIDogXCJtb3VzZWRvd25cIixcblx0XHR0b3VjaFN0b3BFdmVudCA9ICd0b3VjaGVuZCcvL3N1cHBvcnRUb3VjaCA/IFwidG91Y2hlbmRcIiA6IFwibW91c2V1cFwiLFxuXHRcdHRvdWNoTW92ZUV2ZW50ID0gJ3RvdWNobW92ZScvL3N1cHBvcnRUb3VjaCA/IFwidG91Y2htb3ZlXCIgOiBcIm1vdXNlbW92ZVwiO1xuXG5cdC8vIHNldHVwIG5ldyBldmVudCBzaG9ydGN1dHNcblx0JC5lYWNoKCAoIFwidG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgXCIgK1xuXHRcdFwic3dpcGUgc3dpcGVsZWZ0IHN3aXBlcmlnaHRcIiApLnNwbGl0KCBcIiBcIiApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblxuXHRcdCQuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdHJldHVybiBmbiA/IHRoaXMuYmluZCggbmFtZSwgZm4gKSA6IHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHRcdH07XG5cblx0XHQvLyBqUXVlcnkgPCAxLjhcblx0XHRpZiAoICQuYXR0ckZuICkge1xuXHRcdFx0JC5hdHRyRm5bIG5hbWUgXSA9IHRydWU7XG5cdFx0fVxuXHR9KTtcblxuXHRmdW5jdGlvbiB0cmlnZ2VyQ3VzdG9tRXZlbnQoIG9iaiwgZXZlbnRUeXBlLCBldmVudCwgYnViYmxlICkge1xuXHRcdHZhciBvcmlnaW5hbFR5cGUgPSBldmVudC50eXBlO1xuXHRcdGV2ZW50LnR5cGUgPSBldmVudFR5cGU7XG5cdFx0aWYgKCBidWJibGUgKSB7XG5cdFx0XHQkLmV2ZW50LnRyaWdnZXIoIGV2ZW50LCB1bmRlZmluZWQsIG9iaiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkLmV2ZW50LmRpc3BhdGNoLmNhbGwoIG9iaiwgZXZlbnQgKTtcblx0XHR9XG5cdFx0ZXZlbnQudHlwZSA9IG9yaWdpbmFsVHlwZTtcblx0fVxuXG5cdC8vIGFsc28gaGFuZGxlcyB0YXBob2xkXG5cblx0Ly8gQWxzbyBoYW5kbGVzIHN3aXBlbGVmdCwgc3dpcGVyaWdodFxuXHQkLmV2ZW50LnNwZWNpYWwuc3dpcGUgPSB7XG5cblx0XHQvLyBNb3JlIHRoYW4gdGhpcyBob3Jpem9udGFsIGRpc3BsYWNlbWVudCwgYW5kIHdlIHdpbGwgc3VwcHJlc3Mgc2Nyb2xsaW5nLlxuXHRcdHNjcm9sbFN1cHJlc3Npb25UaHJlc2hvbGQ6IDMwLFxuXG5cdFx0Ly8gTW9yZSB0aW1lIHRoYW4gdGhpcywgYW5kIGl0IGlzbid0IGEgc3dpcGUuXG5cdFx0ZHVyYXRpb25UaHJlc2hvbGQ6IDEwMDAsXG5cblx0XHQvLyBTd2lwZSBob3Jpem9udGFsIGRpc3BsYWNlbWVudCBtdXN0IGJlIG1vcmUgdGhhbiB0aGlzLlxuXHRcdGhvcml6b250YWxEaXN0YW5jZVRocmVzaG9sZDogd2luZG93LmRldmljZVBpeGVsUmF0aW8gPj0gMiA/IDE1IDogMzAsXG5cblx0XHQvLyBTd2lwZSB2ZXJ0aWNhbCBkaXNwbGFjZW1lbnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhpcy5cblx0XHR2ZXJ0aWNhbERpc3RhbmNlVGhyZXNob2xkOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA+PSAyID8gMTUgOiAzMCxcblxuXHRcdGdldExvY2F0aW9uOiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXHRcdFx0dmFyIHdpblBhZ2VYID0gd2luZG93LnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHR3aW5QYWdlWSA9IHdpbmRvdy5wYWdlWU9mZnNldCxcblx0XHRcdFx0eCA9IGV2ZW50LmNsaWVudFgsXG5cdFx0XHRcdHkgPSBldmVudC5jbGllbnRZO1xuXG5cdFx0XHRpZiAoIGV2ZW50LnBhZ2VZID09PSAwICYmIE1hdGguZmxvb3IoIHkgKSA+IE1hdGguZmxvb3IoIGV2ZW50LnBhZ2VZICkgfHxcblx0XHRcdFx0ZXZlbnQucGFnZVggPT09IDAgJiYgTWF0aC5mbG9vciggeCApID4gTWF0aC5mbG9vciggZXZlbnQucGFnZVggKSApIHtcblxuXHRcdFx0XHQvLyBpT1M0IGNsaWVudFgvY2xpZW50WSBoYXZlIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBoYXZlIGJlZW5cblx0XHRcdFx0Ly8gaW4gcGFnZVgvcGFnZVkuIFdoaWxlIHBhZ2VYL3BhZ2UvIGhhdmUgdGhlIHZhbHVlIDBcblx0XHRcdFx0eCA9IHggLSB3aW5QYWdlWDtcblx0XHRcdFx0eSA9IHkgLSB3aW5QYWdlWTtcblx0XHRcdH0gZWxzZSBpZiAoIHkgPCAoIGV2ZW50LnBhZ2VZIC0gd2luUGFnZVkpIHx8IHggPCAoIGV2ZW50LnBhZ2VYIC0gd2luUGFnZVggKSApIHtcblxuXHRcdFx0XHQvLyBTb21lIEFuZHJvaWQgYnJvd3NlcnMgaGF2ZSB0b3RhbGx5IGJvZ3VzIHZhbHVlcyBmb3IgY2xpZW50WC9ZXG5cdFx0XHRcdC8vIHdoZW4gc2Nyb2xsaW5nL3pvb21pbmcgYSBwYWdlLiBEZXRlY3RhYmxlIHNpbmNlIGNsaWVudFgvY2xpZW50WVxuXHRcdFx0XHQvLyBzaG91bGQgbmV2ZXIgYmUgc21hbGxlciB0aGFuIHBhZ2VYL3BhZ2VZIG1pbnVzIHBhZ2Ugc2Nyb2xsXG5cdFx0XHRcdHggPSBldmVudC5wYWdlWCAtIHdpblBhZ2VYO1xuXHRcdFx0XHR5ID0gZXZlbnQucGFnZVkgLSB3aW5QYWdlWTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0eDogeCxcblx0XHRcdFx0eTogeVxuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0c3RhcnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciBkYXRhID0gZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzID9cblx0XHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbIDAgXSA6IGV2ZW50LFxuXHRcdFx0XHRsb2NhdGlvbiA9ICQuZXZlbnQuc3BlY2lhbC5zd2lwZS5nZXRMb2NhdGlvbiggZGF0YSApO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdHRpbWU6ICggbmV3IERhdGUoKSApLmdldFRpbWUoKSxcblx0XHRcdFx0XHRcdGNvb3JkczogWyBsb2NhdGlvbi54LCBsb2NhdGlvbi55IF0sXG5cdFx0XHRcdFx0XHRvcmlnaW46ICQoIGV2ZW50LnRhcmdldCApXG5cdFx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0c3RvcDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIGRhdGEgPSBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMgP1xuXHRcdFx0XHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1sgMCBdIDogZXZlbnQsXG5cdFx0XHRcdGxvY2F0aW9uID0gJC5ldmVudC5zcGVjaWFsLnN3aXBlLmdldExvY2F0aW9uKCBkYXRhICk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0dGltZTogKCBuZXcgRGF0ZSgpICkuZ2V0VGltZSgpLFxuXHRcdFx0XHRcdFx0Y29vcmRzOiBbIGxvY2F0aW9uLngsIGxvY2F0aW9uLnkgXVxuXHRcdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdGhhbmRsZVN3aXBlOiBmdW5jdGlvbiggc3RhcnQsIHN0b3AsIHRoaXNPYmplY3QsIG9yaWdUYXJnZXQgKSB7XG5cdFx0XHRpZiAoIHN0b3AudGltZSAtIHN0YXJ0LnRpbWUgPCAkLmV2ZW50LnNwZWNpYWwuc3dpcGUuZHVyYXRpb25UaHJlc2hvbGQgJiZcblx0XHRcdFx0TWF0aC5hYnMoIHN0YXJ0LmNvb3Jkc1sgMCBdIC0gc3RvcC5jb29yZHNbIDAgXSApID4gJC5ldmVudC5zcGVjaWFsLnN3aXBlLmhvcml6b250YWxEaXN0YW5jZVRocmVzaG9sZCAmJlxuXHRcdFx0XHRNYXRoLmFicyggc3RhcnQuY29vcmRzW
5763yAxIF0gLSBzdG9wLmNvb3Jkc1sgMSBdICkgPCAkLmV2ZW50LnNwZWNpYWwuc3dpcGUudmVydGljYWxEaXN0YW5jZVRocmVzaG9sZCApIHtcblx0XHRcdFx0dmFyIGRpcmVjdGlvbiA9IHN0YXJ0LmNvb3Jkc1swXSA+IHN0b3AuY29vcmRzWyAwIF0gPyBcInN3aXBlbGVmdFwiIDogXCJzd2lwZXJpZ2h0XCI7XG5cblx0XHRcdFx0dHJpZ2dlckN1c3RvbUV2ZW50KCB0aGlzT2JqZWN0LCBcInN3aXBlXCIsICQuRXZlbnQoIFwic3dpcGVcIiwgeyB0YXJnZXQ6IG9yaWdUYXJnZXQsIHN3aXBlc3RhcnQ6IHN0YXJ0LCBzd2lwZXN0b3A6IHN0b3AgfSksIHRydWUgKTtcblx0XHRcdFx0dHJpZ2dlckN1c3RvbUV2ZW50KCB0aGlzT2JqZWN0LCBkaXJlY3Rpb24sJC5FdmVudCggZGlyZWN0aW9uLCB7IHRhcmdldDogb3JpZ1RhcmdldCwgc3dpcGVzdGFydDogc3RhcnQsIHN3aXBlc3RvcDogc3RvcCB9ICksIHRydWUgKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHR9LFxuXG5cdFx0Ly8gVGhpcyBzZXJ2ZXMgYXMgYSBmbGFnIHRvIGVuc3VyZSB0aGF0IGF0IG1vc3Qgb25lIHN3aXBlIGV2ZW50IGV2ZW50IGlzXG5cdFx0Ly8gaW4gd29yayBhdCBhbnkgZ2l2ZW4gdGltZVxuXHRcdGV2ZW50SW5Qcm9ncmVzczogZmFsc2UsXG5cblx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZXZlbnRzLFxuXHRcdFx0XHR0aGlzT2JqZWN0ID0gdGhpcyxcblx0XHRcdFx0JHRoaXMgPSAkKCB0aGlzT2JqZWN0ICksXG5cdFx0XHRcdGNvbnRleHQgPSB7fTtcblxuXHRcdFx0Ly8gUmV0cmlldmUgdGhlIGV2ZW50cyBkYXRhIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFkZCB0aGUgc3dpcGUgY29udGV4dFxuXHRcdFx0ZXZlbnRzID0gJC5kYXRhKCB0aGlzLCBcIm1vYmlsZS1ldmVud
5763HNcIiApO1xuXHRcdFx0aWYgKCAhZXZlbnRzICkge1xuXHRcdFx0XHRldmVudHMgPSB7IGxlbmd0aDogMCB9O1xuXHRcdFx0XHQkLmRhdGEoIHRoaXMsIFwibW9iaWxlLWV2ZW50c1wiLCBldmVudHMgKTtcblx0XHRcdH1cblx0XHRcdGV2ZW50cy5sZW5ndGgrKztcblx0XHRcdGV2ZW50cy5zd2lwZSA9IGNvbnRleHQ7XG5cblx0XHRcdGNvbnRleHQuc3RhcnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gQmFpbCBpZiB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgb24gYSBzd2lwZSBldmVudFxuXHRcdFx0XHRpZiAoICQuZXZlbnQuc3BlY2lhbC5zd2lwZS5ldmVudEluUHJvZ3Jlc3MgKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCQuZXZlbnQuc3BlY2lhbC5zd2lwZS5ldmVudEluUHJvZ3Jlc3MgPSB0cnVlO1xuXG5cdFx0XHRcdHZhciBzdG9wLFxuXHRcdFx0XHRcdHN0YXJ0ID0gJC5ldmVudC5zcGVjaWFsLnN3aXBlLnN0YXJ0KCBldmVudCApLFxuXHRcdFx0XHRcdG9yaWdUYXJnZXQgPSBldmVudC50YXJnZXQsXG5cdFx0XHRcdFx0ZW1pdHRlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdGNvbnRleHQubW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0XHRpZiAoICFzdGFydCB8fCBldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzdG9wID0gJC5ldmVudC5zcGVjaWFsLnN3aXBlLnN0b3AoIGV2ZW50ICk7XG5cdFx0XHRcdFx0aWYgKCAhZW1pdHRlZCApIHtcblx0XHRcdFx0XHRcdGVtaXR0ZWQgPSAkLmV2ZW50LnNwZWNpYWwuc3dpcGUuaGFuZGxlU3dpcGUoIHN0YXJ0LCBzdG9wLCB0aGlzT2JqZWN0LCBvcmlnVGFyZ2V0ICk7XG5cdFx0XHRcdFx0XHRpZiAoIGVtaXR0ZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUmVzZXQgdGhlIGNvbnRleHQgdG8gbWFrZSB3YXkgZm9yIHRoZSBuZXh0IHN3aXBlIGV2ZW50XG5cdFx0XHRcdFx0XHRcdCQuZXZlbnQuc3BlY2lhbC5zd2lwZS5ldmVudEluUHJvZ3Jlc3MgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gcHJldmVudCBzY3JvbGxpbmdcblx0XHRcdFx0XHRpZiAoIE1hdGguYWJzKCBzdGFydC5jb29yZHNbIDAgXSAtIHN0b3AuY29vcmRzWyAwIF0gKSA+ICQuZXZlbnQuc3BlY2lhbC5zd2lwZS5zY3JvbGxTdXByZXNzaW9uVGhyZXNob2xkICkge1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29udGV4dC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRlbWl0dGVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVzZXQgdGhlIGNvbnRleHQgdG8gbWFrZSB3YXkgZm9yIHRoZSBuZXh0IHN3aXBlIGV2ZW50XG5cdFx0XHRcdFx0XHQkLmV2ZW50LnNwZWNpYWwuc3dpcGUuZXZlbnRJblByb2dyZXNzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHQkZG9jdW1lbnQub2ZmKCB0b3VjaE1vdmVFdmVudCwgY29udGV4dC5tb3ZlICk7XG5cdFx0XHRcdFx0XHRjb250ZXh0Lm1vdmUgPSBudWxsO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdCRkb2N1bWVudC5vbiggdG91Y2hNb3ZlRXZlbnQsIGNvbnRleHQubW92ZSApXG5cdFx0XHRcdFx0Lm9uZSggdG91Y2hTdG9wRXZlbnQsIGNvbnRleHQuc3RvcCApO1xuXHRcdFx0fTtcblx0XHRcdCR0aGlzLm9uKCB0b3VjaFN0YXJ0RXZlbnQsIGNvbnRleHQuc3RhcnQgKTtcblx0XHR9LFxuXG5cdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGV2ZW50cywgY29udGV4dDtcblxuXHRcdFx0ZXZlbnRzID0gJC5kYXRhKCB0aGlzLCBcIm1vYmlsZS1ldmVud
5763HNcIiApO1xuXHRcdFx0aWYgKCBldmVudHMgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBldmVudHMuc3dpcGU7XG5cdFx0XHRcdGRlbGV0ZSBldmVudHMuc3dpcGU7XG5cdFx0XHRcdGV2ZW50cy5sZW5ndGgtLTtcblx0XHRcdFx0aWYgKCBldmVudHMubGVuZ3RoID09PSAwICkge1xuXHRcdFx0XHRcdCQucmVtb3ZlRGF0YSggdGhpcywgXCJtb2JpbGUtZXZlbnRzXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGNvbnRleHQgKSB7XG5cdFx0XHRcdGlmICggY29udGV4dC5zdGFydCApIHtcblx0XHRcdFx0XHQkKCB0aGlzICkub2ZmKCB0b3VjaFN0YXJ0RXZlbnQsIGNvbnRleHQuc3RhcnQgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIGNvbnRleHQubW92ZSApIHtcblx0XHRcdFx0XHQkZG9jdW1lbnQub2ZmKCB0b3VjaE1vdmVFdmVudCwgY29udGV4dC5tb3ZlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBjb250ZXh0LnN0b3AgKSB7XG5cdFx0XHRcdFx0JGRvY3VtZW50Lm9mZiggdG91Y2hTdG9wRXZlbnQsIGNvbnRleHQuc3RvcCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQkLmVhY2goe1xuXHRcdHN3aXBlbGVmdDogXCJzd2lwZS5sZWZ0XCIsXG5cdFx0c3dpcGVyaWdodDogXCJzd2lwZS5yaWdodFwiXG5cdH0sIGZ1bmN0aW9uKCBldmVudCwgc291cmNlRXZlbnQgKSB7XG5cblx0XHQkLmV2ZW50LnNwZWNpYWxbIGV2ZW50IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCQoIHRoaXMgKS5iaW5kKCBzb3VyY2VFdmVudCwgJC5ub29wICk7XG5cdFx0XHR9LFxuXHRcdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkKCB0aGlzICkudW5iaW5kKCBzb3VyY2VFdmVudCApO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xufSkoIGpRdWVyeSwgdGhpcyApO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuY29uc3QgTXV0YXRpb25PYnNlcnZlciA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBwcmVmaXhlcyA9IFsnV2ViS2l0JywgJ01veicsICdPJywgJ01zJywgJyddO1xuICBmb3IgKHZhciBpPTA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChgJHtwcmVmaXhlc1tpXX1NdXRhdGlvbk9ic2VydmVyYCBpbiB3aW5kb3cpIHtcbiAgICAgIHJldHVybiB3aW5kb3dbYCR7cHJlZml4ZXNbaV19TXV0YXRpb25PYnNlcnZlcmBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59KCkpO1xuXG5jb25zdCB0cmlnZ2VycyA9IChlbCwgdHlwZSkgPT4ge1xuICBlbC5kYXRhKHR5cGUpLnNwbGl0KCcgJykuZm9yRWFjaChpZCA9PiB7XG4gICAgJChgIyR7aWR9YClbIHR5cGUgPT09ICdjbG9zZScgPyAndHJpZ2dlcicgOiAndHJpZ2dlckhhbmRsZXInXShgJHt0eXBlfS56Zi50cmlnZ2VyYCwgW2VsXSk7XG4gIH0pO1xufTtcbi8vIEVsZW1lbnRzIHdpdGggW2RhdGEtb3Blbl0gd2lsbCByZXZlYWwgYSBwbHVnaW4gdGhhdCBzdXBwb3J0cyBpdCB3aGVuIGNsaWNrZWQuXG4kKGRvY3VtZW50KS5vbignY2xpY2suemYudHJpZ2dlcicsICdbZGF0YS1vcGVuXScsIGZ1bmN0aW9uKCkge1xuICB0cmlnZ2VycygkKHRoaXMpLCAnb3BlbicpO1xufSk7XG5cbi8vIEVsZW1lbnRzIHdpdGggW2RhdGEtY2xvc2VdIHdpbGwgY2xvc2UgYSBwbHVnaW4gdGhhdCBzdXBwb3J0cyBpdCB3aGVuIGNsaWNrZWQuXG4vLyBJZiB1c2VkIHdpdGhvdXQgYSB2YWx1ZSBvbiBbZGF0YS1jbG9zZV0sIHRoZSBldmVudCB3aWxsIGJ1YmJsZSwgYWxsb3dpbmcgaXQgdG8gY2xvc2UgYSBwYXJlbnQgY29tcG9uZW50LlxuJChkb2N1bWVudCkub24oJ2NsaWNrLnpmLnRyaWdnZXInLCAnW2RhdGEtY2xvc2VdJywgZnVuY3Rpb24oKSB7XG4gIGxldCBpZCA9ICQodGhpcykuZGF0YSgnY2xvc2UnKTtcbiAgaWYgKGlkKSB7XG4gICAgdHJpZ2dlcnMoJCh0aGlzKSwgJ2Nsb3NlJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgJCh0aGlzKS50cmlnZ2VyKCdjbG9zZS56Zi50cmlnZ2VyJyk7XG4gIH1cbn0pO1xuXG4vLyBFbGVtZW50cyB3aXRoIFtkYXRhLXRvZ2dsZV0gd2lsbCB0b2dnbGUgYSBwbHVnaW4gdGhhdCBzdXBwb3J0cyBpdCB3aGVuIGNsaWNrZWQuXG4kKGRvY3VtZW50KS5vbignY2xpY2suemYudHJpZ2dlcicsICdbZGF0YS10b2dnbGVdJywgZnVuY3Rpb24oKSB7XG4gIGxldCBpZCA9ICQodGhpcykuZGF0YSgndG9nZ2xlJyk7XG4gIGlmIChpZCkge1xuICAgIHRyaWdnZXJzKCQodGhpcyksICd0b2dnbGUnKTtcbiAgfSBlbHNlIHtcbiAgICAkKHRoaXMpLnRyaWdnZXIoJ3RvZ2dsZS56Zi50cmlnZ2VyJyk7XG4gIH1cbn0pO1xuXG4vLyBFbGVtZW50cyB3aXRoIFtkYXRhLWNsb3NhYmxlXSB3aWxsIHJlc3BvbmQgdG8gY2xvc2UuemYudHJpZ2dlciBldmVudHMuXG4kKGRvY3VtZW50KS5vbignY2xvc2UuemYudHJpZ2dlcicsICdbZGF0YS1jbG9zYWJsZV0nLCBmdW5jdGlvbihlKXtcbiAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgbGV0IGFuaW1hdGlvbiA9ICQodGhpcykuZGF0YSgnY2xvc2FibGUnKTtcblxuICBpZihhbmltYXRpb24gIT09ICcnKXtcbiAgICBGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KCQodGhpcyksIGFuaW1hdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICAkKHRoaXMpLnRyaWdnZXIoJ2Nsb3NlZC56ZicpO1xuICAgIH0pO1xuICB9ZWxzZXtcbiAgICAkKHRoaXMpLmZhZGVPdXQoKS50cmlnZ2VyKCdjbG9zZWQuemYnKTtcbiAgfVxufSk7XG5cbiQoZG9jdW1lbnQpLm9uKCdmb2N1cy56Zi50cmlnZ2VyIGJsdXIuemYudHJpZ2dlcicsICdbZGF0YS10b2dnbGUtZm9jdXNdJywgZnVuY3Rpb24oKSB7XG4gIGxldCBpZCA9ICQodGhpcykuZGF0YSgndG9nZ2xlLWZvY3VzJyk7XG4gICQoYCMke2lkfWApLnRyaWdnZXJIYW5kbGVyKCd0b2dnbGUuemYudHJpZ2dlcicsIFskKHRoaXMpXSk7XG59KTtcblxuLyoqXG4qIEZpcmVzIG9uY2UgYWZ0ZXIgYWxsIG90aGVyIHNjcmlwdHMgaGF2ZSBsb2FkZWRcbiogQGZ1bmN0aW9uXG4qIEBwcml2YXRlXG4qL1xuJCh3aW5kb3cpLm9uKCdsb2FkJywgKCkgPT4ge1xuICBjaGVja0xpc3RlbmVycygpO1xufSk7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXJzKCkge1xuICBldmVudHNMaXN0ZW5lcigpO1xuICByZXNpemVMaXN0ZW5lcigpO1xuICBzY3JvbGxMaXN0ZW5lcigpO1xuICBjbG9zZW1lTGlzdGVuZXIoKTtcbn1cblxuLy8qKioqKioqKiBvbmx5IGZpcmVzIHRoaXMgZnVuY3Rpb24gb25jZSBvbiBsb2FkLCBpZiB0aGVyZSdzIHNvbWV0aGluZyB0byB3YXRjaCAqKioqKioqKlxuZnVuY3Rpb24gY2xvc2VtZUxpc3RlbmVyKHBsdWdpbk5hbWUpIHtcbiAgdmFyIHlldGlCb3hlcyA9ICQoJ1tkYXRhLXlldGktYm94XScpLFxuICAgICAgcGx1Z05hbWVzID0gWydkcm9wZG93bicsICd0b29sdGlwJywgJ3JldmVhbCddO1xuXG4gIGlmKHBsdWdpbk5hbWUpe1xuICAgIGlmKHR5cGVvZiBwbHVnaW5OYW1lID09PSAnc3RyaW5nJyl7XG4gICAgICBwbHVnTmFtZXMucHVzaChwbHVnaW5OYW1lKTtcbiAgICB9ZWxzZSBpZih0eXBlb2YgcGx1Z2luTmFtZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBsdWdpbk5hbWVbMF0gPT09ICdzdHJpbmcnKXtcbiAgICAgIHBsdWdOYW1lcy5jb25jYXQocGx1Z2luTmFtZSk7XG4gICAgfWVsc2V7XG4gICAgICBjb25zb2xlLmVycm9yKCdQbHVnaW4gbmFtZXMgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICB9XG4gIGlmKHlldGlCb3hlcy5sZW5ndGgpe1xuICAgIGxldCBsaXN0ZW5lcnMgPSBwbHVnTmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgICByZXR1cm4gYGNsb3NlbWUuemYuJHtuYW1lfWA7XG4gICAgfSkuam9pbignICcpO1xuXG4gICAgJCh3aW5kb3cpLm9mZihsaXN0ZW5lcnMpLm9uKGxpc3RlbmVycywgZnVuY3Rpb24oZSwgcGx1Z2luSWQpe1xuICAgICAgbGV0IHBsdWdpbiA9IGUubmFtZXNwYWNlLnNwbGl0KCcuJylbMF07XG4gICAgICBsZXQgcGx1Z2lucyA9ICQoYFtkYXRhLSR7cGx1Z2lufV1gKS5ub3QoYFtkYXRhLXlldGktYm94PVwiJHtwbHVnaW5JZH1cIl1gKTtcblxuICAgICAgcGx1Z2lucy5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICAgIGxldCBfdGhpcyA9ICQodGhpcyk7XG5cbiAgICAgICAgX3RoaXMudHJpZ2dlck
5763hhbmRsZXIoJ2Nsb3NlLnpmLnRyaWdnZXInLCBbX3RoaXNdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2l6ZUxpc3RlbmVyKGRlYm91bmNlKXtcbiAgbGV0IHRpbWVyLFxuICAgICAgJG5vZGVzID0gJCgnW2RhdGEtcmVzaXplXScpO1xuICBpZigkbm9kZXMubGVuZ3RoKXtcbiAgICAkKHdpbmRvdykub2ZmKCdyZXNpemUuemYudHJpZ2dlcicpXG4gICAgLm9uKCdyZXNpemUuemYudHJpZ2dlcicsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmICh0aW1lcikgeyBjbGVhclRpbWVvdXQodGltZXIpOyB9XG5cbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuXG4gICAgICAgIGlmKCFNdXRhdGlvbk9ic2VydmVyKXsvL2ZhbGxiYWNrIGZvciBJRSA5XG4gICAgICAgICAgJG5vZGVzLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICQodGhpcykudHJpZ2dlckhhbmRsZXIoJ3Jlc2l6ZW1lLnpmLnRyaWdnZXInKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvL3RyaWdnZXIgYWxsIGxpc3RlbmluZyBlbGVtZW50cyBhbmQgc2lnbmFsIGEgcmVzaXplIGV2ZW50XG4gICAgICAgICRub2Rlcy5hdHRyKCdkYXRhLWV2ZW50cycsIFwicmVzaXplXCIpO1xuICAgICAgfSwgZGVib3VuY2UgfHwgMTApOy8vZGVmYXVsdCB0aW1lIHRvIGVtaXQgcmVzaXplIGV2ZW50XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2Nyb2xsTGlzdGVuZXIoZGVib3VuY2Upe1xuICBsZXQgdGltZXIsXG4gICAgICAkbm9kZXMgPSAkKCdbZGF0YS1zY3JvbGxdJyk7XG4gIGlmKCRub2Rlcy5sZW5ndGgpe1xuICAgICQod2luZG93KS5vZmYoJ3Njcm9sbC56Zi50cmlnZ2VyJylcbiAgICAub24oJ3Njcm9sbC56Zi50cmlnZ2VyJywgZnVuY3Rpb24oZSl7XG4gICAgICBpZih0aW1lcil7IGNsZWFyVGltZW91dCh0aW1lcik7IH1cblxuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgaWYoIU11dGF0aW9uT2JzZXJ2ZXIpey8vZmFsbGJhY2sgZm9yIElFIDlcbiAgICAgICAgICAkbm9kZXMuZWFjaChmdW5jdGlvbigpe1xuICAgICAgICAgICAgJCh0aGlzKS50cmlnZ2VySGFuZGxlcignc2Nyb2xsbWUuemYudHJpZ2dlcicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vdHJpZ2dlciBhbGwgbGlzdGVuaW5nIGVsZW1lbnRzIGFuZCBzaWduYWwgYSBzY3JvbGwgZXZlbnRcbiAgICAgICAgJG5vZGVzLmF0dHIoJ2RhdGEtZXZlbnRzJywgXCJzY3JvbGxcIik7XG4gICAgICB9LCBkZWJvdW5jZSB8fCAxMCk7Ly9kZWZhdWx0IHRpbWUgdG8gZW1pdCBzY3JvbGwgZXZlbnRcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudHNMaXN0ZW5lcigpIHtcbiAgaWYoIU11dGF0aW9uT2JzZXJ2ZXIpeyByZXR1cm4gZmFsc2U7IH1cbiAgbGV0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcmVzaXplXSwgW2RhdGEtc2Nyb2xsXSwgW2RhdGEtbXV0YXRlXScpO1xuXG4gIC8vZWxlbWVudCBjYWxsYmFja1xuICB2YXIgbGlzdGVuaW5nRWxlbWVudHNNdXRhdGlvbiA9IGZ1bmN0aW9uIChtdXRhdGlvblJlY29yZHNMaXN0KSB7XG4gICAgICB2Y
5763XIgJHRhcmdldCA9ICQobXV0YXRpb25SZWNvcmRzTGlzdFswXS50YXJnZXQpO1xuXG5cdCAgLy90cmlnZ2VyIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgZWxlbWVudCBkZXBlbmRpbmcgb24gdHlwZVxuICAgICAgc3dpdGNoIChtdXRhdGlvblJlY29yZHNMaXN0WzBdLnR5cGUpIHtcblxuICAgICAgICBjYXNlIFwiYXR0cmlidXRlc1wiOlxuICAgICAgICAgIGlmICgkdGFyZ2V0LmF0dHIoXCJkYXRhLWV2ZW50c1wiKSA9PT0gXCJzY3JvbGxcIiAmJiBtdXRhdGlvblJlY29yZHNMaXN0WzBdLmF0dHJpYnV0ZU5hbWUgPT09IFwiZGF0YS1ldmVudHNcIikge1xuXHRcdCAgXHQkdGFyZ2V0LnRyaWdnZXJIYW5kbGVyKCdzY3JvbGxtZS56Zi50cmlnZ2VyJywgWyR0YXJnZXQsIHdpbmRvdy5wYWdlWU9mZnNldF0pO1xuXHRcdCAgfVxuXHRcdCAgaWYgKCR0YXJnZXQuYXR0cihcImRhdGEtZXZlbnRzXCIpID09PSBcInJlc2l6ZVwiICYmIG11dGF0aW9uUmVjb3Jkc0xpc3RbMF0uYXR0cmlidXRlTmFtZSA9PT0gXCJkYXRhLWV2ZW50c1wiKSB7XG5cdFx0ICBcdCR0YXJnZXQudHJpZ2dlckhhbmRsZXIoJ3Jlc2l6ZW1lLnpmLnRyaWdnZXInLCBbJHRhcmdldF0pO1xuXHRcdCAgIH1cblx0XHQgIGlmIChtdXRhdGlvblJlY29yZHNMaXN0WzBdLmF0dHJpYnV0ZU5hbWUgPT09IFwic3R5bGVcIikge1xuXHRcdFx0ICAkdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1tdXRhdGVdXCIpLmF0dHIoXCJkYXRhLWV2ZW50c1wiLFwibXV0YXRlXCIpO1xuXHRcdFx0ICAkdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1tdXRhdGVdXCIpLnRyaWdnZXJIYW5kbGVyKCdtdXRhdGVtZS56Zi50cmlnZ2VyJywgWyR0YXJnZXQuY2xvc2VzdChcIltkYXRhLW11dGF0ZV1cIildKTtcblx0XHQgIH1cblx0XHQgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJjaGlsZExpc3RcIjpcblx0XHQgICR0YXJnZXQuY2xvc2VzdChcIltkYXRhLW11dGF0ZV1cIikuYXR0cihcImRhdGEtZXZlbnRzXCIsXCJtdXRhdGVcIik7XG5cdFx0ICAkdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1tdXRhdGVdXCIpLnRyaWdnZXJIYW5kbGVyKCdtdXRhdGVtZS56Zi50cmlnZ2VyJywgWyR0YXJnZXQuY2xvc2VzdChcIltkYXRhLW11dGF0ZV1cIildKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy9ub3RoaW5nXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChub2Rlcy5sZW5ndGgpIHtcbiAgICAgIC8vZm9yIGVhY2ggZWxlbWVudCB0aGF0IG5lZWRzIHRvIGxpc3RlbiBmb3IgcmVzaXppbmcsIHNjcm9sbGluZywgb3IgbXV0YXRpb24gYWRkIGEgc2luZ2xlIG9ic2VydmVyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBub2Rlcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnRPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGxpc3RlbmluZ0VsZW1lbnRzTXV0YXRpb24pO1xuICAgICAgICBlbGVtZW50T2JzZXJ2ZXIub2JzZXJ2ZShub2Rlc1tpXSwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIGNoYXJhY3RlckRhdGE6IGZhbHNlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFtcImRhdGEtZXZlbnRzXCIsIFwic3R5bGVcIl0gfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBbUEhdXG4vLyBGb3VuZGF0aW9uLkNoZWNrV2F0Y2hlcnMgPSBjaGVja1dhdGNoZXJzO1xuRm91bmRhdGlvbi5JSGVhcllvdSA9IGNoZWNrTGlzdGVuZXJzO1xuLy8gRm91bmRhdGlvbi5JU2VlWW91ID0gc2Nyb2xsTGlzdGVuZXI7XG4vLyBGb3VuZGF0aW9uLklGZWVsWW91ID0gY2xvc2VtZUxpc3RlbmVyO1xuXG59KGpRdWVyeSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbiFmdW5jdGlvbigkKSB7XG5cbi8qKlxuICogQWNjb3JkaW9uIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi5hY2NvcmRpb25cbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwua2V5Ym9hcmRcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwubW90aW9uXG4gKi9cblxuY2xhc3MgQWNjb3JkaW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gYWNjb3JkaW9uLlxuICAgKiBAY2xhc3NcbiAgICogQGZpcmVzIEFjY29yZGlvbiNpbml0XG4gICAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IC0galF1ZXJ5IG9iamVjdCB0byBtYWtlIGludG8gYW4gYWNjb3JkaW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGEgcGxhaW4gb2JqZWN0IHdpdGggc2V0dGluZ3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgQWNjb3JkaW9uLmRlZmF1bHRzLCB0aGlzLiRlbGVtZW50LmRhdGEoKSwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLl9pbml0KCk7XG5cbiAgICBGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsICdBY2NvcmRpb24nKTtcbiAgICBGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKCdBY2NvcmRpb24nLCB7XG4gICAgICAnRU5URVInOiAndG9nZ2xlJyxcbiAgICAgICdTUEFDRSc6ICd0b2dnbGUnLFxuICAgICAgJ0FSUk9XX0RPV04nOiAnbmV4dCcsXG4gICAgICAnQVJST1dfVVAnOiAncHJldmlvdXMnXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGFjY29yZGlvbiBieSBhbmltYXRpbmcgdGhlIHByZXNldCBhY3RpdmUgcGFuZShzKS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHRoaXMuJGVsZW1lbnQuYXR0cigncm9sZScsICd0YWJsaXN0Jyk7XG4gICAgdGhpcy4kdGFicyA9IHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oJ1tkYXRhLWFjY29yZGlvbi1pdGVtXScpO1xuXG4gICAgdGhpcy4kdGFicy5lYWNoKGZ1bmN0aW9uKGlkeCwgZWwpIHtcbiAgICAgIHZhciAkZWwgPSAkKGVsKSxcbiAgICAgICAgICAkY29udGVudCA9ICRlbC5jaGlsZHJlbignW2RhdGEtdGFiLWNvbnRlbn
5763RdJyksXG4gICAgICAgICAgaWQgPSAkY29udGVudFswXS5pZCB8fCBGb3VuZGF0aW9uLkdldFlvRGlnaXRzKDYsICdhY2NvcmRpb24nKSxcbiAgICAgICAgICBsaW5rSWQgPSBlbC5pZCB8fCBgJHtpZH0tbGFiZWxgO1xuXG4gICAgICAkZWwuZmluZCgnYTpmaXJzdCcpLmF0dHIoe1xuICAgICAgICAnYXJpYS1jb250cm9scyc6IGlkLFxuICAgICAgICAncm9sZSc6ICd0YWInLFxuICAgICAgICAnaWQnOiBsaW5rSWQsXG4gICAgICAgICdhcmlhLWV4cGFuZGVkJzogZmFsc2UsXG4gICAgICAgICdhcmlhLXNlbGVjdGVkJzogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICAkY29udGVudC5hdHRyKHsncm9sZSc6ICd0YWJwYW5lbCcsICdhcmlhLWxhYmVsbGVkYnknOiBsaW5rSWQsICdhcmlhLWhpZGRlbic6IHRydWUsICdpZCc6IGlkfSk7XG4gICAgfSk7XG4gICAgdmFyICRpbml0QWN0aXZlID0gdGhpcy4kZWxlbWVudC5maW5kKCcuaXMtYWN0aXZlJykuY2hpbGRyZW4oJ1tkYXRhLXRhYi1jb250ZW50XScpO1xuICAgIHRoaXMuZmlyc3RUaW1lSW5pdCA9IHRydWU7XG4gICAgaWYoJGluaXRBY3RpdmUubGVuZ3RoKXtcbiAgICAgIHRoaXMuZG93bigkaW5pdEFjdGl2ZSwgdGhpcy5maXJzdFRpbWVJbml0KTtcbiAgICAgIHRoaXMuZmlyc3RUaW1lSW5pdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX2NoZWNrRGVlcExpbmsgPSAoKSA9PiB7XG4gICAgICB2YXIgYW5jaG9yID0gd2luZG93LmxvY2F0aW9uLmhhc2g7XG4gICAgICAvL25lZWQgYSBoYXNoIGFuZCBhIHJlbGV2YW50IGFuY2hvciBpbiB0aGlzIHRhYnNldFxuICAgICAgaWYoYW5jaG9yLmxlbmd0aCkge1xuICAgICAgICB2Y
5763XIgJGxpbmsgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ1tocmVmJD1cIicrYW5jaG9yKydcIl0nKSxcbiAgICAgICAgJGFuY2hvciA9ICQoYW5jaG9yKTtcblxuICAgICAgICBpZiAoJGxpbmsubGVuZ3RoICYmICRhbmNob3IpIHtcbiAgICAgICAgICBpZiAoISRsaW5rLnBhcmVudCgnW2RhdGEtYWNjb3JkaW9uLWl0ZW1dJykuaGFzQ2xhc3MoJ2lzLWFjdGl2ZScpKSB7XG4gICAgICAgICAgICB0aGlzLmRvd24oJGFuY2hvciwgdGhpcy5maXJzdFRpbWVJbml0KTtcbiAgICAgICAgICAgIHRoaXMuZmlyc3RUaW1lSW5pdCA9IGZhbHNlO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvL3JvbGwgdXAgYSBsaXR0bGUgdG8gc2hvdyB0aGUgdGl0bGVzXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWVwTGlua1NtdWRnZSkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgICQod2luZG93KS5sb2FkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gX3RoaXMuJGVsZW1lbnQub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHsgc2Nyb2xsVG9wOiBvZmZzZXQudG9wIH0sIF90aGlzLm9wdGlvbnMuZGVlcExpbmtTbXVkZ2VEZWxheSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgenBsdWdpbiBoYXMgZGVlcGxpbmtlZCBhdCBwYWdlbG9hZFxuICAgICAgICAgICAgKiBAZXZlbnQgQWNjb3JkaW9uI2RlZXBsaW5rXG4gICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignZGVlcGxpbmsuemYuYWNjb3JkaW9uJywgWyRsaW5rLCAkYW5jaG9yXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3VzZSBicm93c2VyIHRvIG9wZW4gYSB0YWIsIGlmIGl0IGV4aXN0cyBpbiB0aGlzIHRhYnNldFxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVlcExpbmspIHtcbiAgICAgIHRoaXMuX2NoZWNrRGVlcExpbmsoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9ldmVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIGZvciBpdGVtcyB3aXRoaW4gdGhlIGFjY29yZGlvbi5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuJHRhYnMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciAkZWxlbSA9ICQodGhpcyk7XG4gICAgICB2Y
5763XIgJHRhYkNvbnRlbnQgPSAkZWxlbS5jaGlsZHJlbignW2RhdGEtdGFiLWNvbnRlbnRdJyk7XG4gICAgICBpZiAoJHRhYkNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICRlbGVtLmNoaWxkcmVuKCdhJykub2ZmKCdjbGljay56Zi5hY2NvcmRpb24ga2V5ZG93bi56Zi5hY2NvcmRpb24nKVxuICAgICAgICAgICAgICAgLm9uKCdjbGljay56Zi5hY2NvcmRpb24nLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIF90aGlzLnRvZ2dsZSgkdGFiQ29udGVudCk7XG4gICAgICAgIH0pLm9uKCdrZXlkb3duLnpmLmFjY29yZGlvbicsIGZ1bmN0aW9uKGUpe1xuICAgICAgICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KGUsICdBY2NvcmRpb24nLCB7XG4gICAgICAgICAgICB0b2dnbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBfdGhpcy50b2dnbGUoJHRhYkNvbnRlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgJGEgPSAkZWxlbS5uZXh0KCkuZmluZCgnYScpLmZvY3VzKCk7XG4gICAgICAgICAgICAgIGlmICghX3RoaXMub3B0aW9ucy5tdWx0aUV4cGFuZCkge1xuICAgICAgICAgICAgICAgICRhLnRyaWdnZXIoJ2NsaWNrLnpmLmFjY29yZGlvbicpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmV2aW91czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciAkYSA9ICRlbGVtLnByZXYoKS5maW5kKCdhJykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLm11bHRpRXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgJGEudHJpZ2dlcignY2xpY2suemYuYWNjb3JkaW9uJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhbmRsZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmKHRoaXMub3B0aW9ucy5kZWVwTGluaykge1xuICAgICAgJCh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRoaXMuX2NoZWNrRGVlcExpbmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBzZWxlY3RlZCBjb250ZW50IHBhbmUncyBvcGVuL2Nsb3NlIHN0YXRlLlxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIGpRdWVyeSBvYmplY3Qgb2YgdGhlIHBhbmUgdG8gdG9nZ2xlIChgLmFjY29yZGlvbi1jb250ZW50YCkuXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgdG9nZ2xlKCR0YXJnZXQpIHtcbiAgICBpZigkdGFyZ2V0LnBhcmVudCgpLmhhc0NsYXNzKCdpcy1hY3RpdmUnKSkge1xuICAgICAgdGhpcy51cCgkdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb3duKCR0YXJnZXQpO1xuICAgIH1cbiAgICAvL2VpdGhlciByZXBsYWNlIG9yIHVwZGF0ZSBicm93c2VyIGhpc3RvcnlcbiAgICBpZiAodGhpcy5vcHRpb25zLmRlZXBMaW5rKSB7XG4gICAgICB2Y
5763XIgYW5jaG9yID0gJHRhcmdldC5wcmV2KCdhJykuYXR0cignaHJlZicpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVwZGF0ZUhpc3RvcnkpIHtcbiAgICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoe30sICcnLCBhbmNob3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCBhbmNob3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgYWNjb3JkaW9uIHRhYiBkZWZpbmVkIGJ5IGAkdGFyZ2V0YC5cbiAgICogQHBhcmFtIHtqUXVlcnl9ICR0YXJnZXQgLSBBY2NvcmRpb24gcGFuZSB0byBvcGVuIChgLmFjY29yZGlvbi1jb250ZW50YCkuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmlyc3RUaW1lIC0gZmxhZyB0byBkZXRlcm1pbmUgaWYgcmVmbG93IHNob3VsZCBoYXBwZW4uXG4gICAqIEBmaXJlcyBBY2NvcmRpb24jZG93blxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIGRvd24oJHRhcmdldCwgZmlyc3RUaW1lKSB7XG4gICAgJHRhcmdldFxuICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgZmFsc2UpXG4gICAgICAucGFyZW50KCdbZGF0YS10YWItY29udGVudF0nKVxuICAgICAgLmFkZEJhY2soKVxuICAgICAgLnBhcmVudCgpLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcblxuICAgIGlmICghdGhpcy5vcHRpb25zLm11bHRpRXhwYW5kICYmICFmaXJzdFRpbWUpIHtcbiAgICAgIHZhciAkY3VycmVudEFjdGl2ZSA9IHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oJy5pcy1hY3RpdmUnKS5jaGlsZHJlbignW2RhdGEtdGFiLWNvbnRlbnRdJyk7XG4gICAgICBpZiAoJGN1cnJlbnRBY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudXAoJGN1cnJlbnRBY3RpdmUubm90KCR0YXJnZXQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAkdGFyZ2V0LnNsaWRlRG93bih0aGlzLm9wdGlvbnMuc2xpZGVTcGVlZCwgKCkgPT4ge1xuICAgICAgLyoqXG4gICAgICAgKiBGaXJlcyB3aGVuIHRoZSB0YWIgaXMgZG9uZSBvcGVuaW5nLlxuICAgICAgICogQGV2ZW50IEFjY29yZGlvbiNkb3duXG4gICAgICAgKi9cbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignZG93bi56Zi5hY2NvcmRpb24nLCBbJHRhcmdldF0pO1xuICAgIH0pO1xuXG4gICAgJChgIyR7JHRhcmdldC5hdHRyKCdhcmlhLWxhYmVsbGVkYnknKX1gKS5hdHRyKHtcbiAgICAgICdhcmlhLWV4cGFuZGVkJzogdHJ1ZSxcbiAgICAgICdhcmlhLXNlbGVjdGVkJzogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgdGFiIGRlZmluZWQgYnkgYCR0YXJnZXRgLlxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIEFjY29yZGlvbiB0YWIgdG8gY2xvc2UgKGAuYWNjb3JkaW9uLWNvbnRlbnRgKS5cbiAgICogQGZpcmVzIEFjY29yZGlvbiN1cFxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIHVwKCR0YXJnZXQpIHtcbiAgICB2YXIgJGF1bnRzID0gJHRhcmdldC5wYXJlbnQoKS5zaWJsaW5ncygpLFxuICAgICAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZigoIXRoaXMub3B0aW9ucy5hbGxvd0FsbENsb3NlZCAmJiAhJGF1bnRzLmhhc0NsYXNzKCdpcy1hY3RpdmUnKSkgfHwgISR0YXJnZXQucGFyZW50KCkuaGFzQ2xhc3MoJ2lzLWFjdGl2ZScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm91bmRhdGlvbi5Nb3ZlKHRoaXMub3B0aW9ucy5zbGlkZVNwZWVkLCAkdGFyZ2V0LCBmdW5jdGlvbigpe1xuICAgICAgJHRhcmdldC5zbGlkZVVwKF90aGlzLm9wdGlvbnMuc2xpZGVTcGVlZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdGFiIGlzIGRvbmUgY29sbGFwc2luZyB1cC5cbiAgICAgICAgICogQGV2ZW50IEFjY29yZGlvbiN1cFxuICAgICAgICAgKi9cbiAgICAgICAgX3RoaXMuJGVsZW1lbnQudHJpZ2dlcigndXAuemYuYWNjb3JkaW9uJywgWyR0YXJnZXRdKTtcbiAgICAgIH0pO1xuICAgIC8vIH0pO1xuXG4gICAgJHRhcmdldC5hdHRyKCdhcmlhLWh
5763pZGRlbicsIHRydWUpXG4gICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XG5cbiAgICAkKGAjJHskdGFyZ2V0LmF0dHIoJ2FyaWEtbGFiZWxsZWRieScpfWApLmF0dHIoe1xuICAgICAnYXJpYS1leHBhbmRlZCc6IGZhbHNlLFxuICAgICAnYXJpYS1zZWxlY3RlZCc6IGZhbHNlXG4gICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhbiBpbnN0YW5jZSBvZiBhbiBhY2NvcmRpb24uXG4gICAqIEBmaXJlcyBBY2NvcmRpb24jZGVzdHJveWVkXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLiRlbGVtZW50LmZpbmQoJ1tkYXRhLXRhYi1jb250ZW50XScpLnN0b3AodHJ1ZSkuc2xpZGVVcCgwKS5jc3MoJ2Rpc3BsYXknLCAnJyk7XG4gICAgdGhpcy4kZWxlbWVudC5maW5kKCdhJykub2ZmKCcuemYuYWNjb3JkaW9uJyk7XG4gICAgaWYodGhpcy5vcHRpb25zLmRlZXBMaW5rKSB7XG4gICAgICAkKHdpbmRvdykub2ZmKCdwb3BzdGF0ZScsIHRoaXMuX2NoZWNrRGVlcExpbmspO1xuICAgIH1cblxuICAgIEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKTtcbiAgfVxufVxuXG5BY2NvcmRpb24uZGVmYXVsdHMgPSB7XG4gIC8qKlxuICAgKiBBbW91bnQgb2YgdGltZSB0byBhbmltYXRlIHRoZSBvcGVuaW5nIG9mIGFuIGFjY29yZGlvbiBwYW5lLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDI1MFxuICAgKi9cbiAgc2xpZGVTcGVlZDogMjUwLFxuICAvKipcbiAgICogQWxsb3cgdGhlIGFjY29yZGlvbiB0byBoYXZlIG11bHRpcGxlIG9wZW4gcGFuZXMuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBtdWx0aUV4cGFuZDogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvdyB0aGUgYWNjb3JkaW9uIHRvIGNsb3NlIGFsbCBwYW5lcy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGFsbG93QWxsQ2xvc2VkOiBmYWxzZSxcbiAgLyoqXG4gICAqIEFsbG93cyB0aGUgd2luZG93IHRvIHNjcm9sbCB0byBjb250ZW50IG9mIHBhbmUgc3BlY2lmaWVkIGJ5IGhhc2ggYW5jaG9yXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWVwTGluazogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEFkanVzdCB0aGUgZGVlcCBsaW5rIHNjcm9sbCB0byBtYWtlIHN1cmUgdGhlIHRvcCBvZiB0aGUgYWNjb3JkaW9uIHBhbmVsIGlzIHZpc2libGVcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRlZXBMaW5rU211ZGdlOiBmYWxzZSxcblxuICAvKipcbiAgICogQW5pbWF0aW9uIHRpbWUgKG1zKSBmb3IgdGhlIGRlZXAgbGluayBhZGp1c3RtZW50XG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBkZWVwTGlua1NtdWRnZURlbGF5OiAzMDAsXG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgYnJvd3NlciBoaXN0b3J5IHdpdGggdGhlIG9wZW4gYWNjb3JkaW9uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB1cGRhdGVIaXN0b3J5OiBmYWxzZVxufTtcblxuLy8gV2luZG93IGV4cG9ydHNcbkZvdW5kYXRpb24ucGx1Z2luKEFjY29yZGlvbiwgJ0FjY29yZGlvbicpO1xuXG59KGpRdWVyeSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbiFmdW5jdGlvbigkKSB7XG5cbi8qKlxuICogRHJpbGxkb3duIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi5kcmlsbGRvd25cbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwua2V5Ym9hcmRcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwubW90aW9uXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLm5lc3RcbiAqL1xuXG5jbGFzcyBEcmlsbGRvd24ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIGRyaWxsZG93biBtZW51LlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIG1ha2UgaW50byBhbiBhY2NvcmRpb24gbWVudS5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPdmVycmlkZXMgdG8gdGhlIGRlZmF1bHQgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBEcmlsbGRvd24uZGVmYXVsdHMsIHRoaXMuJGVsZW1lbnQuZGF0YSgpLCBvcHRpb25zKTtcblxuICAgIEZvdW5kYXRpb24uTmVzdC5GZWF0aGVyKHRoaXMuJGVsZW1lbnQsICdkcmlsbGRvd24nKTtcblxuICAgIHRoaXMuX2luaXQoKTtcblxuICAgIEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcywgJ0RyaWxsZG93bicpO1xuICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQucmVnaXN0ZXIoJ0RyaWxsZG93bicsIHtcbiAgICAgICdFTlRFUic6ICdvcGVuJyxcbiAgICAgICdTUEFDRSc6ICdvcGVuJyxcbiAgICAgICdBUlJPV19SSUdIVCc6ICduZXh0JyxcbiAgICAgICdBUlJPV19VUCc6ICd1cCcsXG4gICAgICAnQVJST1dfRE9XTic6ICdkb3duJyxcbiAgICAgICdBUlJPV19MRUZUJzogJ3ByZXZpb3VzJyxcbiAgICAgICdFU0NBUEUnOiAnY2xvc2UnLFxuICAgICAgJ1RBQic6ICdkb3duJyxcbiAgICAgICdTSElGVF9UQUInOiAndXAnXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGRyaWxsZG93biBieSBjcmVhdGluZyBqUXVlcnkgY29sbGVjdGlvbnMgb2YgZWxlbWVudHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHRoaXMuJHN1Ym1lbnVBbmNob3JzID0gdGhpcy4kZWxlbWVudC5maW5kKCdsaS5pcy1kcmlsbGRvd24tc3VibWVudS1wYXJlbnQnKS5jaGlsZHJlbignYScpO1xuICAgIHRoaXMuJHN1Ym1lbnVzID0gdGhpcy4kc3VibWVudUFuY2hvcnMucGFyZW50KCdsaScpLmNoaWxkcmVuKCdbZGF0YS1zdWJtZW51XScpO1xuICAgIHRoaXMuJG1lbnVJdGVtcyA9IHRoaXMuJGVsZW1lbnQuZmluZCgnbGknKS5ub3QoJy5qcy1kcmlsbGRvd24tYmFjaycpLmF0dHIoJ3JvbGUnLCAnbWVudWl0ZW0nKS5maW5kKCdhJyk7XG4gICAgdGhpcy4kZWxlbWVudC5hdHRyKCdkYXRhLW11dGF0ZScsICh0aGlzLiRlbGVtZW50LmF0dHIoJ2RhdGEtZ
5763HJpbGxkb3duJykgfHwgRm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LCAnZHJpbGxkb3duJykpKTtcblxuICAgIHRoaXMuX3ByZXBhcmVNZW51KCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJFdmVudHMoKTtcblxuICAgIHRoaXMuX2tleWJvYXJkRXZlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogcHJlcGFyZXMgZHJpbGxkb3duIG1lbnUgYnkgc2V0dGluZyBhdHRyaWJ1dGVzIHRvIGxpbmtzIGFuZCBlbGVtZW50c1xuICAgKiBzZXRzIGEgbWluIGhlaWdodCB0byBwcmV2ZW50IGNvbnRlbnQganVtcGluZ1xuICAgKiB3cmFwcyB0aGUgZWxlbWVudCBpZiBub3QgYWxyZWFkeSB3cmFwcGVkXG4gICAqIEBwcml2YXRlXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgX3ByZXBhcmVNZW51KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgLy8gaWYoIXRoaXMub3B0aW9ucy5ob2xkT3Blbil7XG4gICAgLy8gICB0aGlzLl9tZW51TGlua0V2ZW50cygpO1xuICAgIC8vIH1cbiAgICB0aGlzLiRzdWJtZW51QW5jaG9ycy5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgJGxpbmsgPSAkKHRoaXMpO1xuICAgICAgdmFyICRzdWIgPSAkbGluay5wYXJlbnQoKTtcbiAgICAgIGlmKF90aGlzLm9wdGlvbnMucGFyZW50TGluayl7XG4gICAgICAgICRsaW5rLmNsb25lKCkucHJlcGVuZFRvKCRzdWIuY2hpbGRyZW4oJ1tkYXRhLXN1Ym1lbnVdJykpLndyYXAoJzxsaSBjbGFzcz1cImlzLXN1Ym1lbnUtcGFyZW50LWl0ZW0gaXMtc3VibWVudS1pdGVtIGlzLWRyaWxsZG93bi1zdWJtZW51LWl0ZW1cIiByb2xlPVwibWVudS1pdGVtXCI+PC9saT4nKTtcbiAgICAgIH1cbiAgICAgICRsaW5rLmRhdGEoJ3NhdmVkSHJlZicsICRsaW5rLmF0dHIoJ2hyZWYnKSkucmVtb3ZlQXR0cignaHJlZicpLmF0dHIoJ3RhYmluZGV4JywgMCk7XG4gICAgICAkbGluay5jaGlsZHJlbignW2RhdGEtc3VibWVudV0nKVxuICAgICAgICAgIC5hdHRyKHtcbiAgICAgICAgICAgICdhcmlhLWh
5763pZGRlbic6IHRydWUsXG4gICAgICAgICAgICAndGFiaW5kZXgnOiAwLFxuICAgICAgICAgICAgJ3JvbGUnOiAnbWVudSdcbiAgICAgICAgICB9KTtcbiAgICAgIF90aGlzLl9ldmVudHMoJGxpbmspO1xuICAgIH0pO1xuICAgIHRoaXMuJHN1Ym1lbnVzLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgIHZhciAkbWVudSA9ICQodGhpcyksXG4gICAgICAgICAgJGJhY2sgPSAkbWVudS5maW5kKCcuanMtZHJpbGxkb3duLWJhY2snKTtcbiAgICAgIGlmKCEkYmFjay5sZW5ndGgpe1xuICAgICAgICBzd2l0Y2ggKF90aGlzLm9wdGlvbnMuYmFja0J1dHRvblBvc2l0aW9uKSB7XG4gICAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgICAgICAgJG1lbnUuYXBwZW5kKF90aGlzLm9wdGlvbnMuYmFja0J1dHRvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwidG9wXCI6XG4gICAgICAgICAgICAkbWVudS5wcmVwZW5kKF90aGlzLm9wdGlvbnMuYmFja0J1dHRvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlVuc3VwcG9ydGVkIGJhY2tCdXR0b25Qb3NpdGlvbiB2YWx1ZSAnXCIgKyBfdGhpcy5vcHRpb25zLmJhY2tCdXR0b25Qb3NpdGlvbiArIFwiJ1wiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX3RoaXMuX2JhY2soJG1lbnUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kc3VibWVudXMuYWRkQ2xhc3MoJ2ludmlzaWJsZScpO1xuICAgIGlmKCF0aGlzLm9wdGlvbnMuYXV0b0hlaWdodCkge1xuICAgICAgdGhpcy4kc3VibWVudXMuYWRkQ2xhc3MoJ2RyaWxsZG93bi1zdWJtZW51LWNvdmVyLXByZXZpb3VzJyk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgd3JhcHBlciBvbiBlbGVtZW50IGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgaWYoIXRoaXMuJGVsZW1lbnQucGFyZW50KCkuaGFzQ2xhc3MoJ2lzLWRyaWxsZG93bicpKXtcbiAgICAgIHRoaXMuJHdyYXBwZXIgPSAkKHRoaXMub3B0aW9ucy53cmFwcGVyKS5hZGRDbGFzcygnaXMtZHJpbGxkb3duJyk7XG4gICAgICBpZih0aGlzLm9wdGlvbnMuYW5pbWF0ZUhlaWdodCkgdGhpcy4kd3JhcHBlci5hZGRDbGFzcygnYW5pbWF0ZS1oZWlnaHQnKTtcbiAgICAgIHRoaXMuJGVsZW1lbnQud3JhcCh0aGlzLiR3cmFwcGVyKTtcbiAgICB9XG4gICAgLy8gc2V0IHdyYXBwZXJcbiAgICB0aGlzLiR3cmFwcGVyID0gdGhpcy4kZWxlbWVudC5wYXJlbnQoKTtcbiAgICB0aGlzLiR3cmFwcGVyLmNzcyh0aGlzLl9nZXRNYXhEaW1zKCkpO1xuICB9XG5cbiAgX3Jlc2l6ZSgpIHtcbiAgICB0aGlzLiR3cmFwcGVyLmNzcyh7J21heC13aWR0aCc6ICdub25lJywgJ21pbi1oZWlnaHQnOiAnbm9uZSd9KTtcbiAgICAvLyBfZ2V0TWF4RGltcyBoYXMgc2lkZSBlZmZlY3RzIChib28pIGJ1dCBjYWxsaW5nIGl0IHNob3VsZCB1cGRhdGUgYWxsIG90aGVyIG5lY2Vzc2FyeSBoZWlnaHRzICYgd2lkdGhzXG4gICAgdGhpcy4kd3JhcHBlci5jc3ModGhpcy5fZ2V0TWF4RGltcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIGVsZW1lbnRzIGluIHRoZSBtZW51LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtqUXVlcnl9ICRlbGVtIC0gdGhlIGN1cnJlbnQgbWVudSBpdGVtIHRvIGFkZCBoYW5kbGVycyB0by5cbiAgICovXG4gIF9ldmVudHMoJGVsZW0pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgJGVsZW0ub2ZmKCdjbGljay56Zi5kcmlsbGRvd24nKVxuICAgIC5vbignY2xpY2suemYuZHJpbGxkb3duJywgZnVuY3Rpb24oZSl7XG4gICAgICBpZigkKGUudGFyZ2V0KS5wYXJlbnRzVW50aWwoJ3VsJywgJ2xpJykuaGFzQ2xhc3MoJ2lzLWRyaWxsZG93bi1zdWJtZW51LXBhcmVudCcpKXtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZihlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0LmZpcnN0RWxlbWVudENoaWxkKXtcbiAgICAgIC8vICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gfVxuICAgICAgX3RoaXMuX3Nob3coJGVsZW0ucGFyZW50KCdsaScpKTtcblxuICAgICAgaWYoX3RoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2spe1xuICAgICAgICB2Y
5763XIgJGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgICAgICRib2R5Lm9mZignLnpmLmRyaWxsZG93bicpLm9uKCdjbGljay56Zi5kcmlsbGRvd24nLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IF90aGlzLiRlbGVtZW50WzBdIHx8ICQuY29udGFpbnMoX3RoaXMuJGVsZW1lbnRbMF0sIGUudGFyZ2V0KSkgeyByZXR1cm47IH1cbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgX3RoaXMuX2hpZGVBbGwoKTtcbiAgICAgICAgICAkYm9keS5vZmYoJy56Zi5kcmlsbGRvd24nKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cdCAgdGhpcy4kZWxlbWVudC5vbignbXV0YXRlbWUuemYudHJpZ2dlcicsIHRoaXMuX3Jlc2l6ZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSBtZW51IGVsZW1lbnQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlZ2lzdGVyRXZlbnRzKCkge1xuICAgIGlmKHRoaXMub3B0aW9ucy5zY3JvbGxUb3Ape1xuICAgICAgdGhpcy5fYmluZEhhbmRsZXIgPSB0aGlzLl9zY3JvbGxUb3AuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuJGVsZW1lbnQub24oJ29wZW4uemYuZHJpbGxkb3duIGhpZGUuemYuZHJpbGxkb3duIGNsb3NlZC56Zi5kcmlsbGRvd24nLHRoaXMuX2JpbmRIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIHRvIFRvcCBvZiBFbGVtZW50IG9yIGRhdGEtc2Nyb2xsLXRvcC1lbGVtZW50XG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgRHJpbGxkb3duI3Njcm9sbG1lXG4gICAqL1xuICBfc2Nyb2xsVG9wKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyICRzY3JvbGxUb3BFbGVtZW50ID0gX3RoaXMub3B0aW9ucy5zY3JvbGxUb3BFbGVtZW50IT0nJz8kKF90aGlzLm9wdGlvbnMuc2Nyb2xsVG9wRWxlbWVudCk6X3RoaXMuJGVsZW1lbnQsXG4gICAgICAgIHNjcm9sbFBvcyA9IHBhcnNlSW50KCRzY3JvbGxUb3BFbGVtZW50Lm9mZnNldCgpLnRvcCtfdGhpcy5vcHRpb25zLnNjcm9sbFRvcE9mZnNldCk7XG4gICAgJCgnaHRtbCwgYm9keScpLnN0b3AodHJ1ZSkuYW5pbWF0ZSh7IHNjcm9sbFRvcDogc2Nyb2xsUG9zIH0sIF90aGlzLm9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24sIF90aGlzLm9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nLGZ1bmN0aW9uKCl7XG4gICAgICAvKipcbiAgICAgICAgKiBGaXJlcyBhZnRlciB0aGUgbWVudSBoYXMgc2Nyb2xsZWRcbiAgICAgICAgKiBAZXZlbnQgRHJpbGxkb3duI3Njcm9sbG1lXG4gICAgICAgICovXG4gICAgICBpZih0aGlzPT09JCgnaHRtbCcpWzBdKV90aGlzLiRlbGVtZW50LnRyaWdnZXIoJ3Njcm9sbG1lLnpmLmRyaWxsZG93bicpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMga2V5ZG93biBldmVudCBsaXN0ZW5lciB0byBgbGlgJ3MgaW4gdGhlIG1lbnUuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfa2V5Ym9hcmRFdmVudHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuJG1lbnVJdGVtcy5hZGQodGhpcy4kZWxlbWVudC5maW5kKCcuanMtZHJpbGxkb3duLWJhY2sgPiBhLCAuaXMtc3VibWVudS1wYXJlbnQtaXRlbSA+IGEnKSkub24oJ2tleWRvd24uemYuZHJpbGxkb3duJywgZnVuY3Rpb24oZSl7XG4gICAgICB2Y
5763XIgJGVsZW1lbnQgPSAkKHRoaXMpLFxuICAgICAgICAgICRlbGVtZW50cyA9ICRlbGVtZW50LnBhcmVudCgnbGknKS5wYXJlbnQoJ3VsJykuY2hpbGRyZW4oJ2xpJykuY2hpbGRyZW4oJ2EnKSxcbiAgICAgICAgICAkcHJldkVsZW1lbnQsXG4gICAgICAgICAgJG5leHRFbGVtZW50O1xuXG4gICAgICAkZWxlbWVudHMuZWFjaChmdW5jdGlvbihpKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmlzKCRlbGVtZW50KSkge1xuICAgICAgICAgICRwcmV2RWxlbWVudCA9ICRlbGVtZW50cy5lcShNYXRoLm1heCgwLCBpLTEpKTtcbiAgICAgICAgICAkbmV4dEVsZW1lbnQgPSAkZWxlbWVudHMuZXEoTWF0aC5taW4oaSsxLCAkZWxlbWVudHMubGVuZ3RoLTEpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShlLCAnRHJpbGxkb3duJywge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoJGVsZW1lbnQuaXMoX3RoaXMuJHN1Ym1lbnVBbmNob3JzKSkge1xuICAgICAgICAgICAgX3RoaXMuX3Nob3coJGVsZW1lbnQucGFyZW50KCdsaScpKTtcbiAgICAgICAgICAgICRlbGVtZW50LnBhcmVudCgnbGknKS5vbmUoRm91bmRhdGlvbi50cmFuc2l0aW9uZW5kKCRlbGVtZW50KSwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgJGVsZW1lbnQucGFyZW50KCdsaScpLmZpbmQoJ3VsIGxpIGEnKS5maWx0ZXIoX3RoaXMuJG1lbnVJdGVtcykuZmlyc3QoKS5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByZXZpb3VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBfdGhpcy5faGlkZSgkZWxlbWVudC5wYXJlbnQoJ2xpJykucGFyZW50KCd1bCcpKTtcbiAgICAgICAgICAkZWxlbWVudC5wYXJlbnQoJ2xpJykucGFyZW50KCd1bCcpLm9uZShGb3VuZGF0aW9uLnRyYW5zaXRpb25lbmQoJGVsZW1lbnQpLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgJGVsZW1lbnQucGFyZW50KCdsaScpLnBhcmVudCgndWwnKS5wYXJlbnQoJ2xpJykuY2hpbGRyZW4oJ2EnKS5maXJzdCgpLmZvY3VzKCk7XG4gICAgICAgICAgICB9LCAxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgdXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICRwcmV2RWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgIC8vIERvbid0IHRhcCBmb2N1cyBvbiBmaXJzdCBlbGVtZW50IGluIHJvb3QgdWxcbiAgICAgICAgICByZXR1cm4gISRlbGVtZW50LmlzKF90aGlzLiRlbGVtZW50LmZpbmQoJz4gbGk6Zmlyc3QtY2hpbGQgPiBhJykpO1xuICAgICAgICB9LFxuICAgICAgICBkb3duOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAkbmV4dEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAvLyBEb24ndCB0YXAgZm9jdXMgb24gbGFzdCBlbGVtZW50IGluIHJvb3QgdWxcbiAgICAgICAgICByZXR1cm4gISRlbGVtZW50LmlzKF90aGlzLiRlbGVtZW50LmZpbmQoJz4gbGk6bGFzdC1jaGlsZCA+IGEnKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBEb24ndCBjbG9zZSBvbiBlbGVtZW50IGluIHJvb3QgdWxcbiAgICAgICAgICBpZiAoISRlbGVtZW50LmlzKF90aGlzLiRlbGVtZW50LmZpbmQoJz4gbGkgPiBhJykpKSB7XG4gICAgICAgICAgICBfdGhpcy5faGlkZSgkZWxlbWVudC5wYXJlbnQoKS5wYXJlbnQoKSk7XG4gICAgICAgICAgICAkZWxlbWVudC5wYXJlbnQoKS5wYXJlbnQoKS5zaWJsaW5ncygnYScpLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvcGVuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoISRlbGVtZW50LmlzKF90aGlzLiRtZW51SXRlbXMpKSB7IC8vIG5vdCBtZW51IGl0ZW0gbWVhbnMgYmFjayBidXR0b25cbiAgICAgICAgICAgIF90aGlzLl9oaWRlKCRlbGVtZW50LnBhcmVudCgnbGknKS5wYXJlbnQoJ3VsJykpO1xuICAgICAgICAgICAgJGVsZW1lbnQucGFyZW50KCdsaScpLnBhcmVudCgndWwnKS5vbmUoRm91bmRhdGlvbi50cmFuc2l0aW9uZW5kKCRlbGVtZW50KSwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkZWxlbWVudC5wYXJlbnQoJ2xpJykucGFyZW50KCd1bCcpLnBhcmVudCgnbGknKS5jaGlsZHJlbignYScpLmZpcnN0KCkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJGVsZW1lbnQuaXMoX3RoaXMuJHN1Ym1lbnVBbmNob3JzKSkge1xuICAgICAgICAgICAgX3RoaXMuX3Nob3coJGVsZW1lbnQucGFyZW50KCdsaScpKTtcbiAgICAgICAgICAgICRlbGVtZW50LnBhcmVudCgnbGknKS5vbmUoRm91bmRhdGlvbi50cmFuc2l0aW9uZW5kKCRlbGVtZW50KSwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgJGVsZW1lbnQucGFyZW50KCdsaScpLmZpbmQoJ3VsIGxpIGEnKS5maWx0ZXIoX3RoaXMuJG1lbnVJdGVtcykuZmlyc3QoKS5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZWQ6IGZ1bmN0aW9uKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgaWYgKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pOyAvLyBlbmQga2V5Ym9hcmRBY2Nlc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYWxsIG9wZW4gZWxlbWVudHMsIGFuZCByZXR1cm5zIHRvIHJvb3QgbWVudS5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBmaXJlcyBEcmlsbGRvd24jY2xvc2VkXG4gICAqL1xuICBfaGlkZUFsbCgpIHtcbiAgICB2YXIgJGVsZW0gPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5pcy1kcmlsbGRvd24tc3VibWVudS5pcy1hY3RpdmUnKS5hZGRDbGFzcygnaXMtY2xvc2luZycpO1xuICAgIGlmKHRoaXMub3B0aW9ucy5hdXRv
5763SGVpZ2h0KSB0aGlzLiR3cmFwcGVyLmNzcyh7aGVpZ2h0OiRlbGVtLnBhcmVudCgpLmNsb3Nlc3QoJ3VsJykuZGF0YSgnY2FsY0hlaWdodCcpfSk7XG4gICAgJGVsZW0ub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZCgkZWxlbSksIGZ1bmN0aW9uKGUpe1xuICAgICAgJGVsZW0ucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZSBpcy1jbG9zaW5nJyk7XG4gICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBtZW51IGlzIGZ1bGx5IGNsb3NlZC5cbiAgICAgICAgICogQGV2ZW50IERyaWxsZG93biNjbG9zZWRcbiAgICAgICAgICovXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdjbG9zZWQuemYuZHJpbGxkb3duJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBldmVudCBsaXN0ZW5lciBmb3IgZWFjaCBgYmFja2AgYnV0dG9uLCBhbmQgY2xvc2VzIG9wZW4gbWVudXMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgRHJpbGxkb3duI2JhY2tcbiAgICogQHBhcmFtIHtqUXVlcnl9ICRlbGVtIC0gdGhlIGN1cnJlbnQgc3ViLW1lbnUgdG8gYWRkIGBiYWNrYCBldmVudC5cbiAgICovXG4gIF9iYWNrKCRlbGVtKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAkZWxlbS5vZmYoJ2NsaWNrLnpmLmRyaWxsZG93bicpO1xuICAgICRlbGVtLmNoaWxkcmVuKCcuanMtZHJpbGxkb3duLWJhY2snKVxuICAgICAgLm9uKCdjbGljay56Zi5kcmlsbGRvd24nLCBmdW5jdGlvbihlKXtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ21vdXNldXAgb24gYmFjaycpO1xuICAgICAgICBfdGhpcy5faGlkZSgkZWxlbSk7XG5cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwYXJlbnQgc3VibWVudSwgY2FsbCBzaG93XG4gICAgICAgIGxldCBwYXJlbnRTdWJNZW51ID0gJGVsZW0ucGFyZW50KCdsaScpLnBhcmVudCgndWwnKS5wYXJlbnQoJ2xpJyk7XG4gICAgICAgIGlmIChwYXJlbnRTdWJNZW51Lmxlbmd0aCkge1xuICAgICAgICAgIF90aGlzLl9zaG93KHBhcmVudFN1Yk1lbnUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGxpc3RlbmVyIHRvIG1lbnUgaXRlbXMgdy9vIHN1Ym1lbnVzIHRvIGNsb3NlIG9wZW4gbWVudXMgb24gY2xpY2suXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21lbnVMaW5rRXZlbnRzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdGhpcy4kbWVudUl0ZW1zLm5vdCgnLmlzLWRyaWxsZG93bi1zdWJtZW51LXBhcmVudCcpXG4gICAgICAgIC5vZmYoJ2NsaWNrLnpmLmRyaWxsZG93bicpXG4gICAgICAgIC5vbignY2xpY2suemYuZHJpbGxkb3duJywgZnVuY3Rpb24oZSl7XG4gICAgICAgICAgLy8gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBfdGhpcy5faGlkZUFsbCgpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSBzdWJtZW51LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQGZpcmVzIERyaWxsZG93biNvcGVuXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkZWxlbSAtIHRoZSBjdXJyZW50IGVsZW1lbnQgd2l0aCBhIHN1Ym1lbnUgdG8gb3BlbiwgaS5lLiB0aGUgYGxpYCB0YWcuXG4gICAqL1xuICBfc2hvdygkZWxlbSkge1xuICAgIGlmKHRoaXMub3B0aW9ucy5hdXRvSGVpZ2h0KSB0aGlzLiR3cmFwcGVyLmNzcyh7aGVpZ2h0OiRlbGVtLmNoaWxkcmVuKCdbZGF0YS1zdWJtZW51XScpLmRhdGEoJ2NhbGNIZWlnaHQnKX0pO1xuICAgICRlbGVtLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAkZWxlbS5jaGlsZHJlbignW2RhdGEtc3VibWVudV0nKS5hZGRDbGFzcygnaXMtYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2ludmlzaWJsZScpLmF0dHIoJ2FyaWEtaGlkZGVuJywgZmFsc2UpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIHN1Ym1lbnUgaGFzIG9wZW5lZC5cbiAgICAgKiBAZXZlbnQgRHJpbGxkb3duI29wZW5cbiAgICAgKi9cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ29wZW4uemYuZHJpbGxkb3duJywgWyRlbGVtXSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhpZGVzIGEgc3VibWVudVxuICAgKiBAZnVuY3Rpb25cbiAgICogQGZpcmVzIERyaWxsZG93biNoaWRlXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkZWxlbSAtIHRoZSBjdXJyZW50IHN1Yi1tZW51IHRvIGhpZGUsIGkuZS4gdGhlIGB1bGAgdGFnLlxuICAgKi9cbiAgX2hpZGUoJGVsZW0pIHtcbiAgICBpZih0aGlzLm9wdGlvbnMuYXV0b0hlaWdodCkgdGhpcy4kd3JhcHBlci5jc3Moe2hlaWdodDokZWxlbS5wYXJlbnQoKS5jbG9zZXN0KCd1bCcpLmRhdGEoJ2NhbGNIZWlnaHQnKX0pO1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgJGVsZW0ucGFyZW50KCdsaScpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSk7XG4gICAgJGVsZW0uYXR0cignYXJpYS1oaWRkZW4nLCB0cnVlKS5hZGRDbGFzcygnaXMtY2xvc2luZycpXG4gICAgJGVsZW0uYWRkQ2xhc3MoJ2lzLWNsb3NpbmcnKVxuICAgICAgICAgLm9uZShGb3VuZGF0aW9uLnRyYW5zaXRpb25lbmQoJGVsZW0pLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAkZWxlbS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlIGlzLWNsb3NpbmcnKTtcbiAgICAgICAgICAgJGVsZW0uYmx1cigpLmFkZENsYXNzKCdpbnZpc2libGUnKTtcbiAgICAgICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIHN1Ym1lbnUgaGFzIGNsb3NlZC5cbiAgICAgKiBAZXZlbnQgRHJpbGxkb3duI2hpZGVcbiAgICAgKi9cbiAgICAkZWxlbS50cmlnZ2VyKCdoaWRlLnpmLmRyaWxsZG93bicsIFskZWxlbV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIG5lc3RlZCBtZW51cyB0byBjYWxjdWxhdGUgdGhlIG1pbi1oZWlnaHQsIGFuZCBtYXgtd2lkdGggZm9yIHRoZSBtZW51LlxuICAgKiBQcmV2ZW50cyBjb250ZW50IGp1bXBpbmcuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dldE1heERpbXMoKSB7XG4gICAgdmFyICBtYXhIZWlnaHQgPSAwLCByZXN1bHQgPSB7fSwgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuJHN1Ym1lbnVzLmFkZCh0aGlzLiRlbGVtZW50KS5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICB2Y
5763XIgbnVtT2ZFbGVtcyA9ICQodGhpcykuY2hpbGRyZW4oJ2xpJykubGVuZ3RoO1xuICAgICAgdmFyIGhlaWdodCA9IEZvdW5kYXRpb24uQm94LkdldERpbWVuc2lvbnModGhpcykuaGVpZ2h0O1xuICAgICAgbWF4SGVpZ2h0ID0gaGVpZ2h0ID4gbWF4SGVpZ2h0ID8gaGVpZ2h0IDogbWF4SGVpZ2h0O1xuICAgICAgaWYoX3RoaXMub3B0aW9ucy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICQodGhpcykuZGF0YSgnY2FsY0hlaWdodCcsaGVpZ2h0KTtcbiAgICAgICAgaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdpcy1kcmlsbGRvd24tc3VibWVudScpKSByZXN1bHRbJ2hlaWdodCddID0gaGVpZ2h0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYoIXRoaXMub3B0aW9ucy5hdXRvSGVpZ2h0KSByZXN1bHRbJ21pbi1oZWlnaHQnXSA9IGAke21heEhlaWdodH1weGA7XG5cbiAgICByZXN1bHRbJ21heC13aWR0aCddID0gYCR7dGhpcy4kZWxlbWVudFswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aH1weGA7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBEcmlsbGRvd24gTWVudVxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYodGhpcy5vcHRpb25zLnNjcm9sbFRvcCkgdGhpcy4kZWxlbWVudC5vZmYoJy56Zi5kcmlsbGRvd24nLHRoaXMuX2JpbmRIYW5kbGVyKTtcbiAgICB0aGlzLl9oaWRlQWxsKCk7XG5cdCAgdGhpcy4kZWxlbWVudC5vZmYoJ211dGF0ZW1lLnpmLnRyaWdnZXInKTtcbiAgICBGb3VuZGF0aW9uLk5lc3QuQnVybih0aGlzLiRlbGVtZW50LCAnZHJpbGxkb3duJyk7XG4gICAgdGhpcy4kZWxlbWVudC51bndyYXAoKVxuICAgICAgICAgICAgICAgICAuZmluZCgnLmpzLWRyaWxsZG93bi1iYWNrLCAuaXMtc3VibWVudS1wYXJlbnQtaXRlbScpLnJlbW92ZSgpXG4gICAgICAgICAgICAgICAgIC5lbmQoKS5maW5kKCcuaXMtYWN0aXZlLCAuaXMtY2xvc2luZywgLmlzLWRyaWxsZG93bi1zdWJtZW51JykucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZSBpcy1jbG9zaW5nIGlzLWRyaWxsZG93bi1zdWJtZW51JylcbiAgICAgICAgICAgICAgICAgLmVuZCgpLmZpbmQoJ1tkYXRhLXN1Ym1lbnVdJykucmVtb3ZlQXR0cignYXJpYS1oaWRkZW4gdGFiaW5kZXggcm9sZScpO1xuICAgIHRoaXMuJHN1Ym1lbnVBbmNob3JzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAkKHRoaXMpLm9mZignLnpmLmRyaWxsZG93bicpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kc3VibWVudXMucmVtb3ZlQ2xhc3MoJ2RyaWxsZG93bi1zdWJtZW51LWNvdmVyLXByZXZpb3VzJyk7XG5cbiAgICB0aGlzLiRlbGVtZW50LmZpbmQoJ2EnKS5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICB2Y
5763XIgJGxpbmsgPSAkKHRoaXMpO1xuICAgICAgJGxpbmsucmVtb3ZlQXR0cigndGFiaW5kZXgnKTtcbiAgICAgIGlmKCRsaW5rLmRhdGEoJ3NhdmVkSHJlZicpKXtcbiAgICAgICAgJGxpbmsuYXR0cignaHJlZicsICRsaW5rLmRhdGEoJ3NhdmVkSHJlZicpKS5yZW1vdmVEYXRhKCdzYXZlZEhyZWYnKTtcbiAgICAgIH1lbHNleyByZXR1cm47IH1cbiAgICB9KTtcbiAgICBGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyk7XG4gIH07XG59XG5cbkRyaWxsZG93bi5kZWZhdWx0cyA9IHtcbiAgLyoqXG4gICAqIE1hcmt1cCB1c2VkIGZvciBKUyBnZW5lcmF0ZWQgYmFjayBidXR0b24uIFByZXBlbmRlZCAgb3IgYXBwZW5kZWQgKHNlZSBiYWNrQnV0dG9uUG9zaXRpb24pIHRvIHN1Ym1lbnUgbGlzdHMgYW5kIGRlbGV0ZWQgb24gYGRlc3Ryb3lgIG1ldGhvZCwgJ2pzLWRyaWxsZG93bi1iYWNrJyBjbGFzcyByZXF1aXJlZC4gUmVtb3ZlIHRoZSBiYWNrc2xhc2ggKGBcXGApIGlmIGNvcHkgYW5kIHBhc3RpbmcuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJzxsaSBjbGFzcz1cImpzLWRyaWxsZG93bi1iYWNrXCI+PGEgdGFiaW5kZXg9XCIwXCI+QmFjazwvYT48L2xpPidcbiAgICovXG4gIGJhY2tCdXR0b246ICc8bGkgY2xhc3M9XCJqcy1kcmlsbGRvd24tYmFja1wiPjxhIHRhYmluZGV4PVwiMFwiPkJhY2s8L2E+PC9saT4nLFxuICAvKipcbiAgICogUG9zaXRpb24gdGhlIGJhY2sgYnV0dG9uIGVpdGhlciBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBkcmlsbGRvd24gc3VibWVudXMuIENhbiBiZSBgJ2xlZnQnYCBvciBgJ2JvdHRvbSdgLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IHRvcFxuICAgKi9cbiAgYmFja0J1dHRvblBvc2l0aW9uOiAndG9wJyxcbiAgLyoqXG4gICAqIE1hcmt1cCB1c2VkIHRvIHdyYXAgZHJpbGxkb3duIG1lbnUuIFVzZSBhIGNsYXNzIG5hbWUgZm9yIGluZGVwZW5kZW50IHN0eWxpbmc7IHRoZSBKUyBhcHBsaWVkIGNsYXNzOiBgaXMtZHJpbGxkb3duYCBpcyByZXF1aXJlZC4gUmVtb3ZlIHRoZSBiYWNrc2xhc2ggKGBcXGApIGlmIGNvcHkgYW5kIHBhc3RpbmcuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJzxkaXY+PC9kaXY+J1xuICAgKi9cbiAgd3JhcHBlcjogJzxkaXY+PC9kaXY+JyxcbiAgLyoqXG4gICAqIEFkZHMgdGhlIHBhcmVudCBsaW5rIHRvIHRoZSBzdWJtZW51LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcGFyZW50TGluazogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvdyB0aGUgbWVudSB0byByZXR1cm4gdG8gcm9vdCBsaXN0IG9uIGJvZHkgY2xpY2suXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjbG9zZU9uQ2xpY2s6IGZhbHNlLFxuICAvKipcbiAgICogQWxsb3cgdGhlIG1lbnUgdG8gYXV0byBhZGp1c3QgaGVpZ2h0LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYXV0b0hlaWdodDogZmFsc2UsXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBhdXRvIGFkanVzdCBoZWlnaHQuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBhbmltYXRlSGVpZ2h0OiBmYWxzZSxcbiAgLyoqXG4gICAqIFNjcm9sbCB0byB0aGUgdG9wIG9mIHRoZSBtZW51IGFmdGVyIG9wZW5pbmcgYSBzdWJtZW51IG9yIG5hdmlnYXRpbmcgYmFjayB1c2luZyB0aGUgbWVudSBiYWNrIGJ1dHRvblxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgc2Nyb2xsVG9wOiBmYWxzZSxcbiAgLyoqXG4gICAqIFN0cmluZyBqcXVlcnkgc2VsZWN0b3IgKGZvciBleGFtcGxlICdib2R5Jykgb2YgZWxlbWVudCB0byB0YWtlIG9mZnNldCgpLnRvcCBmcm9tLCBpZiBlbXB0eSBzdHJpbmcgdGhlIGRyaWxsZG93biBtZW51IG9mZnNldCgpLnRvcCBpcyB0YWtlblxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICcnXG4gICAqL1xuICBzY3JvbGxUb3BFbGVtZW50OiAnJyxcbiAgLyoqXG4gICAqIFNjcm9sbFRvcCBvZmZzZXRcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBzY3JvbGxUb3BPZmZzZXQ6IDAsXG4gIC8qKlxuICAgKiBTY3JvbGwgYW5pbWF0aW9uIGR1cmF0aW9uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgNTAwXG4gICAqL1xuICBhbmltYXRpb25EdXJhdGlvbjogNTAwLFxuICAvKipcbiAgICogU2Nyb2xsIGFuaW1hdGlvbiBlYXNpbmcuIENhbiBiZSBgJ3N3aW5nJ2Agb3IgYCdsaW5lYXInYC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2FwaS5qcXVlcnkuY29tL2FuaW1hdGV8SlF1ZXJ5IGFuaW1hdGV9XG4gICAqIEBkZWZhdWx0ICdzd2luZydcbiAgICovXG4gIGFuaW1hdGlvbkVhc2luZzogJ3N3aW5nJ1xuICAvLyBob2xkT3BlbjogZmFsc2Vcbn07XG5cbi8vIFdpbmRvdyBleHBvcnRzXG5Gb3VuZGF0aW9uLnBsdWdpbihEcmlsbGRvd24sICdEcmlsbGRvd24nKTtcblxufShqUXVlcnkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4hZnVuY3Rpb24oJCkge1xuXG4vKipcbiAqIERyb3Bkb3duIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi5kcm9wZG93blxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5rZXlib2FyZFxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5ib3hcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwudHJpZ2dlcnNcbiAqL1xuXG5jbGFzcyBEcm9wZG93biB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGEgZHJvcGRvd24uXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge2pRdWVyeX0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gbWFrZSBpbnRvIGEgZHJvcGRvd24uXG4gICAqICAgICAgICBPYmplY3Qgc2hvdWxkIGJlIG9mIHRoZSBkcm9wZG93biBwYW5lbCwgcmF0aGVyIHR
5763oYW4gaXRzIGFuY2hvci5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPdmVycmlkZXMgdG8gdGhlIGRlZmF1bHQgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBEcm9wZG93bi5kZWZhdWx0cywgdGhpcy4kZWxlbWVudC5kYXRhKCksIG9wdGlvbnMpO1xuICAgIHRoaXMuX2luaXQoKTtcblxuICAgIEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcywgJ0Ryb3Bkb3duJyk7XG4gICAgRm91bmRhdGlvbi5LZXlib2FyZC5yZWdpc3RlcignRHJvcGRvd24nLCB7XG4gICAgICAnRU5URVInOiAnb3BlbicsXG4gICAgICAnU1BBQ0UnOiAnb3BlbicsXG4gICAgICAnRVNDQVBFJzogJ2Nsb3NlJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4gYnkgc2V0dGluZy9jaGVja2luZyBvcHRpb25zIGFuZCBhdHRyaWJ1dGVzLCBhZGRpbmcgaGVscGVyIHZhcmlhYmxlcywgYW5kIHNhdmluZyB0aGUgYW5jaG9yLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHZhciAkaWQgPSB0aGlzLiRlbGVtZW50LmF0dHIoJ2lkJyk7XG5cbiAgICB0aGlzLiRhbmNob3IgPSAkKGBbZGF0YS10b2dnbGU9XCIkeyRpZH1cIl1gKS5sZW5ndGggPyAkKGBbZGF0YS10b2dnbGU9XCIkeyRpZH1cIl1gKSA6ICQoYFtkYXRhLW9wZW49XCIkeyRpZH1cIl1gKTtcbiAgICB0aGlzLiRhbmNob3IuYXR0cih7XG4gICAgICAnYXJpYS1jb250cm9scyc6ICRpZCxcbiAgICAgICdkYXRhLWlzLWZvY3VzJzogZmFsc2UsXG4gICAgICAnZGF0YS15ZXRpLWJveCc6ICRpZCxcbiAgICAgICdhcmlhLWhhc3BvcHVwJzogdHJ1ZSxcbiAgICAgICdhcmlhLWV4cGFuZGVkJzogZmFsc2VcblxuICAgIH0pO1xuXG4gICAgaWYodGhpcy5vcHRpb25zLnBhcmVudENsYXNzKXtcbiAgICAgIHRoaXMuJHBhcmVudCA9IHRoaXMuJGVsZW1lbnQucGFyZW50cygnLicgKyB0aGlzLm9wdGlvbnMucGFyZW50Q2xhc3MpO1xuICAgIH1lbHNle1xuICAgICAgdGhpcy4kcGFyZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uQ2xhc3MgPSB0aGlzLmdldFBvc2l0aW9uQ2xhc3MoKTtcbiAgICB0aGlzLmNvdW50ZXIgPSA0O1xuICAgIHRoaXMudXNlZFBvc2l0aW9ucyA9IFtdO1xuICAgIHRoaXMuJGVsZW1lbnQuYXR0cih7XG4gICAgICAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsXG4gICAgICAnZGF0YS15ZXRpLWJveCc6ICRpZCxcbiAgICAgICdkYXRhLXJlc2l6ZSc6ICRpZCxcbiAgICAgICdhcmlhLWxhYmVsbGVkYnknOiB0aGlzLiRhbmNob3JbMF0uaWQgfHwgRm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LCAnZGQtYW5jaG9yJylcbiAgICB9KTtcbiAgICB0aGlzLl9ldmVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGN1cnJlbnQgb3JpZW50YXRpb24gb2YgZHJvcGRvd24gcGFuZS5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IHBvc2l0aW9uIC0gc3RyaW5nIHZhbHVlIG9mIGEgcG9zaXRpb24gY2xhc3MuXG4gICAqL1xuICBnZXRQb3NpdGlvbkNsYXNzKCkge1xuICAgIHZhciB2ZXJ0aWNhbFBvc2l0aW9uID0gdGhpcy4kZWxlbWVudFswXS5jbGFzc05hbWUubWF0Y2goLyh0b3B8bGVmdHxyaWdodHxib3R0b20pL2cpO1xuICAgICAgICB2ZXJ0aWNhbFBvc2l0aW9uID0gdmVydGljYWxQb3NpdGlvbiA/IHZlcnRpY2FsUG9zaXRpb25bMF0gOiAnJztcbiAgICB2YXIgaG9yaXpvbnRhbFBvc2l0aW9uID0gL2Zsb2F0LShcXFMrKS8uZXhlYyh0aGlzLiRhbmNob3JbMF0uY2xhc3NOYW1lKTtcbiAgICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uID0gaG9yaXpvbnRhbFBvc2l0aW9uID8gaG9yaXpvbnRhbFBvc2l0aW9uWzFdIDogJyc7XG4gICAgdmFyIHBvc2l0aW9uID0gaG9yaXpvbnRhbFBvc2l0aW9uID8gaG9yaXpvbnRhbFBvc2l0aW9uICsgJyAnICsgdmVydGljYWxQb3NpdGlvbiA6IHZlcnRpY2FsUG9zaXRpb247XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICAvKipcbiAgICogQWRqdXN0cyB0aGUgZHJvcGRvd24gcGFuZXMgb3JpZW50YXRpb24gYnkgYWRkaW5nL3JlbW92aW5nIHBvc2l0aW9uaW5nIGNsYXNzZXMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcG9zaXRpb24gLSBwb3NpdGlvbiBjbGFzcyB0byByZW1vdmUuXG4gICAqL1xuICBfcmVwb3NpdGlvbihwb3NpdGlvbikge1xuICAgIHRoaXMudXNlZFBvc2l0aW9ucy5wdXNoKHBvc2l0aW9uID8gcG9zaXRpb24gOiAnYm90dG9tJyk
57637XG4gICAgLy9kZWZhdWx0LCB0cnkgc3dpdGNoaW5nIHRvIG9wcG9zaXRlIHNpZGVcbiAgICBpZighcG9zaXRpb24gJiYgKHRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKCd0b3AnKSA8IDApKXtcbiAgICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoJ3RvcCcpO1xuICAgIH1lbHNlIGlmKHBvc2l0aW9uID09PSAndG9wJyAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ2JvdHRvbScpIDwgMCkpe1xuICAgICAgdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhwb3NpdGlvbik7XG4gICAgfWVsc2UgaWYocG9zaXRpb24gPT09ICdsZWZ0JyAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ3JpZ2h0JykgPCAwKSl7XG4gICAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHBvc2l0aW9uKVxuICAgICAgICAgIC5hZGRDbGFzcygncmlnaHQnKTtcbiAgICB9ZWxzZSBpZihwb3NpdGlvbiA9PT0gJ3JpZ2h0JyAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ2xlZnQnKSA8IDApKXtcbiAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MocG9zaXRpb24pXG4gICAgICAgICAgLmFkZENsYXNzKCdsZWZ0Jyk7XG4gICAgfVxuXG4gICAgLy9pZiBkZWZhdWx0IGNoYW5nZSBkaWRuJ3Qgd29yaywgdHJ5IGJvdHRvbSBvciBsZWZ0IGZpcnN0XG4gICAgZWxzZSBpZighcG9zaXRpb24gJiYgKHRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKCd0b3AnKSA+IC0xKSAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ2xlZnQnKSA8IDApKXtcbiAgICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoJ2xlZnQnKTtcbiAgICB9ZWxzZSBpZihwb3NpdGlvbiA9PT0gJ3RvcCcgJiYgKHRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKCdib3R0b20nKSA+IC0xKSAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ2xlZnQnKSA8IDApKXtcbiAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MocG9zaXRpb24pXG4gICAgICAgICAgLmFkZENsYXNzKCdsZWZ0Jyk7XG4gICAgfWVsc2UgaWYocG9zaXRpb24gPT09ICdsZWZ0JyAmJiAodGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoJ3JpZ2h0JykgPiAtMSkgJiYgKHRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKCdib3R0b20nKSA8IDApKXtcbiAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MocG9zaXRpb24pO1xuICAgIH1lbHNlIGlmKHBvc2l0aW9uID09PSAncmlnaHQnICYmICh0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZignbGVmdCcpID4gLTEpICYmICh0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZignYm90dG9tJykgPCAwKSl7XG4gICAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHBvc2l0aW9uKTtcbiAgICB9XG4gICAgLy9pZiBub3RoaW5nIGNsZWFyZWQsIHNldCB0byBib3R0b21cbiAgICBlbHNle1xuICAgICAgdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhwb3NpdGlvbik7XG4gICAgfVxuICAgIHRoaXMuY2xhc3NDaGFuZ2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNvdW50ZXItLTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBhbmQgb3JpZW50YXRpb24gb2YgdGhlIGRyb3Bkb3duIHBhbmUsIGNoZWNrcyBmb3IgY29sbGlzaW9ucy5cbiAgICogUmVjdXJzaXZlbHkgY2FsbHMgaXRzZWxmIGlmIGEgY29sbGlzaW9uIGlzIGRldGVjdGVkLCB3aXRoIGEgbmV3IHBvc2l0aW9uIGNsYXNzLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zZXRQb3NpdGlvbigpIHtcbiAgICBpZih0aGlzLiRhbmNob3IuYXR0cignYXJpYS1leHBhbmRlZCcpID09PSAnZmFsc2UnKXsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdmFyIHBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkNsYXNzKCksXG4gICAgICAgICRlbGVEaW1zID0gRm91bmRhdGlvbi5Cb3guR2V0RGltZW5zaW9ucyh0aGlzLiRlbGVtZW50KSxcbiAgICAgICAgJGFuY2hvckRpbXMgPSBGb3VuZGF0aW9uLkJveC5HZXREaW1lbnNpb25zKHRoaXMuJGFuY2hvciksXG4gICAgICAgIF90aGlzID0gdGhpcyxcbiAgICAgICAgZGlyZWN0aW9uID0gKHBvc2l0aW9uID09PSAnbGVmdCcgPyAnbGVmdCcgOiAoKHBvc2l0aW9uID09PSAncmlnaHQnKSA/ICdsZWZ0JyA6ICd0b3AnKSksXG4gICAgICAgIHBhcmFtID0gKGRpcmVjdGlvbiA9PT0gJ3RvcCcpID8gJ2hlaWdodCcgOiAnd2lkdGgnLFxuICAgICAgICBvZmZzZXQgPSAocGFyYW0gPT09ICdoZWlnaHQnKSA/IHRoaXMub3B0aW9ucy52T2Zmc2V0IDogdGhpcy5vcHRpb25zLmhPZmZzZXQ7XG5cbiAgICBpZigoJGVsZURpbXMud2lkdGggPj0gJGVsZURpbXMud2luZG93RGltcy53aWR0aCkgfHwgKCF0aGlzLmNvdW50ZXIgJiYgIUZvdW5kYXRpb24uQm94LkltTm90VG91Y2hpbmdZb3UodGhpcy4kZWxlbWVudCwgdGhpcy4kcGFyZW50KSkpe1xuICAgICAgdmFyIG5ld1dpZHRoID0gJGVsZURpbXMud2luZG93RGltcy53aWR0aCxcbiAgICAgICAgICBwYXJlbnRIT2Zmc2V0ID0gMDtcbiAgICAgIGlmKHRoaXMuJHBhcmVudCl7XG4gICAgICAgIHZhciAkcGFyZW50RGltcyA9IEZvdW5kYXRpb24uQm94LkdldERpbWVuc2lvbnModGhpcy4kcGFyZW50KSxcbiAgICAgICAgICAgIHBhcmVudEhPZmZzZXQgPSAkcGFyZW50RGltcy5vZmZzZXQubGVmdDtcbiAgICAgICAgaWYgKCRwYXJlbnREaW1zLndpZHRoIDwgbmV3V2lkdGgpe1xuICAgICAgICAgIG5ld1dpZHRoID0gJHBhcmVudERpbXMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy4kZWxlbWVudC5vZmZzZXQoRm91bmRhdGlvbi5Cb3guR2V0T2Zmc2V0cyh0aGlzLiRlbGVtZW50LCB0aGlzLiRhbmNob3IsICdjZW50ZXIgYm90dG9tJywgdGhpcy5vcHRpb25zLnZPZmZzZXQsIHRoaXMub3B0aW9ucy5oT2Zmc2V0ICsgcGFyZW50SE9mZnNldCwgdHJ1ZSkpLmNzcyh7XG4gICAgICAgICd3aWR0aCc6IG5ld1dpZHRoIC0gKHRoaXMub3B0aW9ucy5oT2Zmc2V0ICogMiksXG4gICAgICAgICdoZWlnaHQnOiAnYXV0bydcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jbGFzc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgI
5763HRoaXMuJGVsZW1lbnQub2Zmc2V0KEZvdW5kYXRpb24uQm94LkdldE9mZnNldHModGhpcy4kZWxlbWVudCwgdGhpcy4kYW5jaG9yLCBwb3NpdGlvbiwgdGhpcy5vcHRpb25zLnZPZmZzZXQsIHRoaXMub3B0aW9ucy5oT2Zmc2V0KSk7XG5cbiAgICB3aGlsZSghRm91bmRhdGlvbi5Cb3guSW1Ob3RUb3VjaGluZ1lvdSh0aGlzLiRlbGVtZW50LCB0aGlzLiRwYXJlbnQsIHRydWUpICYmIHRoaXMuY291bnRlcil7XG4gICAgICB0aGlzLl9yZXBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgIHRoaXMuX3NldFBvc2l0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBlbGVtZW50IHV0aWxpemluZyB0aGUgdHJpZ2dlcnMgdXRpbGl0eSBsaWJyYXJ5LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB0aGlzLiRlbGVtZW50Lm9uKHtcbiAgICAgICdvcGVuLnpmLnRyaWdnZXInOiB0aGlzLm9wZW4uYmluZCh0aGlzKSxcbiAgICAgICdjbG9zZS56Zi50cmlnZ2VyJzogdGhpcy5jbG9zZS5iaW5kKHRoaXMpLFxuICAgICAgJ3RvZ2dsZS56Zi50cmlnZ2VyJzogdGhpcy50b2dnbGUuYmluZCh0aGlzKSxcbiAgICAgICdyZXNpemVtZS56Zi50cmlnZ2VyJzogdGhpcy5fc2V0UG9zaXRpb24uYmluZCh0aGlzKVxuICAgIH0pO1xuXG4gICAgaWYodGhpcy5vcHRpb25zLmhvdmVyKXtcbiAgICAgIHRoaXMuJGFuY2hvci5vZmYoJ21vdXNlZW50ZXIuemYuZHJvcGRvd24gbW91c2VsZWF2ZS56Zi5kcm9wZG93bicpXG4gICAgICAub24oJ21vdXNlZW50ZXIuemYuZHJvcGRvd24nLCBmdW5jdGlvbigpe1xuICAgICAgICB2Y
5763XIgYm9keURhdGEgPSAkKCdib2R5JykuZGF0YSgpO1xuICAgICAgICBpZih0eXBlb2YoYm9keURhdGEud2hhdGlucHV0KSA9PT0gJ3VuZGVmaW5lZCcgfHwgYm9keURhdGEud2hhdGlucHV0ID09PSAnbW91c2UnKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLnRpbWVvdXQpO1xuICAgICAgICAgIF90aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBfdGhpcy5vcGVuKCk7XG4gICAgICAgICAgICBfdGhpcy4kYW5jaG9yLmRhdGEoJ2hvdmVyJywgdHJ1ZSk7XG4gICAgICAgICAgfSwgX3RoaXMub3B0aW9ucy5ob3ZlckRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgfSkub24oJ21vdXNlbGVhdmUuemYuZHJvcGRvd24nLCBmdW5jdGlvbigpe1xuICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMudGltZW91dCk7XG4gICAgICAgIF90aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICAgICAgICBfdGhpcy4kYW5jaG9yLmRhdGEoJ2hvdmVyJywgZmFsc2UpO1xuICAgICAgICB9LCBfdGhpcy5vcHRpb25zLmhvdmVyRGVsYXkpO1xuICAgICAgfSk7XG4gICAgICBpZih0aGlzLm9wdGlvbnMuaG92ZXJQYW5lKXtcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vZmYoJ21vdXNlZW50ZXIuemYuZHJvcGRvd24gbW91c2VsZWF2ZS56Zi5kcm9wZG93bicpXG4gICAgICAgICAgICAub24oJ21vdXNlZW50ZXIuemYuZHJvcGRvd24nLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMudGltZW91dCk7XG4gICAgICAgICAgICB9KS5vbignbW91c2VsZWF2ZS56Zi5kcm9wZG93bicsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpcy50aW1lb3V0KTtcbiAgICAgICAgICAgICAgX3RoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIF90aGlzLiRhbmNob3IuZGF0YSgnaG92ZXInLCBmYWxzZSk7XG4gICAgICAgICAgICAgIH0sIF90aGlzLm9wdGlvbnMuaG92ZXJEZWxheSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4kYW5jaG9yLmFkZCh0aGlzLiRlbGVtZW50KS5vbigna2V5ZG93bi56Zi5kcm9wZG93bicsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgdmFyICR0YXJnZXQgPSAkKHRoaXMpLFxuICAgICAgICB2aXNpYmxlRm9jdXNhYmxlRWxlbWVudHMgPSBGb3VuZGF0aW9uLktleWJvYXJkLmZpbmRGb2N1c2FibGUoX3RoaXMuJGVsZW1lbnQpO1xuXG4gICAgICBGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShlLCAnRHJvcGRvd24nLCB7XG4gICAgICAgIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmICgkdGFyZ2V0LmlzKF90aGlzLiRhbmNob3IpKSB7XG4gICAgICAgICAgICBfdGhpcy5vcGVuKCk7XG4gICAgICAgICAgICBfdGhpcy4kZWxlbWVudC5hdHRyKCd0YWJpbmRleCcsIC0xKS5mb2N1cygpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgICAgICAgX3RoaXMuJGFuY2hvci5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGJvZHkgdG8gY2xvc2UgYW55IGRyb3Bkb3ducyBvbiBhIGNsaWNrLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9hZGRCb2R5SGFuZGxlcigpIHtcbiAgICAgdmFyICRib2R5ID0gJChkb2N1bWVudC5ib2R5KS5ub3QodGhpcy4kZWxlbWVudCksXG4gICAgICAgICBfdGhpcyA9IHRoaXM7XG4gICAgICRib2R5Lm9mZignY2xpY2suemYuZHJvcGRvd24nKVxuICAgICAgICAgIC5vbignY2xpY2suemYuZHJvcGRvd24nLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgIGlmKF90aGlzLiRhbmNob3IuaXMoZS50YXJnZXQpIHx8IF90aGlzLiRhbmNob3IuZmluZChlLnRhcmdldCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKF90aGlzLiRlbGVtZW50LmZpbmQoZS50YXJnZXQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgJGJvZHkub2ZmKCdjbGljay56Zi5kcm9wZG93bicpO1xuICAgICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBkcm9wZG93biBwYW5lLCBhbmQgZmlyZXMgYSBidWJibGluZyBldmVudCB0byBjbG9zZSBvdGhlciBkcm9wZG93bnMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgRHJvcGRvd24jY2xvc2VtZVxuICAgKiBAZmlyZXMgRHJvcGRvd24jc2hvd1xuICAgKi9cbiAgb3BlbigpIHtcbiAgICAvLyB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHRvIGNsb3NlIG90aGVyIG9wZW4gZHJvcGRvd25zLCB0eXBpY2FsbHkgd2hlbiBkcm9wZG93biBpcyBvcGVuaW5nXG4gICAgICogQGV2ZW50IERyb3Bkb3duI2Nsb3NlbWVcbiAgICAgKi9cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2Nsb3NlbWUuemYuZHJvcGRvd24nLCB0aGlzLiRlbGVtZW50LmF0dHIoJ2lkJykpO1xuICAgIHRoaXMuJGFuY2hvci5hZGRDbGFzcygnaG92ZXInKVxuICAgICAgICAuYXR0cih7J2FyaWEtZXhwYW5kZWQnOiB0cnVlfSk7XG4gICAgLy8gdGhpcy4kZWxlbWVudC8qLnNob3coKSovO1xuICAgIHRoaXMuX3NldFBvc2l0aW9uKCk7XG4gICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcygnaXMtb3BlbicpXG4gICAgICAgIC5hdHRyKHsnYXJpYS1oaWRkZW4nOiBmYWxzZX0pO1xuXG4gICAgaWYodGhpcy5vcHRpb25zLmF1dG9Gb2N1cyl7XG4gICAgICB2Y
5763XIgJGZvY3VzYWJsZSA9IEZvdW5kYXRpb24uS2V5Ym9hcmQuZmluZEZvY3VzYWJsZSh0aGlzLiRlbGVtZW50KTtcbiAgICAgIGlmKCRmb2N1c2FibGUubGVuZ3RoKXtcbiAgICAgICAgJGZvY3VzYWJsZS5lcSgwKS5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2speyB0aGlzLl9hZGRCb2R5SGFuZGxlcigpOyB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRyYXBGb2N1cykge1xuICAgICAgRm91bmRhdGlvbi5LZXlib2FyZC50cmFwRm9jdXModGhpcy4kZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlyZXMgb25jZSB0aGUgZHJvcGRvd24gaXMgdmlzaWJsZS5cbiAgICAgKiBAZXZlbnQgRHJvcGRvd24jc2hvd1xuICAgICAqL1xuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignc2hvdy56Zi5kcm9wZG93bicsIFt0aGlzLiRlbGVtZW50XSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvcGVuIGRyb3Bkb3duIHBhbmUuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgRHJvcGRvd24jaGlkZVxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgaWYoIXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2lzLW9wZW4nKSl7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2lzLW9wZW4nKVxuICAgICAgICAuYXR0cih7J2FyaWEtaGlkZGVuJzogdHJ1ZX0pO1xuXG4gICAgdGhpcy4kYW5jaG9yLnJlbW92ZUNsYXNzKCdob3ZlcicpXG4gICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuXG4gICAgaWYodGhpcy5jbGFzc0NoYW5nZWQpe1xuICAgICAgdmFyIGN1clBvc2l0aW9uQ2xhc3MgPSB0aGlzLmdldFBvc2l0aW9uQ2xhc3MoKTtcbiAgICAgIGlmKGN1clBvc2l0aW9uQ2xhc3Mpe1xuICAgICAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKGN1clBvc2l0aW9uQ2xhc3MpO1xuICAgICAgfVxuICAgICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMucG9zaXRpb25DbGFzcylcbiAgICAgICAgICAvKi5oaWRlKCkqLy5jc3Moe2hlaWdodDogJycsIHdpZHRoOiAnJ30pO1xuICAgICAgdGhpcy5jbGFzc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY291bnRlciA9IDQ7XG4gICAgICB0aGlzLnVzZWRQb3NpdGlvbnMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmlyZXMgb25jZSB0aGUgZHJvcGRvd24gaXMgbm8gbG9uZ2VyIHZpc2libGUuXG4gICAgICogQGV2ZW50IERyb3Bkb3duI2hpZGVcbiAgICAgKi9cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2hpZGUuemYuZHJvcGRvd24nLCBbdGhpcy4kZWxlbWVudF0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50cmFwRm9jdXMpIHtcbiAgICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQucmVsZWFzZUZvY3VzKHRoaXMuJGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBkcm9wZG93biBwYW5lJ3MgdmlzaWJpbGl0eS5cbiAgICogQGZ1bmN0aW9uXG4gICAqL1xuICB0b2dnbGUoKSB7XG4gICAgaWYodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnaXMtb3BlbicpKXtcbiAgICAgIGlmKHRoaXMuJGFuY2hvci5kYXRhKCdob3ZlcicpKSByZXR1cm47XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIGRyb3Bkb3duLlxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4kZWxlbWVudC5vZmYoJy56Zi50cmlnZ2VyJykuaGlkZSgpO1xuICAgIHRoaXMuJGFuY2hvci5vZmYoJy56Zi5kcm9wZG93bicpO1xuXG4gICAgRm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpO1xuICB9XG59XG5cbkRyb3Bkb3duLmRlZmF1bHRzID0ge1xuICAvKipcbiAgICogQ2xhc3MgdGhhdCBkZXNpZ25hdGVzIGJvdW5kaW5nIGNvbnRhaW5lciBvZiBEcm9wZG93biAoZGVmYXVsdDogd2luZG93KVxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHs/c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqL1xuICBwYXJlbnRDbGFzczogbnVsbCxcbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIHRvIGRlbGF5IG9wZW5pbmcgYSBzdWJtZW51IG9uIGhvdmVyIGV2ZW50LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDI1MFxuICAgKi9cbiAgaG92ZXJEZWxheTogMjUwLFxuICAvKipcbiAgICogQWxsb3cgc3VibWVudXMgdG8gb3BlbiBvbiBob3ZlciBldmVudHNcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGhvdmVyOiBmYWxzZSxcbiAgLyoqXG4gICAqIERvbid0IGNsb3NlIGRyb3Bkb3duIHdoZW4gaG92ZXJpbmcgb3ZlciBkcm9wZG93biBwYW5lXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBob3ZlclBhbmU6IGZhbHNlLFxuICAvKipcbiAgICogTnVtYmVyIG9mIHBpeGVscyBiZXR3ZWVuIHRoZSBkcm9wZG93biBwYW5lIGFuZCB0aGUgdHJpZ2dlcmluZyBlbGVtZW50IG9uIG9wZW4uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgdk9mZnNldDogMSxcbiAgLyoqXG4gICAqIE51bWJlciBvZiBwaXhlbHMgYmV0d2VlbiB0aGUgZHJvcGRvd24gcGFuZSBhbmQgdGhlIHRyaWdnZXJpbmcgZWxlbWVudCBvbiBvcGVuLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIGhPZmZzZXQ6IDEsXG4gIC8qKlxuICAgKiBDbGFzcyBhcHBsaWVkIHRvIGFkanVzdCBvcGVuIHBvc2l0aW9uLiBKUyB3aWxsIHRlc3QgYW5kIGZpbGwgdGhpcyBpbi5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAnJ1xuICAgKi9cbiAgcG9zaXRpb25DbGFzczogJycsXG4gIC8qKlxuICAgKiBBbGxvdyB0aGUgcGx1Z2luIHRvIHRyYXAgZm9jdXMgdG8gdGhlIGRyb3Bkb3duI
5763HBhbmUgaWYgb3BlbmVkIHdpdGgga2V5Ym9hcmQgY29tbWFuZHMuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB0cmFwRm9jdXM6IGZhbHNlLFxuICAvKipcbiAgICogQWxsb3cgdGhlIHBsdWdpbiB0byBzZXQgZm9jdXMgdG8gdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50IHdpdGhpbiB0aGUgcGFuZSwgcmVnYXJkbGVzcyBvZiBtZXRob2Qgb2Ygb3BlbmluZy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGF1dG9Gb2N1czogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBjbGljayBvbiB0aGUgYm9keSB0byBjbG9zZSB0aGUgZHJvcGRvd24uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjbG9zZU9uQ2xpY2s6IGZhbHNlXG59XG5cbi8vIFdpbmRvdyBleHBvcnRzXG5Gb3VuZGF0aW9uLnBsdWdpbihEcm9wZG93biwgJ0Ryb3Bkb3duJyk7XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuLyoqXG4gKiBEcm9wZG93bk1lbnUgbW9kdWxlLlxuICogQG1vZHVsZSBmb3VuZGF0aW9uLmRyb3Bkb3duLW1lbnVcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwua2V5Ym9hcmRcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwuYm94XG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLm5lc3RcbiAqL1xuXG5jbGFzcyBEcm9wZG93bk1lbnUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBEcm9wZG93bk1lbnUuXG4gICAqIEBjbGFzc1xuICAgKiBAZmlyZXMgRHJvcGRvd25NZW51I2luaXRcbiAgICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIG1ha2UgaW50byBhIGRyb3Bkb3duIG1lbnUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3ZlcnJpZGVzIHRvIHRoZSBkZWZhdWx0IHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgRHJvcGRvd25NZW51LmRlZmF1bHRzLCB0aGlzLiRlbGVtZW50LmRhdGEoKSwgb3B0aW9ucyk7XG5cbiAgICBGb3VuZGF0aW9uLk5lc3QuRmVhdGhlcih0aGlzLiRlbGVtZW50LCAnZHJvcGRvd24nKTtcbiAgICB0aGlzLl9pbml0KCk7XG5cbiAgICBGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsICdEcm9wZG93bk1lbnUnKTtcbiAgICBGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKCdEcm9wZG93bk1lbnUnLCB7XG4gICAgICAnRU5URVInOiAnb3BlbicsXG4gICAgICAnU1BBQ0UnOiAnb3BlbicsXG4gICAgICAnQVJST1dfUklHSFQnOiAnbmV4dCcsXG4gICAgICAnQVJST1dfVVAnOiAndXAnLFxuICAgICAgJ0FSUk9XX0RPV04nOiAnZG93bicsXG4gICAgICAnQVJST1dfTEVGVCc6ICdwcmV2aW91cycsXG4gICAgICAnRVNDQVBFJzogJ2Nsb3NlJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4sIGFuZCBjYWxscyBfcHJlcGFyZU1lbnVcbiAgICogQHByaXZhdGVcbiAgICogQGZ1bmN0aW9uXG4gICAqL1xuICBfaW5pdCgpIHtcbiAgICB2YXIgc3VicyA9IHRoaXMuJGVsZW1lbnQuZmluZCgnbGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKTtcbiAgICB0aGlzLiRlbGVtZW50LmNoaWxkcmVuKCcuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKS5jaGlsZHJlbignLmlzLWRyb3Bkb3duLXN1Ym1lbnUnKS5hZGRDbGFzcygnZmlyc3Qtc3ViJyk7XG5cbiAgICB0aGlzLiRtZW51SXRlbXMgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ1tyb2xlPVwibWVudWl0ZW1cIl0nKTtcbiAgICB0aGlzLiR0YWJzID0gdGhpcy4kZWxlbWVudC5jaGlsZHJlbignW3JvbGU9XCJtZW51aXRlbVwiXScpO1xuICAgIHRoaXMuJHRhYnMuZmluZCgndWwuaXMtZHJvcGRvd24tc3VibWVudScpLmFkZENsYXNzKHRoaXMub3B0aW9ucy52ZXJ0aWNhbENsYXNzKTtcblxuICAgIGlmICh0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKHRoaXMub3B0aW9ucy5yaWdodENsYXNzKSB8fCB0aGlzLm9wdGlvbnMuYWxpZ25tZW50ID09PSAncmlnaHQnIHx8IEZvdW5kYXRpb24ucnRsKCkgfHwgdGhpcy4kZWxlbWVudC5wYXJlbnRzKCcudG9wLWJhci1yaWdodCcpLmlzKCcqJykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5hbGlnbm1lbnQgPSAncmlnaHQnO1xuICAgICAgc3Vicy5hZGRDbGFzcygnb3BlbnMtbGVmdCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWJzLmFkZENsYXNzKCdvcGVucy1yaWdodCcpO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9ldmVudHMoKTtcbiAgfTtcblxuICBfaXNWZXJ0aWNhbCgpIHtcbiAgICByZXR1cm4gdGhpcy4kdGFicy5jc3MoJ2Rpc3BsYXknKSA9PT0gJ2Jsb2NrJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byBlbGVtZW50cyB3aXRoaW4gdGhlIG1lbnVcbiAgICogQHByaXZhdGVcbiAgICogQGZ1bmN0aW9uXG4gICAqL1xuICBfZXZlbnRzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGhhc1RvdWNoID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8ICh0eXBlb2Ygd2luZG93Lm9udG91Y2hzdGFydCAhPT0gJ3VuZGVmaW5lZCcpLFxuICAgICAgICBwYXJDbGFzcyA9ICdpcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudCc7XG5cbiAgICAvLyB1c2VkIGZvciBvbkNsaWNrIGFuZCBpbiB0aGUga2V5Ym9hcmQgaGFuZGxlcnNcbiAgICB2YXIgaGFuZGxlQ2xpY2tGbiA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciAkZWxlbSA9ICQoZS50YXJnZXQpLnBhcmVudHNVbnRpbCgndWwnLCBgLiR7cGFyQ2xhc3N9YCksXG4gICAgICAgICAgaGFzU3ViID0gJGVsZW0uaGFzQ2xhc3MocGFyQ2xhc3MpLFxuICAgICAgICAgIGhhc0NsaWNrZWQgPSAkZWxlbS5hdHRyKCdkYXRhLWlzLWNsaWNrJykgPT09ICd0cnVlJyxcbiAgICAgICAgICAkc3ViID0gJGVsZW0uY2hpbGRyZW4oJy5pcy1kcm9wZG93bi1zdWJtZW51Jyk7XG5cbiAgICAgIGlmIChoYXNTdWIpIHtcbiAgICAgICAgaWYgKGhhc0NsaWNrZWQpIHtcbiAgICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrIHx8ICghX3RoaXMub3B0aW9ucy5jbGlja09wZW4gJiYgIWhhc1RvdWNoKSB8fCAoX3RoaXMub3B0aW9ucy5mb3JjZUZvbGxvdyAmJiBoYXNUb3VjaCkpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgX3RoaXMuX2hpZGUoJGVsZW0pO1xuICAgICAgICAgI
5763H1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBfdGhpcy5fc2hvdygkc3ViKTtcbiAgICAgICAgICAkZWxlbS5hZGQoJGVsZW0ucGFyZW50c1VudGlsKF90aGlzLiRlbGVtZW50LCBgLiR7cGFyQ2xhc3N9YCkpLmF0dHIoJ2RhdGEtaXMtY2xpY2snLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNsaWNrT3BlbiB8fCBoYXNUb3VjaCkge1xuICAgICAgdGhpcy4kbWVudUl0ZW1zLm9uKCdjbGljay56Zi5kcm9wZG93bm1lbnUgdG91Y2hzdGFydC56Zi5kcm9wZG93bm1lbnUnLCBoYW5kbGVDbGlja0ZuKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgTGVhZiBlbGVtZW50IENsaWNrc1xuICAgIGlmKF90aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrSW5zaWRlKXtcbiAgICAgIHRoaXMuJG1lbnVJdGVtcy5vbignY2xpY2suemYuZHJvcGRvd25tZW51JywgZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgJGVsZW0gPSAkKHRoaXMpLFxuICAgICAgICAgICAgaGFzU3ViID0gJGVsZW0uaGFzQ2xhc3MocGFyQ2xhc3MpO1xuICAgICAgICBpZighaGFzU3ViKXtcbiAgICAgICAgICBfdGhpcy5faGlkZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlSG92ZXIpIHtcbiAgICAgIHRoaXMuJG1lbnVJdGVtcy5vbignbW91c2VlbnRlci56Zi5kcm9wZG93bm1lbnUnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciAkZWxlbSA9ICQodGhpcyksXG4gICAgICAgICAgICBoYXNTdWIgPSAkZWxlbS5oYXNDbGFzcyhwYXJDbGFzcyk7XG5cbiAgICAgICAgaWYgKGhhc1N1Yikge1xuICAgICAgICAgIGNsZWFyVGltZW91dCgkZWxlbS5kYXRhKCdfZGVsYXknKSk7XG4gICAgICAgICAgJGVsZW0uZGF0YSgnX2RlbGF5Jywgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIF90aGlzLl9zaG93KCRlbGVtLmNoaWxkcmVuKCcuaXMtZHJvcGRvd24tc3VibWVudScpKTtcbiAgICAgICAgICB9LCBfdGhpcy5vcHRpb25zLmhvdmVyRGVsYXkpKTtcbiAgICAgICAgfVxuICAgICAgfSkub24oJ21vdXNlbGVhdmUuemYuZHJvcGRvd25tZW51JywgZnVuY3Rpb24oZSkge1xuICAgICAgICB2Y
5763XIgJGVsZW0gPSAkKHRoaXMpLFxuICAgICAgICAgICAgaGFzU3ViID0gJGVsZW0uaGFzQ2xhc3MocGFyQ2xhc3MpO1xuICAgICAgICBpZiAoaGFzU3ViICYmIF90aGlzLm9wdGlvbnMuYXV0b2Nsb3NlKSB7XG4gICAgICAgICAgaWYgKCRlbGVtLmF0dHIoJ2RhdGEtaXMtY2xpY2snKSA9PT0gJ3RydWUnICYmIF90aGlzLm9wdGlvbnMuY2xpY2tPcGVuKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgY2xlYXJUaW1lb3V0KCRlbGVtLmRhdGEoJ19kZWxheScpKTtcbiAgICAgICAgICAkZWxlbS5kYXRhKCdfZGVsYXknLCBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgX3RoaXMuX2hpZGUoJGVsZW0pO1xuICAgICAgICAgIH0sIF90aGlzLm9wdGlvbnMuY2xvc2luZ1RpbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuJG1lbnVJdGVtcy5vbigna2V5ZG93bi56Zi5kcm9wZG93bm1lbnUnLCBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgJGVsZW1lbnQgPSAkKGUudGFyZ2V0KS5wYXJlbnRzVW50aWwoJ3VsJywgJ1tyb2xlPVwibWVudWl0ZW1cIl0nKSxcbiAgICAgICAgICBpc1RhYiA9IF90aGlzLiR0YWJzLmluZGV4KCRlbGVtZW50KSA+IC0xLFxuICAgICAgICAgICRlbGVtZW50cyA9IGlzVGFiID8gX3RoaXMuJHRhYnMgOiAkZWxlbWVudC5zaWJsaW5ncygnbGknKS5hZGQoJGVsZW1lbnQpLFxuICAgICAgICAgICRwcmV2RWxlbWVudCxcbiAgICAgICAgICAkbmV4dEVsZW1lbnQ7XG5cbiAgICAgICRlbGVtZW50cy5lYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgaWYgKCQodGhpcykuaXMoJGVsZW1lbnQpKSB7XG4gICAgICAgICAgJHByZXZFbGVtZW50ID0gJGVsZW1lbnRzLmVxKGktMSk7XG4gICAgICAgICAgJG5leHRFbGVtZW50ID0gJGVsZW1lbnRzLmVxKGkrMSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIG5leHRTaWJsaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghJGVsZW1lbnQuaXMoJzpsYXN0LWNoaWxkJykpIHtcbiAgICAgICAgICAkbmV4dEVsZW1lbnQuY2hpbGRyZW4oJ2E6Zmlyc3QnKS5mb2N1cygpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSwgcHJldlNpYmxpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgJHByZXZFbGVtZW50LmNoaWxkcmVuKCdhOmZpcnN0JykuZm9jdXMoKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSwgb3BlblN1YiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2Y
5763XIgJHN1YiA9ICRlbGVtZW50LmNoaWxkcmVuKCd1bC5pcy1kcm9wZG93bi1zdWJtZW51Jyk7XG4gICAgICAgIGlmICgkc3ViLmxlbmd0aCkge1xuICAgICAgICAgIF90aGlzLl9zaG93KCRzdWIpO1xuICAgICAgICAgICRlbGVtZW50LmZpbmQoJ2xpID4gYTpmaXJzdCcpLmZvY3VzKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgeyByZXR1cm47IH1cbiAgICAgIH0sIGNsb3NlU3ViID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vaWYgKCRlbGVtZW50LmlzKCc6Zmlyc3QtY2hpbGQnKSkge1xuICAgICAgICB2YXIgY2xvc2UgPSAkZWxlbWVudC5wYXJlbnQoJ3VsJykucGFyZW50KCdsaScpO1xuICAgICAgICBjbG9zZS5jaGlsZHJlbignYTpmaXJzdCcpLmZvY3VzKCk7XG4gICAgICAgIF90aGlzLl9oaWRlKGNsb3NlKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvL31cbiAgICAgIH07XG4gICAgICB2YXIgZnVuY3Rpb25zID0ge1xuICAgICAgICBvcGVuOiBvcGVuU3ViLFxuICAgICAgICBjbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgX3RoaXMuX2hpZGUoX3RoaXMuJGVsZW1lbnQpO1xuICAgICAgICAgIF90aGlzLiRtZW51SXRlbXMuZmluZCgnYTpmaXJzdCcpLmZvY3VzKCk7IC8vIGZvY3VzIHRvIGZpcnN0IGVsZW1lbnRcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChpc1RhYikge1xuICAgICAgICBpZiAoX3RoaXMuX2lzVmVydGljYWwoKSkgeyAvLyB2ZXJ0aWNhbCBtZW51XG4gICAgICAgICAgaWYgKEZvdW5kYXRpb24ucnRsKCkpIHsgLy8gcmlnaHQgYWxpZ25lZFxuICAgICAgICAgICAgJC5leHRlbmQoZnVuY3Rpb25zLCB7XG4gICAgICAgICAgICAgIGRvd246IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICB1cDogcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgIG5leHQ6IGNsb3NlU3ViLFxuICAgICAgICAgICAgICBwcmV2aW91czogb3BlblN1YlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gbGVmdCBhbGlnbmVkXG4gICAgICAgICAgICAkLmV4dGVuZChmdW5jdGlvbnMsIHtcbiAgICAgICAgICAgICAgZG93bjogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgIHVwOiBwcmV2U2libGluZyxcbiAgICAgICAgICAgICAgbmV4dDogb3BlblN1YixcbiAgICAgICAgICAgICAgcHJldmlvdXM6IGNsb3NlU3ViXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7IC8vIGhvcml6b250YWwgbWVudVxuICAgICAgICAgIGlmIChGb3VuZGF0aW9uLnJ0bCgpKSB7IC8vIHJpZ2h0IGFsaWduZWRcbiAgICAgICAgICAgICQuZXh0ZW5kKGZ1bmN0aW9ucywge1xuICAgICAgICAgICAgICBuZXh0OiBwcmV2U2libGluZyxcbiAgICAgICAgICAgICAgcHJldmlvdXM6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICBkb3duOiBvcGVuU3ViLFxuICAgICAgICAgICAgICB1cDogY2xvc2VTdWJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIGxlZnQgYWxpZ25lZFxuICAgICAgICAgICAgJC5leHRlbmQoZnVuY3Rpb25zLCB7XG4gICAgICAgICAgICAgIG5leHQ6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICBwcmV2aW91czogcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgIGRvd246IG9wZW5TdWIsXG4gICAgICAgICAgICAgIHVwOiBjbG9zZVN1YlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAvLyBub3QgdGFicyAtPiBvbmUgc3ViXG4gICAgICAgIGlmIChGb3VuZGF0aW9uLnJ0bCgpKSB7IC8vIHJpZ2h0IGFsaWduZWRcbiAgICAgICAgICAkLmV4dGVuZChmdW5jdGlvbnMsIHtcbiAgICAgICAgICAgIG5leHQ6IGNsb3NlU3ViLFxuICAgICAgICAgICAgcHJldmlvdXM6IG9wZW5TdWIsXG4gICAgICAgICAgICBkb3duOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgIHVwOiBwcmV2U2libGluZ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgeyAvLyBsZWZ0IGFsaWduZWRcbiAgICAgICAgICAkLmV4dGVuZChmdW5jdGlvbnMsIHtcbiAgICAgICAgICAgIG5leHQ6IG9wZW5TdWIsXG4gICAgICAgICAgICBwcmV2aW91czogY2xvc2VTdWIsXG4gICAgICAgICAgICBkb3duOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgIHVwOiBwcmV2U2libGluZ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShlLCAnRHJvcGRvd25NZW51JywgZnVuY3Rpb25zKTtcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgYm9keSB0byBjbG9zZSBhbnkgZHJvcGRvd25zIG9uIGEgY2xpY2suXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2FkZEJvZHlIYW5kbGVyKCkge1xuICAgIHZhciAkYm9keSA9ICQoZG9jdW1lbnQuYm9keSksXG4gICAgICAgIF90aGlzID0gdGhpcztcbiAgICAkYm9keS5vZmYoJ21vdXNldXAuemYuZHJvcGRvd25tZW51IHRvdWNoZW5kLnpmLmRyb3Bkb3dubWVudScpXG4gICAgICAgICAub24oJ21vdXNldXAuemYuZHJvcGRvd25tZW51IHRvdWNoZW5kLnpmLmRyb3Bkb3dubWVudScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgdmFyICRsaW5rID0gX3RoaXMuJGVsZW1lbnQuZmluZChlLnRhcmdldCk7XG4gICAgICAgICAgIGlmICgkbGluay5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgX3RoaXMuX2hpZGUoKTtcbiAgICAgICAgICAgJGJvZHkub2ZmKCdtb3VzZXVwLnpmLmRyb3Bkb3dubWVudSB0b3VjaGVuZC56Zi5kcm9wZG93bm1lbnUnKTtcbiAgICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZHJvcGRvd24gcGFuZSwgYW5kIGNoZWNrcyBmb3IgY29sbGlzaW9ucyBmaXJzdC5cbiAgICogQHBhcmFtIHtqUXVlcnl9ICRzdWIgLSB1bCBlbGVtZW50IHRoYXQgaXMgYSBzdWJtZW51IHRvIHNob3dcbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqIEBmaXJlcyBEcm9wZG93bk1lbnUjc2hvd1xuICAgKi9cbiAgX3Nob3coJHN1Yikge1xuICAgIHZhciBpZHggPSB0aGlzLiR0YWJzLmluZGV4KHRoaXMuJHRhYnMuZmlsdGVyKGZ1bmN0aW9uKGksIGVsKSB7XG4gICAgICByZXR1cm4gJChlbCkuZmluZCgkc3ViKS5sZW5ndGggPiAwO1xuICAgIH0pKTtcbiAgICB2YXIgJHNpYnMgPSAkc3ViLnBhcmVudCgnbGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKS5zaWJsaW5ncygnbGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKTtcbiAgICB0aGlzLl9oaWRlKCRzaWJzLCBpZHgpO1xuICAgICRzdWIuY3NzKCd2aXN
5763pYmlsaXR5JywgJ2hpZGRlbicpLmFkZENsYXNzKCdqcy1kcm9wZG93bi1hY3RpdmUnKVxuICAgICAgICAucGFyZW50KCdsaS5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudCcpLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICB2YXIgY2xlYXIgPSBGb3VuZGF0aW9uLkJveC5JbU5vdFRvdWNoaW5nWW91KCRzdWIsIG51bGwsIHRydWUpO1xuICAgIGlmICghY2xlYXIpIHtcbiAgICAgIHZhciBvbGRDbGFzcyA9IHRoaXMub3B0aW9ucy5hbGlnbm1lbnQgPT09ICdsZWZ0JyA/ICctcmlnaHQnIDogJy1sZWZ0JyxcbiAgICAgICAgICAkcGFyZW50TGkgPSAkc3ViLnBhcmVudCgnLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50Jyk7XG4gICAgICAkcGFyZW50TGkucmVtb3ZlQ2xhc3MoYG9wZW5zJHtvbGRDbGFzc31gKS5hZGRDbGFzcyhgb3BlbnMtJHt0aGlzLm9wdGlvbnMuYWxpZ25tZW50fWApO1xuICAgICAgY2xlYXIgPSBGb3VuZGF0aW9uLkJveC5JbU5vdFRvdWNoaW5nWW91KCRzdWIsIG51bGwsIHRydWUpO1xuICAgICAgaWYgKCFjbGVhcikge1xuICAgICAgICAkcGFyZW50TGkucmVtb3ZlQ2xhc3MoYG9wZW5zLSR7dGhpcy5vcHRpb25zLmFsaWdubWVudH1gKS5hZGRDbGFzcygnb3BlbnMtaW5uZXInKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgICRzdWIuY3NzKCd2aXNpYmlsaXR5JywgJycpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrKSB7IHRoaXMuX2FkZEJvZHlIYW5kbGVyKCk7IH1cbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHRoZSBuZXcgZHJvcGRvd24gcGFuZSBpcyB2aXNpYmxlLlxuICAgICAqIEBldmVudCBEcm9wZG93bk1lbnUjc2hvd1xuICAgICAqL1xuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignc2hvdy56Zi5kcm9wZG93bm1lbnUnLCBbJHN1Yl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIGEgc2luZ2xlLCBjdXJyZW50bHkgb3BlbiBkcm9wZG93biBwYW5lLCBpZiBwYXNzZWQgYSBwYXJhbWV0ZXIsIG90aGVyd2lzZSwgaGlkZXMgZXZlcnl0aGluZy5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkZWxlbSAtIGVsZW1lbnQgd2l0aCBhIHN1Ym1lbnUgdG8gaGlkZVxuICAgKiBAcGFyYW0ge051bWJlcn0gaWR4IC0gaW5kZXggb2YgdGhlICR0YWJzIGNvbGxlY3Rpb24gdG8gaGlkZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2hpZGUoJGVsZW0sIGlkeCkge1xuICAgIHZhciAkdG9DbG9zZTtcbiAgICBpZiAoJGVsZW0gJiYgJGVsZW0ubGVuZ3RoKSB7XG4gICAgICAkdG9DbG9zZSA9ICRlbGVtO1xuICAgIH0gZWxzZSBpZiAoaWR4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICR0b0Nsb3NlID0gdGhpcy4kdGFicy5ub3QoZnVuY3Rpb24oaSwgZWwpIHtcbiAgICAgICAgcmV0dXJuIGkgPT09IGlkeDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICR0b0Nsb3NlID0gdGhpcy4kZWxlbWVudDtcbiAgICB9XG4gICAgdmFyIHNvbWV0aGluZ1RvQ2xvc2UgPSAkdG9DbG9zZS5oYXNDbGFzcygnaXMtYWN0aXZlJykgfHwgJHRvQ2xvc2UuZmluZCgnLmlzLWFjdGl2ZScpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc29tZXRoaW5nVG9DbG9zZSkge1xuICAgICAgJHRvQ2xvc2UuZmluZCgnbGkuaXMtYWN0aXZlJykuYWRkKCR0b0Nsb3NlKS5hdHRyKHtcbiAgICAgICAgJ2RhdGEtaXMtY2xpY2snOiBmYWxzZVxuICAgICAgfSkucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICAkdG9DbG9zZS5maW5kKCd1bC5qcy1kcm9wZG93bi1hY3RpdmUnKS5yZW1vdmVDbGFzcygnanMtZHJvcGRvd24tYWN0aXZlJyk7XG5cbiAgICAgIGlmICh0aGlzLmNoYW5nZWQgfHwgJHRvQ2xvc2UuZmluZCgnb3BlbnMtaW5uZXInKS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG9sZENsYXNzID0gdGhpcy5vcHRpb25zLmFsaWdubWVudCA9PT0gJ2xlZnQnID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgICAgICAgJHRvQ2xvc2UuZmluZCgnbGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKS5hZGQoJHRvQ2xvc2UpXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKGBvcGVucy1pbm5lciBvcGVucy0ke3RoaXMub3B0aW9ucy5hbGlnbm1lbnR9YClcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoYG9wZW5zLSR7b2xkQ2xhc3N9YCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBGaXJlcyB3aGVuIHRoZSBvcGVuIG1lbnVzIGFyZSBjbG9zZWQuXG4gICAgICAgKiBAZXZlbnQgRHJvcGRvd25NZW51I2hpZGVcbiAgICAgICAqL1xuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdoaWRlLnpmLmRyb3Bkb3dubWVudScsIFskdG9DbG9zZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgcGx1Z2luLlxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4kbWVudUl0ZW1zLm9mZignLnpmLmRyb3Bkb3dubWVudScpLnJlbW92ZUF0dHIoJ2RhdGEtaXMtY2xpY2snKVxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2lzLXJpZ2h0LWFycm93IGlzLWxlZnQtYXJyb3cgaXMtZG93bi1hcnJvdyBvcGVucy1yaWdodCBvcGVucy1sZWZ0IG9wZW5zLWlubmVyJyk7XG4gICAgJChkb2N1bWVudC5ib2R5KS5vZmYoJy56Zi5kcm9wZG93bm1lbnUnKTtcbiAgICBGb3VuZGF0aW9uLk5lc3QuQnVybih0aGlzLiRlbGVtZW50LCAnZHJvcGRvd24nKTtcbiAgICBGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZhdWx0IHNldHRpbmdzIGZvciBwbHVnaW5cbiAqL1xuRHJvcGRvd25NZW51LmRlZmF1bHRzID0ge1xuICAvKipcbiAgICogRGlzYWxsb3dzIGhvdmVyIGV2ZW50cyBmcm9tIG9wZW5pbmcgc3VibWVudXNcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRpc2FibGVIb3ZlcjogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvdyBhIHN1Ym1lbnUgdG8gYXV0b21hdGljYWxseSBjbG9zZSBvbiBhIG1vdXNlbGVhdmUgZXZlbnQsIGlmIG5vdCBjbGlja2VkIG9wZW4uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGF1dG9jbG9zZTogdHJ1ZSxcbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIH
5763RvIGRlbGF5IG9wZW5pbmcgYSBzdWJtZW51IG9uIGhvdmVyIGV2ZW50LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDUwXG4gICAqL1xuICBob3ZlckRlbGF5OiA1MCxcbiAgLyoqXG4gICAqIEFsbG93IGEgc3VibWVudSB0byBvcGVuL3JlbWFpbiBvcGVuIG9uIHBhcmVudCBjbGljayBldmVudC4gQWxsb3dzIGN1cnNvciB0byBtb3ZlIGF3YXkgZnJvbSBtZW51LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgY2xpY2tPcGVuOiBmYWxzZSxcbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIHRvIGRlbGF5IGNsb3NpbmcgYSBzdWJtZW51IG9uIGEgbW91c2VsZWF2ZSBldmVudC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCA1MDBcbiAgICovXG5cbiAgY2xvc2luZ1RpbWU6IDUwMCxcbiAgLyoqXG4gICAqIFBvc2l0aW9uIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHdoYXQgZGlyZWN0aW9uIHRoZSBzdWJtZW51cyBzaG91bGQgb3Blbi4gSGFuZGxlZCBieSBKUy4gQ2FuIGJlIGAnbGVmdCdgIG9yIGAncmlnaHQnYC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAnbGVmdCdcbiAgICovXG4gIGFsaWdubWVudDogJ2xlZnQnLFxuICAvKipcbiAgICogQWxsb3cgY2xpY2tzIG9uIHRoZSBib2R5IHRvIGNsb3NlIGFueSBvcGVuIHN1Ym1lbnVzLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBjbG9zZU9uQ2xpY2s6IHRydWUsXG4gIC8qKlxuICAgKiBBbGxvdyBjbGlja3Mgb24gbGVhZiBhbmNob3IgbGlua3MgdG8gY2xvc2UgYW55IG9wZW4gc3VibWVudXMuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGNsb3NlT25DbGlja0luc2lkZTogdHJ1ZSxcbiAgLyoqXG4gICAqIENsYXNzIGFwcGxpZWQgdG8gdmVydGljYWwgb3JpZW50ZWQgbWVudXMsIEZvdW5kYXRpb24gZGVmYXVsdCBpcyBgdmVydGljYWxgLiBVcGRhdGUgdGhpcyBpZiB1c2luZyB5b3VyIG93biBjbGFzcy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAndmVydGljYWwnXG4gICAqL1xuICB2ZXJ0aWNhbENsYXNzOiAndmVydGljYWwnLFxuICAvKipcbiAgICogQ2xhc3MgYXBwbGllZCB0byByaWdodC1zaWRlIG9yaWVudGVkIG1lbnVzLCBGb3VuZGF0aW9uIGRlZmF1bHQgaXMgYGFsaWduLXJpZ2h0YC4gVXBkYXRlIHRoaXMgaWYgdXNpbmcgeW91ciBvd24gY2xhc3MuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ2FsaWduLXJpZ2h0J1xuICAgKi9cbiAgcmlnaHRDbGFzczogJ2FsaWduLXJpZ2h0JyxcbiAgLyoqXG4gICAqIEJvb2xlYW4gdG8gZm9yY2Ugb3ZlcmlkZSB0aGUgY2xpY2tpbmcgb2YgbGlua3MgdG8gcGVyZm9ybSBkZWZhdWx0IGFjdGlvbiwgb24gc2Vjb25kIHRvdWNoIGV2ZW50IGZvciBtb2JpbGUuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGZvcmNlRm9sbG93OiB0cnVlXG59O1xuXG4vLyBXaW5kb3cgZXhwb3J0c1xuRm91bmRhdGlvbi5wbHVnaW4oRHJvcGRvd25NZW51LCAnRHJvcGRvd25NZW51Jyk7XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuLyoqXG4gKiBSZXNwb25zaXZlTWVudSBtb2R1bGUuXG4gKiBAbW9kdWxlIGZvdW5kYXRpb24ucmVzcG9uc2l2ZU1lbnVcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwudHJpZ2dlcnNcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwubWVkaWFRdWVyeVxuICovXG5cbmNsYXNzIFJlc3BvbnNpdmVNZW51IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYSByZXNwb25zaXZlIG1lbnUuXG4gICAqIEBjbGFzc1xuICAgKiBAZmlyZXMgUmVzcG9uc2l2ZU1lbnUjaW5pdFxuICAgKiBAcGFyYW0ge2pRdWVyeX0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gbWFrZSBpbnRvIGEgZHJvcGRvd24gbWVudS5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPdmVycmlkZXMgdG8gdGhlIGRlZmF1bHQgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgIHRoaXMucnVsZXMgPSB0aGlzLiRlbGVtZW50LmRhdGEoJ3Jlc3BvbnNpdmUtbWVudScpO1xuICAgIHRoaXMuY3VycmVudE1xID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRQbHVnaW4gPSBudWxsO1xuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIHRoaXMuX2V2ZW50cygpO1xuXG4gICAgRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLCAnUmVzcG9uc2l2ZU1lbnUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgTWVudSBieSBwYXJzaW5nIHRoZSBjbGFzc2VzIGZyb20gdGhlICdkYXRhLVJlc3BvbnNpdmVNZW51JyBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2luaXQoKSB7XG4gICAgLy8gVGhlIGZpcnN0IHRpbWUgYW4gSW50ZXJjaGFuZ2UgcGx1Z2luIGlzIGluaXRpYWxpemVkLCB0aGlzLnJ1bGVzIGlzIGNvbnZlcnRlZCBmcm9tIGEgc3RyaW5nIG9mIFwiY2xhc3Nlc1wiIHRvIGFuIG9iamVjdCBvZiBydWxlc1xuICAgIGlmICh0eXBlb2YgdGhpcy5ydWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBydWxlc1RyZWUgPSB7fTtcblxuICAgICAgLy8gUGFyc2UgcnVsZXMgZnJvbSBcImNsYXNzZXNcIiBwdWxsZWQgZnJvbSBkYXRhIGF0dHJpYnV0ZVxuICAgICAgbGV0IHJ1bGVzID0gdGhpcy5ydWxlcy5zcGxpdCgnICcpO1xuXG4gICAgICAvLyBJdGVyYXRlIHRocm91Z2ggZXZlcnkgcnVsZSBmb3VuZFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzW2ldLnNwbGl0KCctJyk7XG4gICAgICAgIGxldCBydWxlU2l6ZSA9IHJ1bGUubGVuZ3RoID4gMSA/IHJ1bGVbMF0gOiAnc21hbGwnO1xuICAgICAgICBsZXQgcnVsZVBsdWdpbiA9IHJ1bGUubGVuZ3RoID4gMSA/IHJ1bGVbMV0gOiBydWxlWzBdO1xuXG4gICAgICAgIGlmIChNZW51UGx1Z2luc1tydWxlUGx1Z2luXSAhPT0gbnVsbCkge1xuICAgICAgICAgI
5763HJ1bGVzVHJlZVtydWxlU2l6ZV0gPSBNZW51UGx1Z2luc1tydWxlUGx1Z2luXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJ1bGVzID0gcnVsZXNUcmVlO1xuICAgIH1cblxuICAgIGlmICghJC5pc0VtcHR5T2JqZWN0KHRoaXMucnVsZXMpKSB7XG4gICAgICB0aGlzLl9jaGVja01lZGlhUXVlcmllcygpO1xuICAgIH1cbiAgICAvLyBBZGQgZGF0YS1tdXRhdGUgc2luY2UgY2hpbGRyZW4gbWF5IG5lZWQgaXQuXG4gICAgdGhpcy4kZWxlbWVudC5hdHRyKCdkYXRhLW11dGF0ZScsICh0aGlzLiRlbGVtZW50LmF0dHIoJ2RhdGEtbXV0YXRlJykgfHwgRm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LCAncmVzcG9uc2l2ZS1tZW51JykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBldmVudHMgZm9yIHRoZSBNZW51LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICQod2luZG93KS5vbignY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5JywgZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5fY2hlY2tNZWRpYVF1ZXJpZXMoKTtcbiAgICB9KTtcbiAgICAvLyAkKHdpbmRvdykub24oJ3Jlc2l6ZS56Zi5SZXNwb25zaXZlTWVudScsIGZ1bmN0aW9uKCkge1xuICAgIC8vICAgX3RoaXMuX2NoZWNrTWVkaWFRdWVyaWVzKCk7XG4gICAgLy8gfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBjdXJyZW50IHNjcmVlbiB3aWR0aCBhZ2FpbnN0IGF2YWlsYWJsZSBtZWRpYSBxdWVyaWVzLiBJZiB0aGUgbWVkaWEgcXVlcnkgaGFzIGNoYW5nZWQsIGFuZCB0aGUgcGx1Z2luIG5lZWRlZCBoYXMgY2hhbmdlZCwgdGhlIHBsdWdpbnMgd2lsbCBzd2FwIG91dC5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tNZWRpYVF1ZXJpZXMoKSB7XG4gICAgdmFyIG1hdGNoZWRNcSwgX3RoaXMgPSB0aGlzO1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHJ1bGUgYW5kIGZpbmQgdGhlIGxhc3QgbWF0Y2hpbmcgcnVsZVxuICAgICQuZWFjaCh0aGlzLnJ1bGVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgIGlmIChGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdChrZXkpKSB7XG4gICAgICAgIG1hdGNoZWRNcSA9IGtleTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE5vIG1hdGNoPyBObyBkaWNlXG4gICAgaWYgKCFtYXRjaGVkTXEpIHJldHVybjtcblxuICAgIC8vIFBsdWdpbiBhbHJlYWR5IGluaXRpYWxpemVkPyBXZSBnb29kXG4gICAgaWYgKHRoaXMuY3VycmVudFBsdWdpbiBpbnN0YW5jZW9mIHRoaXMucnVsZXNbbWF0Y2hlZE1xXS5wbHVnaW4pIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBleGlzdGluZyBwbHVnaW4tc3BlY2lmaWMgQ1NTIGNsYXNzZXNcbiAgICAkLmVhY2goTWVudVBsdWdpbnMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgIF90aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHZhbHVlLmNzc0NsYXNzKTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCB0aGUgQ1NTIGNsYXNzIGZvciB0aGUgbmV3IHBsdWdpblxuICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5ydWxlc1ttYXRjaGVkTXFdLmNzc0NsYXNzKTtcblxuICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbmV3IHBsdWdpblxuICAgIGlmICh0aGlzLmN1cnJlbnRQbHVnaW4pIHRoaXMuY3VycmVudFBsdWdpbi5kZXN0cm95KCk7XG4gICAgdGhpcy5jdXJyZW50UGx1Z2luID0gbmV3IHRoaXMucnVsZXNbbWF0Y2hlZE1xXS5wbHVnaW4odGhpcy4kZWxlbWVudCwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBwbHVnaW4gb24gdGhpcyBlbGVtZW50LCBhcyB3ZWxsIGFzIHRoZSB3aW5kb3cgcmVzaXplIGhhbmRsZXIgdGhhdCBzd2l0Y2hlcyB0aGUgcGx1Z2lucyBvdXQuXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmN1cnJlbnRQbHVnaW4uZGVzdHJveSgpO1xuICAgICQod2luZG93KS5vZmYoJy56Zi5SZXNwb25zaXZlTWVudScpO1xuICAgIEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKTtcbiAgfVxufVxuXG5SZXNwb25zaXZlTWVudS5kZWZhdWx0cyA9IHt9O1xuXG4vLyBUaGUgcGx1Z2luIG1hdGNoZXMgdGhlIHBsdWdpbiBjbGFzc2VzIHdpdGggdGhlc2UgcGx1Z2luIGluc3RhbmNlcy5cbnZhciBNZW51UGx1Z2lucyA9IHtcbiAgZHJvcGRvd246IHtcbiAgICBjc3NDbGFzczogJ2Ryb3Bkb3duJyxcbiAgICBwbHVnaW46IEZvdW5kYXRpb24uX3BsdWdpbnNbJ2Ryb3Bkb3duLW1lbnUnXSB8fCBudWxsXG4gIH0sXG4gZHJpbGxkb3duOiB7XG4gICAgY3NzQ2xhc3M6ICdkcmlsbGRvd24nLFxuICAgIHBsdWdpbjogRm91bmRhdGlvbi5fcGx1Z2luc1snZHJpbGxkb3duJ10gfHwgbnVsbFxuICB9LFxuICBhY2NvcmRpb246IHtcbiAgICBjc3NDbGFzczogJ2FjY29yZGlvbi1tZW51JyxcbiAgICBwbHVnaW46IEZvdW5kYXRpb24uX3BsdWdpbnNbJ2FjY29yZGlvbi1tZW51J10gfHwgbnVsbFxuICB9XG59O1xuXG4vLyBXaW5kb3cgZXhwb3J0c1xuRm91bmRhdGlvbi5wbHVnaW4oUmVzcG9uc2l2ZU1lbnUsICdSZXNwb25zaXZlTWVudScpO1xuXG59KGpRdWVyeSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbiFmdW5jdGlvbigkKSB7XG5cbi8qKlxuICogUmVzcG9uc2l2ZVRvZ2dsZSBtb2R1bGUuXG4gKiBAbW9kdWxlIGZvdW5kYXRpb24ucmVzcG9uc2l2ZVRvZ2dsZVxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5tZWRpYVF1ZXJ5XG4gKi9cblxuY2xhc3MgUmVzcG9uc2l2ZVRvZ2dsZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFRhYiBCYXIuXG4gICAqIEBjbGFzc1xuICAgKiBAZmlyZXMgUmVzcG9uc2l2ZVRvZ2dsZSNpbml0XG4gICAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IC0galF1ZXJ5IG9iamVjdCB0byBhdHRhY2ggdGFiIGJhciBmdW5jdGlvbmFsaXR5IHRvLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE92ZXJyaWRlcyB0byB0aGUgZGVmYXVsdCBwbHVnaW4gc2V0dGluZ3MuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIFJl
5763c3BvbnNpdmVUb2dnbGUuZGVmYXVsdHMsIHRoaXMuJGVsZW1lbnQuZGF0YSgpLCBvcHRpb25zKTtcblxuICAgIHRoaXMuX2luaXQoKTtcbiAgICB0aGlzLl9ldmVudHMoKTtcblxuICAgIEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcywgJ1Jlc3BvbnNpdmVUb2dnbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgdGFiIGJhciBieSBmaW5kaW5nIHRoZSB0YXJnZXQgZWxlbWVudCwgdG9nZ2xpbmcgZWxlbWVudCwgYW5kIHJ1bm5pbmcgdXBkYXRlKCkuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2luaXQoKSB7XG4gICAgdmFyIHRhcmdldElEID0gdGhpcy4kZWxlbWVudC5kYXRhKCdyZXNwb25zaXZlLXRvZ2dsZScpO1xuICAgIGlmICghdGFyZ2V0SUQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1lvdXIgdGFiIGJhciBuZWVkcyBhbiBJRCBvZiBhIE1lbnUgYXMgdGhlIHZhbHVlIG9mIGRhdGEtdGFiLWJhci4nKTtcbiAgICB9XG5cbiAgICB0aGlzLiR0YXJnZXRNZW51ID0gJChgIyR7dGFyZ2V0SUR9YCk7XG4gICAgdGhpcy4kdG9nZ2xlciA9IHRoaXMuJGVsZW1lbnQuZmluZCgnW2RhdGEtdG9nZ2xlXScpLmZpbHRlcihmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0YXJnZXQgPSAkKHRoaXMpLmRhdGEoJ3RvZ2dsZScpO1xuICAgICAgcmV0dXJuICh0YXJnZXQgPT09IHRhcmdldElEIHx8IHRhcmdldCA9PT0gXCJcIik7XG4gICAgfSk7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgdGhpcy4kdGFyZ2V0TWVudS5kYXRhKCkpO1xuXG4gICAgLy8gSWYgdGhleSB3ZXJlIHNldCwgcGFyc2UgdGhlIGFuaW1hdGlvbiBjbGFzc2VzXG4gICAgaWYodGhpcy5vcHRpb25zLmFuaW1hdGUpIHtcbiAgICAgIGxldCBpbnB1dCA9IHRoaXMub3B0aW9ucy5hbmltYXRlLnNwbGl0KCcgJyk7XG5cbiAgICAgIHRoaXMuYW5pbWF0aW9uSW4gPSBpbnB1dFswXTtcbiAgICAgIHRoaXMuYW5pbWF0aW9uT3V0ID0gaW5wdXRbMV0gfHwgbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG5lY2Vzc2FyeSBldmVudCBoYW5kbGVycyBmb3IgdGhlIHRhYiBiYXIgdG8gd29yay5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZXZlbnRzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLl91cGRhdGVNcUhhbmRsZXIgPSB0aGlzLl91cGRhdGUuYmluZCh0aGlzKTtcblxuICAgICQod2luZG93KS5vbignY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5JywgdGhpcy5fdXBkYXRlTXFIYW5kbGVyKTtcblxuICAgIHRoaXMuJHRvZ2dsZXIub24oJ2NsaWNrLnpmLnJlc3BvbnNpdmVUb2dnbGUnLCB0aGlzLnRvZ2dsZU1lbnUuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBjdXJyZW50IG1lZGlhIHF1ZXJ5IHRvIGRldGVybWluZSBpZiB0aGUgdGFiIGJhciBzaG91bGQgYmUgdmlzaWJsZSBvciBoaWRkZW4uXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZSgpIHtcbiAgICAvLyBNb2JpbGVcbiAgICBpZiAoIUZvdW5kYXRpb24uTWVkaWFRdWVyeS5hdExlYXN0KHRoaXMub3B0aW9ucy5oaWRlRm9yKSkge1xuICAgICAgdGhpcy4kZWxlbWVudC5zaG93KCk7XG4gICAgICB0aGlzLiR0YXJnZXRNZW51LmhpZGUoKTtcbiAgICB9XG5cbiAgICAvLyBEZXNrdG9wXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLiRlbGVtZW50LmhpZGUoKTtcbiAgICAgIHRoaXMuJHRhcmdldE1lbnUuc2hvdygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBlbGVtZW50IGF0dGFjaGVkIHRvIHRoZSB0YWIgYmFyLiBUaGUgdG9nZ2xlIG9ubHkgaGFwcGVucyBpZiB0aGUgc2NyZWVuIGlzIHNtYWxsIGVub3VnaCB0byBhbGxvdyBpdC5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBmaXJlcyBSZXNwb25zaXZlVG9nZ2xlI3RvZ2dsZWRcbiAgICovXG4gIHRvZ2dsZU1lbnUoKSB7XG4gICAgaWYgKCFGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCh0aGlzLm9wdGlvbnMuaGlkZUZvcikpIHtcbiAgICAgIC8qKlxuICAgICAgICogRmlyZXMgd2hlbiB0aGUgZWxlbWVudCBhdHRhY2hlZCB0byB0aGUgdGFiIGJhciB0b2dnbGVzLlxuICAgICAgICogQGV2ZW50IFJlc3BvbnNpdmVUb2dnbGUjdG9nZ2xlZFxuICAgICAgICovXG4gICAgICBpZih0aGlzLm9wdGlvbnMuYW5pbWF0ZSkge1xuICAgICAgICBpZiAodGhpcy4kdGFyZ2V0TWVudS5pcygnOmhpZGRlbicpKSB7XG4gICAgICAgICAgRm91bmRhdGlvbi5Nb3Rpb24uYW5pbWF0ZUluKHRoaXMuJHRhcmdldE1lbnUsIHRoaXMuYW5pbWF0aW9uSW4sICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcigndG9nZ2xlZC56Zi5yZXNwb25zaXZlVG9nZ2xlJyk7XG4gICAgICAgICAgICB0aGlzLiR0YXJnZXRNZW51LmZpbmQoJ1tkYXRhLW11dGF0ZV0nKS50cmlnZ2VySGFuZGxlcignbXV0YXRlbWUuemYudHJpZ2dlcicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIEZvdW5kYXRpb24uTW90aW9uLmFuaW1hdGVPdXQodGhpcy4kdGFyZ2V0TWVudSwgdGhpcy5hbmltYXRpb25PdXQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcigndG9nZ2xlZC56Zi5yZXNwb25zaXZlVG9nZ2xlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLiR0YXJnZXRNZW51LnRvZ2dsZSgwKTtcbiAgICAgICAgdGhpcy4kdGFyZ2V0TWVudS5maW5kKCdbZGF0YS1tdXRhdGVdJykudHJpZ2dlcignbXV0YXRlbWUuemYudHJpZ2dlcicpO1xuICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ3RvZ2dsZWQuemYucmVzcG9uc2l2ZVRvZ2dsZScpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuJGVsZW1lbnQub2ZmKCcuemYucmVzcG9uc2l2ZVRvZ2dsZScpO1xuICAgIHRoaXMuJHRvZ2dsZXIub2ZmKCcuemYucmVzcG9uc2l2ZVRvZ2dsZScpO1xuXG4gICAgJCh3aW5kb3cpLm9mZignY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5JywgdGhpcy5fdXBkYXRlTXFIYW5kbGVyKTtcblxuICAgIEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKTtcbiAgfVxufVxuXG5SZXNwb25zaXZlVG9nZ2xlLmRlZmF1bHRzID0ge1xuICAvKipcbiAgICogVGhlIGJyZWFrcG9pbnQgYWZ0ZXIgd2hpY2ggdGhlIG1lbnUgaXMgYWx3YXlzIHNob3duLCBhbmQgdGhlI
5763HRhYiBiYXIgaXMgaGlkZGVuLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdtZWRpdW0nXG4gICAqL1xuICBoaWRlRm9yOiAnbWVkaXVtJyxcblxuICAvKipcbiAgICogVG8gZGVjaWRlIGlmIHRoZSB0b2dnbGUgc2hvdWxkIGJlIGFuaW1hdGVkIG9yIG5vdC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGFuaW1hdGU6IGZhbHNlXG59O1xuXG4vLyBXaW5kb3cgZXhwb3J0c1xuRm91bmRhdGlvbi5wbHVnaW4oUmVzcG9uc2l2ZVRvZ2dsZSwgJ1Jlc3BvbnNpdmVUb2dnbGUnKTtcblxufShqUXVlcnkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4hZnVuY3Rpb24oJCkge1xuXG4vKipcbiAqIFJldmVhbCBtb2R1bGUuXG4gKiBAbW9kdWxlIGZvdW5kYXRpb24ucmV2ZWFsXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLmtleWJvYXJkXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLmJveFxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC50cmlnZ2Vyc1xuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5tZWRpYVF1ZXJ5XG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLm1vdGlvbiBpZiB1c2luZyBhbmltYXRpb25zXG4gKi9cblxuY2xhc3MgUmV2ZWFsIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmV2ZWFsLlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIHVzZSBmb3IgdGhlIG1vZGFsLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIFJldmVhbC5kZWZhdWx0cywgdGhpcy4kZWxlbWVudC5kYXRhKCksIG9wdGlvbnMpO1xuICAgIHRoaXMuX2luaXQoKTtcblxuICAgIEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcywgJ1JldmVhbCcpO1xuICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQucmVnaXN0ZXIoJ1JldmVhbCcsIHtcbiAgICAgICdFTlRFUic6ICdvcGVuJyxcbiAgICAgICdTUEFDRSc6ICdvcGVuJyxcbiAgICAgICdFU0NBUEUnOiAnY2xvc2UnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBtb2RhbCBieSBhZGRpbmcgdGhlIG92ZXJsYXkgYW5kIGNsb3NlIGJ1dHRvbnMsIChpZiBzZWxlY3RlZCkuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaW5pdCgpIHtcbiAgICB0aGlzLmlkID0gdGhpcy4kZWxlbWVudC5hdHRyKCdpZCcpO1xuICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNhY2hlZCA9IHttcTogRm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmN1cnJlbnR9O1xuICAgIHRoaXMuaXNNb2JpbGUgPSBtb2JpbGVTbmlmZigpO1xuXG4gICAgdGhpcy4kYW5jaG9yID0gJ
5763ChgW2RhdGEtb3Blbj1cIiR7dGhpcy5pZH1cIl1gKS5sZW5ndGggPyAkKGBbZGF0YS1vcGVuPVwiJHt0aGlzLmlkfVwiXWApIDogJChgW2RhdGEtdG9nZ2xlPVwiJHt0aGlzLmlkfVwiXWApO1xuICAgIHRoaXMuJGFuY2hvci5hdHRyKHtcbiAgICAgICdhcmlhLWNvbnRyb2xzJzogdGhpcy5pZCxcbiAgICAgICdhcmlhLWhhc3BvcHVwJzogdHJ1ZSxcbiAgICAgICd0YWJpbmRleCc6IDBcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZnVsbFNjcmVlbiB8fCB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmdWxsJykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5mdWxsU2NyZWVuID0gdHJ1ZTtcbiAgICAgIHRoaXMub3B0aW9ucy5vdmVybGF5ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcmxheSAmJiAhdGhpcy4kb3ZlcmxheSkge1xuICAgICAgdGhpcy4kb3ZlcmxheSA9IHRoaXMuX21ha2VPdmVybGF5KHRoaXMuaWQpO1xuICAgIH1cblxuICAgIHRoaXMuJGVsZW1lbnQuYXR0cih7XG4gICAgICAgICdyb2xlJzogJ2RpYWxvZycsXG4gICAgICAgICdhcmlhLWhpZGRlbic6IHRydWUsXG4gICAgICAgICdkYXRhLXlldGktYm94JzogdGhpcy5pZCxcbiAgICAgICAgJ2RhdGEtcmVzaXplJzogdGhpcy5pZFxuICAgIH0pO1xuXG4gICAgaWYodGhpcy4kb3ZlcmxheSkge1xuICAgICAgdGhpcy4kZWxlbWVudC5kZXRhY2goKS5hcHBlbmRUbyh0aGlzLiRvdmVybGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4kZWxlbWVudC5kZXRhY2goKS5hcHBlbmRUbygkKHRoaXMub3B0aW9ucy5hcHBlbmRUbykpO1xuICAgICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcygnd2l0aG91dC1vdmVybGF5Jyk7XG4gICAgfVxuICAgIHRoaXMuX2V2ZW50cygpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVlcExpbmsgJiYgd2luZG93LmxvY2F0aW9uLmhhc2ggPT09ICggYCMke3RoaXMuaWR9YCkpIHtcbiAgICAgICQod2luZG93KS5vbmUoJ2xvYWQuemYucmV2ZWFsJywgdGhpcy5vcGVuLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIG92ZXJsYXkgZGl2IHRvIGRpc3BsYXkgYmVoaW5kIHRoZSBtb2RhbC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tYWtlT3ZlcmxheSgpIHtcbiAgICByZXR1cm4gJCgnPGRpdj48L2Rpdj4nKVxuICAgICAgLmFkZENsYXNzKCdyZXZlYWwtb3ZlcmxheScpXG4gICAgICAuYXBwZW5kVG8odGhpcy5vcHRpb25zLmFwcGVuZFRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHBvc2l0aW9uIG9mIG1vZGFsXG4gICAqIFRPRE86ICBGaWd1cmUgb3V0IGlmIHdlIGFjdHVhbGx5IG5lZWQgdG8gY2FjaGUgdGhlc2UgdmFsdWVzIG9yIGlmIGl0IGRvZXNuJ3QgbWF0dGVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgdmFyIHdpZHRoID0gdGhpcy4kZWxlbWVudC5vdXRlcldpZHRoKCk7XG4gICAgdmFyIG91dGVyV2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICB2YXIgaGVpZ2h0ID0gdGhpcy4kZWxlbWVudC5vdXRlckhlaWdodCgpO1xuICAgIHZhciBvdXRlckhlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcbiAgICB2YXIgbGVmdCwgdG9wO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuaE9mZnNldCA9PT0gJ2F1dG8nKSB7XG4gICAgICBsZWZ0ID0gcGFyc2VJbnQoKG91dGVyV2lkdGggLSB3aWR0aCkgLyAyLCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlZnQgPSBwYXJzZUludCh0aGlzLm9wdGlvbnMuaE9mZnNldCwgMTApO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnZPZmZzZXQgPT09ICdhdXRvJykge1xuICAgICAgaWYgKGhlaWdodCA+IG91dGVySGVpZ2h0KSB7XG4gICAgICAgIHRvcCA9IHBhcnNlSW50KE1hdGgubWluKDEwMCwgb3V0ZXJIZWlnaHQgLyAxMCksIDEwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcCA9IHBhcnNlSW50KChvdXRlckhlaWdodCAtIGhlaWdodCkgLyA0LCAxMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvcCA9IHBhcnNlSW50KHRoaXMub3B0aW9ucy52T2Zmc2V0LCAxMCk7XG4gICAgfVxuICAgIHRoaXMuJGVsZW1lbnQuY3NzKHt0b3A6IHRvcCArICdweCd9KTtcbiAgICAvLyBvbmx5IHdvcnJ5IGFib3V0IGxlZnQgaWYgd2UgZG9uJ3QgaGF2ZSBhbiBvdmVybGF5IG9yIHdlIGhhdmVhICBob3Jpem9udGFsIG9mZnNldCxcbiAgICAvLyBvdGhlcndpc2Ugd2UncmUgcGVyZmVjdGx5IGluIHRoZSBtaWRkbGVcbiAgICBpZighdGhpcy4kb3ZlcmxheSB8fCAodGhpcy5vcHRpb25zLmhPZmZzZXQgIT09ICdhdXRvJykpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQuY3NzKHtsZWZ0OiBsZWZ0ICsgJ3B4J30pO1xuICAgICAgdGhpcy4kZWxlbWVudC5jc3Moe21hcmdpbjogJzBweCd9KTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgbW9kYWwuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZXZlbnRzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLiRlbGVtZW50Lm9uKHtcbiAgICAgICdvcGVuLnpmLnRyaWdnZXInOiB0aGlzLm9wZW4uYmluZCh0aGlzKSxcbiAgICAgICdjbG9zZS56Zi50cmlnZ2VyJzogKGV2ZW50LCAkZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoKGV2ZW50LnRhcmdldCA9PT0gX3RoaXMuJGVsZW1lbnRbMF0pIHx8XG4gICAgICAgICAgICAoJChldmVudC50YXJnZXQpLnBhcmVudHMoJ1tkYXRhLWNsb3NhYmxlXScpWzBdID09PSAkZWxlbWVudCkpIHsgLy8gb25seSBjbG9zZSByZXZlYWwgd2hlbiBpdCdzIGV4cGxpY2l0bHkgY2FsbGVkXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UuYXBwbHkodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAndG9nZ2xlLnpmLnRyaWdnZXInOiB0aGlzLnRvZ2dsZS5iaW5kKHRoaXMpLFxuICAgICAgJ3Jlc2l6ZW1lLnpmLnRyaWdnZXInOiBmdW5jdGlvbigpIHtcbiAgICAgICAgX3RoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy4kYW5jaG9yLmxlbmd0aCkge1xuICAgICAgdGhpcy4kYW5jaG9yLm9uKCdrZXlkb3duLnpmLnJldmVhbCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDEzIHx8IGUud2hpY2ggPT09IDMyKSB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBlLnByZXZlbn
5763REZWZhdWx0KCk7XG4gICAgICAgICAgX3RoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlT25DbGljayAmJiB0aGlzLm9wdGlvbnMub3ZlcmxheSkge1xuICAgICAgdGhpcy4kb3ZlcmxheS5vZmYoJy56Zi5yZXZlYWwnKS5vbignY2xpY2suemYucmV2ZWFsJywgZnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAoZS50YXJnZXQgPT09IF90aGlzLiRlbGVtZW50WzBdIHx8XG4gICAgICAgICAgJC5jb250YWlucyhfdGhpcy4kZWxlbWVudFswXSwgZS50YXJnZXQpIHx8XG4gICAgICAgICAgICAhJC5jb250YWlucyhkb2N1bWVudCwgZS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVlcExpbmspIHtcbiAgICAgICQod2luZG93KS5vbihgcG9wc3RhdGUuemYucmV2ZWFsOiR7dGhpcy5pZH1gLCB0aGlzLl9oYW5kbGVTdGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBtb2RhbCBtZXRob2RzIG9uIGJhY2svZm9yd2FyZCBidXR0b24gY2xpY2tzIG9yIGFueSBvdGhlciBldmVudCB0aGF0IHRyaWdnZXJzIHBvcHN0YXRlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2hhbmRsZVN0YXRlKGUpIHtcbiAgICBpZih3aW5kb3cubG9jYXRpb24uaGFzaCA9PT0gKCAnIycgKyB0aGlzLmlkKSAmJiAhdGhpcy5pc0FjdGl2ZSl7IHRoaXMub3BlbigpOyB9XG4gICAgZWxzZXsgdGhpcy5jbG9zZSgpOyB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgbW9kYWwgY29udHJvbGxlZCBieSBgdGhpcy4kYW5jaG9yYCwgYW5kIGNsb3NlcyBhbGwgb3RoZXJzIGJ5IGRlZmF1bHQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgUmV2ZWFsI2Nsb3NlbWVcbiAgICogQGZpcmVzIFJldmVhbCNvcGVuXG4gICAqL1xuICBvcGVuKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVlcExpbmspIHtcbiAgICAgIHZhciBoYXNoID0gYCMke3RoaXMuaWR9YDtcblxuICAgICAgaWYgKHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSkge1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgaGFzaCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICAvLyBNYWtlIGVsZW1lbnRzIGludmlzaWJsZSwgYnV0IHJlbW92ZSBkaXNwbGF5OiBub25lIHNvIHdlIGNhbiBnZXQgc2l6ZSBhbmQgcG9zaXRpb25pbmdcbiAgICB0aGlzLiRlbGVtZW50XG4gICAgICAgIC5jc3MoeyAndmlzaWJpbGl0eSc6ICdoaWRkZW4nIH0pXG4gICAgICAgIC5zaG93KClcbiAgICAgICAgLnNjcm9sbFRvcCgwKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLm92ZXJsYXkpIHtcbiAgICAgIHRoaXMuJG92ZXJsYXkuY3NzKHsndmlzaWJpbGl0eSc6ICdoaWRkZW4nfSkuc2hvdygpO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG5cbiAgICB0aGlzLiRlbGVtZW50XG4gICAgICAuaGlkZSgpXG4gICAgICAuY3NzKHsgJ3Zpc2liaWxpdHknOiAnJyB9KTtcblxuICAgIGlmKHRoaXMuJG92ZXJsYXkpIHtcbiAgICAgIHRoaXMuJG92ZXJsYXkuY3NzKHsndmlzaWJpbGl0eSc6ICcnfSkuaGlkZSgpO1xuICAgICAgaWYodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZmFzdCcpKSB7XG4gICAgICAgIHRoaXMuJG92ZXJsYXkuYWRkQ2xhc3MoJ2Zhc3QnKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnc2xvdycpKSB7XG4gICAgICAgIHRoaXMuJG92ZXJsYXkuYWRkQ2xhc3MoJ3Nsb3cnKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGlmICghdGhpcy5vcHRpb25zLm11bHRpcGxlT3BlbmVkKSB7XG4gICAgICAvKipcbiAgICAgICAqIEZpcmVzIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgbW9kYWwgb3BlbnMuXG4gICAgICAgKiBDbG9zZXMgYW55IG90aGVyIG1vZGFscyB0aGF0IGFyZSBjdXJyZW50bHkgb3BlblxuICAgICAgICogQGV2ZW50IFJldmVhbCNjbG9zZW1lXG4gICAgICAgKi9cbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignY2xvc2VtZS56Zi5yZXZlYWwnLCB0aGlzLmlkKTtcbiAgICB9XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gYWRkUmV2ZWFsT3BlbkNsYXNzZXMoKSB7XG4gICAgICBpZiAoX3RoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgaWYoIV90aGlzLm9yaWdpbmFsU2Nyb2xsUG9zKSB7XG4gICAgICAgICAgX3RoaXMub3JpZ2luYWxTY3JvbGxQb3MgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgJCgnaHRtbCwgYm9keScpLmFkZENsYXNzKCdpcy1yZXZlYWwtb3BlbicpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnaXMtcmV2ZWFsLW9wZW4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTW90aW9uIFVJIG1ldGhvZCBvZiByZXZlYWxcbiAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbkluKSB7XG4gICAgICBmdW5jdGlvbiBhZnRlckFuaW1hdGlvbigpe1xuICAgICAgICBfdGhpcy4kZWxlbWVudFxuICAgICAgICAgIC5hdHRyKHtcbiAgICAgICAgICAgICdhcmlhLWh
5763pZGRlbic6IGZhbHNlLFxuICAgICAgICAgICAgJ3RhYmluZGV4JzogLTFcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb2N1cygpO1xuICAgICAgICBhZGRSZXZlYWxPcGVuQ2xhc3NlcygpO1xuICAgICAgICBGb3VuZGF0aW9uLktleWJvYXJkLnRyYXBGb2N1cyhfdGhpcy4kZWxlbWVudCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm92ZXJsYXkpIHtcbiAgICAgICAgRm91bmRhdGlvbi5Nb3Rpb24uYW5pbWF0ZUluKHRoaXMuJG92ZXJsYXksICdmYWRlLWluJyk7XG4gICAgICB9XG4gICAgICBGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlSW4odGhpcy4kZWxlbWVudCwgdGhpcy5vcHRpb25zLmFuaW1hdGlvbkluLCAoKSA9PiB7XG4gICAgICAgIGlmKHRoaXMuJGVsZW1lbnQpIHsgLy8gcHJvdGVjdCBhZ2FpbnN0IG9iamVjdCBoYXZpbmcgYmVlbiByZW1vdmVkXG4gICAgICAgICAgdGhpcy5mb2N1c2FibGVFbGVtZW50cyA9IEZvdW5kYXRpb24uS2V5Ym9hcmQuZmluZEZvY3VzYWJsZSh0aGlzLiRlbGVtZW50KTtcbiAgICAgICAgICBhZnRlckFuaW1hdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8galF1ZXJ5IG1ldGhvZCBvZiByZXZlYWxcbiAgICBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcmxheSkge1xuICAgICAgICB0aGlzLiRvdmVybGF5LnNob3coMCk7XG4gICAgICB9XG4gICAgICB0aGlzLiRlbGVtZW50LnNob3codGhpcy5vcHRpb25zLnNob3dEZWxheSk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIGFjY2Vzc2liaWxpdHlcbiAgICB0aGlzLiRlbGVtZW50XG4gICAgICAuYXR0cih7XG4gICAgICAgICdhcmlhLWh
5763pZGRlbic6IGZhbHNlLFxuICAgICAgICAndGFiaW5kZXgnOiAtMVxuICAgICAgfSlcbiAgICAgIC5mb2N1cygpO1xuICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQudHJhcEZvY3VzKHRoaXMuJGVsZW1lbnQpO1xuXG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiB0aGUgbW9kYWwgaGFzIHN1Y2Nlc3NmdWxseSBvcGVuZWQuXG4gICAgICogQGV2ZW50IFJldmVhbCNvcGVuXG4gICAgICovXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdvcGVuLnpmLnJldmVhbCcpO1xuXG4gICAgYWRkUmV2ZWFsT3BlbkNsYXNzZXMoKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fZXh0cmFIYW5kbGVycygpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZXh0cmEgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBib2R5IGFuZCB3aW5kb3cgaWYgbmVjZXNzYXJ5LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2V4dHJhSGFuZGxlcnMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBpZighdGhpcy4kZWxlbWVudCkgeyByZXR1cm47IH0gLy8gSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBjbGVhbnVwLCBkb24ndCBmcmVhayBvdXRcbiAgICB0aGlzLmZvY3VzYWJsZUVsZW1lbnRzID0gRm91bmRhdGlvbi5LZXlib2FyZC5maW5kRm9jdXNhYmxlKHRoaXMuJGVsZW1lbnQpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMub3ZlcmxheSAmJiB0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrICYmICF0aGlzLm9wdGlvbnMuZnVsbFNjcmVlbikge1xuICAgICAgJCgnYm9keScpLm9uKCdjbGljay56Zi5yZXZlYWwnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGlmIChlLnRhcmdldCA9PT0gX3RoaXMuJGVsZW1lbnRbMF0gfHxcbiAgICAgICAgICAkLmNvbnRhaW5zKF90aGlzLiRlbGVtZW50WzBdLCBlLnRhcmdldCkgfHxcbiAgICAgICAgICAgICEkLmNvbnRhaW5zKGRvY3VtZW50LCBlLnRhcmdldCkpIHsgcmV0dXJuOyB9XG4gICAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlT25Fc2MpIHtcbiAgICAgICQod2luZG93KS5vbigna2V5ZG93bi56Zi5yZXZlYWwnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KGUsICdSZXZlYWwnLCB7XG4gICAgICAgICAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMuY2xvc2VPbkVzYykge1xuICAgICAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICBfdGhpcy4kYW5jaG9yLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGxvY2sgZm9jdXMgd2l0aGluIG1vZGFsIHdoaWxlIHRhYmJpbmdcbiAgICB0aGlzLiRlbGVtZW50Lm9uKCdrZXlkb3duLnpmLnJldmVhbCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciAkdGFyZ2V0ID0gJCh0aGlzKTtcbiAgICAgIC8vIGhhbmRsZSBrZXlib2FyZCBldmVudCB3aXRoIGtleWJvYXJkIHV0aWxcbiAgICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KGUsICdSZXZlYWwnLCB7XG4gICAgICAgIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmIChfdGhpcy4kZWxlbWVudC5maW5kKCc6Zm9jdXMnKS5pcyhfdGhpcy4kZWxlbWVudC5maW5kKCdbZGF0YS1jbG9zZV0nKSkpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IC8vIHNldCBmb2N1cyBiYWNrIHRvIGFuY2hvciBpZiBjbG9zZSBidXR0b24gaGFzIGJlZW4gYWN0aXZhdGVkXG4gICAgICAgICAgICAgIF90aGlzLiRhbmNob3IuZm9jdXMoKTtcbiAgICAgICAgICAgIH0sIDEpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJHRhcmdldC5pcyhfdGhpcy5mb2N1c2FibGVFbGVtZW50cykpIHsgLy8gZG9udCd0IHRyaWdnZXIgaWYgYWN1YWwgZWxlbWVudCBoYXMgZm9jdXMgKGkuZS4gaW5wdXRzLCBsaW5rcywgLi4uKVxuICAgICAgICAgICAgX3RoaXMub3BlbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmNsb3NlT25Fc2MpIHtcbiAgICAgICAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICBfdGhpcy4kYW5jaG9yLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVkOiBmdW5jdGlvbihwcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgIGlmIChwcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBtb2RhbC5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBmaXJlcyBSZXZlYWwjY2xvc2VkXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUgfHwgIXRoaXMuJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIC8vIE1vdGlvbiBVSSBtZXRob2Qgb2YgaGlkaW5nXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb25PdXQpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcmxheSkge1xuICAgICAgICBGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KHRoaXMuJG92ZXJsYXksICdmYWRlLW91dCcsIGZpbmlzaFVwKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBmaW5pc2hVcCgpO1xuICAgICAgfVxuXG4gICAgICBGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KHRoaXMuJGVsZW1lbnQsIHRoaXMub3B0aW9ucy5hbmltYXRpb25PdXQpO1xuICAgIH1cbiAgICAvLyBqUXVlcnkgbWV0aG9kIG9mIGhpZGluZ1xuICAgIGVsc2Uge1xuXG4gICAgICB0aGlzLiRlbGVtZW50LmhpZGUodGhpcy5vcHRpb25zLmhpZGVEZWxheSk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcmxheSkge1xuICAgICAgICB0aGlzLiRvdmVybGF5LmhpZGUoMCwgZmluaXNoVXApO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGZpbmlzaFVwKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29uZGl0aW9uYWxzIHRvIHJlbW92ZSBleHRyYSBldmVudCBsaXN0ZW5lcnMgYWRkZWQgb24gb3BlblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPbkVzYykge1xuICAgICAgJCh3aW5kb3cpLm9mZigna2V5ZG93bi56Zi5yZXZlYWwnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5vdmVybGF5ICYmIHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2spIHtcbiAgICAgICQoJ2JvZHknKS5vZmYoJ2NsaWNrLnpmLnJldmVhbCc
5763pO1xuICAgIH1cblxuICAgIHRoaXMuJGVsZW1lbnQub2ZmKCdrZXlkb3duLnpmLnJldmVhbCcpO1xuXG4gICAgZnVuY3Rpb24gZmluaXNoVXAoKSB7XG4gICAgICBpZiAoX3RoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgaWYgKCQoJy5yZXZlYWw6dmlzaWJsZScpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICQoJ2h0bWwsIGJvZHknKS5yZW1vdmVDbGFzcygnaXMtcmV2ZWFsLW9wZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZihfdGhpcy5vcmlnaW5hbFNjcm9sbFBvcykge1xuICAgICAgICAgICQoJ2JvZHknKS5zY3JvbGxUb3AoX3RoaXMub3JpZ2luYWxTY3JvbGxQb3MpO1xuICAgICAgICAgIF90aGlzLm9yaWdpbmFsU2Nyb2xsUG9zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICgkKCcucmV2ZWFsOnZpc2libGUnKS5sZW5ndGggID09PSAwKSB7XG4gICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdpcy1yZXZlYWwtb3BlbicpO1xuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgICAgRm91bmRhdGlvbi5LZXlib2FyZC5yZWxlYXNlRm9jdXMoX3RoaXMuJGVsZW1lbnQpO1xuXG4gICAgICBfdGhpcy4kZWxlbWVudC5hdHRyKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuXG4gICAgICAvKipcbiAgICAgICogRmlyZXMgd2hlbiB0aGUgbW9kYWwgaXMgZG9uZSBjbG9zaW5nLlxuICAgICAgKiBAZXZlbnQgUmV2ZWFsI2Nsb3NlZFxuICAgICAgKi9cbiAgICAgIF90aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2Nsb3NlZC56Zi5yZXZlYWwnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJlc2V0cyB0aGUgbW9kYWwgY29udGVudFxuICAgICogVGhpcyBwcmV2ZW50cyBhIHJ1bm5pbmcgdmlkZW8gdG8ga2VlcCBnb2luZyBpbiB0aGUgYmFja2dyb3VuZFxuICAgICovXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXNldE9uQ2xvc2UpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQuaHRtbCh0aGlzLiRlbGVtZW50Lmh0bWwoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICBpZiAoX3RoaXMub3B0aW9ucy5kZWVwTGluaykge1xuICAgICAgIGlmICh3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUpIHtcbiAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSgnJywgZG9jdW1lbnQudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoYCMke3RoaXMuaWR9YCwgJycpKTtcbiAgICAgICB9IGVsc2Uge1xuICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnJztcbiAgICAgICB9XG4gICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBvcGVuL2Nsb3NlZCBzdGF0ZSBvZiBhIG1vZGFsLlxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIGEgbW9kYWwuXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm92ZXJsYXkpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQuYXBwZW5kVG8oJCh0aGlzLm9wdGlvbnMuYXBwZW5kVG8pKTsgLy8gbW92ZSAkZWxlbWVudCBvdXRzaWRlIG9mICRvdmVybGF5IHRvIHByZXZlbnQgZXJyb3IgdW5yZWdpc3RlclBsdWdpbigpXG4gICAgICB0aGlzLiRvdmVybGF5LmhpZGUoKS5vZmYoKS5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy4kZWxlbWVudC5oaWRlKCkub2ZmKCk7XG4gICAgdGhpcy4kYW5jaG9yLm9mZignLnpmJyk7XG4gICAgJCh3aW5kb3cpLm9mZihgLnpmLnJldmVhbDoke3RoaXMuaWR9YCk7XG5cbiAgICBGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyk7XG4gIH07XG59XG5cblJldmVhbC5kZWZhdWx0cyA9IHtcbiAgLyoqXG4gICAqIE1vdGlvbi1VSSBjbGFzcyB0byB1c2UgZm9yIGFuaW1hdGVkIGVsZW1lbnRzLiBJZiBub25lIHVzZWQsIGRlZmF1bHRzIHRvIHNpbXBsZSBzaG93L2hpZGUuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIGFuaW1hdGlvbkluOiAnJyxcbiAgLyoqXG4gICAqIE1vdGlvbi1VSSBjbGFzcyB0byB1c2UgZm9yIGFuaW1hdGVkIGVsZW1lbnRzLiBJZiBub25lIHVzZWQsIGRlZmF1bHRzIHRvIHNpbXBsZSBzaG93L2hpZGUuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIGFuaW1hdGlvbk91dDogJycsXG4gIC8qKlxuICAgKiBUaW1lLCBpbiBtcywgdG8gZGVsYXkgdGhlIG9wZW5pbmcgb2YgYSBtb2RhbCBhZnRlciBhIGNsaWNrIGlmIG5vIGFuaW1hdGlvbiB1c2VkLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHNob3dEZWxheTogMCxcbiAgLyoqXG4gICAqIFRpbWUsIGluIG1zLCB0byBkZWxheSB0aGUgY2xvc2luZyBvZiBhIG1vZGFsIGFmdGVyIGEgY2xpY2sgaWYgbm8gYW5pbWF0aW9uIHVzZWQuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgaGlkZURlbGF5OiAwLFxuICAvKipcbiAgICogQWxsb3dzIGEgY2xpY2sgb24gdGhlIGJvZHkvb3ZlcmxheSB0byBjbG9zZSB0aGUgbW9kYWwuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGNsb3NlT25DbGljazogdHJ1ZSxcbiAgLyoqXG4gICAqIEFsbG93cyB0aGUgbW9kYWwgdG8gY2xvc2UgaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgYEVTQ0FQRWAga2V5LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBjbG9zZU9uRXNjOiB0cnVlLFxuICAvKipcbiAgICogSWYgdHJ1ZSwgYWxsb3dzIG11bHRpcGxlIG1vZGFscyB0byBiZSBkaXNwbGF5ZWQgYXQgb25jZS5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG11bHRpcGxlT3BlbmVkOiBmYWxzZSxcbiAgLyoqXG4gICAqIERpc3RhbmNlLCBpbiBwaXhlbHMsIHRoZSBtb2RhbCBzaG91bGQgcHVzaCBkb3duIGZyb20gdGhlIHRvcCBvZiB0aGUgc2NyZWVuLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ8
5763c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBhdXRvXG4gICAqL1xuICB2T2Zmc2V0OiAnYXV0bycsXG4gIC8qKlxuICAgKiBEaXN0YW5jZSwgaW4gcGl4ZWxzLCB0aGUgbW9kYWwgc2hvdWxkIHB1c2ggaW4gZnJvbSB0aGUgc2lkZSBvZiB0aGUgc2NyZWVuLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ8c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBhdXRvXG4gICAqL1xuICBoT2Zmc2V0OiAnYXV0bycsXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIG1vZGFsIHRvIGJlIGZ1bGxzY3JlZW4sIGNvbXBsZXRlbHkgYmxvY2tpbmcgb3V0IHRoZSByZXN0IG9mIHRoZSB2aWV3LiBKUyBjaGVja3MgZm9yIHRoaXMgYXMgd2VsbC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGZ1bGxTY3JlZW46IGZhbHNlLFxuICAvKipcbiAgICogUGVyY2VudGFnZSBvZiBzY3JlZW4gaGVpZ2h0IHRoZSBtb2RhbCBzaG91bGQgcHVzaCB1cCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHZpZXcuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIGJ0bU9mZnNldFBjdDogMTAsXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIG1vZGFsIHRvIGdlbmVyYXRlIGFuIG92ZXJsYXkgZGl2LCB3aGljaCB3aWxsIGNvdmVyIHRoZSB2aWV3IHdoZW4gbW9kYWwgb3BlbnMuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIG92ZXJsYXk6IHRydWUsXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIG1vZGFsIHRvIHJlbW92ZSBhbmQgcmVpbmplY3QgbWFya3VwIG9uIGNsb3NlLiBTaG91bGQgYmUgdHJ1ZSBpZiB1c2luZyB2aWRlbyBlbGVtZW50cyB3L28gdXNpbmcgcHJvdmlkZXIncyBhcGksIG90aGVyd2lzZSwgdmlkZW9zIHdpbGwgY29udGludWUgdG8gcGxheSBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlc2V0T25DbG9zZTogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIG1vZGFsIHRvIGFsdGVyIHRoZSB1cmwgb24gb3Blbi9jbG9zZSwgYW5kIGFsbG93cyB0aGUgdXNlIG9mIHRoZSBgYmFja2AgYnV0dG9uIHRvIGNsb3NlIG1vZGFscy4gQUxTTywgYWxsb3dzIGEgbW9kYWwgdG8gYXV0by1tYW5pYWNhbGx5IG9wZW4gb24gcGFnZSBsb2FkIElGIHRoZSBoYXNoID09PSB0aGUgbW9kYWwncyB1c2VyLXNldCBpZC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRlZXBMaW5rOiBmYWxzZSxcbiAgICAvKipcbiAgICogQWxsb3dzIHRoZSBtb2RhbCB0byBhcHBlbmQgdG8gY3VzdG9tIGRpdi5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBcImJvZHlcIlxuICAgKi9cbiAgYXBwZW5kVG86IFwiYm9keVwiXG5cbn07XG5cbi8vIFdpbmRvdyBleHBvcnRzXG5Gb3VuZGF0aW9uLnBsdWdpbihSZXZlYWwsICdSZXZlYWwnKTtcblxuZnVuY3Rpb24gaVBob25lU25pZmYoKSB7XG4gIHJldHVybiAvaVAoYWR8aG9uZXxvZCkuKk9TLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KTtcbn1cblxuZnVuY3Rpb24gYW5kcm9pZFNuaWZmKCkge1xuICByZXR1cm4gL0FuZHJvaWQvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xufVxuXG5mdW5jdGlvbiBtb2JpbGVTbmlmZigpIHtcbiAgcmV0dXJuIGlQaG9uZVNuaWZmKCkgfHwgYW5kcm9pZFNuaWZmKCk7XG59XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuLyoqXG4gKiBUYWJzIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi50YWJzXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLmtleWJvYXJkXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLnRpbWVyQW5kSW1hZ2VMb2FkZXIgaWYgdGFicyBjb250YWluIGltYWdlc1xuICovXG5cbmNsYXNzIFRhYnMge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0YWJzLlxuICAgKiBAY2xhc3NcbiAgICogQGZpcmVzIFRhYnMjaW5pdFxuICAgKiBAcGFyYW0ge2pRdWVyeX0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gbWFrZSBpbnRvIHRhYnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3ZlcnJpZGVzIHRvIHRoZSBkZWZhdWx0IHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgVGFicy5kZWZhdWx0cywgdGhpcy4kZWxlbWVudC5kYXRhKCksIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcywgJ1RhYnMnKTtcbiAgICBGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKCdUYWJzJywge1xuICAgICAgJ0VOVEVSJzogJ29wZW4nLFxuICAgICAgJ1NQQUNFJzogJ29wZW4nLFxuICAgICAgJ0FSUk9XX1JJR0hUJzogJ25leHQnLFxuICAgICAgJ0FSUk9XX1VQJzogJ3ByZXZpb3VzJyxcbiAgICAgICdBUlJPV19ET1dOJzogJ25leHQnLFxuICAgICAgJ0FSUk9XX0xFRlQnOiAncHJldmlvdXMnXG4gICAgICAvLyAnVEFCJzogJ25leHQnLFxuICAgICAgLy8gJ1NISUZUX1RBQic6ICdwcmV2aW91cydcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgdGFicyBieSBzaG93aW5nIGFuZCBmb2N1c2luZyAoaWYgYXV0b0ZvY3VzPXRydWUpIHRoZSBwcmVzZXQgYWN0aXZlIHRhYi5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLiRlbGVtZW50LmF0dHIoeydyb2xlJzogJ3RhYmxpc3QnfSk7XG4gICAgdGhpcy4kdGFiVGl0bGVzID0gdGhpcy4kZWxlbWVudC5maW5kKGAuJHt0aGlzLm9wdGlvbnMubGlua0NsYXNzfWApO1xuICAgIHRoaXMuJHRhYkNvbnRlbnQgPSAkKGBbZGF0YS10YWJzLWNvbnRlbnQ9XCIke3RoaXMuJGVsZW1lbnRbMF0uaWR9XCJdYCk7XG5cbiAgICB0aGlzLiR0YWJUaXRsZXMuZWFjaChmdW5jdGlvbigpe1xuICAgICAgdmFyICRlbGVtID0gJCh0aGlzKSxcbiAgICAgICAgICAkbGluayA9ICRlbGVtLmZpbmQoJ2EnKSxcbiAgICAgICAgICBpc0FjdGl2ZSA9ICRlbGVtLmhhc0NsYXNzKGAke190aGlzLm9wdGlvbnMubGlua0FjdGl2ZUNsYXNzfWApLFxuICAgICAgICAgIGhhc2ggPSAkbGlua1swXS5oYXNoLnNsaWNlKDEpLFxuICAgICAgICAgIGxpbmtJZCA9ICRsaW5rWzBdLmlkID8gJGxpbmtbMF0uaWQgOiBgJHtoYXNofS1sYWJlbGAsXG4gICAgICAgICAgJHRhYkNvbnRlbnQgPSAkKGAjJHtoYXNofWApO1xuXG4gICAgICAkZWxlbS5hdHRyKHsncm9sZSc6ICdwcmVzZW50YXRpb24nfSk7XG5cbiAgICAgICRsaW5rLmF0dHIoe1xuICAgICAgICAncm9sZSc6ICd0YWInLFxuICAgICAgICAnYXJpYS1jb250cm9scyc6IGhhc2gsXG4gICAgICAgICdhcmlhLXNlbGVjdGVkJzogaXNBY3RpdmUsXG4gICAgICAgICdpZCc6IGxpbmtJZFxuICAgICAgfSk7XG5cbiAgICAgICR0YWJDb250ZW50LmF0dHIoe1xuICAgICAgICAncm9sZSc6ICd0YWJwYW5lbCcsXG4gICAgICAgICdhcmlhLWh
5763pZGRlbic6ICFpc0FjdGl2ZSxcbiAgICAgICAgJ2FyaWEtbGFiZWxsZWRieSc6IGxpbmtJZFxuICAgICAgfSk7XG5cbiAgICAgIGlmKGlzQWN0aXZlICYmIF90aGlzLm9wdGlvbnMuYXV0b0ZvY3VzKXtcbiAgICAgICAgJCh3aW5kb3cpLmxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoeyBzY3JvbGxUb3A6ICRlbGVtLm9mZnNldCgpLnRvcCB9LCBfdGhpcy5vcHRpb25zLmRlZXBMaW5rU211ZGdlRGVsYXksICgpID0+IHtcbiAgICAgICAgICAgICRsaW5rLmZvY3VzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmKHRoaXMub3B0aW9ucy5tYXRjaEhlaWdodCkge1xuICAgICAgdmFyICRpbWFnZXMgPSB0aGlzLiR0YWJDb250ZW50LmZpbmQoJ2ltZycpO1xuXG4gICAgICBpZiAoJGltYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgRm91bmRhdGlvbi5vbkltYWdlc0xvYWRlZCgkaW1hZ2VzLCB0aGlzLl9zZXRIZWlnaHQuYmluZCh0aGlzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zZXRIZWlnaHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAgLy9jdXJyZW50IGNvbnRleHQtYm91bmQgZnVuY3Rpb24gdG8gb3BlbiB0YWJzIG9uIHBhZ2UgbG9hZCBvciBoaXN0b3J5IHBvcHN0YXRlXG4gICAgdGhpcy5fY2hlY2tEZWVwTGluayA9ICgpID0+IHtcbiAgICAgIHZhciBhbmNob3IgPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcbiAgICAgIC8vbmVlZCBhIGhhc2ggYW5kIGEgcmVsZXZhbnQgYW5jaG9yIGluIHRoaXMgdGFic2V0XG4gICAgICBpZihhbmNob3IubGVuZ3RoKSB7XG4gICAgICAgIHZhciAkbGluayA9IHRoaXMuJGVsZW1lbnQuZmluZCgnW2hyZWYkPVwiJythbmNob3IrJ1wiXScpO1xuICAgICAgICBpZiAoJGxpbmsubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RUYWIoJChhbmNob3IpLCB0cnVlKTtcblxuICAgICAgICAgIC8vcm9sbCB1cCBhIGxpdHRsZSB0byBzaG93IHRoZSB0aXRsZXNcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlZXBMaW5rU211ZGdlKSB7XG4gICAgICAgICAgICB2Y
5763XIgb2Zmc2V0ID0gdGhpcy4kZWxlbWVudC5vZmZzZXQoKTtcbiAgICAgICAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHsgc2Nyb2xsVG9wOiBvZmZzZXQudG9wIH0sIHRoaXMub3B0aW9ucy5kZWVwTGlua1NtdWRnZURlbGF5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgenBsdWdpbiBoYXMgZGVlcGxpbmtlZCBhdCBwYWdlbG9hZFxuICAgICAgICAgICAgKiBAZXZlbnQgVGFicyNkZWVwbGlua1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdkZWVwbGluay56Zi50YWJzJywgWyRsaW5rLCAkKGFuY2hvcildKTtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIH1cblxuICAgIC8vdXNlIGJyb3dzZXIgdG8gb3BlbiBhIHRhYiwgaWYgaXQgZXhpc3RzIGluIHRoaXMgdGFic2V0XG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWVwTGluaykge1xuICAgICAgdGhpcy5fY2hlY2tEZWVwTGluaygpO1xuICAgIH1cblxuICAgIHRoaXMuX2V2ZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgZm9yIGl0ZW1zIHdpdGhpbiB0aGUgdGFicy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdGhpcy5fYWRkS2V5SGFuZGxlcigpO1xuICAgIHRoaXMuX2FkZENsaWNrSGFuZGxlcigpO1xuICAgIHRoaXMuX3NldEhlaWdodE1xSGFuZGxlciA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm1hdGNoSGVpZ2h0KSB7XG4gICAgICB0aGlzLl9zZXRIZWlnaHRNcUhhbmRsZXIgPSB0aGlzLl9zZXRIZWlnaHQuYmluZCh0aGlzKTtcblxuICAgICAgJCh3aW5kb3cpLm9uKCdjaGFuZ2VkLnpmLm1lZGlhcXVlcnknLCB0aGlzLl9zZXRIZWlnaHRNcUhhbmRsZXIpO1xuICAgIH1cblxuICAgIGlmKHRoaXMub3B0aW9ucy5kZWVwTGluaykge1xuICAgICAgJCh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRoaXMuX2NoZWNrRGVlcExpbmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNsaWNrIGhhbmRsZXJzIGZvciBpdGVtcyB3aXRoaW4gdGhlIHRhYnMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYWRkQ2xpY2tIYW5kbGVyKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLiRlbGVtZW50XG4gICAgICAub2ZmKCdjbGljay56Zi50YWJzJylcbiAgICAgIC5vbignY2xpY2suemYudGFicycsIGAuJHt0aGlzLm9wdGlvbnMubGlua0NsYXNzfWAsIGZ1bmN0aW9uKGUpe1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIF90aGlzLl9oYW5kbGVUYWJDaGFuZ2UoJCh0aGlzKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGtleWJvYXJkIGV2ZW50IGhhbmRsZXJzIGZvciBpdGVtcyB3aXRoaW4gdGhlIHRhYnMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYWRkS2V5SGFuZGxlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy4kdGFiVGl0bGVzLm9mZigna2V5ZG93bi56Zi50YWJzJykub24oJ2tleWRvd24uemYudGFicycsIGZ1bmN0aW9uKGUpe1xuICAgICAgaWYgKGUud2hpY2ggPT09IDkpIHJldHVybjtcblxuXG4gICAgICB2Y
5763XIgJGVsZW1lbnQgPSAkKHRoaXMpLFxuICAgICAgICAkZWxlbWVudHMgPSAkZWxlbWVudC5wYXJlbnQoJ3VsJykuY2hpbGRyZW4oJ2xpJyksXG4gICAgICAgICRwcmV2RWxlbWVudCxcbiAgICAgICAgJG5leHRFbGVtZW50O1xuXG4gICAgICAkZWxlbWVudHMuZWFjaChmdW5jdGlvbihpKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmlzKCRlbGVtZW50KSkge1xuICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLndyYXBPbktleXMpIHtcbiAgICAgICAgICAgICRwcmV2RWxlbWVudCA9IGkgPT09IDAgPyAkZWxlbWVudHMubGFzdCgpIDogJGVsZW1lbnRzLmVxKGktMSk7XG4gICAgICAgICAgICAkbmV4dEVsZW1lbnQgPSBpID09PSAkZWxlbWVudHMubGVuZ3RoIC0xID8gJGVsZW1lbnRzLmZpcnN0KCkgOiAkZWxlbWVudHMuZXEoaSsxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHByZXZFbGVtZW50ID0gJGVsZW1lbnRzLmVxKE1hdGgubWF4KDAsIGktMSkpO1xuICAgICAgICAgICAgJG5leHRFbGVtZW50ID0gJGVsZW1lbnRzLmVxKE1hdGgubWluKGkrMSwgJGVsZW1lbnRzLmxlbmd0aC0xKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGhhbmRsZSBrZXlib2FyZCBldmVudCB3aXRoIGtleWJvYXJkIHV0aWxcbiAgICAgIEZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KGUsICdUYWJzJywge1xuICAgICAgICBvcGVuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAkZWxlbWVudC5maW5kKCdbcm9sZT1cInRhYlwiXScpLmZvY3VzKCk7XG4gICAgICAgICAgX3RoaXMuX2hhbmRsZVRhYkNoYW5nZSgkZWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIHByZXZpb3VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAkcHJldkVsZW1lbnQuZmluZCgnW3JvbGU9XCJ0YWJcIl0nKS5mb2N1cygpO1xuICAgICAgICAgIF90aGlzLl9oYW5kbGVUYWJDaGFuZ2UoJHByZXZFbGVtZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJG5leHRFbGVtZW50LmZpbmQoJ1tyb2xlPVwidGFiXCJdJykuZm9jdXMoKTtcbiAgICAgICAgICBfdGhpcy5faGFuZGxlVGFiQ2hhbmdlKCRuZXh0RWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgdGFiIGAkdGFyZ2V0Q29udGVudGAgZGVmaW5lZCBieSBgJHRhcmdldGAuIENvbGxhcHNlcyBhY3RpdmUgdGFiLlxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIFRhYiB0byBvcGVuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhpc3RvcnlIYW5kbGVkIC0gYnJvd3NlciBoYXMgYWxyZWFkeSBoYW5kbGVkIGEgaGlzdG9yeSB1cGRhdGVcbiAgICogQGZpcmVzIFRhYnMjY2hhbmdlXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgX2hhbmRsZVRhYkNoYW5nZSgkdGFyZ2V0LCBoaXN0b3J5SGFuZGxlZCkge1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgZm9yIGFjdGl2ZSBjbGFzcyBvbiB0YXJnZXQuIENvbGxhcHNlIGlmIGV4aXN0cy5cbiAgICAgKi9cbiAgICBpZiAoJHRhcmdldC5oYXNDbGFzcyhgJHt0aGlzLm9wdGlvbnMubGlua0FjdGl2ZUNsYXNzfWApKSB7XG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy5hY3RpdmVDb2xsYXBzZSkge1xuICAgICAgICAgICAgdGhpcy5fY29sbGFwc2VUYWIoJHRhcmdldCk7XG5cbiAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHpwbHVnaW4gaGFzIHN1Y2Nlc3NmdWxseSBjb2xsYXBzZWQgdGFicy5cbiAgICAgICAgICAgICogQGV2ZW50IFRhYnMjY29sbGFwc2VcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2NvbGxhcHNlLnpmLnRhYnMnLCBbJHRhcmdldF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgJG9sZFRhYiA9IHRoaXMuJGVsZW1lbnQuXG4gICAgICAgICAgZmluZChgLiR7dGhpcy5vcHRpb25zLmxpbmtDbGFzc30uJHt0aGlzLm9wdGlvbnMubGlua0FjdGl2ZUNsYXNzfWApLFxuICAgICAgICAgICR0YWJMaW5rID0gJHRhcmdldC5maW5kKCdbcm9sZT1cInRhYlwiXScpLFxuICAgICAgICAgIGhhc2ggPSAkdGFiTGlua1swXS5oYXNoLFxuICAgICAgICAgICR0YXJnZXRDb250ZW50ID0gdGhpcy4kdGFiQ29udGVudC5maW5kKGhhc2gpO1xuXG4gICAgLy9jbG9zZSBvbGQgdGFiXG4gICAgdGhpcy5fY29sbGFwc2VUYWIoJG9sZFRhYik7XG5cbiAgICAvL29wZW4gbmV3IHRhYlxuICAgIHRoaXMuX29wZW5UYWIoJHRhcmdldCk7XG5cbiAgICAvL2VpdGhlciByZXBsYWNlIG9yIHVwZGF0ZSBicm93c2VyIGhpc3RvcnlcbiAgICBpZiAodGhpcy5vcHRpb25zLmRlZXBMaW5rICYmICFoaXN0b3J5SGFuZGxlZCkge1xuICAgICAgdmFyIGFuY2hvciA9ICR0YXJnZXQuZmluZCgnYScpLmF0dHIoJ2hyZWYnKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGRhdGVIaXN0b3J5KSB7XG4gICAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHt9LCAnJywgYW5jaG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCAnJywgYW5jaG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHRoZSBwbHVnaW4gaGFzIHN1Y2Nlc3NmdWxseSBjaGFuZ2VkIHRhYnMuXG4gICAgICogQGV2ZW50IFRhYnMjY2hhbmdlXG4gICAgICovXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UuemYudGFicycsIFskdGFyZ2V0LCAkdGFyZ2V0Q29udGVudF0pO1xuXG4gICAgLy9maXJlIHRvIGNoaWxkcmVuIGEgbXV0YXRpb24gZXZlbnRcbiAgICAkdGFyZ2V0Q29udGVudC5maW5kKFwiW2RhdGEtbXV0YXRlXVwiKS50cmlnZ2VyKFwibXV0YXRlbWUuemYudHJpZ2dlclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgdGFiIGAkdGFyZ2V0Q29udGVudGAgZGVmaW5lZCBieSBgJHRhcmdldGAuXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkdGFyZ2V0IC0gVGFiIHRvIE9wZW4uXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgX29wZW5UYWIoJHRhcmdldCkge1xuICAgICAgdmFyICR0YWJMaW5rID0gJHRhcmdldC5maW5kKCdbcm9sZT1cInRhYlwiXScpLFxuICAgICAgICAgIGhhc2ggPSAkdGFiTGlua1swXS5oYXNoLFxuICAgICAgICAgICR0YXJnZXRDb250ZW50ID0gdGhpcy4kdGFiQ29udGVudC5maW5kKGhhc2gpO1xuXG4gICAgICAkdGFyZ2V0LmFkZENsYXNzKGAke3RoaXMub3B0aW9ucy5saW5rQWN0aXZlQ2xhc3N9YCk7XG5cbiAgICAgICR0YWJMaW5rLmF0dHIoey
5763dhcmlhLXNlbGVjdGVkJzogJ3RydWUnfSk7XG5cbiAgICAgICR0YXJnZXRDb250ZW50XG4gICAgICAgIC5hZGRDbGFzcyhgJHt0aGlzLm9wdGlvbnMucGFuZWxBY3RpdmVDbGFzc31gKVxuICAgICAgICAuYXR0cih7J2FyaWEtaGlkZGVuJzogJ2ZhbHNlJ30pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxhcHNlcyBgJHRhcmdldENvbnRlbnRgIGRlZmluZWQgYnkgYCR0YXJnZXRgLlxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIFRhYiB0byBPcGVuLlxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIF9jb2xsYXBzZVRhYigkdGFyZ2V0KSB7XG4gICAgdmFyICR0YXJnZXRfYW5jaG9yID0gJHRhcmdldFxuICAgICAgLnJlbW92ZUNsYXNzKGAke3RoaXMub3B0aW9ucy5saW5rQWN0aXZlQ2xhc3N9YClcbiAgICAgIC5maW5kKCdbcm9sZT1cInRhYlwiXScpXG4gICAgICAuYXR0cih7ICdhcmlhLXNlbGVjdGVkJzogJ2ZhbHNlJyB9KTtcblxuICAgICQoYCMkeyR0YXJnZXRfYW5jaG9yLmF0dHIoJ2FyaWEtY29udHJvbHMnKX1gKVxuICAgICAgLnJlbW92ZUNsYXNzKGAke3RoaXMub3B0aW9ucy5wYW5lbEFjdGl2ZUNsYXNzfWApXG4gICAgICAuYXR0cih7ICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgbWV0aG9kIGZvciBzZWxlY3RpbmcgYSBjb250ZW50IHBhbmUgdG8gZGlzcGxheS5cbiAgICogQHBhcmFtIHtqUXVlcnkgfCBTdHJpbmd9IGVsZW0gLSBqUXVlcnkgb2JqZWN0IG9yIHN0cmluZyBvZiB0aGUgaWQgb2YgdGhlIHBhbmUgdG8gZGlzcGxheS5cbiAgICogQHBhcmFtIHtib29sZWFufSBoaXN0b3J5SGFuZGxlZCAtIGJyb3dzZXIgaGFzIGFscmVhZHkgaGFuZGxlZCBhIGhpc3RvcnkgdXBkYXRlXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgc2VsZWN0VGFiKGVsZW0sIGhpc3RvcnlIYW5kbGVkKSB7XG4gICAgdmFyIGlkU3RyO1xuXG4gICAgaWYgKHR5cGVvZiBlbGVtID09PSAnb2JqZWN0Jykge1xuICAgICAgaWRTdHIgPSBlbGVtWzBdLmlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZFN0ciA9IGVsZW07XG4gICAgfVxuXG4gICAgaWYgKGlkU3RyLmluZGV4T2YoJyMnKSA8IDApIHtcbiAgICAgIGlkU3RyID0gYCMke2lkU3RyfWA7XG4gICAgfVxuXG4gICAgdmFyICR0YXJnZXQgPSB0aGlzLiR0YWJUaXRsZXMuZmluZChgW2hyZWYkPVwiJHtpZFN0cn1cIl1gKS5wYXJlbnQoYC4ke3RoaXMub3B0aW9ucy5saW5rQ2xhc3N9YCk7XG5cbiAgICB0aGlzLl9oYW5kbGVUYWJDaGFuZ2UoJHRhcmdldCwgaGlzdG9yeUhhbmRsZWQpO1xuICB9O1xuICAvKipcbiAgICogU2V0cyB0aGUgaGVpZ2h0IG9mIGVhY2ggcGFuZWwgdG8gdGhlIGhlaWdodCBvZiB0aGUgdGFsbGVzdCBwYW5lbC5cbiAgICogSWYgZW5hYmxlZCBpbiBvcHRpb25zLCBnZXRzIGNhbGxlZCBvbiBtZWRpYSBxdWVyeSBjaGFuZ2UuXG4gICAqIElmIGxvYWRpbmcgY29udGVudCB2aWEgZXh0ZXJuYWwgc291cmNlLCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IG9yIHdpdGggX3JlZmxvdy5cbiAgICogSWYgZW5hYmxlZCB3aXRoIGBkYXRhLW1hdGNoLWhlaWdodD1cInRydWVcImAsIHRhYnMgc2V0cyB0byBlcXVhbCBoZWlnaHRcbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0SGVpZ2h0KCkge1xuICAgIHZhciBtYXggPSAwLFxuICAgICAgICBfdGhpcyA9IHRoaXM7IC8vIExvY2sgZG93biB0aGUgYHRoaXNgIHZhbHVlIGZvciB0aGUgcm9vdCB0YWJzIG9iamVjdFxuXG4gICAgdGhpcy4kdGFiQ29udGVudFxuICAgICAgLmZpbmQoYC4ke3RoaXMub3B0aW9ucy5wYW5lbENsYXNzfWApXG4gICAgICAuY3NzKCdoZWlnaHQnLCAnJylcbiAgICAgIC5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciBwYW5lbCA9ICQodGhpcyksXG4gICAgICAgICAgICBpc0FjdGl2ZSA9IHBhbmVsLmhhc0NsYXNzKGAke190aGlzLm9wdGlvbnMucGFuZWxBY3RpdmVDbGFzc31gKTsgLy8gZ2V0IHRoZSBvcHRpb25zIGZyb20gdGhlIHBhcmVudCBpbnN0ZWFkIG9mIHRyeWluZyB0byBnZXQgdGhlbSBmcm9tIHRoZSBjaGlsZFxuXG4gICAgICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgICAgICBwYW5lbC5jc3Moeyd2aXNpYmlsaXR5JzogJ2hpZGRlbicsICdkaXNwbGF5JzogJ2Jsb2NrJ30pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRlbXAgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICBpZiAoIWlzQWN0aXZlKSB7XG4gICAgICAgICAgcGFuZWwuY3NzKHtcbiAgICAgICAgICAgICd2aXNpYmlsaXR5JzogJycsXG4gICAgICAgICAgICAnZGlzcGxheSc6ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXggPSB0ZW1wID4gbWF4ID8gdGVtcCA6IG1heDtcbiAgICAgIH0pXG4gICAgICAuY3NzKCdoZWlnaHQnLCBgJHttYXh9cHhgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhbiBpbnN0YW5jZSBvZiBhbiB0YWJzLlxuICAgKiBAZmlyZXMgVGFicyNkZXN0cm95ZWRcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4kZWxlbWVudFxuICAgICAgLmZpbmQoYC4ke3RoaXMub3B0aW9ucy5saW5rQ2xhc3N9YClcbiAgICAgIC5vZmYoJy56Zi50YWJzJykuaGlkZSgpLmVuZCgpXG4gICAgICAuZmluZChgLiR7dGhpcy5vcHRpb25zLnBhbmVsQ2xhc3N9YClcbiAgICAgIC5oaWRlKCk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm1hdGNoSGVpZ2h0KSB7XG4gICAgICBpZiAodGhpcy5fc2V0SGVpZ2h0TXFIYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgICQod2luZG93KS5vZmYoJ2NoYW5nZWQuemYubWVkaWFxdWVyeScsIHRoaXMuX3NldEhlaWdodE1xSGFuZGxlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWVwTGluaykge1xuICAgICAgJCh3aW5kb3cpLm9mZigncG9wc3RhdGUnLCB0aGlzLl9jaGVja0RlZXBMaW5rKTtcbiAgICB9XG5cbiAgICBGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyk7XG4gIH1cbn1cblxuVGFicy5kZWZhdWx0cyA9IHtcbiAgLyoqXG4gICAqIEFsbG93cyB0aGUgd2luZG93IHRvIHNjcm9sbCB0byBjb250ZW50IG9mIHBhbmUgc3BlY2lmaWVkIGJ5IGhhc2ggYW5jaG9yXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWVwTGluazogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEFkanVzdCB0aGUgZGVlcCBsaW5rIHNjcm9sbCB0byBtYWtlIHN1cmUgdGhlIHRvcCBvZiB0aGUgdGFiIHBhbmVsIGlzIHZpc2libGVcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRlZXBMaW5rU211ZGdlOiBmYWxzZSxcblxuICAvKipcbiAgICogQW5pbWF0aW9uIHRpbWUgKG1zKSBmb3IgdGhlIGRlZXAgbGluayBhZGp1c3RtZW50XG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBkZWVwTGlua1NtdWRnZURlbGF5OiAzMDAsXG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgYnJvd3NlciBoaXN0b3J5IHdpdGggdGhlIG9wZW4gdGFiXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB1cGRhdGVIaXN0b3J5OiBmYWxzZSxcblxuICAvKipcbiAgICogQWxsb3dzIHRoZSB3aW5kb3cgdG8gc2Nyb2xsIHRvIGNvbnRlbnQgb2YgYWN0aXZlIHBhbmUgb24gbG9hZCBpZiBzZXQgdG8gdHJ1ZS5cbiAgICogTm90IHJlY29tbWVuZGVkIGlmIG1vcmUgdGhhbiBvbmUgdGFiIHBhbmVsIHBlciBwYWdlLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYXV0b0ZvY3VzOiBmYWxzZSxcblxuICAvKipcbiAgICogQWxsb3dzIGtleWJvYXJkIGlucHV0IHRvICd3cmFwJyBhcm91bmQgdGhlI
5763HRhYiBsaW5rcy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgd3JhcE9uS2V5czogdHJ1ZSxcblxuICAvKipcbiAgICogQWxsb3dzIHRoZSB0YWIgY29udGVudCBwYW5lcyB0byBtYXRjaCBoZWlnaHRzIGlmIHNldCB0byB0cnVlLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgbWF0Y2hIZWlnaHQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYWN0aXZlIHRhYnMgdG8gY29sbGFwc2Ugd2hlbiBjbGlja2VkLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYWN0aXZlQ29sbGFwc2U6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBDbGFzcyBhcHBsaWVkIHRvIGBsaWAncyBpbiB0YWIgbGluayBsaXN0LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICd0YWJzLXRpdGxlJ1xuICAgKi9cbiAgbGlua0NsYXNzOiAndGFicy10aXRsZScsXG5cbiAgLyoqXG4gICAqIENsYXNzIGFwcGxpZWQgdG8gdGhlIGFjdGl2ZSBgbGlgIGluIHRhYiBsaW5rIGxpc3QuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ2lzLWFjdGl2ZSdcbiAgICovXG4gIGxpbmtBY3RpdmVDbGFzczogJ2lzLWFjdGl2ZScsXG5cbiAgLyoqXG4gICAqIENsYXNzIGFwcGxpZWQgdG8gdGhlIGNvbnRlbnQgY29udGFpbmVycy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAndGFicy1wYW5lbCdcbiAgICovXG4gIHBhbmVsQ2xhc3M6ICd0YWJzLXBhbmVsJyxcblxuICAvKipcbiAgICogQ2xhc3MgYXBwbGllZCB0byB0aGUgYWN0aXZlIGNvbnRlbnQgY29udGFpbmVyLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdpcy1hY3RpdmUnXG4gICAqL1xuICBwYW5lbEFjdGl2ZUNsYXNzOiAnaXMtYWN0aXZlJ1xufTtcblxuLy8gV2luZG93IGV4cG9ydHNcbkZvdW5kYXRpb24ucGx1Z2luKFRhYnMsICdUYWJzJyk7XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuLyoqXG4gKiBUb2dnbGVyIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi50b2dnbGVyXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLm1vdGlvblxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC50cmlnZ2Vyc1xuICovXG5cbmNsYXNzIFRvZ2dsZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBUb2dnbGVyLlxuICAgKiBAY2xhc3NcbiAgICogQGZpcmVzIFRvZ2dsZXIjaW5pdF
5763xuICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gYWRkIHRoZSB0cmlnZ2VyIHRvLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE92ZXJyaWRlcyB0byB0aGUgZGVmYXVsdCBwbHVnaW4gc2V0dGluZ3MuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIFRvZ2dsZXIuZGVmYXVsdHMsIGVsZW1lbnQuZGF0YSgpLCBvcHRpb25zKTtcbiAgICB0aGlzLmNsYXNzTmFtZSA9ICcnO1xuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIHRoaXMuX2V2ZW50cygpO1xuXG4gICAgRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLCAnVG9nZ2xlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBUb2dnbGVyIHBsdWdpbiBieSBwYXJzaW5nIHRoZSB0b2dnbGUgY2xhc3MgZnJvbSBkYXRhLXRvZ2dsZXIsIG9yIGFuaW1hdGlvbiBjbGFzc2VzIGZyb20gZGF0YS1hbmltYXRlLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHZhciBpbnB1dDtcbiAgICAvLyBQYXJzZSBhbmltYXRpb24gY2xhc3NlcyBpZiB0aGV5IHdlcmUgc2V0XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRlKSB7XG4gICAgICBpbnB1dCA9IHRoaXMub3B0aW9ucy5hbmltYXRlLnNwbGl0KCcgJyk7XG5cbiAgICAgIHRoaXMuYW5pbWF0aW9uSW4gPSBpbnB1dFswXTtcbiAgICAgIHRoaXMuYW5pbWF0aW9uT3V0ID0gaW5wdXRbMV0gfHwgbnVsbDtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlLCBwYXJzZSB0b2dnbGUgY2xhc3NcbiAgICBlbHNlIHtcbiAgICAgIGlucHV0ID0gdGhpcy4kZWxlbWVudC5kYXRhKCd0b2dnbGVyJyk7XG4gICAgICAvLyBBbGxvdyBmb3IgYSAuIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZ1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBpbnB1dFswXSA9PT0gJy4nID8gaW5wdXQuc2xpY2UoMSkgOiBpbnB1dDtcbiAgICB9XG5cbiAgICAvLyBBZGQgQVJJQSBhdHRyaWJ1dGVzIHRvIHRyaWdnZXJzXG4gICAgdmFyIGlkID0gdGh
5763pcy4kZWxlbWVudFswXS5pZDtcbiAgICAkKGBbZGF0YS1vcGVuPVwiJHtpZH1cIl0sIFtkYXRhLWNsb3NlPVwiJHtpZH1cIl0sIFtkYXRhLXRvZ2dsZT1cIiR7aWR9XCJdYClcbiAgICAgIC5hdHRyKCdhcmlhLWNvbnRyb2xzJywgaWQpO1xuICAgIC8vIElmIHRoZSB0YXJnZXQgaXMgaGlkZGVuLCBhZGQgYXJpYS1oaWRkZW5cbiAgICB0aGlzLiRlbGVtZW50LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0aGlzLiRlbGVtZW50LmlzKCc6aGlkZGVuJykgPyBmYWxzZSA6IHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGV2ZW50cyBmb3IgdGhlIHRvZ2dsZSB0cmlnZ2VyLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdGhpcy4kZWxlbWVudC5vZmYoJ3RvZ2dsZS56Zi50cmlnZ2VyJykub24oJ3RvZ2dsZS56Zi50cmlnZ2VyJywgdGhpcy50b2dnbGUuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgdGFyZ2V0IGNsYXNzIG9uIHRoZSB0YXJnZXQgZWxlbWVudC4gQW4gZXZlbnQgaXMgZmlyZWQgZnJvbSB0aGUgb3JpZ2luYWwgdHJpZ2dlciBkZXBlbmRpbmcgb24gaWYgdGhlIHJlc3VsdGFudCBzdGF0ZSB3YXMgXCJvblwiIG9yIFwib2ZmXCIuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgVG9nZ2xlciNvblxuICAgKiBAZmlyZXMgVG9nZ2xlciNvZmZcbiAgICovXG4gIHRvZ2dsZSgpIHtcbiAgICB0aGlzWyB0aGlzLm9wdGlvbnMuYW5pbWF0ZSA/ICdfdG9nZ2xlQW5pbWF0ZScgOiAnX3RvZ2dsZUNsYXNzJ10oKTtcbiAgfVxuXG4gIF90b2dnbGVDbGFzcygpIHtcbiAgICB0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMuY2xhc3NOYW1lKTtcblxuICAgIHZhciBpc09uID0gdGhpcy4kZWxlbWVudC5oYXNDbGFzcyh0aGlzLmNsYXNzTmFtZSk7XG4gICAgaWYgKGlzT24pIHtcbiAgICAgIC8qKlxuICAgICAgICogRmlyZXMgaWYgdGhlIHRhcmdldCBlbGVtZW50IGhhcyB0aGUgY2xhc3MgYWZ0ZXIgYSB0b2dnbGUuXG4gICAgICAgKiBAZXZlbnQgVG9nZ2xlciNvblxuICAgICAgICovXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ29uLnpmLnRvZ2dsZXInKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvKipcbiAgICAgICAqIEZpcmVzIGlmIHRoZSB0YXJnZXQgZWxlbWVudCBkb2VzIG5vdCBoYXZlIHRoZSBjbGFzcyBhZnRlciBhIHRvZ2dsZS5cbiAgICAgICAqIEBldmVudCBUb2dnbGVyI29mZlxuICAgICAgICovXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ29mZi56Zi50b2dnbGVyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlQVJJQShpc09uKTtcbiAgICB0aGlzLiRlbGVtZW50LmZpbmQoJ1tkYXRhLW11dGF0ZV0nKS50cmlnZ2VyKCdtdXRhdGVtZS56Zi50cmlnZ2VyJyk7XG4gIH1cblxuICBfdG9nZ2xlQW5pbWF0ZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuJGVsZW1lbnQuaXMoJzpoaWRkZW4nKSkge1xuICAgICAgRm91bmRhdGlvbi5Nb3Rpb24uYW5pbWF0ZUluKHRoaXMuJGVsZW1lbnQsIHRoaXMuYW5pbWF0aW9uSW4sIGZ1bmN0aW9uKCkge1xuICAgICAgICBfdGhpcy5fdXBkYXRlQVJJQSh0cnVlKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdvbi56Zi50b2dnbGVyJyk7XG4gICAgICAgIHRoaXMuZmluZCgnW2RhdGEtbXV0YXRlXScpLnRyaWdnZXIoJ211dGF0ZW1lLnpmLnRyaWdnZXInKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIEZvdW5kYXRpb24uTW90aW9uLmFuaW1hdGVPdXQodGhpcy4kZWxlbWVudCwgdGhpcy5hbmltYXRpb25PdXQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBfdGhpcy5fdXBkYXRlQVJJQShmYWxzZSk7XG4gICAgICAgIHRoaXMudHJpZ2dlcignb2ZmLnpmLnRvZ2dsZXInKTtcbiAgICAgICAgdGhpcy5maW5kKCdbZGF0YS1tdXRhdGVdJykudHJpZ2dlcignbXV0YXRlbWUuemYudHJpZ2dlcicpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUFSSUEoaXNPbikge1xuICAgIHRoaXMuJGVsZW1lbnQuYXR0cignYXJpYS1leHBhbmRlZCcsIGlzT24gPyB0cnVlIDogZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBpbnN0YW5jZSBvZiBUb2dnbGVyIG9uIHRoZSBlbGVtZW50LlxuICAgKiBAZnVuY3Rpb25cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4kZWxlbWVudC5vZmYoJy56Zi50b2dnbGVyJyk7XG4gICAgRm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpO1xuICB9XG59XG5cblRvZ2dsZXIuZGVmYXVsdHMgPSB7XG4gIC8qKlxuICAgKiBUZWxscyB0aGUgcGx1Z2luIGlmIHRoZSBlbGVtZW50IHNob3VsZCBhbmltYXRlZCB3aGVuIHRvZ2dsZWQuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBhbmltYXRlOiBmYWxzZVxufTtcblxuLy8gV2luZG93IGV4cG9ydHNcbkZvdW5kYXRpb24ucGx1Z2luKFRvZ2dsZXIsICdUb2dnbGVyJyk7XG5cbn0oalF1ZXJ5KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuIWZ1bmN0aW9uKCQpIHtcblxuLyoqXG4gKiBSZXNwb25zaXZlQWNjb3JkaW9uVGFicyBtb2R1bGUuXG4gKiBAbW9kdWxlIGZvdW5kYXRpb24ucmVzcG9uc2l2ZUFjY29yZGlvblRhYnNcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwua2V5Ym9hcmRcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwudGltZXJBbmRJbWFnZUxvYWRlclxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5tb3Rpb25cbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLmFjY29yZGlvblxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udGFic1xuICovXG5cbmNsYXNzIFJlc3BvbnNpdmVBY2NvcmRpb25UYWJzIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYSByZXNwb25zaXZlIGFjY29yZGlvbiB0YWJzLlxuICAgKiBAY2xhc3NcbiAgICogQGZpcmVzIFJlc3BvbnNpdmVBY2NvcmRpb25UYWJzI2luaXRcbiAgICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIG1ha2UgaW50byBhIGRyb3Bkb3duIG1lbnUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3ZlcnJpZGVzIHRvIHRoZSBkZWZhdWx0IHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICB0aGlzLm9wdGlvbnMgID0gJC5leHRlbmQoe30sIHRoaXMuJGVsZW1lbnQuZGF0YSgpLCBvcHRpb25zKTtcbiAgICB0aGlzLnJ1bGVzID0gdGhpcy4kZWxlbWVudC5kYXRhKCdyZXNwb25zaXZlLWFjY29yZGlvbi10YWJzJyk7XG4gICAgdGhpcy5jdXJyZW50TXEgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudFBsdWdpbiA9IG51bGw7XG4gICAgaWYgKCF0aGlzLiRlbGVtZW50LmF0dHIoJ2lkJykpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQuYXR0cignaWQnLEZvdW5kYXRpb24uR2V0WW9EaWdpdHMoNiwgJ3Jlc3BvbnNpdmVhY2NvcmRpb250YWJzJykpO1xuICAgIH07XG5cbiAgICB0aGlzLl9pbml0KCk7XG4gICAgdGhpcy5fZXZlbnRzKCk7XG5cbiAgICBGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsICdSZXNwb25zaXZlQWNjb3JkaW9uVGFicycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBNZW51IGJ5IHBhcnNpbmcgdGhlIGNsYXNzZXMgZnJvbSB0aGUgJ2RhdGEtcmVzcG9uc2l2ZS1hY2NvcmRpb24tdGFicycgYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIC8vIFRoZSBmaXJzdCB0aW1lIGFuIEludGVyY2hhbmdlIHBsdWdpbiBpcyBpbml0aWFsaXplZCwgdGhpcy5ydWxlcyBpcyBjb252ZXJ0ZWQgZnJvbSBhIHN0cmluZyBvZiBcImNsYXNzZXNcIiB0byBhbiBvYmplY3Qgb2YgcnVsZXNcbiAgICBpZiAodHlwZW9mIHRoaXMucnVsZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgcnVsZXNUcmVlID0ge307XG5cbiAgICAgIC8vIFBhcnNlIHJ1bGVzIGZyb20gXCJjbGFzc2VzXCIgcHVsbGVkIGZyb20gZGF0YSBhdHRyaWJ1dGVcbiAgICAgIGxldCBydWxlcyA9IHRoaXMucnVsZXMuc3BsaXQoJyAnKTtcblxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IHJ1bGUgZm91bmRcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHJ1bGUgPSBydWxlc1tpXS5zcGxpdCgnLScpO1xuICAgICAgICBsZXQgcnVsZVNpemUgPSBydWxlLmxlbmd0aCA+IDEgPyBydWxlWzBdIDogJ3NtYWxsJztcbiAgICAgICAgbGV0IHJ1bGVQbHVnaW4gPSBydWxlLmxlbmd0aCA+IDEgPyBydWxlWzFdIDogcnVsZVswXTtcblxuICAgICAgICBpZiAoTWVudVBsdWdpbnNbcnVsZVBsdWdpbl0gIT09IG51bGwpIHtcbiAgICAgICAgICBydWxlc1RyZWVbcnVsZVNpemVdID0gTWVudVBsdWdpbnNbcnVsZVBsdWdpbl07XG4gICAgICAgI
5763H1cbiAgICAgIH1cblxuICAgICAgdGhpcy5ydWxlcyA9IHJ1bGVzVHJlZTtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRBbGxPcHRpb25zKCk7XG5cbiAgICBpZiAoISQuaXNFbXB0eU9iamVjdCh0aGlzLnJ1bGVzKSkge1xuICAgICAgdGhpcy5fY2hlY2tNZWRpYVF1ZXJpZXMoKTtcbiAgICB9XG4gIH1cblxuICBfZ2V0QWxsT3B0aW9ucygpIHtcbiAgICAvL2dldCBhbGwgZGVmYXVsdHMgYW5kIG9wdGlvbnNcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLmFsbE9wdGlvbnMgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gTWVudVBsdWdpbnMpIHtcbiAgICAgIGlmIChNZW51UGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHZhciBvYmogPSBNZW51UGx1Z2luc1trZXldO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBkdW1teVBsdWdpbiA9ICQoJzx1bD48L3VsPicpO1xuICAgICAgICAgIHZhciB0bXBQbHVnaW4gPSBuZXcgb2JqLnBsdWdpbihkdW1teVBsdWdpbixfdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICBmb3IgKHZhciBrZXlLZXkgaW4gdG1wUGx1Z2luLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0bXBQbHVnaW4ub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXlLZXkpICYmIGtleUtleSAhPT0gJ3pmUGx1Z2luJykge1xuICAgICAgICAgICAgICB2YXIgb2JqT2JqID0gdG1wUGx1Z2luLm9wdGlvbnNba2V5S2V5XTtcbiAgICAgICAgICAgICAgX3RoaXMuYWxsT3B0aW9uc1trZXlLZXldID0gb2JqT2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0bXBQbHVnaW4uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBldmVudHMgZm9yIHRoZSBNZW51LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ldmVudHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICQod2luZG93KS5vbignY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5JywgZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5fY2hlY2tNZWRpYVF1ZXJpZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIGN1cnJlbnQgc2NyZWVuIHdpZHRoIGFnYWluc3QgYXZhaWxhYmxlIG1lZGlhIHF1ZXJpZXMuIElmIHRoZSBtZWRpYSBxdWVyeSBoYXMgY2hhbmdlZCwgYW5kIHRoZSBwbHVnaW4gbmVlZGVkIGhhcyBjaGFuZ2VkLCB0aGUgcGx1Z2lucyB3aWxsIHN3YXAgb3V0LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja01lZGlhUXVlcmllcygpIHtcbiAgICB2YXIgbWF0Y2hlZE1xLCBfdGhpcyA9IHRoaXM7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcnVsZSBhbmQgZmluZCB0aGUgbGFzdCBtYXRjaGluZyBydWxlXG4gICAgJC5lYWNoKHRoaXMucnVsZXMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgaWYgKEZvdW5kYXRpb24uTWVkaWFRdWVyeS5hdExlYXN0KGtleSkpIHtcbiAgICAgICAgbWF0Y2hlZE1xID0ga2V5O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTm8gbWF0Y2g/IE5vIGRpY2VcbiAgICBpZiAoIW1hdGNoZWRNcSkgcmV0dXJuO1xuXG4gICAgLy8gUGx1Z2luIGFscmVhZHkgaW5pdGlhbGl6ZWQ/IFdlIGdvb2RcbiAgICBpZiAodGhpcy5jdXJyZW50UGx1Z2luIGluc3RhbmNlb2YgdGhpcy5ydWxlc1ttYXRjaGVkTXFdLnBsdWdpbikgcmV0dXJuO1xuXG4gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHBsdWdpbi1zcGVjaWZpYyBDU1MgY2xhc3Nlc1xuICAgICQuZWFjaChNZW51UGx1Z2lucywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgX3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModmFsdWUuY3NzQ2xhc3MpO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIHRoZSBDU1MgY2xhc3MgZm9yIHRoZSBuZXcgcGx1Z2luXG4gICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcyh0aGlzLnJ1bGVzW21hdGNoZWRNcV0uY3NzQ2xhc3MpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBuZXcgcGx1Z2luXG4gICAgaWYgKHRoaXMuY3VycmVudFBsdWdpbikge1xuICAgICAgLy9kb24ndCBrbm93IHdoeSBidXQgb24gbmVzdGVkIGVsZW1lbnRzIGRhdGEgemZQbHVnaW4gZ2V0J3MgbG9zdFxuICAgICAgaWYgKCF0aGlzLmN1cnJlbnRQbHVnaW4uJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nKSAmJiB0aGlzLnN0b3JlemZEYXRhKSB0aGlzLmN1cnJlbnRQbHVnaW4uJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nLHRoaXMuc3RvcmV6ZkRhdGEpO1xuICAgICAgdGhpcy5jdXJyZW50UGx1Z2luLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5faGFuZGxlTWFya3VwKHRoaXMucnVsZXNbbWF0Y2hlZE1xXS5jc3NDbGFzcyk7XG4gICAgdGhpcy5jdXJyZW50UGx1Z2luID0gbmV3IHRoaXMucnVsZXNbbWF0Y2hlZE1xXS5wbHVnaW4odGhpcy4kZWxlbWVudCwge30pO1xuICAgIHRoaXMuc3RvcmV6ZkRhdGEgPSB0aGlzLmN1cnJlbnRQbHVnaW4uJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nKTtcblxuICB9XG5cbiAgX2hhbmRsZU1hcmt1cCh0b1NldCl7XG4gICAgdmFyIF90aGlzID0gdGhpcywgZnJvbVN0cmluZyA9ICdhY2NvcmRpb24nO1xuICAgIHZhciAkcGFuZWxzID0gJCgnW2RhdGEtdGFicy1jb250ZW50PScrdGhpcy4kZWxlbWVudC5hdHRyKCdpZCcpKyddJyk7XG4gICAgaWYgKCRwYW5lbHMubGVuZ3RoKSBmcm9tU3RyaW5nID0gJ3RhYnMnO1xuICAgIGlmIChmcm9tU3RyaW5nID09PSB0b1NldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH07XG5cbiAgICB2YXIgdGFic1RpdGxlID0gX3RoaXMuYWxsT3B0aW9ucy5saW5rQ2xhc3M/X3RoaXMuYWxsT3B0aW9ucy5saW5rQ2xhc3M6J3RhYnMtdGl0bGUnO1xuICAgIHZhciB0YWJzUGFuZWwgPSBfdGhpcy5hbGxPcHRpb25zLnBhbmVsQ2xhc3M/X3RoaXMuYWxsT3B0aW9ucy5wYW5lbENsYXNzOid0YWJzLXBhbmVsJztcblxuICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQXR0cigncm9sZScpO1xuICAgIHZhciAkbGlIZWFkcyA9IHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oJy4nK3RhYnNUaXRsZSsnLFtkYXRhLWFjY29yZGlvbi1pdGVtXScpLnJlbW92ZUNsYXNzKHRhYnNUaXRsZSkucmVtb3ZlQ2xhc3MoJ2FjY29yZGlvbi1pdGVtJykucmVtb3ZlQXR0cignZGF0YS1hY2NvcmRpb24taXRlbScpO1xuICAgIHZhciAkbGlIZWFkc0EgPSAkbGlIZWFkcy5jaGlsZHJlbignYScpLnJlbW92ZUNsYXNzKCdhY2NvcmRpb24tdGl0bGUnKTtcblxuICAgIGlmIChmcm9tU3RyaW5nID09PSAndGFicycpIHtcbiAgICAgICRwYW5lbHMgPSAkcGFuZWxzLmNoaWxkcmVuKCcuJyt0YWJzUGFuZWwpLnJlbW92ZUNsYXNzKHRhYnNQYW5lbCkucmVtb3ZlQXR0cigncm9sZScpLnJlbW92ZUF0dHIoJ2FyaWEtaGlkZGVuJykucmVtb3ZlQXR0cignYXJpYS1sYWJlbGxlZGJ5Jyk7XG4gICAgICAkcGFuZWxzLmNoaWxkcmVuKCdhJykucmVtb3ZlQXR0cigncm9sZScpLnJlbW92ZUF0dHIoJ2FyaWEtY29udHJvbHMnKS5yZW1vdmVBdHRyKCdhcmlhLXNlbGVjdGVkJyk7XG4gICAgfWVsc2V7XG4gICAgICAkcGFuZWxzID0gJGxpSGVhZHMuY2hpbGRyZW4oJ1tkYXRhLXRhYi1jb250ZW50XScpLnJlbW92ZUNsYXNzKCdhY2NvcmRpb24tY29udGVudCcpO1xuICAgIH07XG5cbiAgICAkcGFuZWxzLmNzcyh7ZGlzcGxheTonJyx2aXNpYmlsaXR5OicnfSk7XG4gICAgJGxpSGVhZHMuY3NzKHtkaXNwbGF5OicnLHZpc2liaWxpdHk6Jyd9KTtcbiAgICBpZiAodG9TZXQgPT09ICdhY2NvcmRpb24nKSB7XG4gICAgICAkcGFuZWxzLmVhY2goZnVuY3Rpb24oa2V5LHZhbHVlKXtcbiAgICAgICAgJCh2YWx1ZSkuYXBwZW5kVG8oJGxpSGVhZHMuZ2V0KGtleSkpLmFkZENsYXNzKCdhY2NvcmRpb24tY29udGVudCcpLmF0dHIoJ2RhdGEtdGFiLWNvbnRlbnQnLCcnKS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJykuY3NzKHtoZWlnaHQ6Jyd9KTtcbiAgICAgICAgJCgnW2RhdGEtdGFicy1jb250ZW50PScrX3RoaXMuJGVsZW1lbnQuYXR0cignaWQnKSsnXScpLmFmdGVyKCc8ZGl2IGlkPVwidGFicy1wbGFjZWhvbGRlci0nK190aGlzLiRlbGVtZW50LmF0dHIoJ2lkJykrJ1wiPjwvZGl2PicpLnJlbW92ZSgpO1xuICAgICAgICAkbGlIZWFkcy5hZGRDbGFzcygnYWNjb3JkaW9uLWl0ZW0nKS5hdHRyKCdkYXRhLWFjY29yZGlvbi1pdGVtJywnJyk7XG4gICAgICAgICRsaUhlYWRzQS5hZGRDbGFzcygnYWNjb3JkaW9uLXRpdGxlJyk7XG4gICAgICB9KTtcbiAgICB9ZWxzZSBpZiAodG9TZXQgPT09ICd0YWJzJyl7XG4gICAgICB2Y
5763XIgJHRhYnNDb250ZW50ID0gJCgnW2RhdGEtdGFicy1jb250ZW50PScrX3RoaXMuJGVsZW1lbnQuYXR0cignaWQnKSsnXScpO1xuICAgICAgdmFyICRwbGFjZWhvbGRlciA9ICQoJyN0YWJzLXBsYWNlaG9sZGVyLScrX3RoaXMuJGVsZW1lbnQuYXR0cignaWQnKSk7XG4gICAgICBpZiAoJHBsYWNlaG9sZGVyLmxlbmd0aCkge1xuICAgICAgICAkdGFic0NvbnRlbnQgPSAkKCc8ZGl2IGNsYXNzPVwidGFicy1jb250ZW50XCI+PC9kaXY+JykuaW5zZXJ0QWZ0ZXIoJHBsYWNlaG9sZGVyKS5hdHRyKCdkYXRhLXRhYnMtY29udGVudCcsX3RoaXMuJGVsZW1lbnQuYXR0cignaWQnKSk7XG4gICAgICAgICRwbGFjZWhvbGRlci5yZW1vdmUoKTtcbiAgICAgIH1lbHNle1xuICAgICAgICAkdGFic0NvbnRlbnQgPSAkKCc8ZGl2IGNsYXNzPVwidGFicy1jb250ZW50XCI+PC9kaXY+JykuaW5zZXJ0QWZ0ZXIoX3RoaXMuJGVsZW1lbnQpLmF0dHIoJ2RhdGEtdGFicy1jb250ZW50JyxfdGhpcy4kZWxlbWVudC5hdHRyKCdpZCcpKTtcbiAgICAgIH07XG4gICAgICAkcGFuZWxzLmVhY2goZnVuY3Rpb24oa2V5LHZhbHVlKXtcbiAgICAgICAgdmFyIHRlbXBWYWx1ZSA9ICQodmFsdWUpLmFwcGVuZFRvKCR0YWJzQ29udGVudCkuYWRkQ2xhc3ModGFic1BhbmVsKTtcbiAgICAgICAgdmFyIGhhc2ggPSAkbGlIZWFkc0EuZ2V0KGtleSkuaGFzaC5zbGljZSgxKTtcbiAgICAgICAgdmFyIGlkID0gJCh2YWx1ZSkuYXR0cignaWQnKSB8fCBGb3VuZGF0aW9uLkdldFlvRGlnaXRzKDYsICdhY2NvcmRpb24nKTtcbiAgICAgICAgaWYgKGhhc2ggIT09IGlkKSB7XG4gICAgICAgICAgaWYgKGhhc2ggIT09ICcnKSB7XG4gICAgICAgICAgICAkKHZhbHVlKS5hdHRyKCdpZCcsaGFzaCk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBoYXNoID0gaWQ7XG4gICAgICAgICAgICAkKHZhbHVlKS5hdHRyKCdpZCcsaGFzaCk7XG4gICAgICAgICAgICAkKCRsaUhlYWRzQS5nZXQoa2V5KSkuYXR0cignaHJlZicsJCgkbGlIZWFkc0EuZ2V0KGtleSkpLmF0dHIoJ2hyZWYnKS5yZXBsYWNlKCcjJywnJykrJyMnK2hhc2gpO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHZhciBpc0FjdGl2ZSA9ICQoJGxpSGVhZHMuZ2V0KGtleSkpLmhhc0NsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgdGVtcFZhbHVlLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgJGxpSGVhZHMuYWRkQ2xhc3ModGFic1RpdGxlKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBwbHVnaW4gb24gdGhpcyBlbGVtZW50LCBhcyB3ZWxsIGFzIHRoZSB3aW5kb3cgcmVzaXplIGhhbmRsZXIgdGhhdCBzd2l0Y2hlcyB0aGUgcGx1Z2lucyBvdXQuXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGx1Z2luKSB0aGlzLmN1cnJlbnRQbHVnaW4uZGVzdHJveSgpO1xuICAgICQod2luZG93KS5vZmYoJy56Zi5SZXNwb25zaXZlQWNjb3JkaW9uVGFicycpO1xuICAgIEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKTtcbiAgfVxufVxuXG5SZXNwb25zaXZlQWNjb3JkaW9uVGFicy5kZWZhdWx0cyA9IHt9O1xuXG4vLyBUaGUgcGx1Z2luIG1hdGNoZXMgdGhlIHBsdWdpbiBjbGFzc2VzIHdpdGggdGhlc2UgcGx1Z2luIGluc3RhbmNlcy5cbnZhciBNZW51UGx1Z2lucyA9IHtcbiAgdGFiczoge1xuICAgIGNzc0NsYXNzOiAndGFicycsXG4gICAgcGx1Z2luOiBGb3VuZGF0aW9uLl9wbHVnaW5zLnRhYnMgfHwgbnVsbFxuICB9LFxuICBhY2NvcmRpb246IHtcbiAgICBjc3NDbGFzczogJ2FjY29yZGlvbicsXG4gICAgcGx1Z2luOiBGb3VuZGF0aW9uLl9wbHVnaW5zLmFjY29yZGlvbiB8fCBudWxsXG4gIH1cbn07XG5cbi8vIFdpbmRvdyBleHBvcnRzXG5Gb3VuZGF0aW9uLnBsdWdpbihSZXNwb25zaXZlQWNjb3JkaW9uVGFicywgJ1Jlc3BvbnNpdmVBY2NvcmRpb25UYWJzJyk7XG5cbn0oalF1ZXJ5KTtcbiIsIiQoZG9jdW1lbnQpLmZvdW5kYXRpb24oKTtcblxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7XG5cbiAgLy8gU2Nyb2xsIHRvIHRvcCBvZiBhY2NvcmRpb24gaXRlbSB3aGVuIGFjdGl2ZVxuICBpZiAodHlwZW9mIHRoZW1lQWNjb3JkaW9uSXRlbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhlbWVBY2NvcmRpb25JdGVtKCcuYWNjb3JkaW9uJyk7XG4gIH1cblxuICAvLyBCYWNrIHRvIHJlc3VsdHNcbiAgaWYgKHR5cGVvZiB0aGVtZUJhY2tUb1Jlc3VsdHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRoZW1lQmFja1RvUmVzdWx0cygnLmpzLWJhY2stdG8tcmVzdWx0cycpO1xuICB9XG5cbiAgLy8gQ29va2llIHBvbGljeVxuICBpZiAodHlwZW9mIHRoZW1lQ29va2llUG9saWN5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aGVtZUNvb2tpZVBvbGljeSgpO1xuICB9XG5cbiAgLy8gRGVwYXJ0bWVudCBzZWxlY3Rpb24gZm9yIG9wZW5pbmcgaG91cnNcbiAgaWYgKHR5cGVvZiB0aGVtZURlcGFydG1lbnRPcGVuaW5nSG91cnMgPT09IFwiZnVuY3Rpb25cIiAmJiAoJCgnLmJyYW5jaC0tdGVhc2VyJykubGVuZ3RoIHx8ICQoJy5icmFuY2gtLWZ1bGwnKS5sZW5ndGgpKSB7XG4gICAgdGhlbWVEZXBhcnRtZW50T3BlbmluZ0hvdXJzKCk7XG4gIH1cblxuICAvLyBBZGRzIGEgcmVhZCBtb3JlIGxpbmsgaWYgZGl2IG92ZXIgYSBjZXJ0YWluIGhlaWdodFxuICBpZiAodHlwZW9mIHRoZW1lRXhwYW5kID09PSBcImZ1bmN0aW9uXCIgJiYgRm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmN1cnJlbnQgPT0gJ3NtYWxsJykge1xuICAgIHRoZW1lRXhwYW5kKCcucGFnZS0taG9tZSAucGFnZV9fZGVzY3JpcHRpb24sIC52ZWhpY2xlLS1mdWxsIC52ZWhpY2xlX19kZXNjcmlwdGlvbicsMzAwKTtcbiAgfVxuXG4gIC8vIENsaWNrIG91dHNpZGUgdG8gY2xvc2UgdG9nZ2xlclxuICBpZiAodHlwZW9mIHRoZW1lQ2xvc2VUb2dnbGVyID09PSBcImZ1bmN0aW9uXCIgJiYgJCgnI3NlYXJjaCcpLmxlbmd0aCAmJiAhRm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmF0TGVhc3QoJ2xhcmdlJykpIHtcbiAgICB0aGVtZUNsb3NlVG9nZ2xlcign
5763I3NlYXJjaCcpO1xuICB9XG5cbiAgLy8gU3dhcCBwcmljZXMgaWYgc2VhcmNoaW5nIGJ5IG1vbnRobHkgcHJpY2Ugb24gdmVoaWNsZSByZXN1bHRzXG4gIGlmICh0eXBlb2YgdGhlbWVTd2FwUHJpY2VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aGVtZVN3YXBQcmljZXMoKTtcbiAgfVxuXG4gIC8vIEVuc3VyZXMgaW1hZ2VzIGxvYWQgaW4gdGFicyBvbiB2ZWhpY2xlIGRldGFpbHMgaWYgdmlkZW8gcHJlc2VudFxuICBpZiAodHlwZW9mIHRoZW1lVGFic1ZpZGVvID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aGVtZVRhYnNWaWRlbygpO1xuICB9XG5cbiAgLy8gRW5zdXJlcyBtYXAgbG9hZHMgaW4gdGFicyBvbiB2ZWhpY2xlIGRldGFpbHNcbiAgaWYgKHR5cGVvZiB0aGVtZVRhYnNNYXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRoZW1lVGFic01hcCgpO1xuICB9XG5cbiAgLy8gRmFuY3lib3ggbGlnaHRib3hcbiAgJChcIltkYXRhLWZhbmN5Ym94XVwiKS5mYW5jeWJveCgpO1xuXG4gIC8vIFNsaWNrIGNhcm91c2VsXG4gICQoJy5wYWdlX19wcmltYXJ5LWltYWdlcyA+IHVsLCAucG9zdF9fcHJpbWFyeS1pbWFnZXMgPiB1bCwgLmN1c3RvbS1lbnRyeV9fcHJpbWFyeS1pbWFnZXMgPiB1bCwgLmJyYW5jaF9fcHJpbWFyeS1pbWFnZXMgPiB1bCcpLnNsaWNrKHtcbiAgICBhdXRvcGxheTogdHJ1ZSxcbiAgICBhdXRvcGxheVNwZWVkOiAxMDAwMCxcbiAgICBpbmZpbml0ZTogdHJ1ZVxuICB9KTtcbiAgJCgnLnBhZ2VfX3NlY29uZGFyeS1pbWFnZXMgPiB1bCwgLnBvc3RfX3NlY29uZGFyeS1pbWFnZXMgPiB1bCwgLmN1c3RvbS1lbnRyeV9fc2Vjb25kYXJ5LWltYWdlcyA+IHVsLCAuYnJhbmNoX19zZWNvbmRhcnktaW1hZ2VzID4gdWwsIC5icmFuY2hfX2xvZ29zID4gdWwnKS5zbGljayh7XG4gICAgaW5maW5pdGU6IGZhbHNlXG4gIH0pO1xuICBpZiAoRm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmN1cnJlbnQgPT0gJ3NtYWxsJykge1xuICAgICQoJy5saXN0aW5nLS1ibG9jayA+IHVsJykuc2xpY2soe1xuICAgICAgc2xpZGVzVG9TaG93OiAxLFxuICAgICAgaW5maW5pdGU6IGZhbHNlXG4gICAgfSk7XG4gIH1cbiAgJCgnLmxpc3RpbmctLXZlaGljbGUtY29tcGFyZSAubGlzdGluZ19fbGlzdCcpLnNsaWNrKHtcbiAgICBzbGlkZXNUb1Nob3c6IDEsXG4gICAgaW5maW5pdGU6IGZhbHNlLFxuICAgIG1vYmlsZUZpcnN0OiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICBicmVha3BvaW50OiA2MzksXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBzbGlkZXNUb1Nob3c6IDJcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBicmVha3BvaW50OiAxMDIzLFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgc2xpZGVzVG9TaG93OiA0XG4gICAgICB9XG4gICAgfV1cbiAgfSk7XG4gICQoJy5saXN0aW5nLS12ZWhpY2xlLWZlYXR1cmVkID4gdWwsIC5saXN0aW5nLS12ZWhpY2xlLWxhdGVzdCA+IHVsLCAubGlzdGluZy0tdmVoaWNsZS1zaW1pbGFyID4gdWwnKS5zbGljayh7XG4gICAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gICAgc2xpZGVzVG9TaG93OiAxLFxuICAgIGluZmluaXRlOiBmYWxzZSxcbiAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICByZXNwb25zaXZlOiBbe1xuICAgICAgYnJlYWtwb2ludDogNjM5LFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgc2xpZGVzVG9TaG93OiAyXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgYnJlYWtwb2ludDogMTAyMyxcbiAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgIHNsaWRlc1RvU2hvdzogM1xuICAgICAgfVxuICAgIH1dXG4gIH0pO1xuICAkKCcubGlzdGluZy0tdmVoaWNsZS1mZWF0dXJlZC1zaWRlYmFyID4gdWwsIC5saXN0aW5nLS12ZWhpY2xlLWxhdGVzdC1zaWRlYmFyID4gdWwnKS5zbGljayh7XG4gICAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gICAgc2xpZGVzVG9TaG93OiAxLFxuICAgIGluZmluaXRlOiBmYWxzZVxuICB9KTtcbiAgJCgnLnZlaGljbGUtLWZ1bGwgLnZlaGljbGVfX3ByaW1hcnktaW1hZ2VzID4gdWwnKS5zbGljayh7XG4gICAgc2xpZGVzVG9TaG93OiAxLFxuICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgIGFkYXB0aXZlSGVpZ2h0OiB0cnVlLFxuICAgIGluZmluaXRlOiBmYWxzZSxcbiAgICBhc05hdkZvcjogJy52ZWhpY2xlX19wcmltYXJ5LWltYWdlcy10aHVtYm5haWxzID4gdWwnXG4gIH0pO1xuICAkKCcudmVoaWNsZS0tZnVsbCAudmVoaWNsZV9fcHJpbWFyeS1pbWFnZXMtdGh1bWJuYWlscyA+IHVsJykuc2xpY2soe1xuICAgIHNsaWRlc1RvU2hvdzogNCxcbiAgICBzbGlkZXNUb1Njcm9sbDogNCxcbiAgICBmb2N1c09uU2VsZWN0OiB0cnVlLFxuICAgIGluZmluaXRlOiBmYWxzZSxcbiAgICBhc05hdkZvcjogJy52ZWhpY2xlX19wcmltYXJ5LWltYWdlcyA+IHVsJyxcbiAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICByZXNwb25zaXZlOiBbe1xuICAgICAgYnJlYWtwb2ludDogNzY3LFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgc2xpZGVzVG9TaG93OiAzLFxuICAgICAgICBzbGlkZXNUb1Njcm9sbDogM1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGJyZWFrcG9pbnQ6IDEwMjMsXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBzbGlkZXNUb1Nob3c6IDUsXG4gICAgICAgIHNsaWRlc1RvU2Nyb2xsOiA1XG4gICAgICB9XG4gICAgfV1cbiAgfSk7XG4gICQoJy52ZWhpY2xlLS1mdWxsIC52ZWhpY2xlX19zZWNvbmRhcnktaW1hZ2VzIHVsJykuc2xpY2soe1xuICAgIHNsaWRlc1RvU2hvdzogMSxcbiAgICBpbmZpbml0ZTogZmFsc2UsXG4gICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgcmVzcG9uc2l2ZTogW3tcbiAgICAgIGJyZWFrcG9pbnQ6IDYzOSxcbiAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgIHNsaWRlc1RvU2hvdzogMlxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGJyZWFrcG9pbnQ6IDEwMjMsXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBzbGlkZXNUb1Nob3c6IDNcbiAgICAgIH1cbiAgICB9XVxuICB9KTtcblxuICAvLyBTd2lwZSB0byBjbG9zZSB0b2dnbGVyXG4gIGlmICgkKCcjc2VhcmNoJykubGVuZ3RoICYmICFGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCgnbGFyZ2UnKSkge1xuICAgICQoJyNzZWFyY2gnKS5zd2lwZSh7XG4gICAgICBzd2lwZUxlZnQ6IGZ1bmN0aW9uKGV2ZW50LCBkaXJlY3Rpb24sIGRpc3RhbmNlLCBkdXJhdGlvbiwgZmluZ2VyQ291bnQsIGZpbmdlckRhdGEpIHtcbiAgICAgICAgJCh0aGlzKS5mb3VuZGF0aW9uKCd0b2dnbGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFZlaGljbGUgcmVzdWx0cyBmaW5hbmNlIGZvcm0gdG9nZ2xlXG4gIGlmICgkKFwiLmxpc3RpbmdfX2FkanVzdC1maW5hbmNlIGFcIikubGVuZ3RoKSB7XG4gICAgJChcIi5saXN0aW5nX19hZGp1c3QtZmluYW5jZSBhXCIpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgJCh0aGlzKS5wYXJlbnQoXCIubGlzdGluZ19fYWRqdXN0LWZpbmFuY2VcIikubmV4dChcIi5saXN0aW5nX19maW5hbmNlLWZvcm1cIikuc2xpZGVUb2dnbGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIE9wZW4gcmV2ZWFsIGVtYWlsIHZlaGljbGUgZm9ybSBmcm9tIHVybCBoYXNoIG9uIHZlaGljbGUgZGV0YWlsc1xuICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggJiYgd2luZG93LmxvY2F0aW9uLmhhc2ggPT0gJyNlbWFpbC12ZWhpY2xlJykge1xuICAgICQoJyNlbWFpbC12ZWhpY2xlJykuZm91bmRhdGlvbignb3BlbicpO1xuICB9XG5cbn0pO1xuXG4vLyBWZWhpY2xlIHNlYXJjaCBvcHRpb25zIHRvZ2dsZSBsaW1pdFxudmFyIFNlYXJjaEJhck9wdGlvbnNMaW1pdFRvID0gNTtcblxuLy8gRnVuY3Rpb25zIGxvYWRlZCBhZnRlciBzZWFyY2ggZmlsdGVycyB1cGRhdGVkIG9uIHZlaGljbGUgcmVzdWx0c1xudmFyIGFmdGVyUmVsb2FkRGVhbGVyID0gZnVuY3Rpb24oKSB7XG4gIC8vIFN3YXAgcHJpY2VzIGlmIHNlYXJjaGluZyBieSBtb250aGx5IHByaWNlIG9uIHZlaGljbGUgcmVzdWx0c1xuICBpZiAodHlwZW9mIHRoZW1lU3dhcFByaWNlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhlbWVTd2FwUHJpY2VzKCk7XG4gIH1cbn1cblxuLy8gRGlzYWJsZSBmYW5jeWJveCBsaWdodGJveCBoYXNoIG1vZHVsZVxuJC5mYW5jeWJveC5kZWZhdWx0cy5oYXNoID0gZmFsc2U7XG4iXX0=
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.