{"version":3,"sources":["slider.js"],"names":["e","t","n","r","s","o","u","a","require","i","Error","f","exports","call","length","1","module","_typeof","obj","Symbol","iterator","constructor","prototype","_glide","__esModule","default","cache","_getRequireWildcardCache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","hasOwnProperty","desc","set","_interopRequireWildcard","WeakMap","window","NodeList","forEach","Array","Slider","init","elem","type","autoplay","hoverpause","animationDuration","animationTimingFunc","mount","Anchors","Autoplay","Controls","Images","Keyboard","Breakpoints","Swipe","resize","slider","image","querySelector","arrows","arrowsHeight","firstElementChild","getBoundingClientRect","height","newPos","style","top","addEventListener","document","querySelectorAll","./vendor/glide.js","2","_typeof2","value","Glide","Components","Events","Binder","EventsBinder","swipeSin","swipeStartX","swipeStartY","disabled","capture","supportsPassive$1","passive","this","bindSwipeStart","start","event","disable","swipe","touches","toInt","pageX","pageY","bindSwipeMove","bindSwipeEnd","emit","move","_Glide$settings","settings","touchAngle","touchRatio","classes","subExSx","subEySy","powEX","Math","abs","powEY","swipeHypotenuse","sqrt","swipeCathetus","asin","PI","stopPropagation","Move","make","parseFloat","Html","root","classList","add","dragging","end","_Glide$settings2","perSwipe","threshold","swipeDistance","swipeDeg","enable","Run","Direction","resolve","remove","unbindSwipeMove","unbindSwipeEnd","_this","_Glide$settings3","swipeThreshold","dragThreshold","on","START_EVENTS","wrapper","unbindSwipeStart","off","_this2","MOVE_EVENTS","throttle","_this3","END_EVENTS","MOUSE_EVENTS","indexOf","changedTouches","Transition","swipeable","destroy","bind","dragstart","unbind","preventDefault","detached","prevented","_a","click","detach","items","draggable","setAttribute","getAttribute","removeAttribute","attach","define","after","_n","_c","addBindings","setActive","addClass","children","removeActive","removeClass","controls","item","index","nav","active","siblings","sibling","removeBindings","elements","currentTarget","keyboard","press","keyCode","isUndefined","_i","setInterval","stop","time","clearInterval","slides","points","sortBreakpoints","breakpoints","defaults","_extends","match","matchMedia","point","matches","mergeOptions","startAt","perView","focusAt","gap","bound","rewind","rewindDuration","waitForTransition","direction","peek","ltr","rtl","carousel","slide","clone","arrow","warn","msg","console","error","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","target","props","descriptor","enumerable","configurable","writable","protoProps","staticProps","assign","arguments","source","object","property","receiver","Function","undefined","parent","getPrototypeOf","getter","possibleConstructorReturn","self","ReferenceError","parseInt","isString","isObject","isFunction","isArray","glide","extensions","events","components","name","_name","prop","definition","options","EventsBus","hop","handler","push","context","selector","_t","_e","transformers","pattern","distance","interval","_o","_d","status","now","Date","getTime","func","wait","timeout","args","result","previous","later","leading","apply","throttled","at","remaining","clearTimeout","trailing","setTimeout","cancel","MARGIN_TYPE","node","parentNode","firstChild","matched","nextSibling","nodeType","exist","HTMLElement","listeners","el","closure","removeEventListener","VALID_DIRECTIONS","FLIPED_MOVEMENTS",">","<","=","Rtl","modify","translate","is","Gap","multiplier","floor","Sizes","slideWidth","Gaps","Grow","Clones","grow","Peeking","Peek","before","Focusing","width","supportsPassive","opts","keys","sort","reduce","k","COMPONENTS","track","slice","filter","contains","_r","Translate","transform","TRANSFORMERS","concat","mutate","transformer","mutator","getStartIndex","isOffset","getTravelDistance","travelDistance","isType","movement","startWidth","compose","duration","transition","callback","offset","token","split","join","_v","setupSlides","setupWrapper","wrapperSize","offsetWidth","reductor","len","marginLeft","marginRight","collect","peekIncrementer","cloneCount","round","append","reverse","prepend","max","cloneNode","_clone","unshift","_Components$Html","half","appendChild","_i2","insertBefore","_i3","removeChild","Resize","Build","typeClass","activeClass","removeClasses","_Glide$settings$class","calculate","isStart","isEnd","steps","viewSize","calculateForwardIndex","isBound","normalizeForwardIndex","_index","ceil","calculateBackwardIndex","normalizeBackwardIndex","_m","step","substr","_default","_Core","Glide$$1","__proto__","subClass","superClass","create","setPrototypeOf","inherits"],"mappings":"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","file":"slider.min.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o (http://jedrzejchalubek.com/)\n * Released under the MIT License.\n */\nvar defaults = {\n /**\n * Type of the movement.\n *\n * Available types:\n * `slider` - Rewinds slider to the start/end when it reaches the first or last slide.\n * `carousel` - Changes slides without starting over when it reaches the first or last slide.\n *\n * @type {String}\n */\n type: 'slider',\n\n /**\n * Start at specific slide number defined with zero-based index.\n *\n * @type {Number}\n */\n startAt: 0,\n\n /**\n * A number of slides visible on the single viewport.\n *\n * @type {Number}\n */\n perView: 1,\n\n /**\n * Focus currently active slide at a specified position in the track.\n *\n * Available inputs:\n * `center` - Current slide will be always focused at the center of a track.\n * `0,1,2,3...` - Current slide will be focused on the specified zero-based index.\n *\n * @type {String|Number}\n */\n focusAt: 0,\n\n /**\n * A size of the gap added between slides.\n *\n * @type {Number}\n */\n gap: 10,\n\n /**\n * Change slides after a specified interval. Use `false` for turning off autoplay.\n *\n * @type {Number|Boolean}\n */\n autoplay: false,\n\n /**\n * Stop autoplay on mouseover event.\n *\n * @type {Boolean}\n */\n hoverpause: true,\n\n /**\n * Allow for changing slides with left and right keyboard arrows.\n *\n * @type {Boolean}\n */\n keyboard: true,\n\n /**\n * Stop running `perView` number of slides from the end. Use this\n * option if you don't want to have an empty space after\n * a slider. Works only with `slider` type and a\n * non-centered `focusAt` setting.\n *\n * @type {Boolean}\n */\n bound: false,\n\n /**\n * Minimal swipe distance needed to change the slide. Use `false` for turning off a swiping.\n *\n * @type {Number|Boolean}\n */\n swipeThreshold: 80,\n\n /**\n * Minimal mouse drag distance needed to change the slide. Use `false` for turning off a dragging.\n *\n * @type {Number|Boolean}\n */\n dragThreshold: 120,\n\n /**\n * A number of slides moved on single swipe.\n *\n * Available types:\n * `` - Moves slider by one slide per swipe\n * `|` - Moves slider between views per swipe (number of slides defined in `perView` options)\n *\n * @type {String}\n */\n perSwipe: '|',\n\n /**\n * Moving distance ratio of the slides on a swiping and dragging.\n *\n * @type {Number}\n */\n touchRatio: 0.5,\n\n /**\n * Angle required to activate slides moving on swiping or dragging.\n *\n * @type {Number}\n */\n touchAngle: 45,\n\n /**\n * Duration of the animation in milliseconds.\n *\n * @type {Number}\n */\n animationDuration: 400,\n\n /**\n * Allows looping the `slider` type. Slider will rewind to the first/last slide when it's at the start/end.\n *\n * @type {Boolean}\n */\n rewind: true,\n\n /**\n * Duration of the rewinding animation of the `slider` type in milliseconds.\n *\n * @type {Number}\n */\n rewindDuration: 800,\n\n /**\n * Easing function for the animation.\n *\n * @type {String}\n */\n animationTimingFunc: 'cubic-bezier(.165, .840, .440, 1)',\n\n /**\n * Wait for the animation to finish until the next user input can be processed\n *\n * @type {boolean}\n */\n waitForTransition: true,\n\n /**\n * Throttle costly events at most once per every wait milliseconds.\n *\n * @type {Number}\n */\n throttle: 10,\n\n /**\n * Moving direction mode.\n *\n * Available inputs:\n * - 'ltr' - left to right movement,\n * - 'rtl' - right to left movement.\n *\n * @type {String}\n */\n direction: 'ltr',\n\n /**\n * The distance value of the next and previous viewports which\n * have to peek in the current view. Accepts number and\n * pixels as a string. Left and right peeking can be\n * set up separately with a directions object.\n *\n * For example:\n * `100` - Peek 100px on the both sides.\n * { before: 100, after: 50 }` - Peek 100px on the left side and 50px on the right side.\n *\n * @type {Number|String|Object}\n */\n peek: 0,\n\n /**\n * Collection of options applied at specified media breakpoints.\n * For example: display two slides per view under 800px.\n * `{\n * '800px': {\n * perView: 2\n * }\n * }`\n */\n breakpoints: {},\n\n /**\n * Collection of internally used HTML classes.\n *\n * @todo Refactor `slider` and `carousel` properties to single `type: { slider: '', carousel: '' }` object\n * @type {Object}\n */\n classes: {\n swipeable: 'glide--swipeable',\n dragging: 'glide--dragging',\n direction: {\n ltr: 'glide--ltr',\n rtl: 'glide--rtl'\n },\n type: {\n slider: 'glide--slider',\n carousel: 'glide--carousel'\n },\n slide: {\n clone: 'glide__slide--clone',\n active: 'glide__slide--active'\n },\n arrow: {\n disabled: 'glide__arrow--disabled'\n },\n nav: {\n active: 'glide__bullet--active'\n }\n }\n};\n/**\n * Outputs warning message to the bowser console.\n *\n * @param {String} msg\n * @return {Void}\n */\n\nfunction warn(msg) {\n console.error(\"[Glide warn]: \" + msg);\n}\n\nvar _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n return _typeof2(obj);\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n};\n\nvar classCallCheck = function classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + _typeof2(superClass));\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar possibleConstructorReturn = function possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (_typeof2(call) === \"object\" || typeof call === \"function\") ? call : self;\n};\n/**\n * Converts value entered as number\n * or string to integer value.\n *\n * @param {String} value\n * @returns {Number}\n */\n\n\nfunction toInt(value) {\n return parseInt(value);\n}\n/**\n * Converts value entered as number\n * or string to flat value.\n *\n * @param {String} value\n * @returns {Number}\n */\n\n\nfunction toFloat(value) {\n return parseFloat(value);\n}\n/**\n * Indicates whether the specified value is a string.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\n\nfunction isString(value) {\n return typeof value === 'string';\n}\n/**\n * Indicates whether the specified value is an object.\n *\n * @param {*} value\n * @return {Boolean}\n *\n * @see https://github.com/jashkenas/underscore\n */\n\n\nfunction isObject(value) {\n var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n return type === 'function' || type === 'object' && !!value; // eslint-disable-line no-mixed-operators\n}\n/**\n * Indicates whether the specified value is a function.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n/**\n * Indicates whether the specified value is undefined.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\n\nfunction isUndefined(value) {\n return typeof value === 'undefined';\n}\n/**\n * Indicates whether the specified value is an array.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\n\nfunction isArray(value) {\n return value.constructor === Array;\n}\n/**\n * Creates and initializes specified collection of extensions.\n * Each extension receives access to instance of glide and rest of components.\n *\n * @param {Object} glide\n * @param {Object} extensions\n *\n * @returns {Object}\n */\n\n\nfunction mount(glide, extensions, events) {\n var components = {};\n\n for (var name in extensions) {\n if (isFunction(extensions[name])) {\n components[name] = extensions[name](glide, components, events);\n } else {\n warn('Extension must be a function');\n }\n }\n\n for (var _name in components) {\n if (isFunction(components[_name].mount)) {\n components[_name].mount();\n }\n }\n\n return components;\n}\n/**\n * Defines getter and setter property on the specified object.\n *\n * @param {Object} obj Object where property has to be defined.\n * @param {String} prop Name of the defined property.\n * @param {Object} definition Get and set definitions for the property.\n * @return {Void}\n */\n\n\nfunction define(obj, prop, definition) {\n Object.defineProperty(obj, prop, definition);\n}\n/**\n * Sorts aphabetically object keys.\n *\n * @param {Object} obj\n * @return {Object}\n */\n\n\nfunction sortKeys(obj) {\n return Object.keys(obj).sort().reduce(function (r, k) {\n r[k] = obj[k];\n return r[k], r;\n }, {});\n}\n/**\n * Merges passed settings object with default options.\n *\n * @param {Object} defaults\n * @param {Object} settings\n * @return {Object}\n */\n\n\nfunction mergeOptions(defaults, settings) {\n var options = _extends({}, defaults, settings); // `Object.assign` do not deeply merge objects, so we\n // have to do it manually for every nested object\n // in options. Although it does not look smart,\n // it's smaller and faster than some fancy\n // merging deep-merge algorithm script.\n\n\n if (settings.hasOwnProperty('classes')) {\n options.classes = _extends({}, defaults.classes, settings.classes);\n\n if (settings.classes.hasOwnProperty('direction')) {\n options.classes.direction = _extends({}, defaults.classes.direction, settings.classes.direction);\n }\n\n if (settings.classes.hasOwnProperty('type')) {\n options.classes.type = _extends({}, defaults.classes.type, settings.classes.type);\n }\n\n if (settings.classes.hasOwnProperty('slide')) {\n options.classes.slide = _extends({}, defaults.classes.slide, settings.classes.slide);\n }\n\n if (settings.classes.hasOwnProperty('arrow')) {\n options.classes.arrow = _extends({}, defaults.classes.arrow, settings.classes.arrow);\n }\n\n if (settings.classes.hasOwnProperty('nav')) {\n options.classes.nav = _extends({}, defaults.classes.nav, settings.classes.nav);\n }\n }\n\n if (settings.hasOwnProperty('breakpoints')) {\n options.breakpoints = _extends({}, defaults.breakpoints, settings.breakpoints);\n }\n\n return options;\n}\n\nvar EventsBus = function () {\n /**\n * Construct a EventBus instance.\n *\n * @param {Object} events\n */\n function EventsBus() {\n var events = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, EventsBus);\n this.events = events;\n this.hop = events.hasOwnProperty;\n }\n /**\n * Adds listener to the specifed event.\n *\n * @param {String|Array} event\n * @param {Function} handler\n */\n\n\n createClass(EventsBus, [{\n key: 'on',\n value: function on(event, handler) {\n if (isArray(event)) {\n for (var i = 0; i < event.length; i++) {\n this.on(event[i], handler);\n }\n } // Create the event's object if not yet created\n\n\n if (!this.hop.call(this.events, event)) {\n this.events[event] = [];\n } // Add the handler to queue\n\n\n var index = this.events[event].push(handler) - 1; // Provide handle back for removal of event\n\n return {\n remove: function remove() {\n delete this.events[event][index];\n }\n };\n }\n /**\n * Runs registered handlers for specified event.\n *\n * @param {String|Array} event\n * @param {Object=} context\n */\n\n }, {\n key: 'emit',\n value: function emit(event, context) {\n if (isArray(event)) {\n for (var i = 0; i < event.length; i++) {\n this.emit(event[i], context);\n }\n } // If the event doesn't exist, or there's no handlers in queue, just leave\n\n\n if (!this.hop.call(this.events, event)) {\n return;\n } // Cycle through events queue, fire!\n\n\n this.events[event].forEach(function (item) {\n item(context || {});\n });\n }\n }]);\n return EventsBus;\n}();\n\nvar Glide = function () {\n /**\n * Construct glide.\n *\n * @param {String} selector\n * @param {Object} options\n */\n function Glide(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n classCallCheck(this, Glide);\n this._c = {};\n this._t = [];\n this._e = new EventsBus();\n this.disabled = false;\n this.selector = selector;\n this.settings = mergeOptions(defaults, options);\n this.index = this.settings.startAt;\n }\n /**\n * Initializes glide.\n *\n * @param {Object} extensions Collection of extensions to initialize.\n * @return {Glide}\n */\n\n\n createClass(Glide, [{\n key: 'mount',\n value: function mount$$1() {\n var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this._e.emit('mount.before');\n\n if (isObject(extensions)) {\n this._c = mount(this, extensions, this._e);\n } else {\n warn('You need to provide a object on `mount()`');\n }\n\n this._e.emit('mount.after');\n\n return this;\n }\n /**\n * Collects an instance `translate` transformers.\n *\n * @param {Array} transformers Collection of transformers.\n * @return {Void}\n */\n\n }, {\n key: 'mutate',\n value: function mutate() {\n var transformers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n if (isArray(transformers)) {\n this._t = transformers;\n } else {\n warn('You need to provide a array on `mutate()`');\n }\n\n return this;\n }\n /**\n * Updates glide with specified settings.\n *\n * @param {Object} settings\n * @return {Glide}\n */\n\n }, {\n key: 'update',\n value: function update() {\n var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.settings = mergeOptions(this.settings, settings);\n\n if (settings.hasOwnProperty('startAt')) {\n this.index = settings.startAt;\n }\n\n this._e.emit('update');\n\n return this;\n }\n /**\n * Change slide with specified pattern. A pattern must be in the special format:\n * `>` - Move one forward\n * `<` - Move one backward\n * `={i}` - Go to {i} zero-based slide (eq. '=1', will go to second slide)\n * `>>` - Rewinds to end (last slide)\n * `<<` - Rewinds to start (first slide)\n *\n * @param {String} pattern\n * @return {Glide}\n */\n\n }, {\n key: 'go',\n value: function go(pattern) {\n this._c.Run.make(pattern);\n\n return this;\n }\n /**\n * Move track by specified distance.\n *\n * @param {String} distance\n * @return {Glide}\n */\n\n }, {\n key: 'move',\n value: function move(distance) {\n this._c.Transition.disable();\n\n this._c.Move.make(distance);\n\n return this;\n }\n /**\n * Destroy instance and revert all changes done by this._c.\n *\n * @return {Glide}\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n this._e.emit('destroy');\n\n return this;\n }\n /**\n * Start instance autoplaying.\n *\n * @param {Boolean|Number} interval Run autoplaying with passed interval regardless of `autoplay` settings\n * @return {Glide}\n */\n\n }, {\n key: 'play',\n value: function play() {\n var interval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (interval) {\n this.settings.autoplay = interval;\n }\n\n this._e.emit('play');\n\n return this;\n }\n /**\n * Stop instance autoplaying.\n *\n * @return {Glide}\n */\n\n }, {\n key: 'pause',\n value: function pause() {\n this._e.emit('pause');\n\n return this;\n }\n /**\n * Sets glide into a idle status.\n *\n * @return {Glide}\n */\n\n }, {\n key: 'disable',\n value: function disable() {\n this.disabled = true;\n return this;\n }\n /**\n * Sets glide into a active status.\n *\n * @return {Glide}\n */\n\n }, {\n key: 'enable',\n value: function enable() {\n this.disabled = false;\n return this;\n }\n /**\n * Adds cuutom event listener with handler.\n *\n * @param {String|Array} event\n * @param {Function} handler\n * @return {Glide}\n */\n\n }, {\n key: 'on',\n value: function on(event, handler) {\n this._e.on(event, handler);\n\n return this;\n }\n /**\n * Checks if glide is a precised type.\n *\n * @param {String} name\n * @return {Boolean}\n */\n\n }, {\n key: 'isType',\n value: function isType(name) {\n return this.settings.type === name;\n }\n /**\n * Gets value of the core options.\n *\n * @return {Object}\n */\n\n }, {\n key: 'settings',\n get: function get$$1() {\n return this._o;\n }\n /**\n * Sets value of the core options.\n *\n * @param {Object} o\n * @return {Void}\n */\n ,\n set: function set$$1(o) {\n if (isObject(o)) {\n this._o = o;\n } else {\n warn('Options must be an `object` instance.');\n }\n }\n /**\n * Gets current index of the slider.\n *\n * @return {Object}\n */\n\n }, {\n key: 'index',\n get: function get$$1() {\n return this._i;\n }\n /**\n * Sets current index a slider.\n *\n * @return {Object}\n */\n ,\n set: function set$$1(i) {\n this._i = toInt(i);\n }\n /**\n * Gets type name of the slider.\n *\n * @return {String}\n */\n\n }, {\n key: 'type',\n get: function get$$1() {\n return this.settings.type;\n }\n /**\n * Gets value of the idle status.\n *\n * @return {Boolean}\n */\n\n }, {\n key: 'disabled',\n get: function get$$1() {\n return this._d;\n }\n /**\n * Sets value of the idle status.\n *\n * @return {Boolean}\n */\n ,\n set: function set$$1(status) {\n this._d = !!status;\n }\n }]);\n return Glide;\n}();\n\nfunction Run(Glide, Components, Events) {\n var Run = {\n /**\n * Initializes autorunning of the glide.\n *\n * @return {Void}\n */\n mount: function mount() {\n this._o = false;\n },\n\n /**\n * Makes glides running based on the passed moving schema.\n *\n * @param {String} move\n */\n make: function make(move) {\n var _this = this;\n\n if (!Glide.disabled) {\n !Glide.settings.waitForTransition || Glide.disable();\n this.move = move;\n Events.emit('run.before', this.move);\n this.calculate();\n Events.emit('run', this.move);\n Components.Transition.after(function () {\n if (_this.isStart()) {\n Events.emit('run.start', _this.move);\n }\n\n if (_this.isEnd()) {\n Events.emit('run.end', _this.move);\n }\n\n if (_this.isOffset()) {\n _this._o = false;\n Events.emit('run.offset', _this.move);\n }\n\n Events.emit('run.after', _this.move);\n Glide.enable();\n });\n }\n },\n\n /**\n * Calculates current index based on defined move.\n *\n * @return {Number|Undefined}\n */\n calculate: function calculate() {\n var move = this.move,\n length = this.length;\n var steps = move.steps,\n direction = move.direction; // By default assume that size of view is equal to one slide\n\n var viewSize = 1; // While direction is `=` we want jump to\n // a specified index described in steps.\n\n if (direction === '=') {\n Glide.index = steps;\n return;\n } // When pattern is equal to `>>` we want\n // fast forward to the last slide.\n\n\n if (direction === '>' && steps === '>') {\n Glide.index = length;\n return;\n } // When pattern is equal to `<<` we want\n // fast forward to the first slide.\n\n\n if (direction === '<' && steps === '<') {\n Glide.index = 0;\n return;\n } // pagination movement\n\n\n if (direction === '|') {\n viewSize = Glide.settings.perView || 1;\n } // we are moving forward\n\n\n if (direction === '>' || direction === '|' && steps === '>') {\n var index = calculateForwardIndex(viewSize);\n\n if (index > length) {\n this._o = true;\n }\n\n Glide.index = normalizeForwardIndex(index, viewSize);\n return;\n } // we are moving backward\n\n\n if (direction === '<' || direction === '|' && steps === '<') {\n var _index = calculateBackwardIndex(viewSize);\n\n if (_index < 0) {\n this._o = true;\n }\n\n Glide.index = normalizeBackwardIndex(_index, viewSize);\n return;\n }\n\n warn('Invalid direction pattern [' + direction + steps + '] has been used');\n },\n\n /**\n * Checks if we are on the first slide.\n *\n * @return {Boolean}\n */\n isStart: function isStart() {\n return Glide.index <= 0;\n },\n\n /**\n * Checks if we are on the last slide.\n *\n * @return {Boolean}\n */\n isEnd: function isEnd() {\n return Glide.index >= this.length;\n },\n\n /**\n * Checks if we are making a offset run.\n *\n * @param {String} direction\n * @return {Boolean}\n */\n isOffset: function isOffset() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;\n\n if (!direction) {\n return this._o;\n }\n\n if (!this._o) {\n return false;\n } // did we view to the right?\n\n\n if (direction === '|>') {\n return this.move.direction === '|' && this.move.steps === '>';\n } // did we view to the left?\n\n\n if (direction === '|<') {\n return this.move.direction === '|' && this.move.steps === '<';\n }\n\n return this.move.direction === direction;\n },\n\n /**\n * Checks if bound mode is active\n *\n * @return {Boolean}\n */\n isBound: function isBound() {\n return Glide.isType('slider') && Glide.settings.focusAt !== 'center' && Glide.settings.bound;\n }\n };\n /**\n * Returns index value to move forward/to the right\n *\n * @param viewSize\n * @returns {Number}\n */\n\n function calculateForwardIndex(viewSize) {\n var index = Glide.index;\n\n if (Glide.isType('carousel')) {\n return index + viewSize;\n }\n\n return index + (viewSize - index % viewSize);\n }\n /**\n * Normalizes the given forward index based on glide settings, preventing it to exceed certain boundaries\n *\n * @param index\n * @param length\n * @param viewSize\n * @returns {Number}\n */\n\n\n function normalizeForwardIndex(index, viewSize) {\n var length = Run.length;\n\n if (index <= length) {\n return index;\n }\n\n if (Glide.isType('carousel')) {\n return index - (length + 1);\n }\n\n if (Glide.settings.rewind) {\n // bound does funny things with the length, therefor we have to be certain\n // that we are on the last possible index value given by bound\n if (Run.isBound() && !Run.isEnd()) {\n return length;\n }\n\n return 0;\n }\n\n if (Run.isBound()) {\n return length;\n }\n\n return Math.floor(length / viewSize) * viewSize;\n }\n /**\n * Calculates index value to move backward/to the left\n *\n * @param viewSize\n * @returns {Number}\n */\n\n\n function calculateBackwardIndex(viewSize) {\n var index = Glide.index;\n\n if (Glide.isType('carousel')) {\n return index - viewSize;\n } // ensure our back navigation results in the same index as a forward navigation\n // to experience a homogeneous paging\n\n\n var view = Math.ceil(index / viewSize);\n return (view - 1) * viewSize;\n }\n /**\n * Normalizes the given backward index based on glide settings, preventing it to exceed certain boundaries\n *\n * @param index\n * @param length\n * @param viewSize\n * @returns {*}\n */\n\n\n function normalizeBackwardIndex(index, viewSize) {\n var length = Run.length;\n\n if (index >= 0) {\n return index;\n }\n\n if (Glide.isType('carousel')) {\n return index + (length + 1);\n }\n\n if (Glide.settings.rewind) {\n // bound does funny things with the length, therefor we have to be certain\n // that we are on first possible index value before we to rewind to the length given by bound\n if (Run.isBound() && Run.isStart()) {\n return length;\n }\n\n return Math.floor(length / viewSize) * viewSize;\n }\n\n return 0;\n }\n\n define(Run, 'move', {\n /**\n * Gets value of the move schema.\n *\n * @returns {Object}\n */\n get: function get() {\n return this._m;\n },\n\n /**\n * Sets value of the move schema.\n *\n * @returns {Object}\n */\n set: function set(value) {\n var step = value.substr(1);\n this._m = {\n direction: value.substr(0, 1),\n steps: step ? toInt(step) ? toInt(step) : step : 0\n };\n }\n });\n define(Run, 'length', {\n /**\n * Gets value of the running distance based\n * on zero-indexing number of slides.\n *\n * @return {Number}\n */\n get: function get() {\n var settings = Glide.settings;\n var length = Components.Html.slides.length; // If the `bound` option is active, a maximum running distance should be\n // reduced by `perView` and `focusAt` settings. Running distance\n // should end before creating an empty space after instance.\n\n if (this.isBound()) {\n return length - 1 - (toInt(settings.perView) - 1) + toInt(settings.focusAt);\n }\n\n return length - 1;\n }\n });\n define(Run, 'offset', {\n /**\n * Gets status of the offsetting flag.\n *\n * @return {Boolean}\n */\n get: function get() {\n return this._o;\n }\n });\n return Run;\n}\n/**\n * Returns a current time.\n *\n * @return {Number}\n */\n\n\nfunction now() {\n return new Date().getTime();\n}\n/**\n * Returns a function, that, when invoked, will only be triggered\n * at most once during a given window of time.\n *\n * @param {Function} func\n * @param {Number} wait\n * @param {Object=} options\n * @return {Function}\n *\n * @see https://github.com/jashkenas/underscore\n */\n\n\nfunction throttle(func, wait, options) {\n var timeout = void 0,\n context = void 0,\n args = void 0,\n result = void 0;\n var previous = 0;\n if (!options) options = {};\n\n var later = function later() {\n previous = options.leading === false ? 0 : now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function throttled() {\n var at = now();\n if (!previous && options.leading === false) previous = at;\n var remaining = wait - (at - previous);\n context = this;\n args = arguments;\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n\n previous = at;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n\n return result;\n };\n\n throttled.cancel = function () {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n}\n\nvar MARGIN_TYPE = {\n ltr: ['marginLeft', 'marginRight'],\n rtl: ['marginRight', 'marginLeft']\n};\n\nfunction Gaps(Glide, Components, Events) {\n var Gaps = {\n /**\n * Applies gaps between slides. First and last\n * slides do not receive it's edge margins.\n *\n * @param {HTMLCollection} slides\n * @return {Void}\n */\n apply: function apply(slides) {\n for (var i = 0, len = slides.length; i < len; i++) {\n var style = slides[i].style;\n var direction = Components.Direction.value;\n\n if (i !== 0) {\n style[MARGIN_TYPE[direction][0]] = this.value / 2 + 'px';\n } else {\n style[MARGIN_TYPE[direction][0]] = '';\n }\n\n if (i !== slides.length - 1) {\n style[MARGIN_TYPE[direction][1]] = this.value / 2 + 'px';\n } else {\n style[MARGIN_TYPE[direction][1]] = '';\n }\n }\n },\n\n /**\n * Removes gaps from the slides.\n *\n * @param {HTMLCollection} slides\n * @returns {Void}\n */\n remove: function remove(slides) {\n for (var i = 0, len = slides.length; i < len; i++) {\n var style = slides[i].style;\n style.marginLeft = '';\n style.marginRight = '';\n }\n }\n };\n define(Gaps, 'value', {\n /**\n * Gets value of the gap.\n *\n * @returns {Number}\n */\n get: function get() {\n return toInt(Glide.settings.gap);\n }\n });\n define(Gaps, 'grow', {\n /**\n * Gets additional dimentions value caused by gaps.\n * Used to increase width of the slides wrapper.\n *\n * @returns {Number}\n */\n get: function get() {\n return Gaps.value * Components.Sizes.length;\n }\n });\n define(Gaps, 'reductor', {\n /**\n * Gets reduction value caused by gaps.\n * Used to subtract width of the slides.\n *\n * @returns {Number}\n */\n get: function get() {\n var perView = Glide.settings.perView;\n return Gaps.value * (perView - 1) / perView;\n }\n });\n /**\n * Apply calculated gaps:\n * - after building, so slides (including clones) will receive proper margins\n * - on updating via API, to recalculate gaps with new options\n */\n\n Events.on(['build.after', 'update'], throttle(function () {\n Gaps.apply(Components.Html.wrapper.children);\n }, 30));\n /**\n * Remove gaps:\n * - on destroying to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Gaps.remove(Components.Html.wrapper.children);\n });\n return Gaps;\n}\n/**\n * Finds siblings nodes of the passed node.\n *\n * @param {Element} node\n * @return {Array}\n */\n\n\nfunction siblings(node) {\n if (node && node.parentNode) {\n var n = node.parentNode.firstChild;\n var matched = [];\n\n for (; n; n = n.nextSibling) {\n if (n.nodeType === 1 && n !== node) {\n matched.push(n);\n }\n }\n\n return matched;\n }\n\n return [];\n}\n/**\n * Checks if passed node exist and is a valid element.\n *\n * @param {Element} node\n * @return {Boolean}\n */\n\n\nfunction exist(node) {\n if (node && node instanceof window.HTMLElement) {\n return true;\n }\n\n return false;\n}\n\nvar TRACK_SELECTOR = '[data-glide-el=\"track\"]';\n\nfunction Html(Glide, Components) {\n var Html = {\n /**\n * Setup slider HTML nodes.\n *\n * @param {Glide} glide\n */\n mount: function mount() {\n this.root = Glide.selector;\n this.track = this.root.querySelector(TRACK_SELECTOR);\n this.slides = Array.prototype.slice.call(this.wrapper.children).filter(function (slide) {\n return !slide.classList.contains(Glide.settings.classes.slide.clone);\n });\n }\n };\n define(Html, 'root', {\n /**\n * Gets node of the glide main element.\n *\n * @return {Object}\n */\n get: function get() {\n return Html._r;\n },\n\n /**\n * Sets node of the glide main element.\n *\n * @return {Object}\n */\n set: function set(r) {\n if (isString(r)) {\n r = document.querySelector(r);\n }\n\n if (exist(r)) {\n Html._r = r;\n } else {\n warn('Root element must be a existing Html node');\n }\n }\n });\n define(Html, 'track', {\n /**\n * Gets node of the glide track with slides.\n *\n * @return {Object}\n */\n get: function get() {\n return Html._t;\n },\n\n /**\n * Sets node of the glide track with slides.\n *\n * @return {Object}\n */\n set: function set(t) {\n if (exist(t)) {\n Html._t = t;\n } else {\n warn('Could not find track element. Please use ' + TRACK_SELECTOR + ' attribute.');\n }\n }\n });\n define(Html, 'wrapper', {\n /**\n * Gets node of the slides wrapper.\n *\n * @return {Object}\n */\n get: function get() {\n return Html.track.children[0];\n }\n });\n return Html;\n}\n\nfunction Peek(Glide, Components, Events) {\n var Peek = {\n /**\n * Setups how much to peek based on settings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.value = Glide.settings.peek;\n }\n };\n define(Peek, 'value', {\n /**\n * Gets value of the peek.\n *\n * @returns {Number|Object}\n */\n get: function get() {\n return Peek._v;\n },\n\n /**\n * Sets value of the peek.\n *\n * @param {Number|Object} value\n * @return {Void}\n */\n set: function set(value) {\n if (isObject(value)) {\n value.before = toInt(value.before);\n value.after = toInt(value.after);\n } else {\n value = toInt(value);\n }\n\n Peek._v = value;\n }\n });\n define(Peek, 'reductor', {\n /**\n * Gets reduction value caused by peek.\n *\n * @returns {Number}\n */\n get: function get() {\n var value = Peek.value;\n var perView = Glide.settings.perView;\n\n if (isObject(value)) {\n return value.before / perView + value.after / perView;\n }\n\n return value * 2 / perView;\n }\n });\n /**\n * Recalculate peeking sizes on:\n * - when resizing window to update to proper percents\n */\n\n Events.on(['resize', 'update'], function () {\n Peek.mount();\n });\n return Peek;\n}\n\nfunction Move(Glide, Components, Events) {\n var Move = {\n /**\n * Constructs move component.\n *\n * @returns {Void}\n */\n mount: function mount() {\n this._o = 0;\n },\n\n /**\n * Calculates a movement value based on passed offset and currently active index.\n *\n * @param {Number} offset\n * @return {Void}\n */\n make: function make() {\n var _this = this;\n\n var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n this.offset = offset;\n Events.emit('move', {\n movement: this.value\n });\n Components.Transition.after(function () {\n Events.emit('move.after', {\n movement: _this.value\n });\n });\n }\n };\n define(Move, 'offset', {\n /**\n * Gets an offset value used to modify current translate.\n *\n * @return {Object}\n */\n get: function get() {\n return Move._o;\n },\n\n /**\n * Sets an offset value used to modify current translate.\n *\n * @return {Object}\n */\n set: function set(value) {\n Move._o = !isUndefined(value) ? toInt(value) : 0;\n }\n });\n define(Move, 'translate', {\n /**\n * Gets a raw movement value.\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Sizes.slideWidth * Glide.index;\n }\n });\n define(Move, 'value', {\n /**\n * Gets an actual movement value corrected by offset.\n *\n * @return {Number}\n */\n get: function get() {\n var offset = this.offset;\n var translate = this.translate;\n\n if (Components.Direction.is('rtl')) {\n return translate + offset;\n }\n\n return translate - offset;\n }\n });\n /**\n * Make movement to proper slide on:\n * - before build, so glide will start at `startAt` index\n * - on each standard run to move to newly calculated index\n */\n\n Events.on(['build.before', 'run'], function () {\n Move.make();\n });\n return Move;\n}\n\nfunction Sizes(Glide, Components, Events) {\n var Sizes = {\n /**\n * Setups dimentions of slides.\n *\n * @return {Void}\n */\n setupSlides: function setupSlides() {\n var width = this.slideWidth + 'px';\n var slides = Components.Html.slides;\n\n for (var i = 0; i < slides.length; i++) {\n slides[i].style.width = width;\n }\n },\n\n /**\n * Setups dimentions of slides wrapper.\n *\n * @return {Void}\n */\n setupWrapper: function setupWrapper() {\n Components.Html.wrapper.style.width = this.wrapperSize + 'px';\n },\n\n /**\n * Removes applied styles from HTML elements.\n *\n * @returns {Void}\n */\n remove: function remove() {\n var slides = Components.Html.slides;\n\n for (var i = 0; i < slides.length; i++) {\n slides[i].style.width = '';\n }\n\n Components.Html.wrapper.style.width = '';\n }\n };\n define(Sizes, 'length', {\n /**\n * Gets count number of the slides.\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Html.slides.length;\n }\n });\n define(Sizes, 'width', {\n /**\n * Gets width value of the slider (visible area).\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Html.root.offsetWidth;\n }\n });\n define(Sizes, 'wrapperSize', {\n /**\n * Gets size of the slides wrapper.\n *\n * @return {Number}\n */\n get: function get() {\n return Sizes.slideWidth * Sizes.length + Components.Gaps.grow + Components.Clones.grow;\n }\n });\n define(Sizes, 'slideWidth', {\n /**\n * Gets width value of a single slide.\n *\n * @return {Number}\n */\n get: function get() {\n return Sizes.width / Glide.settings.perView - Components.Peek.reductor - Components.Gaps.reductor;\n }\n });\n /**\n * Apply calculated glide's dimensions:\n * - before building, so other dimentions (e.g. translate) will be calculated propertly\n * - when resizing window to recalculate sildes dimensions\n * - on updating via API, to calculate dimensions based on new options\n */\n\n Events.on(['build.before', 'resize', 'update'], function () {\n Sizes.setupSlides();\n Sizes.setupWrapper();\n });\n /**\n * Remove calculated glide's dimensions:\n * - on destoting to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Sizes.remove();\n });\n return Sizes;\n}\n\nfunction Build(Glide, Components, Events) {\n var Build = {\n /**\n * Init glide building. Adds classes, sets\n * dimensions and setups initial state.\n *\n * @return {Void}\n */\n mount: function mount() {\n Events.emit('build.before');\n this.typeClass();\n this.activeClass();\n Events.emit('build.after');\n },\n\n /**\n * Adds `type` class to the glide element.\n *\n * @return {Void}\n */\n typeClass: function typeClass() {\n Components.Html.root.classList.add(Glide.settings.classes.type[Glide.settings.type]);\n },\n\n /**\n * Sets active class to current slide.\n *\n * @return {Void}\n */\n activeClass: function activeClass() {\n var classes = Glide.settings.classes;\n var slide = Components.Html.slides[Glide.index];\n\n if (slide) {\n slide.classList.add(classes.slide.active);\n siblings(slide).forEach(function (sibling) {\n sibling.classList.remove(classes.slide.active);\n });\n }\n },\n\n /**\n * Removes HTML classes applied at building.\n *\n * @return {Void}\n */\n removeClasses: function removeClasses() {\n var _Glide$settings$class = Glide.settings.classes,\n type = _Glide$settings$class.type,\n slide = _Glide$settings$class.slide;\n Components.Html.root.classList.remove(type[Glide.settings.type]);\n Components.Html.slides.forEach(function (sibling) {\n sibling.classList.remove(slide.active);\n });\n }\n };\n /**\n * Clear building classes:\n * - on destroying to bring HTML to its initial state\n * - on updating to remove classes before remounting component\n */\n\n Events.on(['destroy', 'update'], function () {\n Build.removeClasses();\n });\n /**\n * Remount component:\n * - on resizing of the window to calculate new dimentions\n * - on updating settings via API\n */\n\n Events.on(['resize', 'update'], function () {\n Build.mount();\n });\n /**\n * Swap active class of current slide:\n * - after each move to the new index\n */\n\n Events.on('move.after', function () {\n Build.activeClass();\n });\n return Build;\n}\n\nfunction Clones(Glide, Components, Events) {\n var Clones = {\n /**\n * Create pattern map and collect slides to be cloned.\n */\n mount: function mount() {\n this.items = [];\n\n if (Glide.isType('carousel')) {\n this.items = this.collect();\n }\n },\n\n /**\n * Collect clones with pattern.\n *\n * @return {[]}\n */\n collect: function collect() {\n var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var slides = Components.Html.slides;\n var _Glide$settings = Glide.settings,\n perView = _Glide$settings.perView,\n classes = _Glide$settings.classes;\n var peekIncrementer = +!!Glide.settings.peek;\n var cloneCount = perView + peekIncrementer + Math.round(perView / 2);\n var append = slides.slice(0, cloneCount).reverse();\n var prepend = slides.slice(cloneCount * -1);\n\n for (var r = 0; r < Math.max(1, Math.floor(perView / slides.length)); r++) {\n for (var i = 0; i < append.length; i++) {\n var clone = append[i].cloneNode(true);\n clone.classList.add(classes.slide.clone);\n items.push(clone);\n }\n\n for (var _i = 0; _i < prepend.length; _i++) {\n var _clone = prepend[_i].cloneNode(true);\n\n _clone.classList.add(classes.slide.clone);\n\n items.unshift(_clone);\n }\n }\n\n return items;\n },\n\n /**\n * Append cloned slides with generated pattern.\n *\n * @return {Void}\n */\n append: function append() {\n var items = this.items;\n var _Components$Html = Components.Html,\n wrapper = _Components$Html.wrapper,\n slides = _Components$Html.slides;\n var half = Math.floor(items.length / 2);\n var prepend = items.slice(0, half).reverse();\n var append = items.slice(half * -1).reverse();\n var width = Components.Sizes.slideWidth + 'px';\n\n for (var i = 0; i < append.length; i++) {\n wrapper.appendChild(append[i]);\n }\n\n for (var _i2 = 0; _i2 < prepend.length; _i2++) {\n wrapper.insertBefore(prepend[_i2], slides[0]);\n }\n\n for (var _i3 = 0; _i3 < items.length; _i3++) {\n items[_i3].style.width = width;\n }\n },\n\n /**\n * Remove all cloned slides.\n *\n * @return {Void}\n */\n remove: function remove() {\n var items = this.items;\n\n for (var i = 0; i < items.length; i++) {\n Components.Html.wrapper.removeChild(items[i]);\n }\n }\n };\n define(Clones, 'grow', {\n /**\n * Gets additional dimentions value caused by clones.\n *\n * @return {Number}\n */\n get: function get() {\n return (Components.Sizes.slideWidth + Components.Gaps.value) * Clones.items.length;\n }\n });\n /**\n * Append additional slide's clones:\n * - while glide's type is `carousel`\n */\n\n Events.on('update', function () {\n Clones.remove();\n Clones.mount();\n Clones.append();\n });\n /**\n * Append additional slide's clones:\n * - while glide's type is `carousel`\n */\n\n Events.on('build.before', function () {\n if (Glide.isType('carousel')) {\n Clones.append();\n }\n });\n /**\n * Remove clones HTMLElements:\n * - on destroying, to bring HTML to its initial state\n */\n\n Events.on('destroy', function () {\n Clones.remove();\n });\n return Clones;\n}\n\nvar EventsBinder = function () {\n /**\n * Construct a EventsBinder instance.\n */\n function EventsBinder() {\n var listeners = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, EventsBinder);\n this.listeners = listeners;\n }\n /**\n * Adds events listeners to arrows HTML elements.\n *\n * @param {String|Array} events\n * @param {Element|Window|Document} el\n * @param {Function} closure\n * @param {Boolean|Object} capture\n * @return {Void}\n */\n\n\n createClass(EventsBinder, [{\n key: 'on',\n value: function on(events, el, closure) {\n var capture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (isString(events)) {\n events = [events];\n }\n\n for (var i = 0; i < events.length; i++) {\n this.listeners[events[i]] = closure;\n el.addEventListener(events[i], this.listeners[events[i]], capture);\n }\n }\n /**\n * Removes event listeners from arrows HTML elements.\n *\n * @param {String|Array} events\n * @param {Element|Window|Document} el\n * @param {Boolean|Object} capture\n * @return {Void}\n */\n\n }, {\n key: 'off',\n value: function off(events, el) {\n var capture = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (isString(events)) {\n events = [events];\n }\n\n for (var i = 0; i < events.length; i++) {\n el.removeEventListener(events[i], this.listeners[events[i]], capture);\n }\n }\n /**\n * Destroy collected listeners.\n *\n * @returns {Void}\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n delete this.listeners;\n }\n }]);\n return EventsBinder;\n}();\n\nfunction Resize(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Resize = {\n /**\n * Initializes window bindings.\n */\n mount: function mount() {\n this.bind();\n },\n\n /**\n * Binds `rezsize` listener to the window.\n * It's a costly event, so we are debouncing it.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('resize', window, throttle(function () {\n Events.emit('resize');\n }, Glide.settings.throttle));\n },\n\n /**\n * Unbinds listeners from the window.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('resize', window);\n }\n };\n /**\n * Remove bindings from window:\n * - on destroying, to remove added EventListener\n */\n\n Events.on('destroy', function () {\n Resize.unbind();\n Binder.destroy();\n });\n return Resize;\n}\n\nvar VALID_DIRECTIONS = ['ltr', 'rtl'];\nvar FLIPED_MOVEMENTS = {\n '>': '<',\n '<': '>',\n '=': '='\n};\n\nfunction Direction(Glide, Components, Events) {\n var Direction = {\n /**\n * Setups gap value based on settings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.value = Glide.settings.direction;\n },\n\n /**\n * Resolves pattern based on direction value\n *\n * @param {String} pattern\n * @returns {String}\n */\n resolve: function resolve(pattern) {\n var token = pattern.slice(0, 1);\n\n if (this.is('rtl')) {\n return pattern.split(token).join(FLIPED_MOVEMENTS[token]);\n }\n\n return pattern;\n },\n\n /**\n * Checks value of direction mode.\n *\n * @param {String} direction\n * @returns {Boolean}\n */\n is: function is(direction) {\n return this.value === direction;\n },\n\n /**\n * Applies direction class to the root HTML element.\n *\n * @return {Void}\n */\n addClass: function addClass() {\n Components.Html.root.classList.add(Glide.settings.classes.direction[this.value]);\n },\n\n /**\n * Removes direction class from the root HTML element.\n *\n * @return {Void}\n */\n removeClass: function removeClass() {\n Components.Html.root.classList.remove(Glide.settings.classes.direction[this.value]);\n }\n };\n define(Direction, 'value', {\n /**\n * Gets value of the direction.\n *\n * @returns {Number}\n */\n get: function get() {\n return Direction._v;\n },\n\n /**\n * Sets value of the direction.\n *\n * @param {String} value\n * @return {Void}\n */\n set: function set(value) {\n if (VALID_DIRECTIONS.indexOf(value) > -1) {\n Direction._v = value;\n } else {\n warn('Direction value must be `ltr` or `rtl`');\n }\n }\n });\n /**\n * Clear direction class:\n * - on destroy to bring HTML to its initial state\n * - on update to remove class before reappling bellow\n */\n\n Events.on(['destroy', 'update'], function () {\n Direction.removeClass();\n });\n /**\n * Remount component:\n * - on update to reflect changes in direction value\n */\n\n Events.on('update', function () {\n Direction.mount();\n });\n /**\n * Apply direction class:\n * - before building to apply class for the first time\n * - on updating to reapply direction class that may changed\n */\n\n Events.on(['build.before', 'update'], function () {\n Direction.addClass();\n });\n return Direction;\n}\n/**\n * Reflects value of glide movement.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction Rtl(Glide, Components) {\n return {\n /**\n * Negates the passed translate if glide is in RTL option.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n if (Components.Direction.is('rtl')) {\n return -translate;\n }\n\n return translate;\n }\n };\n}\n/**\n * Updates glide movement with a `gap` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction Gap(Glide, Components) {\n return {\n /**\n * Modifies passed translate value with number in the `gap` settings.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n var multiplier = Math.floor(translate / Components.Sizes.slideWidth);\n return translate + Components.Gaps.value * multiplier;\n }\n };\n}\n/**\n * Updates glide movement with width of additional clones width.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction Grow(Glide, Components) {\n return {\n /**\n * Adds to the passed translate width of the half of clones.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n return translate + Components.Clones.grow / 2;\n }\n };\n}\n/**\n * Updates glide movement with a `peek` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction Peeking(Glide, Components) {\n return {\n /**\n * Modifies passed translate value with a `peek` setting.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n if (Glide.settings.focusAt >= 0) {\n var peek = Components.Peek.value;\n\n if (isObject(peek)) {\n return translate - peek.before;\n }\n\n return translate - peek;\n }\n\n return translate;\n }\n };\n}\n/**\n * Updates glide movement with a `focusAt` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction Focusing(Glide, Components) {\n return {\n /**\n * Modifies passed translate value with index in the `focusAt` setting.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n var gap = Components.Gaps.value;\n var width = Components.Sizes.width;\n var focusAt = Glide.settings.focusAt;\n var slideWidth = Components.Sizes.slideWidth;\n\n if (focusAt === 'center') {\n return translate - (width / 2 - slideWidth / 2);\n }\n\n return translate - slideWidth * focusAt - gap * focusAt;\n }\n };\n}\n/**\n * Applies diffrent transformers on translate value.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\n\nfunction mutator(Glide, Components, Events) {\n /**\n * Merge instance transformers with collection of default transformers.\n * It's important that the Rtl component be last on the list,\n * so it reflects all previous transformations.\n *\n * @type {Array}\n */\n var TRANSFORMERS = [Gap, Grow, Peeking, Focusing].concat(Glide._t, [Rtl]);\n return {\n /**\n * Piplines translate value with registered transformers.\n *\n * @param {Number} translate\n * @return {Number}\n */\n mutate: function mutate(translate) {\n for (var i = 0; i < TRANSFORMERS.length; i++) {\n var transformer = TRANSFORMERS[i];\n\n if (isFunction(transformer) && isFunction(transformer().modify)) {\n translate = transformer(Glide, Components, Events).modify(translate);\n } else {\n warn('Transformer should be a function that returns an object with `modify()` method');\n }\n }\n\n return translate;\n }\n };\n}\n\nfunction Translate(Glide, Components, Events) {\n var Translate = {\n /**\n * Sets value of translate on HTML element.\n *\n * @param {Number} value\n * @return {Void}\n */\n set: function set(value) {\n var transform = mutator(Glide, Components).mutate(value);\n Components.Html.wrapper.style.transform = 'translate3d(' + -1 * transform + 'px, 0px, 0px)';\n },\n\n /**\n * Removes value of translate from HTML element.\n *\n * @return {Void}\n */\n remove: function remove() {\n Components.Html.wrapper.style.transform = '';\n },\n\n /**\n * @return {number}\n */\n getStartIndex: function getStartIndex() {\n var length = Components.Sizes.length;\n var index = Glide.index;\n var perView = Glide.settings.perView;\n\n if (Components.Run.isOffset('>') || Components.Run.isOffset('|>')) {\n return length + (index - perView);\n } // \"modulo length\" converts an index that equals length to zero\n\n\n return (index + perView) % length;\n },\n\n /**\n * @return {number}\n */\n getTravelDistance: function getTravelDistance() {\n var travelDistance = Components.Sizes.slideWidth * Glide.settings.perView;\n\n if (Components.Run.isOffset('>') || Components.Run.isOffset('|>')) {\n // reverse travel distance so that we don't have to change subtract operations\n return travelDistance * -1;\n }\n\n return travelDistance;\n }\n };\n /**\n * Set new translate value:\n * - on move to reflect index change\n * - on updating via API to reflect possible changes in options\n */\n\n Events.on('move', function (context) {\n if (!Glide.isType('carousel') || !Components.Run.isOffset()) {\n return Translate.set(context.movement);\n }\n\n Components.Transition.after(function () {\n Events.emit('translate.jump');\n Translate.set(Components.Sizes.slideWidth * Glide.index);\n });\n var startWidth = Components.Sizes.slideWidth * Components.Translate.getStartIndex();\n return Translate.set(startWidth - Components.Translate.getTravelDistance());\n });\n /**\n * Remove translate:\n * - on destroying to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Translate.remove();\n });\n return Translate;\n}\n\nfunction Transition(Glide, Components, Events) {\n /**\n * Holds inactivity status of transition.\n * When true transition is not applied.\n *\n * @type {Boolean}\n */\n var disabled = false;\n var Transition = {\n /**\n * Composes string of the CSS transition.\n *\n * @param {String} property\n * @return {String}\n */\n compose: function compose(property) {\n var settings = Glide.settings;\n\n if (!disabled) {\n return property + ' ' + this.duration + 'ms ' + settings.animationTimingFunc;\n }\n\n return property + ' 0ms ' + settings.animationTimingFunc;\n },\n\n /**\n * Sets value of transition on HTML element.\n *\n * @param {String=} property\n * @return {Void}\n */\n set: function set() {\n var property = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'transform';\n Components.Html.wrapper.style.transition = this.compose(property);\n },\n\n /**\n * Removes value of transition from HTML element.\n *\n * @return {Void}\n */\n remove: function remove() {\n Components.Html.wrapper.style.transition = '';\n },\n\n /**\n * Runs callback after animation.\n *\n * @param {Function} callback\n * @return {Void}\n */\n after: function after(callback) {\n setTimeout(function () {\n callback();\n }, this.duration);\n },\n\n /**\n * Enable transition.\n *\n * @return {Void}\n */\n enable: function enable() {\n disabled = false;\n this.set();\n },\n\n /**\n * Disable transition.\n *\n * @return {Void}\n */\n disable: function disable() {\n disabled = true;\n this.set();\n }\n };\n define(Transition, 'duration', {\n /**\n * Gets duration of the transition based\n * on currently running animation type.\n *\n * @return {Number}\n */\n get: function get() {\n var settings = Glide.settings;\n\n if (Glide.isType('slider') && Components.Run.offset) {\n return settings.rewindDuration;\n }\n\n return settings.animationDuration;\n }\n });\n /**\n * Set transition `style` value:\n * - on each moving, because it may be cleared by offset move\n */\n\n Events.on('move', function () {\n Transition.set();\n });\n /**\n * Disable transition:\n * - before initial build to avoid transitioning from `0` to `startAt` index\n * - while resizing window and recalculating dimentions\n * - on jumping from offset transition at start and end edges in `carousel` type\n */\n\n Events.on(['build.before', 'resize', 'translate.jump'], function () {\n Transition.disable();\n });\n /**\n * Enable transition:\n * - on each running, because it may be disabled by offset move\n */\n\n Events.on('run', function () {\n Transition.enable();\n });\n /**\n * Remove transition:\n * - on destroying to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Transition.remove();\n });\n return Transition;\n}\n/**\n * Test via a getter in the options object to see\n * if the passive property is accessed.\n *\n * @see https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n */\n\n\nvar supportsPassive = false;\n\ntry {\n var opts = Object.defineProperty({}, 'passive', {\n get: function get() {\n supportsPassive = true;\n }\n });\n window.addEventListener('testPassive', null, opts);\n window.removeEventListener('testPassive', null, opts);\n} catch (e) {}\n\nvar supportsPassive$1 = supportsPassive;\nvar START_EVENTS = ['touchstart', 'mousedown'];\nvar MOVE_EVENTS = ['touchmove', 'mousemove'];\nvar END_EVENTS = ['touchend', 'touchcancel', 'mouseup', 'mouseleave'];\nvar MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'mouseleave'];\n\nfunction swipe(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var swipeSin = 0;\n var swipeStartX = 0;\n var swipeStartY = 0;\n var disabled = false;\n var capture = supportsPassive$1 ? {\n passive: true\n } : false;\n var Swipe = {\n /**\n * Initializes swipe bindings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.bindSwipeStart();\n },\n\n /**\n * Handler for `swipestart` event. Calculates entry points of the user's tap.\n *\n * @param {Object} event\n * @return {Void}\n */\n start: function start(event) {\n if (!disabled && !Glide.disabled) {\n this.disable();\n var swipe = this.touches(event);\n swipeSin = null;\n swipeStartX = toInt(swipe.pageX);\n swipeStartY = toInt(swipe.pageY);\n this.bindSwipeMove();\n this.bindSwipeEnd();\n Events.emit('swipe.start');\n }\n },\n\n /**\n * Handler for `swipemove` event. Calculates user's tap angle and distance.\n *\n * @param {Object} event\n */\n move: function move(event) {\n if (!Glide.disabled) {\n var _Glide$settings = Glide.settings,\n touchAngle = _Glide$settings.touchAngle,\n touchRatio = _Glide$settings.touchRatio,\n classes = _Glide$settings.classes;\n var swipe = this.touches(event);\n var subExSx = toInt(swipe.pageX) - swipeStartX;\n var subEySy = toInt(swipe.pageY) - swipeStartY;\n var powEX = Math.abs(subExSx << 2);\n var powEY = Math.abs(subEySy << 2);\n var swipeHypotenuse = Math.sqrt(powEX + powEY);\n var swipeCathetus = Math.sqrt(powEY);\n swipeSin = Math.asin(swipeCathetus / swipeHypotenuse);\n\n if (swipeSin * 180 / Math.PI < touchAngle) {\n event.stopPropagation();\n Components.Move.make(subExSx * toFloat(touchRatio));\n Components.Html.root.classList.add(classes.dragging);\n Events.emit('swipe.move');\n } else {\n return false;\n }\n }\n },\n\n /**\n * Handler for `swipeend` event. Finitializes user's tap and decides about glide move.\n *\n * @param {Object} event\n * @return {Void}\n */\n end: function end(event) {\n if (!Glide.disabled) {\n var _Glide$settings2 = Glide.settings,\n perSwipe = _Glide$settings2.perSwipe,\n touchAngle = _Glide$settings2.touchAngle,\n classes = _Glide$settings2.classes;\n var swipe = this.touches(event);\n var threshold = this.threshold(event);\n var swipeDistance = swipe.pageX - swipeStartX;\n var swipeDeg = swipeSin * 180 / Math.PI;\n this.enable();\n\n if (swipeDistance > threshold && swipeDeg < touchAngle) {\n Components.Run.make(Components.Direction.resolve(perSwipe + '<'));\n } else if (swipeDistance < -threshold && swipeDeg < touchAngle) {\n Components.Run.make(Components.Direction.resolve(perSwipe + '>'));\n } else {\n // While swipe don't reach distance apply previous transform.\n Components.Move.make();\n }\n\n Components.Html.root.classList.remove(classes.dragging);\n this.unbindSwipeMove();\n this.unbindSwipeEnd();\n Events.emit('swipe.end');\n }\n },\n\n /**\n * Binds swipe's starting event.\n *\n * @return {Void}\n */\n bindSwipeStart: function bindSwipeStart() {\n var _this = this;\n\n var _Glide$settings3 = Glide.settings,\n swipeThreshold = _Glide$settings3.swipeThreshold,\n dragThreshold = _Glide$settings3.dragThreshold;\n\n if (swipeThreshold) {\n Binder.on(START_EVENTS[0], Components.Html.wrapper, function (event) {\n _this.start(event);\n }, capture);\n }\n\n if (dragThreshold) {\n Binder.on(START_EVENTS[1], Components.Html.wrapper, function (event) {\n _this.start(event);\n }, capture);\n }\n },\n\n /**\n * Unbinds swipe's starting event.\n *\n * @return {Void}\n */\n unbindSwipeStart: function unbindSwipeStart() {\n Binder.off(START_EVENTS[0], Components.Html.wrapper, capture);\n Binder.off(START_EVENTS[1], Components.Html.wrapper, capture);\n },\n\n /**\n * Binds swipe's moving event.\n *\n * @return {Void}\n */\n bindSwipeMove: function bindSwipeMove() {\n var _this2 = this;\n\n Binder.on(MOVE_EVENTS, Components.Html.wrapper, throttle(function (event) {\n _this2.move(event);\n }, Glide.settings.throttle), capture);\n },\n\n /**\n * Unbinds swipe's moving event.\n *\n * @return {Void}\n */\n unbindSwipeMove: function unbindSwipeMove() {\n Binder.off(MOVE_EVENTS, Components.Html.wrapper, capture);\n },\n\n /**\n * Binds swipe's ending event.\n *\n * @return {Void}\n */\n bindSwipeEnd: function bindSwipeEnd() {\n var _this3 = this;\n\n Binder.on(END_EVENTS, Components.Html.wrapper, function (event) {\n _this3.end(event);\n });\n },\n\n /**\n * Unbinds swipe's ending event.\n *\n * @return {Void}\n */\n unbindSwipeEnd: function unbindSwipeEnd() {\n Binder.off(END_EVENTS, Components.Html.wrapper);\n },\n\n /**\n * Normalizes event touches points accorting to different types.\n *\n * @param {Object} event\n */\n touches: function touches(event) {\n if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n return event;\n }\n\n return event.touches[0] || event.changedTouches[0];\n },\n\n /**\n * Gets value of minimum swipe distance settings based on event type.\n *\n * @return {Number}\n */\n threshold: function threshold(event) {\n var settings = Glide.settings;\n\n if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n return settings.dragThreshold;\n }\n\n return settings.swipeThreshold;\n },\n\n /**\n * Enables swipe event.\n *\n * @return {self}\n */\n enable: function enable() {\n disabled = false;\n Components.Transition.enable();\n return this;\n },\n\n /**\n * Disables swipe event.\n *\n * @return {self}\n */\n disable: function disable() {\n disabled = true;\n Components.Transition.disable();\n return this;\n }\n };\n /**\n * Add component class:\n * - after initial building\n */\n\n Events.on('build.after', function () {\n Components.Html.root.classList.add(Glide.settings.classes.swipeable);\n });\n /**\n * Remove swiping bindings:\n * - on destroying, to remove added EventListeners\n */\n\n Events.on('destroy', function () {\n Swipe.unbindSwipeStart();\n Swipe.unbindSwipeMove();\n Swipe.unbindSwipeEnd();\n Binder.destroy();\n });\n return Swipe;\n}\n\nfunction images(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Images = {\n /**\n * Binds listener to glide wrapper.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.bind();\n },\n\n /**\n * Binds `dragstart` event on wrapper to prevent dragging images.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('dragstart', Components.Html.wrapper, this.dragstart);\n },\n\n /**\n * Unbinds `dragstart` event on wrapper.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('dragstart', Components.Html.wrapper);\n },\n\n /**\n * Event handler. Prevents dragging.\n *\n * @return {Void}\n */\n dragstart: function dragstart(event) {\n event.preventDefault();\n }\n };\n /**\n * Remove bindings from images:\n * - on destroying, to remove added EventListeners\n */\n\n Events.on('destroy', function () {\n Images.unbind();\n Binder.destroy();\n });\n return Images;\n}\n\nfunction anchors(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n /**\n * Holds detaching status of anchors.\n * Prevents detaching of already detached anchors.\n *\n * @private\n * @type {Boolean}\n */\n\n var detached = false;\n /**\n * Holds preventing status of anchors.\n * If `true` redirection after click will be disabled.\n *\n * @private\n * @type {Boolean}\n */\n\n var prevented = false;\n var Anchors = {\n /**\n * Setups a initial state of anchors component.\n *\n * @returns {Void}\n */\n mount: function mount() {\n /**\n * Holds collection of anchors elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n this._a = Components.Html.wrapper.querySelectorAll('a');\n this.bind();\n },\n\n /**\n * Binds events to anchors inside a track.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('click', Components.Html.wrapper, this.click);\n },\n\n /**\n * Unbinds events attached to anchors inside a track.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('click', Components.Html.wrapper);\n },\n\n /**\n * Handler for click event. Prevents clicks when glide is in `prevent` status.\n *\n * @param {Object} event\n * @return {Void}\n */\n click: function click(event) {\n if (prevented) {\n event.stopPropagation();\n event.preventDefault();\n }\n },\n\n /**\n * Detaches anchors click event inside glide.\n *\n * @return {self}\n */\n detach: function detach() {\n prevented = true;\n\n if (!detached) {\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].draggable = false;\n this.items[i].setAttribute('data-href', this.items[i].getAttribute('href'));\n this.items[i].removeAttribute('href');\n }\n\n detached = true;\n }\n\n return this;\n },\n\n /**\n * Attaches anchors click events inside glide.\n *\n * @return {self}\n */\n attach: function attach() {\n prevented = false;\n\n if (detached) {\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].draggable = true;\n this.items[i].setAttribute('href', this.items[i].getAttribute('data-href'));\n }\n\n detached = false;\n }\n\n return this;\n }\n };\n define(Anchors, 'items', {\n /**\n * Gets collection of the arrows HTML elements.\n *\n * @return {HTMLElement[]}\n */\n get: function get() {\n return Anchors._a;\n }\n });\n /**\n * Detach anchors inside slides:\n * - on swiping, so they won't redirect to its `href` attributes\n */\n\n Events.on('swipe.move', function () {\n Anchors.detach();\n });\n /**\n * Attach anchors inside slides:\n * - after swiping and transitions ends, so they can redirect after click again\n */\n\n Events.on('swipe.end', function () {\n Components.Transition.after(function () {\n Anchors.attach();\n });\n });\n /**\n * Unbind anchors inside slides:\n * - on destroying, to bring anchors to its initial state\n */\n\n Events.on('destroy', function () {\n Anchors.attach();\n Anchors.unbind();\n Binder.destroy();\n });\n return Anchors;\n}\n\nvar NAV_SELECTOR = '[data-glide-el=\"controls[nav]\"]';\nvar CONTROLS_SELECTOR = '[data-glide-el^=\"controls\"]';\n\nfunction controls(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var capture = supportsPassive$1 ? {\n passive: true\n } : false;\n var Controls = {\n /**\n * Inits arrows. Binds events listeners\n * to the arrows HTML elements.\n *\n * @return {Void}\n */\n mount: function mount() {\n /**\n * Collection of navigation HTML elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n this._n = Components.Html.root.querySelectorAll(NAV_SELECTOR);\n /**\n * Collection of controls HTML elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n\n this._c = Components.Html.root.querySelectorAll(CONTROLS_SELECTOR);\n this.addBindings();\n },\n\n /**\n * Sets active class to current slide.\n *\n * @return {Void}\n */\n setActive: function setActive() {\n for (var i = 0; i < this._n.length; i++) {\n this.addClass(this._n[i].children);\n }\n },\n\n /**\n * Removes active class to current slide.\n *\n * @return {Void}\n */\n removeActive: function removeActive() {\n for (var i = 0; i < this._n.length; i++) {\n this.removeClass(this._n[i].children);\n }\n },\n\n /**\n * Toggles active class on items inside navigation.\n *\n * @param {HTMLElement} controls\n * @return {Void}\n */\n addClass: function addClass(controls) {\n var settings = Glide.settings;\n var item = controls[Glide.index];\n\n if (item) {\n item.classList.add(settings.classes.nav.active);\n siblings(item).forEach(function (sibling) {\n sibling.classList.remove(settings.classes.nav.active);\n });\n }\n },\n\n /**\n * Removes active class from active control.\n *\n * @param {HTMLElement} controls\n * @return {Void}\n */\n removeClass: function removeClass(controls) {\n var item = controls[Glide.index];\n\n if (item) {\n item.classList.remove(Glide.settings.classes.nav.active);\n }\n },\n\n /**\n * Adds handles to the each group of controls.\n *\n * @return {Void}\n */\n addBindings: function addBindings() {\n for (var i = 0; i < this._c.length; i++) {\n this.bind(this._c[i].children);\n }\n },\n\n /**\n * Removes handles from the each group of controls.\n *\n * @return {Void}\n */\n removeBindings: function removeBindings() {\n for (var i = 0; i < this._c.length; i++) {\n this.unbind(this._c[i].children);\n }\n },\n\n /**\n * Binds events to arrows HTML elements.\n *\n * @param {HTMLCollection} elements\n * @return {Void}\n */\n bind: function bind(elements) {\n for (var i = 0; i < elements.length; i++) {\n Binder.on('click', elements[i], this.click);\n Binder.on('touchstart', elements[i], this.click, capture);\n }\n },\n\n /**\n * Unbinds events binded to the arrows HTML elements.\n *\n * @param {HTMLCollection} elements\n * @return {Void}\n */\n unbind: function unbind(elements) {\n for (var i = 0; i < elements.length; i++) {\n Binder.off(['click', 'touchstart'], elements[i]);\n }\n },\n\n /**\n * Handles `click` event on the arrows HTML elements.\n * Moves slider in driection precised in\n * `data-glide-dir` attribute.\n *\n * @param {Object} event\n * @return {Void}\n */\n click: function click(event) {\n event.preventDefault();\n Components.Run.make(Components.Direction.resolve(event.currentTarget.getAttribute('data-glide-dir')));\n }\n };\n define(Controls, 'items', {\n /**\n * Gets collection of the controls HTML elements.\n *\n * @return {HTMLElement[]}\n */\n get: function get() {\n return Controls._c;\n }\n });\n /**\n * Swap active class of current navigation item:\n * - after mounting to set it to initial index\n * - after each move to the new index\n */\n\n Events.on(['mount.after', 'move.after'], function () {\n Controls.setActive();\n });\n /**\n * Remove bindings and HTML Classes:\n * - on destroying, to bring markup to its initial state\n */\n\n Events.on('destroy', function () {\n Controls.removeBindings();\n Controls.removeActive();\n Binder.destroy();\n });\n return Controls;\n}\n\nfunction keyboard(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Keyboard = {\n /**\n * Binds keyboard events on component mount.\n *\n * @return {Void}\n */\n mount: function mount() {\n if (Glide.settings.keyboard) {\n this.bind();\n }\n },\n\n /**\n * Adds keyboard press events.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('keyup', document, this.press);\n },\n\n /**\n * Removes keyboard press events.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('keyup', document);\n },\n\n /**\n * Handles keyboard's arrows press and moving glide foward and backward.\n *\n * @param {Object} event\n * @return {Void}\n */\n press: function press(event) {\n if (event.keyCode === 39) {\n Components.Run.make(Components.Direction.resolve('>'));\n }\n\n if (event.keyCode === 37) {\n Components.Run.make(Components.Direction.resolve('<'));\n }\n }\n };\n /**\n * Remove bindings from keyboard:\n * - on destroying to remove added events\n * - on updating to remove events before remounting\n */\n\n Events.on(['destroy', 'update'], function () {\n Keyboard.unbind();\n });\n /**\n * Remount component\n * - on updating to reflect potential changes in settings\n */\n\n Events.on('update', function () {\n Keyboard.mount();\n });\n /**\n * Destroy binder:\n * - on destroying to remove listeners\n */\n\n Events.on('destroy', function () {\n Binder.destroy();\n });\n return Keyboard;\n}\n\nfunction autoplay(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Autoplay = {\n /**\n * Initializes autoplaying and events.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.start();\n\n if (Glide.settings.hoverpause) {\n this.bind();\n }\n },\n\n /**\n * Starts autoplaying in configured interval.\n *\n * @param {Boolean|Number} force Run autoplaying with passed interval regardless of `autoplay` settings\n * @return {Void}\n */\n start: function start() {\n var _this = this;\n\n if (Glide.settings.autoplay) {\n if (isUndefined(this._i)) {\n this._i = setInterval(function () {\n _this.stop();\n\n Components.Run.make('>');\n\n _this.start();\n }, this.time);\n }\n }\n },\n\n /**\n * Stops autorunning of the glide.\n *\n * @return {Void}\n */\n stop: function stop() {\n this._i = clearInterval(this._i);\n },\n\n /**\n * Stops autoplaying while mouse is over glide's area.\n *\n * @return {Void}\n */\n bind: function bind() {\n var _this2 = this;\n\n Binder.on('mouseover', Components.Html.root, function () {\n _this2.stop();\n });\n Binder.on('mouseout', Components.Html.root, function () {\n _this2.start();\n });\n },\n\n /**\n * Unbind mouseover events.\n *\n * @returns {Void}\n */\n unbind: function unbind() {\n Binder.off(['mouseover', 'mouseout'], Components.Html.root);\n }\n };\n define(Autoplay, 'time', {\n /**\n * Gets time period value for the autoplay interval. Prioritizes\n * times in `data-glide-autoplay` attrubutes over options.\n *\n * @return {Number}\n */\n get: function get() {\n var autoplay = Components.Html.slides[Glide.index].getAttribute('data-glide-autoplay');\n\n if (autoplay) {\n return toInt(autoplay);\n }\n\n return toInt(Glide.settings.autoplay);\n }\n });\n /**\n * Stop autoplaying and unbind events:\n * - on destroying, to clear defined interval\n * - on updating via API to reset interval that may changed\n */\n\n Events.on(['destroy', 'update'], function () {\n Autoplay.unbind();\n });\n /**\n * Stop autoplaying:\n * - before each run, to restart autoplaying\n * - on pausing via API\n * - on destroying, to clear defined interval\n * - while starting a swipe\n * - on updating via API to reset interval that may changed\n */\n\n Events.on(['run.before', 'pause', 'destroy', 'swipe.start', 'update'], function () {\n Autoplay.stop();\n });\n /**\n * Start autoplaying:\n * - after each run, to restart autoplaying\n * - on playing via API\n * - while ending a swipe\n */\n\n Events.on(['run.after', 'play', 'swipe.end'], function () {\n Autoplay.start();\n });\n /**\n * Remount autoplaying:\n * - on updating via API to reset interval that may changed\n */\n\n Events.on('update', function () {\n Autoplay.mount();\n });\n /**\n * Destroy a binder:\n * - on destroying glide instance to clearup listeners\n */\n\n Events.on('destroy', function () {\n Binder.destroy();\n });\n return Autoplay;\n}\n/**\n * Sorts keys of breakpoint object so they will be ordered from lower to bigger.\n *\n * @param {Object} points\n * @returns {Object}\n */\n\n\nfunction sortBreakpoints(points) {\n if (isObject(points)) {\n return sortKeys(points);\n } else {\n warn('Breakpoints option must be an object');\n }\n\n return {};\n}\n\nfunction breakpoints(Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n /**\n * Holds reference to settings.\n *\n * @type {Object}\n */\n\n var settings = Glide.settings;\n /**\n * Holds reference to breakpoints object in settings. Sorts breakpoints\n * from smaller to larger. It is required in order to proper\n * matching currently active breakpoint settings.\n *\n * @type {Object}\n */\n\n var points = sortBreakpoints(settings.breakpoints);\n /**\n * Cache initial settings before overwritting.\n *\n * @type {Object}\n */\n\n var defaults = _extends({}, settings);\n\n var Breakpoints = {\n /**\n * Matches settings for currectly matching media breakpoint.\n *\n * @param {Object} points\n * @returns {Object}\n */\n match: function match(points) {\n if (typeof window.matchMedia !== 'undefined') {\n for (var point in points) {\n if (points.hasOwnProperty(point)) {\n if (window.matchMedia('(max-width: ' + point + 'px)').matches) {\n return points[point];\n }\n }\n }\n }\n\n return defaults;\n }\n };\n /**\n * Overwrite instance settings with currently matching breakpoint settings.\n * This happens right after component initialization.\n */\n\n _extends(settings, Breakpoints.match(points));\n /**\n * Update glide with settings of matched brekpoint:\n * - window resize to update slider\n */\n\n\n Binder.on('resize', window, throttle(function () {\n Glide.settings = mergeOptions(settings, Breakpoints.match(points));\n }, Glide.settings.throttle));\n /**\n * Resort and update default settings:\n * - on reinit via API, so breakpoint matching will be performed with options\n */\n\n Events.on('update', function () {\n points = sortBreakpoints(points);\n defaults = _extends({}, settings);\n });\n /**\n * Unbind resize listener:\n * - on destroying, to bring markup to its initial state\n */\n\n Events.on('destroy', function () {\n Binder.off('resize', window);\n });\n return Breakpoints;\n}\n\nvar COMPONENTS = {\n Html: Html,\n Translate: Translate,\n Transition: Transition,\n Direction: Direction,\n Peek: Peek,\n Sizes: Sizes,\n Gaps: Gaps,\n Move: Move,\n Clones: Clones,\n Resize: Resize,\n Build: Build,\n Run: Run\n};\n\nvar Glide$1 = function (_Core) {\n inherits(Glide$$1, _Core);\n\n function Glide$$1() {\n classCallCheck(this, Glide$$1);\n return possibleConstructorReturn(this, (Glide$$1.__proto__ || Object.getPrototypeOf(Glide$$1)).apply(this, arguments));\n }\n\n createClass(Glide$$1, [{\n key: 'mount',\n value: function mount() {\n var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return get(Glide$$1.prototype.__proto__ || Object.getPrototypeOf(Glide$$1.prototype), 'mount', this).call(this, _extends({}, COMPONENTS, extensions));\n }\n }]);\n return Glide$$1;\n}(Glide);\n\nvar _default = Glide$1;\nexports.default = _default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdsaWRlLmpzIl0sIm5hbWVzIjpbImRlZmF1bHRzIiwidHlwZSIsInN0YXJ0QXQiLCJwZXJWaWV3IiwiZm9jdXNBdCIsImdhcCIsImF1dG9wbGF5IiwiaG92ZXJwYXVzZSIsImtleWJvYXJkIiwiYm91bmQiLCJzd2lwZVRocmVzaG9sZCIsImRyYWdUaHJlc2hvbGQiLCJwZXJTd2lwZSIsInRvdWNoUmF0aW8iLCJ0b3VjaEFuZ2xlIiwiYW5pbWF0aW9uRHVyYXRpb24iLCJyZXdpbmQiLCJyZXdpbmREdXJhdGlvbiIsImFuaW1hdGlvblRpbWluZ0Z1bmMiLCJ3YWl0Rm9yVHJhbnNpdGlvbiIsInRocm90dGxlIiwiZGlyZWN0aW9uIiwicGVlayIsImJyZWFrcG9pbnRzIiwiY2xhc3NlcyIsInN3aXBlYWJsZSIsImRyYWdnaW5nIiwibHRyIiwicnRsIiwic2xpZGVyIiwiY2Fyb3VzZWwiLCJzbGlkZSIsImNsb25lIiwiYWN0aXZlIiwiYXJyb3ciLCJkaXNhYmxlZCIsIm5hdiIsIndhcm4iLCJtc2ciLCJjb25zb2xlIiwiZXJyb3IiLCJfdHlwZW9mIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJvYmoiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsImNsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsImNyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInRhcmdldCIsInByb3BzIiwiaSIsImxlbmd0aCIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImtleSIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIl9leHRlbmRzIiwiYXNzaWduIiwiYXJndW1lbnRzIiwic291cmNlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZ2V0Iiwib2JqZWN0IiwicHJvcGVydHkiLCJyZWNlaXZlciIsIkZ1bmN0aW9uIiwiZGVzYyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInVuZGVmaW5lZCIsInBhcmVudCIsImdldFByb3RvdHlwZU9mIiwidmFsdWUiLCJnZXR0ZXIiLCJpbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwicG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsInRvSW50IiwicGFyc2VJbnQiLCJ0b0Zsb2F0IiwicGFyc2VGbG9hdCIsImlzU3RyaW5nIiwiaXNPYmplY3QiLCJpc0Z1bmN0aW9uIiwiaXNVbmRlZmluZWQiLCJpc0FycmF5IiwiQXJyYXkiLCJtb3VudCIsImdsaWRlIiwiZXh0ZW5zaW9ucyIsImV2ZW50cyIsImNvbXBvbmVudHMiLCJuYW1lIiwiX25hbWUiLCJkZWZpbmUiLCJwcm9wIiwiZGVmaW5pdGlvbiIsInNvcnRLZXlzIiwia2V5cyIsInNvcnQiLCJyZWR1Y2UiLCJyIiwiayIsIm1lcmdlT3B0aW9ucyIsInNldHRpbmdzIiwib3B0aW9ucyIsIkV2ZW50c0J1cyIsImhvcCIsIm9uIiwiZXZlbnQiLCJoYW5kbGVyIiwiaW5kZXgiLCJwdXNoIiwicmVtb3ZlIiwiZW1pdCIsImNvbnRleHQiLCJmb3JFYWNoIiwiaXRlbSIsIkdsaWRlIiwic2VsZWN0b3IiLCJfYyIsIl90IiwiX2UiLCJtb3VudCQkMSIsIm11dGF0ZSIsInRyYW5zZm9ybWVycyIsInVwZGF0ZSIsImdvIiwicGF0dGVybiIsIlJ1biIsIm1ha2UiLCJtb3ZlIiwiZGlzdGFuY2UiLCJUcmFuc2l0aW9uIiwiZGlzYWJsZSIsIk1vdmUiLCJkZXN0cm95IiwicGxheSIsImludGVydmFsIiwicGF1c2UiLCJlbmFibGUiLCJpc1R5cGUiLCJnZXQkJDEiLCJfbyIsInNldCIsInNldCQkMSIsIm8iLCJfaSIsIl9kIiwic3RhdHVzIiwiQ29tcG9uZW50cyIsIkV2ZW50cyIsIl90aGlzIiwiY2FsY3VsYXRlIiwiYWZ0ZXIiLCJpc1N0YXJ0IiwiaXNFbmQiLCJpc09mZnNldCIsInN0ZXBzIiwidmlld1NpemUiLCJjYWxjdWxhdGVGb3J3YXJkSW5kZXgiLCJub3JtYWxpemVGb3J3YXJkSW5kZXgiLCJfaW5kZXgiLCJjYWxjdWxhdGVCYWNrd2FyZEluZGV4Iiwibm9ybWFsaXplQmFja3dhcmRJbmRleCIsImlzQm91bmQiLCJNYXRoIiwiZmxvb3IiLCJ2aWV3IiwiY2VpbCIsIl9tIiwic3RlcCIsInN1YnN0ciIsIkh0bWwiLCJzbGlkZXMiLCJub3ciLCJEYXRlIiwiZ2V0VGltZSIsImZ1bmMiLCJ3YWl0IiwidGltZW91dCIsImFyZ3MiLCJyZXN1bHQiLCJwcmV2aW91cyIsImxhdGVyIiwibGVhZGluZyIsImFwcGx5IiwidGhyb3R0bGVkIiwiYXQiLCJyZW1haW5pbmciLCJjbGVhclRpbWVvdXQiLCJ0cmFpbGluZyIsInNldFRpbWVvdXQiLCJjYW5jZWwiLCJNQVJHSU5fVFlQRSIsIkdhcHMiLCJsZW4iLCJzdHlsZSIsIkRpcmVjdGlvbiIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsIlNpemVzIiwid3JhcHBlciIsImNoaWxkcmVuIiwic2libGluZ3MiLCJub2RlIiwicGFyZW50Tm9kZSIsIm4iLCJmaXJzdENoaWxkIiwibWF0Y2hlZCIsIm5leHRTaWJsaW5nIiwibm9kZVR5cGUiLCJleGlzdCIsIndpbmRvdyIsIkhUTUxFbGVtZW50IiwiVFJBQ0tfU0VMRUNUT1IiLCJyb290IiwidHJhY2siLCJxdWVyeVNlbGVjdG9yIiwic2xpY2UiLCJmaWx0ZXIiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsIl9yIiwiZG9jdW1lbnQiLCJ0IiwiUGVlayIsIl92IiwiYmVmb3JlIiwib2Zmc2V0IiwibW92ZW1lbnQiLCJzbGlkZVdpZHRoIiwidHJhbnNsYXRlIiwiaXMiLCJzZXR1cFNsaWRlcyIsIndpZHRoIiwic2V0dXBXcmFwcGVyIiwid3JhcHBlclNpemUiLCJvZmZzZXRXaWR0aCIsImdyb3ciLCJDbG9uZXMiLCJyZWR1Y3RvciIsIkJ1aWxkIiwidHlwZUNsYXNzIiwiYWN0aXZlQ2xhc3MiLCJhZGQiLCJzaWJsaW5nIiwicmVtb3ZlQ2xhc3NlcyIsIl9HbGlkZSRzZXR0aW5ncyRjbGFzcyIsIml0ZW1zIiwiY29sbGVjdCIsIl9HbGlkZSRzZXR0aW5ncyIsInBlZWtJbmNyZW1lbnRlciIsImNsb25lQ291bnQiLCJyb3VuZCIsImFwcGVuZCIsInJldmVyc2UiLCJwcmVwZW5kIiwibWF4IiwiY2xvbmVOb2RlIiwiX2Nsb25lIiwidW5zaGlmdCIsIl9Db21wb25lbnRzJEh0bWwiLCJoYWxmIiwiYXBwZW5kQ2hpbGQiLCJfaTIiLCJpbnNlcnRCZWZvcmUiLCJfaTMiLCJyZW1vdmVDaGlsZCIsIkV2ZW50c0JpbmRlciIsImxpc3RlbmVycyIsImVsIiwiY2xvc3VyZSIsImNhcHR1cmUiLCJhZGRFdmVudExpc3RlbmVyIiwib2ZmIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlJlc2l6ZSIsIkJpbmRlciIsImJpbmQiLCJ1bmJpbmQiLCJWQUxJRF9ESVJFQ1RJT05TIiwiRkxJUEVEX01PVkVNRU5UUyIsInJlc29sdmUiLCJ0b2tlbiIsInNwbGl0Iiwiam9pbiIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJpbmRleE9mIiwiUnRsIiwibW9kaWZ5IiwiR2FwIiwibXVsdGlwbGllciIsIkdyb3ciLCJQZWVraW5nIiwiRm9jdXNpbmciLCJtdXRhdG9yIiwiVFJBTlNGT1JNRVJTIiwiY29uY2F0IiwidHJhbnNmb3JtZXIiLCJUcmFuc2xhdGUiLCJ0cmFuc2Zvcm0iLCJnZXRTdGFydEluZGV4IiwiZ2V0VHJhdmVsRGlzdGFuY2UiLCJ0cmF2ZWxEaXN0YW5jZSIsInN0YXJ0V2lkdGgiLCJjb21wb3NlIiwiZHVyYXRpb24iLCJ0cmFuc2l0aW9uIiwiY2FsbGJhY2siLCJzdXBwb3J0c1Bhc3NpdmUiLCJvcHRzIiwiZSIsInN1cHBvcnRzUGFzc2l2ZSQxIiwiU1RBUlRfRVZFTlRTIiwiTU9WRV9FVkVOVFMiLCJFTkRfRVZFTlRTIiwiTU9VU0VfRVZFTlRTIiwic3dpcGUiLCJzd2lwZVNpbiIsInN3aXBlU3RhcnRYIiwic3dpcGVTdGFydFkiLCJwYXNzaXZlIiwiU3dpcGUiLCJiaW5kU3dpcGVTdGFydCIsInN0YXJ0IiwidG91Y2hlcyIsInBhZ2VYIiwicGFnZVkiLCJiaW5kU3dpcGVNb3ZlIiwiYmluZFN3aXBlRW5kIiwic3ViRXhTeCIsInN1YkV5U3kiLCJwb3dFWCIsImFicyIsInBvd0VZIiwic3dpcGVIeXBvdGVudXNlIiwic3FydCIsInN3aXBlQ2F0aGV0dXMiLCJhc2luIiwiUEkiLCJzdG9wUHJvcGFnYXRpb24iLCJlbmQiLCJfR2xpZGUkc2V0dGluZ3MyIiwidGhyZXNob2xkIiwic3dpcGVEaXN0YW5jZSIsInN3aXBlRGVnIiwidW5iaW5kU3dpcGVNb3ZlIiwidW5iaW5kU3dpcGVFbmQiLCJfR2xpZGUkc2V0dGluZ3MzIiwidW5iaW5kU3dpcGVTdGFydCIsIl90aGlzMiIsIl90aGlzMyIsImNoYW5nZWRUb3VjaGVzIiwiaW1hZ2VzIiwiSW1hZ2VzIiwiZHJhZ3N0YXJ0IiwicHJldmVudERlZmF1bHQiLCJhbmNob3JzIiwiZGV0YWNoZWQiLCJwcmV2ZW50ZWQiLCJBbmNob3JzIiwiX2EiLCJxdWVyeVNlbGVjdG9yQWxsIiwiY2xpY2siLCJkZXRhY2giLCJkcmFnZ2FibGUiLCJzZXRBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJhdHRhY2giLCJOQVZfU0VMRUNUT1IiLCJDT05UUk9MU19TRUxFQ1RPUiIsImNvbnRyb2xzIiwiQ29udHJvbHMiLCJfbiIsImFkZEJpbmRpbmdzIiwic2V0QWN0aXZlIiwicmVtb3ZlQWN0aXZlIiwicmVtb3ZlQmluZGluZ3MiLCJlbGVtZW50cyIsImN1cnJlbnRUYXJnZXQiLCJLZXlib2FyZCIsInByZXNzIiwia2V5Q29kZSIsIkF1dG9wbGF5Iiwic2V0SW50ZXJ2YWwiLCJzdG9wIiwidGltZSIsImNsZWFySW50ZXJ2YWwiLCJzb3J0QnJlYWtwb2ludHMiLCJwb2ludHMiLCJCcmVha3BvaW50cyIsIm1hdGNoIiwibWF0Y2hNZWRpYSIsInBvaW50IiwibWF0Y2hlcyIsIkNPTVBPTkVOVFMiLCJHbGlkZSQxIiwiX0NvcmUiLCJHbGlkZSQkMSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7OztBQU1BLElBQUlBLFFBQVEsR0FBRztBQUNiOzs7Ozs7Ozs7QUFTQUMsRUFBQUEsSUFBSSxFQUFFLFFBVk87O0FBWWI7Ozs7O0FBS0FDLEVBQUFBLE9BQU8sRUFBRSxDQWpCSTs7QUFtQmI7Ozs7O0FBS0FDLEVBQUFBLE9BQU8sRUFBRSxDQXhCSTs7QUEwQmI7Ozs7Ozs7OztBQVNBQyxFQUFBQSxPQUFPLEVBQUUsQ0FuQ0k7O0FBcUNiOzs7OztBQUtBQyxFQUFBQSxHQUFHLEVBQUUsRUExQ1E7O0FBNENiOzs7OztBQUtBQyxFQUFBQSxRQUFRLEVBQUUsS0FqREc7O0FBbURiOzs7OztBQUtBQyxFQUFBQSxVQUFVLEVBQUUsSUF4REM7O0FBMERiOzs7OztBQUtBQyxFQUFBQSxRQUFRLEVBQUUsSUEvREc7O0FBaUViOzs7Ozs7OztBQVFBQyxFQUFBQSxLQUFLLEVBQUUsS0F6RU07O0FBMkViOzs7OztBQUtBQyxFQUFBQSxjQUFjLEVBQUUsRUFoRkg7O0FBa0ZiOzs7OztBQUtBQyxFQUFBQSxhQUFhLEVBQUUsR0F2RkY7O0FBeUZiOzs7Ozs7Ozs7QUFTQUMsRUFBQUEsUUFBUSxFQUFFLEdBbEdHOztBQW9HYjs7Ozs7QUFLQUMsRUFBQUEsVUFBVSxFQUFFLEdBekdDOztBQTJHYjs7Ozs7QUFLQUMsRUFBQUEsVUFBVSxFQUFFLEVBaEhDOztBQWtIYjs7Ozs7QUFLQUMsRUFBQUEsaUJBQWlCLEVBQUUsR0F2SE47O0FBeUhiOzs7OztBQUtBQyxFQUFBQSxNQUFNLEVBQUUsSUE5SEs7O0FBZ0liOzs7OztBQUtBQyxFQUFBQSxjQUFjLEVBQUUsR0FySUg7O0FBdUliOzs7OztBQUtBQyxFQUFBQSxtQkFBbUIsRUFBRSxtQ0E1SVI7O0FBOEliOzs7OztBQUtBQyxFQUFBQSxpQkFBaUIsRUFBRSxJQW5KTjs7QUFxSmI7Ozs7O0FBS0FDLEVBQUFBLFFBQVEsRUFBRSxFQTFKRzs7QUE0SmI7Ozs7Ozs7OztBQVNBQyxFQUFBQSxTQUFTLEVBQUUsS0FyS0U7O0FBdUtiOzs7Ozs7Ozs7Ozs7QUFZQUMsRUFBQUEsSUFBSSxFQUFFLENBbkxPOztBQXFMYjs7Ozs7Ozs7O0FBU0FDLEVBQUFBLFdBQVcsRUFBRSxFQTlMQTs7QUFnTWI7Ozs7OztBQU1BQyxFQUFBQSxPQUFPLEVBQUU7QUFDUEMsSUFBQUEsU0FBUyxFQUFFLGtCQURKO0FBRVBDLElBQUFBLFFBQVEsRUFBRSxpQkFGSDtBQUdQTCxJQUFBQSxTQUFTLEVBQUU7QUFDVE0sTUFBQUEsR0FBRyxFQUFFLFlBREk7QUFFVEMsTUFBQUEsR0FBRyxFQUFFO0FBRkksS0FISjtBQU9QM0IsSUFBQUEsSUFBSSxFQUFFO0FBQ0o0QixNQUFBQSxNQUFNLEVBQUUsZUFESjtBQUVKQyxNQUFBQSxRQUFRLEVBQUU7QUFGTixLQVBDO0FBV1BDLElBQUFBLEtBQUssRUFBRTtBQUNMQyxNQUFBQSxLQUFLLEVBQUUscUJBREY7QUFFTEMsTUFBQUEsTUFBTSxFQUFFO0FBRkgsS0FYQTtBQWVQQyxJQUFBQSxLQUFLLEVBQUU7QUFDTEMsTUFBQUEsUUFBUSxFQUFFO0FBREwsS0FmQTtBQWtCUEMsSUFBQUEsR0FBRyxFQUFFO0FBQ0hILE1BQUFBLE1BQU0sRUFBRTtBQURMO0FBbEJFO0FBdE1JLENBQWY7QUE4TkE7Ozs7Ozs7QUFNQSxTQUFTSSxJQUFULENBQWNDLEdBQWQsRUFBbUI7QUFDakJDLEVBQUFBLE9BQU8sQ0FBQ0MsS0FBUixDQUFjLG1CQUFtQkYsR0FBakM7QUFDRDs7QUFFRCxJQUFJRyxPQUFPLEdBQUcsT0FBT0MsTUFBUCxLQUFrQixVQUFsQixJQUFnQyxTQUFPQSxNQUFNLENBQUNDLFFBQWQsTUFBMkIsUUFBM0QsR0FBc0UsVUFBVUMsR0FBVixFQUFlO0FBQ2pHLGtCQUFjQSxHQUFkO0FBQ0QsQ0FGYSxHQUVWLFVBQVVBLEdBQVYsRUFBZTtBQUNqQixTQUFPQSxHQUFHLElBQUksT0FBT0YsTUFBUCxLQUFrQixVQUF6QixJQUF1Q0UsR0FBRyxDQUFDQyxXQUFKLEtBQW9CSCxNQUEzRCxJQUFxRUUsR0FBRyxLQUFLRixNQUFNLENBQUNJLFNBQXBGLEdBQWdHLFFBQWhHLFlBQWtIRixHQUFsSCxDQUFQO0FBQ0QsQ0FKRDs7QUFNQSxJQUFJRyxjQUFjLEdBQUcsU0FBakJBLGNBQWlCLENBQVVDLFFBQVYsRUFBb0JDLFdBQXBCLEVBQWlDO0FBQ3BELE1BQUksRUFBRUQsUUFBUSxZQUFZQyxXQUF0QixDQUFKLEVBQXdDO0FBQ3RDLFVBQU0sSUFBSUMsU0FBSixDQUFjLG1DQUFkLENBQU47QUFDRDtBQUNGLENBSkQ7O0FBTUEsSUFBSUMsV0FBVyxHQUFHLFlBQVk7QUFDNUIsV0FBU0MsZ0JBQVQsQ0FBMEJDLE1BQTFCLEVBQWtDQyxLQUFsQyxFQUF5QztBQUN2QyxTQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdELEtBQUssQ0FBQ0UsTUFBMUIsRUFBa0NELENBQUMsRUFBbkMsRUFBdUM7QUFDckMsVUFBSUUsVUFBVSxHQUFHSCxLQUFLLENBQUNDLENBQUQsQ0FBdEI7QUFDQUUsTUFBQUEsVUFBVSxDQUFDQyxVQUFYLEdBQXdCRCxVQUFVLENBQUNDLFVBQVgsSUFBeUIsS0FBakQ7QUFDQUQsTUFBQUEsVUFBVSxDQUFDRSxZQUFYLEdBQTBCLElBQTFCO0FBQ0EsVUFBSSxXQUFXRixVQUFmLEVBQTJCQSxVQUFVLENBQUNHLFFBQVgsR0FBc0IsSUFBdEI7QUFDM0JDLE1BQUFBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQlQsTUFBdEIsRUFBOEJJLFVBQVUsQ0FBQ00sR0FBekMsRUFBOENOLFVBQTlDO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPLFVBQVVSLFdBQVYsRUFBdUJlLFVBQXZCLEVBQW1DQyxXQUFuQyxFQUFnRDtBQUNyRCxRQUFJRCxVQUFKLEVBQWdCWixnQkFBZ0IsQ0FBQ0gsV0FBVyxDQUFDSCxTQUFiLEVBQXdCa0IsVUFBeEIsQ0FBaEI7QUFDaEIsUUFBSUMsV0FBSixFQUFpQmIsZ0JBQWdCLENBQUNILFdBQUQsRUFBY2dCLFdBQWQsQ0FBaEI7QUFDakIsV0FBT2hCLFdBQVA7QUFDRCxHQUpEO0FBS0QsQ0FoQmlCLEVBQWxCOztBQWtCQSxJQUFJaUIsUUFBUSxHQUFHTCxNQUFNLENBQUNNLE1BQVAsSUFBaUIsVUFBVWQsTUFBVixFQUFrQjtBQUNoRCxPQUFLLElBQUlFLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdhLFNBQVMsQ0FBQ1osTUFBOUIsRUFBc0NELENBQUMsRUFBdkMsRUFBMkM7QUFDekMsUUFBSWMsTUFBTSxHQUFHRCxTQUFTLENBQUNiLENBQUQsQ0FBdEI7O0FBRUEsU0FBSyxJQUFJUSxHQUFULElBQWdCTSxNQUFoQixFQUF3QjtBQUN0QixVQUFJUixNQUFNLENBQUNmLFNBQVAsQ0FBaUJ3QixjQUFqQixDQUFnQ0MsSUFBaEMsQ0FBcUNGLE1BQXJDLEVBQTZDTixHQUE3QyxDQUFKLEVBQXVEO0FBQ3JEVixRQUFBQSxNQUFNLENBQUNVLEdBQUQsQ0FBTixHQUFjTSxNQUFNLENBQUNOLEdBQUQsQ0FBcEI7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsU0FBT1YsTUFBUDtBQUNELENBWkQ7O0FBY0EsSUFBSW1CLEdBQUcsR0FBRyxTQUFTQSxHQUFULENBQWFDLE1BQWIsRUFBcUJDLFFBQXJCLEVBQStCQyxRQUEvQixFQUF5QztBQUNqRCxNQUFJRixNQUFNLEtBQUssSUFBZixFQUFxQkEsTUFBTSxHQUFHRyxRQUFRLENBQUM5QixTQUFsQjtBQUNyQixNQUFJK0IsSUFBSSxHQUFHaEIsTUFBTSxDQUFDaUIsd0JBQVAsQ0FBZ0NMLE1BQWhDLEVBQXdDQyxRQUF4QyxDQUFYOztBQUVBLE1BQUlHLElBQUksS0FBS0UsU0FBYixFQUF3QjtBQUN0QixRQUFJQyxNQUFNLEdBQUduQixNQUFNLENBQUNvQixjQUFQLENBQXNCUixNQUF0QixDQUFiOztBQUVBLFFBQUlPLE1BQU0sS0FBSyxJQUFmLEVBQXFCO0FBQ25CLGFBQU9ELFNBQVA7QUFDRCxLQUZELE1BRU87QUFDTCxhQUFPUCxHQUFHLENBQUNRLE1BQUQsRUFBU04sUUFBVCxFQUFtQkMsUUFBbkIsQ0FBVjtBQUNEO0FBQ0YsR0FSRCxNQVFPLElBQUksV0FBV0UsSUFBZixFQUFxQjtBQUMxQixXQUFPQSxJQUFJLENBQUNLLEtBQVo7QUFDRCxHQUZNLE1BRUE7QUFDTCxRQUFJQyxNQUFNLEdBQUdOLElBQUksQ0FBQ0wsR0FBbEI7O0FBRUEsUUFBSVcsTUFBTSxLQUFLSixTQUFmLEVBQTBCO0FBQ3hCLGFBQU9BLFNBQVA7QUFDRDs7QUFFRCxXQUFPSSxNQUFNLENBQUNaLElBQVAsQ0FBWUksUUFBWixDQUFQO0FBQ0Q7QUFDRixDQXZCRDs7QUF5QkEsSUFBSVMsUUFBUSxHQUFHLFNBQVhBLFFBQVcsQ0FBVUMsUUFBVixFQUFvQkMsVUFBcEIsRUFBZ0M7QUFDN0MsTUFBSSxPQUFPQSxVQUFQLEtBQXNCLFVBQXRCLElBQW9DQSxVQUFVLEtBQUssSUFBdkQsRUFBNkQ7QUFDM0QsVUFBTSxJQUFJcEMsU0FBSixDQUFjLHNFQUFvRW9DLFVBQXBFLENBQWQsQ0FBTjtBQUNEOztBQUVERCxFQUFBQSxRQUFRLENBQUN2QyxTQUFULEdBQXFCZSxNQUFNLENBQUMwQixNQUFQLENBQWNELFVBQVUsSUFBSUEsVUFBVSxDQUFDeEMsU0FBdkMsRUFBa0Q7QUFDckVELElBQUFBLFdBQVcsRUFBRTtBQUNYcUMsTUFBQUEsS0FBSyxFQUFFRyxRQURJO0FBRVgzQixNQUFBQSxVQUFVLEVBQUUsS0FGRDtBQUdYRSxNQUFBQSxRQUFRLEVBQUUsSUFIQztBQUlYRCxNQUFBQSxZQUFZLEVBQUU7QUFKSDtBQUR3RCxHQUFsRCxDQUFyQjtBQVFBLE1BQUkyQixVQUFKLEVBQWdCekIsTUFBTSxDQUFDMkIsY0FBUCxHQUF3QjNCLE1BQU0sQ0FBQzJCLGNBQVAsQ0FBc0JILFFBQXRCLEVBQWdDQyxVQUFoQyxDQUF4QixHQUFzRUQsUUFBUSxDQUFDSSxTQUFULEdBQXFCSCxVQUEzRjtBQUNqQixDQWREOztBQWdCQSxJQUFJSSx5QkFBeUIsR0FBRyxTQUE1QkEseUJBQTRCLENBQVVDLElBQVYsRUFBZ0JwQixJQUFoQixFQUFzQjtBQUNwRCxNQUFJLENBQUNvQixJQUFMLEVBQVc7QUFDVCxVQUFNLElBQUlDLGNBQUosQ0FBbUIsMkRBQW5CLENBQU47QUFDRDs7QUFFRCxTQUFPckIsSUFBSSxLQUFLLFNBQU9BLElBQVAsTUFBZ0IsUUFBaEIsSUFBNEIsT0FBT0EsSUFBUCxLQUFnQixVQUFqRCxDQUFKLEdBQW1FQSxJQUFuRSxHQUEwRW9CLElBQWpGO0FBQ0QsQ0FORDtBQVFBOzs7Ozs7Ozs7QUFPQSxTQUFTRSxLQUFULENBQWVYLEtBQWYsRUFBc0I7QUFDcEIsU0FBT1ksUUFBUSxDQUFDWixLQUFELENBQWY7QUFDRDtBQUVEOzs7Ozs7Ozs7QUFPQSxTQUFTYSxPQUFULENBQWlCYixLQUFqQixFQUF3QjtBQUN0QixTQUFPYyxVQUFVLENBQUNkLEtBQUQsQ0FBakI7QUFDRDtBQUVEOzs7Ozs7OztBQU1BLFNBQVNlLFFBQVQsQ0FBa0JmLEtBQWxCLEVBQXlCO0FBQ3ZCLFNBQU8sT0FBT0EsS0FBUCxLQUFpQixRQUF4QjtBQUNEO0FBRUQ7Ozs7Ozs7Ozs7QUFRQSxTQUFTZ0IsUUFBVCxDQUFrQmhCLEtBQWxCLEVBQXlCO0FBQ3ZCLE1BQUlqRixJQUFJLEdBQUcsT0FBT2lGLEtBQVAsS0FBaUIsV0FBakIsR0FBK0IsV0FBL0IsR0FBNkN6QyxPQUFPLENBQUN5QyxLQUFELENBQS9EO0FBRUEsU0FBT2pGLElBQUksS0FBSyxVQUFULElBQXVCQSxJQUFJLEtBQUssUUFBVCxJQUFxQixDQUFDLENBQUNpRixLQUFyRCxDQUh1QixDQUdxQztBQUM3RDtBQUVEOzs7Ozs7OztBQU1BLFNBQVNpQixVQUFULENBQW9CakIsS0FBcEIsRUFBMkI7QUFDekIsU0FBTyxPQUFPQSxLQUFQLEtBQWlCLFVBQXhCO0FBQ0Q7QUFFRDs7Ozs7Ozs7QUFNQSxTQUFTa0IsV0FBVCxDQUFxQmxCLEtBQXJCLEVBQTRCO0FBQzFCLFNBQU8sT0FBT0EsS0FBUCxLQUFpQixXQUF4QjtBQUNEO0FBRUQ7Ozs7Ozs7O0FBTUEsU0FBU21CLE9BQVQsQ0FBaUJuQixLQUFqQixFQUF3QjtBQUN0QixTQUFPQSxLQUFLLENBQUNyQyxXQUFOLEtBQXNCeUQsS0FBN0I7QUFDRDtBQUVEOzs7Ozs7Ozs7OztBQVNBLFNBQVNDLEtBQVQsQ0FBZUMsS0FBZixFQUFzQkMsVUFBdEIsRUFBa0NDLE1BQWxDLEVBQTBDO0FBQ3hDLE1BQUlDLFVBQVUsR0FBRyxFQUFqQjs7QUFFQSxPQUFLLElBQUlDLElBQVQsSUFBaUJILFVBQWpCLEVBQTZCO0FBQzNCLFFBQUlOLFVBQVUsQ0FBQ00sVUFBVSxDQUFDRyxJQUFELENBQVgsQ0FBZCxFQUFrQztBQUNoQ0QsTUFBQUEsVUFBVSxDQUFDQyxJQUFELENBQVYsR0FBbUJILFVBQVUsQ0FBQ0csSUFBRCxDQUFWLENBQWlCSixLQUFqQixFQUF3QkcsVUFBeEIsRUFBb0NELE1BQXBDLENBQW5CO0FBQ0QsS0FGRCxNQUVPO0FBQ0xyRSxNQUFBQSxJQUFJLENBQUMsOEJBQUQsQ0FBSjtBQUNEO0FBQ0Y7O0FBRUQsT0FBSyxJQUFJd0UsS0FBVCxJQUFrQkYsVUFBbEIsRUFBOEI7QUFDNUIsUUFBSVIsVUFBVSxDQUFDUSxVQUFVLENBQUNFLEtBQUQsQ0FBVixDQUFrQk4sS0FBbkIsQ0FBZCxFQUF5QztBQUN2Q0ksTUFBQUEsVUFBVSxDQUFDRSxLQUFELENBQVYsQ0FBa0JOLEtBQWxCO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPSSxVQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7OztBQVFBLFNBQVNHLE1BQVQsQ0FBZ0JsRSxHQUFoQixFQUFxQm1FLElBQXJCLEVBQTJCQyxVQUEzQixFQUF1QztBQUNyQ25ELEVBQUFBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQmxCLEdBQXRCLEVBQTJCbUUsSUFBM0IsRUFBaUNDLFVBQWpDO0FBQ0Q7QUFFRDs7Ozs7Ozs7QUFNQSxTQUFTQyxRQUFULENBQWtCckUsR0FBbEIsRUFBdUI7QUFDckIsU0FBT2lCLE1BQU0sQ0FBQ3FELElBQVAsQ0FBWXRFLEdBQVosRUFBaUJ1RSxJQUFqQixHQUF3QkMsTUFBeEIsQ0FBK0IsVUFBVUMsQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQ3BERCxJQUFBQSxDQUFDLENBQUNDLENBQUQsQ0FBRCxHQUFPMUUsR0FBRyxDQUFDMEUsQ0FBRCxDQUFWO0FBRUEsV0FBT0QsQ0FBQyxDQUFDQyxDQUFELENBQUQsRUFBTUQsQ0FBYjtBQUNELEdBSk0sRUFJSixFQUpJLENBQVA7QUFLRDtBQUVEOzs7Ozs7Ozs7QUFPQSxTQUFTRSxZQUFULENBQXNCdkgsUUFBdEIsRUFBZ0N3SCxRQUFoQyxFQUEwQztBQUN4QyxNQUFJQyxPQUFPLEdBQUd2RCxRQUFRLENBQUMsRUFBRCxFQUFLbEUsUUFBTCxFQUFld0gsUUFBZixDQUF0QixDQUR3QyxDQUd4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxNQUFJQSxRQUFRLENBQUNsRCxjQUFULENBQXdCLFNBQXhCLENBQUosRUFBd0M7QUFDdENtRCxJQUFBQSxPQUFPLENBQUNqRyxPQUFSLEdBQWtCMEMsUUFBUSxDQUFDLEVBQUQsRUFBS2xFLFFBQVEsQ0FBQ3dCLE9BQWQsRUFBdUJnRyxRQUFRLENBQUNoRyxPQUFoQyxDQUExQjs7QUFFQSxRQUFJZ0csUUFBUSxDQUFDaEcsT0FBVCxDQUFpQjhDLGNBQWpCLENBQWdDLFdBQWhDLENBQUosRUFBa0Q7QUFDaERtRCxNQUFBQSxPQUFPLENBQUNqRyxPQUFSLENBQWdCSCxTQUFoQixHQUE0QjZDLFFBQVEsQ0FBQyxFQUFELEVBQUtsRSxRQUFRLENBQUN3QixPQUFULENBQWlCSCxTQUF0QixFQUFpQ21HLFFBQVEsQ0FBQ2hHLE9BQVQsQ0FBaUJILFNBQWxELENBQXBDO0FBQ0Q7O0FBRUQsUUFBSW1HLFFBQVEsQ0FBQ2hHLE9BQVQsQ0FBaUI4QyxjQUFqQixDQUFnQyxNQUFoQyxDQUFKLEVBQTZDO0FBQzNDbUQsTUFBQUEsT0FBTyxDQUFDakcsT0FBUixDQUFnQnZCLElBQWhCLEdBQXVCaUUsUUFBUSxDQUFDLEVBQUQsRUFBS2xFLFFBQVEsQ0FBQ3dCLE9BQVQsQ0FBaUJ2QixJQUF0QixFQUE0QnVILFFBQVEsQ0FBQ2hHLE9BQVQsQ0FBaUJ2QixJQUE3QyxDQUEvQjtBQUNEOztBQUVELFFBQUl1SCxRQUFRLENBQUNoRyxPQUFULENBQWlCOEMsY0FBakIsQ0FBZ0MsT0FBaEMsQ0FBSixFQUE4QztBQUM1Q21ELE1BQUFBLE9BQU8sQ0FBQ2pHLE9BQVIsQ0FBZ0JPLEtBQWhCLEdBQXdCbUMsUUFBUSxDQUFDLEVBQUQsRUFBS2xFLFFBQVEsQ0FBQ3dCLE9BQVQsQ0FBaUJPLEtBQXRCLEVBQTZCeUYsUUFBUSxDQUFDaEcsT0FBVCxDQUFpQk8sS0FBOUMsQ0FBaEM7QUFDRDs7QUFFRCxRQUFJeUYsUUFBUSxDQUFDaEcsT0FBVCxDQUFpQjhDLGNBQWpCLENBQWdDLE9BQWhDLENBQUosRUFBOEM7QUFDNUNtRCxNQUFBQSxPQUFPLENBQUNqRyxPQUFSLENBQWdCVSxLQUFoQixHQUF3QmdDLFFBQVEsQ0FBQyxFQUFELEVBQUtsRSxRQUFRLENBQUN3QixPQUFULENBQWlCVSxLQUF0QixFQUE2QnNGLFFBQVEsQ0FBQ2hHLE9BQVQsQ0FBaUJVLEtBQTlDLENBQWhDO0FBQ0Q7O0FBRUQsUUFBSXNGLFFBQVEsQ0FBQ2hHLE9BQVQsQ0FBaUI4QyxjQUFqQixDQUFnQyxLQUFoQyxDQUFKLEVBQTRDO0FBQzFDbUQsTUFBQUEsT0FBTyxDQUFDakcsT0FBUixDQUFnQlksR0FBaEIsR0FBc0I4QixRQUFRLENBQUMsRUFBRCxFQUFLbEUsUUFBUSxDQUFDd0IsT0FBVCxDQUFpQlksR0FBdEIsRUFBMkJvRixRQUFRLENBQUNoRyxPQUFULENBQWlCWSxHQUE1QyxDQUE5QjtBQUNEO0FBQ0Y7O0FBRUQsTUFBSW9GLFFBQVEsQ0FBQ2xELGNBQVQsQ0FBd0IsYUFBeEIsQ0FBSixFQUE0QztBQUMxQ21ELElBQUFBLE9BQU8sQ0FBQ2xHLFdBQVIsR0FBc0IyQyxRQUFRLENBQUMsRUFBRCxFQUFLbEUsUUFBUSxDQUFDdUIsV0FBZCxFQUEyQmlHLFFBQVEsQ0FBQ2pHLFdBQXBDLENBQTlCO0FBQ0Q7O0FBRUQsU0FBT2tHLE9BQVA7QUFDRDs7QUFFRCxJQUFJQyxTQUFTLEdBQUcsWUFBWTtBQUMxQjs7Ozs7QUFLQSxXQUFTQSxTQUFULEdBQXFCO0FBQ25CLFFBQUloQixNQUFNLEdBQUd0QyxTQUFTLENBQUNaLE1BQVYsR0FBbUIsQ0FBbkIsSUFBd0JZLFNBQVMsQ0FBQyxDQUFELENBQVQsS0FBaUJXLFNBQXpDLEdBQXFEWCxTQUFTLENBQUMsQ0FBRCxDQUE5RCxHQUFvRSxFQUFqRjtBQUNBckIsSUFBQUEsY0FBYyxDQUFDLElBQUQsRUFBTzJFLFNBQVAsQ0FBZDtBQUVBLFNBQUtoQixNQUFMLEdBQWNBLE1BQWQ7QUFDQSxTQUFLaUIsR0FBTCxHQUFXakIsTUFBTSxDQUFDcEMsY0FBbEI7QUFDRDtBQUVEOzs7Ozs7OztBQVFBbkIsRUFBQUEsV0FBVyxDQUFDdUUsU0FBRCxFQUFZLENBQUM7QUFDdEIzRCxJQUFBQSxHQUFHLEVBQUUsSUFEaUI7QUFFdEJtQixJQUFBQSxLQUFLLEVBQUUsU0FBUzBDLEVBQVQsQ0FBWUMsS0FBWixFQUFtQkMsT0FBbkIsRUFBNEI7QUFDakMsVUFBSXpCLE9BQU8sQ0FBQ3dCLEtBQUQsQ0FBWCxFQUFvQjtBQUNsQixhQUFLLElBQUl0RSxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHc0UsS0FBSyxDQUFDckUsTUFBMUIsRUFBa0NELENBQUMsRUFBbkMsRUFBdUM7QUFDckMsZUFBS3FFLEVBQUwsQ0FBUUMsS0FBSyxDQUFDdEUsQ0FBRCxDQUFiLEVBQWtCdUUsT0FBbEI7QUFDRDtBQUNGLE9BTGdDLENBT2pDOzs7QUFDQSxVQUFJLENBQUMsS0FBS0gsR0FBTCxDQUFTcEQsSUFBVCxDQUFjLEtBQUttQyxNQUFuQixFQUEyQm1CLEtBQTNCLENBQUwsRUFBd0M7QUFDdEMsYUFBS25CLE1BQUwsQ0FBWW1CLEtBQVosSUFBcUIsRUFBckI7QUFDRCxPQVZnQyxDQVlqQzs7O0FBQ0EsVUFBSUUsS0FBSyxHQUFHLEtBQUtyQixNQUFMLENBQVltQixLQUFaLEVBQW1CRyxJQUFuQixDQUF3QkYsT0FBeEIsSUFBbUMsQ0FBL0MsQ0FiaUMsQ0FlakM7O0FBQ0EsYUFBTztBQUNMRyxRQUFBQSxNQUFNLEVBQUUsU0FBU0EsTUFBVCxHQUFrQjtBQUN4QixpQkFBTyxLQUFLdkIsTUFBTCxDQUFZbUIsS0FBWixFQUFtQkUsS0FBbkIsQ0FBUDtBQUNEO0FBSEksT0FBUDtBQUtEO0FBRUQ7Ozs7Ozs7QUF6QnNCLEdBQUQsRUFnQ3BCO0FBQ0RoRSxJQUFBQSxHQUFHLEVBQUUsTUFESjtBQUVEbUIsSUFBQUEsS0FBSyxFQUFFLFNBQVNnRCxJQUFULENBQWNMLEtBQWQsRUFBcUJNLE9BQXJCLEVBQThCO0FBQ25DLFVBQUk5QixPQUFPLENBQUN3QixLQUFELENBQVgsRUFBb0I7QUFDbEIsYUFBSyxJQUFJdEUsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR3NFLEtBQUssQ0FBQ3JFLE1BQTFCLEVBQWtDRCxDQUFDLEVBQW5DLEVBQXVDO0FBQ3JDLGVBQUsyRSxJQUFMLENBQVVMLEtBQUssQ0FBQ3RFLENBQUQsQ0FBZixFQUFvQjRFLE9BQXBCO0FBQ0Q7QUFDRixPQUxrQyxDQU9uQzs7O0FBQ0EsVUFBSSxDQUFDLEtBQUtSLEdBQUwsQ0FBU3BELElBQVQsQ0FBYyxLQUFLbUMsTUFBbkIsRUFBMkJtQixLQUEzQixDQUFMLEVBQXdDO0FBQ3RDO0FBQ0QsT0FWa0MsQ0FZbkM7OztBQUNBLFdBQUtuQixNQUFMLENBQVltQixLQUFaLEVBQW1CTyxPQUFuQixDQUEyQixVQUFVQyxJQUFWLEVBQWdCO0FBQ3pDQSxRQUFBQSxJQUFJLENBQUNGLE9BQU8sSUFBSSxFQUFaLENBQUo7QUFDRCxPQUZEO0FBR0Q7QUFsQkEsR0FoQ29CLENBQVosQ0FBWDtBQW9EQSxTQUFPVCxTQUFQO0FBQ0QsQ0EzRWUsRUFBaEI7O0FBNkVBLElBQUlZLEtBQUssR0FBRyxZQUFZO0FBQ3RCOzs7Ozs7QUFNQSxXQUFTQSxLQUFULENBQWVDLFFBQWYsRUFBeUI7QUFDdkIsUUFBSWQsT0FBTyxHQUFHckQsU0FBUyxDQUFDWixNQUFWLEdBQW1CLENBQW5CLElBQXdCWSxTQUFTLENBQUMsQ0FBRCxDQUFULEtBQWlCVyxTQUF6QyxHQUFxRFgsU0FBUyxDQUFDLENBQUQsQ0FBOUQsR0FBb0UsRUFBbEY7QUFDQXJCLElBQUFBLGNBQWMsQ0FBQyxJQUFELEVBQU91RixLQUFQLENBQWQ7QUFFQSxTQUFLRSxFQUFMLEdBQVUsRUFBVjtBQUNBLFNBQUtDLEVBQUwsR0FBVSxFQUFWO0FBQ0EsU0FBS0MsRUFBTCxHQUFVLElBQUloQixTQUFKLEVBQVY7QUFFQSxTQUFLdkYsUUFBTCxHQUFnQixLQUFoQjtBQUNBLFNBQUtvRyxRQUFMLEdBQWdCQSxRQUFoQjtBQUNBLFNBQUtmLFFBQUwsR0FBZ0JELFlBQVksQ0FBQ3ZILFFBQUQsRUFBV3lILE9BQVgsQ0FBNUI7QUFDQSxTQUFLTSxLQUFMLEdBQWEsS0FBS1AsUUFBTCxDQUFjdEgsT0FBM0I7QUFDRDtBQUVEOzs7Ozs7OztBQVFBaUQsRUFBQUEsV0FBVyxDQUFDbUYsS0FBRCxFQUFRLENBQUM7QUFDbEJ2RSxJQUFBQSxHQUFHLEVBQUUsT0FEYTtBQUVsQm1CLElBQUFBLEtBQUssRUFBRSxTQUFTeUQsUUFBVCxHQUFvQjtBQUN6QixVQUFJbEMsVUFBVSxHQUFHckMsU0FBUyxDQUFDWixNQUFWLEdBQW1CLENBQW5CLElBQXdCWSxTQUFTLENBQUMsQ0FBRCxDQUFULEtBQWlCVyxTQUF6QyxHQUFxRFgsU0FBUyxDQUFDLENBQUQsQ0FBOUQsR0FBb0UsRUFBckY7O0FBRUEsV0FBS3NFLEVBQUwsQ0FBUVIsSUFBUixDQUFhLGNBQWI7O0FBRUEsVUFBSWhDLFFBQVEsQ0FBQ08sVUFBRCxDQUFaLEVBQTBCO0FBQ3hCLGFBQUsrQixFQUFMLEdBQVVqQyxLQUFLLENBQUMsSUFBRCxFQUFPRSxVQUFQLEVBQW1CLEtBQUtpQyxFQUF4QixDQUFmO0FBQ0QsT0FGRCxNQUVPO0FBQ0xyRyxRQUFBQSxJQUFJLENBQUMsMkNBQUQsQ0FBSjtBQUNEOztBQUVELFdBQUtxRyxFQUFMLENBQVFSLElBQVIsQ0FBYSxhQUFiOztBQUVBLGFBQU8sSUFBUDtBQUNEO0FBRUQ7Ozs7Ozs7QUFsQmtCLEdBQUQsRUF5QmhCO0FBQ0RuRSxJQUFBQSxHQUFHLEVBQUUsUUFESjtBQUVEbUIsSUFBQUEsS0FBSyxFQUFFLFNBQVMwRCxNQUFULEdBQWtCO0FBQ3ZCLFVBQUlDLFlBQVksR0FBR3pFLFNBQVMsQ0FBQ1osTUFBVixHQUFtQixDQUFuQixJQUF3QlksU0FBUyxDQUFDLENBQUQsQ0FBVCxLQUFpQlcsU0FBekMsR0FBcURYLFNBQVMsQ0FBQyxDQUFELENBQTlELEdBQW9FLEVBQXZGOztBQUVBLFVBQUlpQyxPQUFPLENBQUN3QyxZQUFELENBQVgsRUFBMkI7QUFDekIsYUFBS0osRUFBTCxHQUFVSSxZQUFWO0FBQ0QsT0FGRCxNQUVPO0FBQ0x4RyxRQUFBQSxJQUFJLENBQUMsMkNBQUQsQ0FBSjtBQUNEOztBQUVELGFBQU8sSUFBUDtBQUNEO0FBRUQ7Ozs7Ozs7QUFkQyxHQXpCZ0IsRUE4Q2hCO0FBQ0QwQixJQUFBQSxHQUFHLEVBQUUsUUFESjtBQUVEbUIsSUFBQUEsS0FBSyxFQUFFLFNBQVM0RCxNQUFULEdBQWtCO0FBQ3ZCLFVBQUl0QixRQUFRLEdBQUdwRCxTQUFTLENBQUNaLE1BQVYsR0FBbUIsQ0FBbkIsSUFBd0JZLFNBQVMsQ0FBQyxDQUFELENBQVQsS0FBaUJXLFNBQXpDLEdBQXFEWCxTQUFTLENBQUMsQ0FBRCxDQUE5RCxHQUFvRSxFQUFuRjtBQUVBLFdBQUtvRCxRQUFMLEdBQWdCRCxZQUFZLENBQUMsS0FBS0MsUUFBTixFQUFnQkEsUUFBaEIsQ0FBNUI7O0FBRUEsVUFBSUEsUUFBUSxDQUFDbEQsY0FBVCxDQUF3QixTQUF4QixDQUFKLEVBQXdDO0FBQ3RDLGFBQUt5RCxLQUFMLEdBQWFQLFFBQVEsQ0FBQ3RILE9BQXRCO0FBQ0Q7O0FBRUQsV0FBS3dJLEVBQUwsQ0FBUVIsSUFBUixDQUFhLFFBQWI7O0FBRUEsYUFBTyxJQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7O0FBaEJDLEdBOUNnQixFQTBFaEI7QUFDRG5FLElBQUFBLEdBQUcsRUFBRSxJQURKO0FBRURtQixJQUFBQSxLQUFLLEVBQUUsU0FBUzZELEVBQVQsQ0FBWUMsT0FBWixFQUFxQjtBQUMxQixXQUFLUixFQUFMLENBQVFTLEdBQVIsQ0FBWUMsSUFBWixDQUFpQkYsT0FBakI7O0FBRUEsYUFBTyxJQUFQO0FBQ0Q7QUFFRDs7Ozs7OztBQVJDLEdBMUVnQixFQXlGaEI7QUFDRGpGLElBQUFBLEdBQUcsRUFBRSxNQURKO0FBRURtQixJQUFBQSxLQUFLLEVBQUUsU0FBU2lFLElBQVQsQ0FBY0MsUUFBZCxFQUF3QjtBQUM3QixXQUFLWixFQUFMLENBQVFhLFVBQVIsQ0FBbUJDLE9BQW5COztBQUNBLFdBQUtkLEVBQUwsQ0FBUWUsSUFBUixDQUFhTCxJQUFiLENBQWtCRSxRQUFsQjs7QUFFQSxhQUFPLElBQVA7QUFDRDtBQUVEOzs7Ozs7QUFUQyxHQXpGZ0IsRUF3R2hCO0FBQ0RyRixJQUFBQSxHQUFHLEVBQUUsU0FESjtBQUVEbUIsSUFBQUEsS0FBSyxFQUFFLFNBQVNzRSxPQUFULEdBQW1CO0FBQ3hCLFdBQUtkLEVBQUwsQ0FBUVIsSUFBUixDQUFhLFNBQWI7O0FBRUEsYUFBTyxJQUFQO0FBQ0Q7QUFFRDs7Ozs7OztBQVJDLEdBeEdnQixFQXVIaEI7QUFDRG5FLElBQUFBLEdBQUcsRUFBRSxNQURKO0FBRURtQixJQUFBQSxLQUFLLEVBQUUsU0FBU3VFLElBQVQsR0FBZ0I7QUFDckIsVUFBSUMsUUFBUSxHQUFHdEYsU0FBUyxDQUFDWixNQUFWLEdBQW1CLENBQW5CLElBQXdCWSxTQUFTLENBQUMsQ0FBRCxDQUFULEtBQWlCVyxTQUF6QyxHQUFxRFgsU0FBUyxDQUFDLENBQUQsQ0FBOUQsR0FBb0UsS0FBbkY7O0FBRUEsVUFBSXNGLFFBQUosRUFBYztBQUNaLGFBQUtsQyxRQUFMLENBQWNsSCxRQUFkLEdBQXlCb0osUUFBekI7QUFDRDs7QUFFRCxXQUFLaEIsRUFBTCxDQUFRUixJQUFSLENBQWEsTUFBYjs7QUFFQSxhQUFPLElBQVA7QUFDRDtBQUVEOzs7Ozs7QUFkQyxHQXZIZ0IsRUEySWhCO0FBQ0RuRSxJQUFBQSxHQUFHLEVBQUUsT0FESjtBQUVEbUIsSUFBQUEsS0FBSyxFQUFFLFNBQVN5RSxLQUFULEdBQWlCO0FBQ3RCLFdBQUtqQixFQUFMLENBQVFSLElBQVIsQ0FBYSxPQUFiOztBQUVBLGFBQU8sSUFBUDtBQUNEO0FBRUQ7Ozs7OztBQVJDLEdBM0lnQixFQXlKaEI7QUFDRG5FLElBQUFBLEdBQUcsRUFBRSxTQURKO0FBRURtQixJQUFBQSxLQUFLLEVBQUUsU0FBU29FLE9BQVQsR0FBbUI7QUFDeEIsV0FBS25ILFFBQUwsR0FBZ0IsSUFBaEI7QUFFQSxhQUFPLElBQVA7QUFDRDtBQUVEOzs7Ozs7QUFSQyxHQXpKZ0IsRUF1S2hCO0FBQ0Q0QixJQUFBQSxHQUFHLEVBQUUsUUFESjtBQUVEbUIsSUFBQUEsS0FBSyxFQUFFLFNBQVMwRSxNQUFULEdBQWtCO0FBQ3ZCLFdBQUt6SCxRQUFMLEdBQWdCLEtBQWhCO0FBRUEsYUFBTyxJQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7QUFSQyxHQXZLZ0IsRUF1TGhCO0FBQ0Q0QixJQUFBQSxHQUFHLEVBQUUsSUFESjtBQUVEbUIsSUFBQUEsS0FBSyxFQUFFLFNBQVMwQyxFQUFULENBQVlDLEtBQVosRUFBbUJDLE9BQW5CLEVBQTRCO0FBQ2pDLFdBQUtZLEVBQUwsQ0FBUWQsRUFBUixDQUFXQyxLQUFYLEVBQWtCQyxPQUFsQjs7QUFFQSxhQUFPLElBQVA7QUFDRDtBQUVEOzs7Ozs7O0FBUkMsR0F2TGdCLEVBc01oQjtBQUNEL0QsSUFBQUEsR0FBRyxFQUFFLFFBREo7QUFFRG1CLElBQUFBLEtBQUssRUFBRSxTQUFTMkUsTUFBVCxDQUFnQmpELElBQWhCLEVBQXNCO0FBQzNCLGFBQU8sS0FBS1ksUUFBTCxDQUFjdkgsSUFBZCxLQUF1QjJHLElBQTlCO0FBQ0Q7QUFFRDs7Ozs7O0FBTkMsR0F0TWdCLEVBa05oQjtBQUNEN0MsSUFBQUEsR0FBRyxFQUFFLFVBREo7QUFFRFMsSUFBQUEsR0FBRyxFQUFFLFNBQVNzRixNQUFULEdBQWtCO0FBQ3JCLGFBQU8sS0FBS0MsRUFBWjtBQUNEO0FBRUQ7Ozs7OztBQU5DO0FBYURDLElBQUFBLEdBQUcsRUFBRSxTQUFTQyxNQUFULENBQWdCQyxDQUFoQixFQUFtQjtBQUN0QixVQUFJaEUsUUFBUSxDQUFDZ0UsQ0FBRCxDQUFaLEVBQWlCO0FBQ2YsYUFBS0gsRUFBTCxHQUFVRyxDQUFWO0FBQ0QsT0FGRCxNQUVPO0FBQ0w3SCxRQUFBQSxJQUFJLENBQUMsdUNBQUQsQ0FBSjtBQUNEO0FBQ0Y7QUFFRDs7Ozs7O0FBckJDLEdBbE5nQixFQTZPaEI7QUFDRDBCLElBQUFBLEdBQUcsRUFBRSxPQURKO0FBRURTLElBQUFBLEdBQUcsRUFBRSxTQUFTc0YsTUFBVCxHQUFrQjtBQUNyQixhQUFPLEtBQUtLLEVBQVo7QUFDRDtBQUVEOzs7OztBQU5DO0FBWURILElBQUFBLEdBQUcsRUFBRSxTQUFTQyxNQUFULENBQWdCMUcsQ0FBaEIsRUFBbUI7QUFDdEIsV0FBSzRHLEVBQUwsR0FBVXRFLEtBQUssQ0FBQ3RDLENBQUQsQ0FBZjtBQUNEO0FBRUQ7Ozs7OztBQWhCQyxHQTdPZ0IsRUFtUWhCO0FBQ0RRLElBQUFBLEdBQUcsRUFBRSxNQURKO0FBRURTLElBQUFBLEdBQUcsRUFBRSxTQUFTc0YsTUFBVCxHQUFrQjtBQUNyQixhQUFPLEtBQUt0QyxRQUFMLENBQWN2SCxJQUFyQjtBQUNEO0FBRUQ7Ozs7OztBQU5DLEdBblFnQixFQStRaEI7QUFDRDhELElBQUFBLEdBQUcsRUFBRSxVQURKO0FBRURTLElBQUFBLEdBQUcsRUFBRSxTQUFTc0YsTUFBVCxHQUFrQjtBQUNyQixhQUFPLEtBQUtNLEVBQVo7QUFDRDtBQUVEOzs7OztBQU5DO0FBWURKLElBQUFBLEdBQUcsRUFBRSxTQUFTQyxNQUFULENBQWdCSSxNQUFoQixFQUF3QjtBQUMzQixXQUFLRCxFQUFMLEdBQVUsQ0FBQyxDQUFDQyxNQUFaO0FBQ0Q7QUFkQSxHQS9RZ0IsQ0FBUixDQUFYO0FBK1JBLFNBQU8vQixLQUFQO0FBQ0QsQ0E3VFcsRUFBWjs7QUErVEEsU0FBU1csR0FBVCxDQUFjWCxLQUFkLEVBQXFCZ0MsVUFBckIsRUFBaUNDLE1BQWpDLEVBQXlDO0FBQ3ZDLE1BQUl0QixHQUFHLEdBQUc7QUFDUjs7Ozs7QUFLQTFDLElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULEdBQWlCO0FBQ3RCLFdBQUt3RCxFQUFMLEdBQVUsS0FBVjtBQUNELEtBUk87O0FBV1I7Ozs7O0FBS0FiLElBQUFBLElBQUksRUFBRSxTQUFTQSxJQUFULENBQWNDLElBQWQsRUFBb0I7QUFDeEIsVUFBSXFCLEtBQUssR0FBRyxJQUFaOztBQUVBLFVBQUksQ0FBQ2xDLEtBQUssQ0FBQ25HLFFBQVgsRUFBcUI7QUFDbkIsU0FBQ21HLEtBQUssQ0FBQ2QsUUFBTixDQUFlckcsaUJBQWhCLElBQXFDbUgsS0FBSyxDQUFDZ0IsT0FBTixFQUFyQztBQUVBLGFBQUtILElBQUwsR0FBWUEsSUFBWjtBQUVBb0IsUUFBQUEsTUFBTSxDQUFDckMsSUFBUCxDQUFZLFlBQVosRUFBMEIsS0FBS2lCLElBQS9CO0FBRUEsYUFBS3NCLFNBQUw7QUFFQUYsUUFBQUEsTUFBTSxDQUFDckMsSUFBUCxDQUFZLEtBQVosRUFBbUIsS0FBS2lCLElBQXhCO0FBRUFtQixRQUFBQSxVQUFVLENBQUNqQixVQUFYLENBQXNCcUIsS0FBdEIsQ0FBNEIsWUFBWTtBQUN0QyxjQUFJRixLQUFLLENBQUNHLE9BQU4sRUFBSixFQUFxQjtBQUNuQkosWUFBQUEsTUFBTSxDQUFDckMsSUFBUCxDQUFZLFdBQVosRUFBeUJzQyxLQUFLLENBQUNyQixJQUEvQjtBQUNEOztBQUVELGNBQUlxQixLQUFLLENBQUNJLEtBQU4sRUFBSixFQUFtQjtBQUNqQkwsWUFBQUEsTUFBTSxDQUFDckMsSUFBUCxDQUFZLFNBQVosRUFBdUJzQyxLQUFLLENBQUNyQixJQUE3QjtBQUNEOztBQUVELGNBQUlxQixLQUFLLENBQUNLLFFBQU4sRUFBSixFQUFzQjtBQUNwQkwsWUFBQUEsS0FBSyxDQUFDVCxFQUFOLEdBQVcsS0FBWDtBQUVBUSxZQUFBQSxNQUFNLENBQUNyQyxJQUFQLENBQVksWUFBWixFQUEwQnNDLEtBQUssQ0FBQ3JCLElBQWhDO0FBQ0Q7O0FBRURvQixVQUFBQSxNQUFNLENBQUNyQyxJQUFQLENBQVksV0FBWixFQUF5QnNDLEtBQUssQ0FBQ3JCLElBQS9CO0FBRUFiLFVBQUFBLEtBQUssQ0FBQ3NCLE1BQU47QUFDRCxTQWxCRDtBQW1CRDtBQUNGLEtBbERPOztBQXFEUjs7Ozs7QUFLQWEsSUFBQUEsU0FBUyxFQUFFLFNBQVNBLFNBQVQsR0FBcUI7QUFDOUIsVUFBSXRCLElBQUksR0FBRyxLQUFLQSxJQUFoQjtBQUFBLFVBQ0kzRixNQUFNLEdBQUcsS0FBS0EsTUFEbEI7QUFFQSxVQUFJc0gsS0FBSyxHQUFHM0IsSUFBSSxDQUFDMkIsS0FBakI7QUFBQSxVQUNJekosU0FBUyxHQUFHOEgsSUFBSSxDQUFDOUgsU0FEckIsQ0FIOEIsQ0FNOUI7O0FBRUEsVUFBSTBKLFFBQVEsR0FBRyxDQUFmLENBUjhCLENBVTlCO0FBQ0E7O0FBQ0EsVUFBSTFKLFNBQVMsS0FBSyxHQUFsQixFQUF1QjtBQUNyQmlILFFBQUFBLEtBQUssQ0FBQ1AsS0FBTixHQUFjK0MsS0FBZDtBQUVBO0FBQ0QsT0FoQjZCLENBa0I5QjtBQUNBOzs7QUFDQSxVQUFJekosU0FBUyxLQUFLLEdBQWQsSUFBcUJ5SixLQUFLLEtBQUssR0FBbkMsRUFBd0M7QUFDdEN4QyxRQUFBQSxLQUFLLENBQUNQLEtBQU4sR0FBY3ZFLE1BQWQ7QUFFQTtBQUNELE9BeEI2QixDQTBCOUI7QUFDQTs7O0FBQ0EsVUFBSW5DLFNBQVMsS0FBSyxHQUFkLElBQXFCeUosS0FBSyxLQUFLLEdBQW5DLEVBQXdDO0FBQ3RDeEMsUUFBQUEsS0FBSyxDQUFDUCxLQUFOLEdBQWMsQ0FBZDtBQUVBO0FBQ0QsT0FoQzZCLENBa0M5Qjs7O0FBQ0EsVUFBSTFHLFNBQVMsS0FBSyxHQUFsQixFQUF1QjtBQUNyQjBKLFFBQUFBLFFBQVEsR0FBR3pDLEtBQUssQ0FBQ2QsUUFBTixDQUFlckgsT0FBZixJQUEwQixDQUFyQztBQUNELE9BckM2QixDQXVDOUI7OztBQUNBLFVBQUlrQixTQUFTLEtBQUssR0FBZCxJQUFxQkEsU0FBUyxLQUFLLEdBQWQsSUFBcUJ5SixLQUFLLEtBQUssR0FBeEQsRUFBNkQ7QUFDM0QsWUFBSS9DLEtBQUssR0FBR2lELHFCQUFxQixDQUFDRCxRQUFELENBQWpDOztBQUVBLFlBQUloRCxLQUFLLEdBQUd2RSxNQUFaLEVBQW9CO0FBQ2xCLGVBQUt1RyxFQUFMLEdBQVUsSUFBVjtBQUNEOztBQUVEekIsUUFBQUEsS0FBSyxDQUFDUCxLQUFOLEdBQWNrRCxxQkFBcUIsQ0FBQ2xELEtBQUQsRUFBUWdELFFBQVIsQ0FBbkM7QUFFQTtBQUNELE9BbEQ2QixDQW9EOUI7OztBQUNBLFVBQUkxSixTQUFTLEtBQUssR0FBZCxJQUFxQkEsU0FBUyxLQUFLLEdBQWQsSUFBcUJ5SixLQUFLLEtBQUssR0FBeEQsRUFBNkQ7QUFDM0QsWUFBSUksTUFBTSxHQUFHQyxzQkFBc0IsQ0FBQ0osUUFBRCxDQUFuQzs7QUFFQSxZQUFJRyxNQUFNLEdBQUcsQ0FBYixFQUFnQjtBQUNkLGVBQUtuQixFQUFMLEdBQVUsSUFBVjtBQUNEOztBQUVEekIsUUFBQUEsS0FBSyxDQUFDUCxLQUFOLEdBQWNxRCxzQkFBc0IsQ0FBQ0YsTUFBRCxFQUFTSCxRQUFULENBQXBDO0FBRUE7QUFDRDs7QUFFRDFJLE1BQUFBLElBQUksQ0FBQyxnQ0FBZ0NoQixTQUFoQyxHQUE0Q3lKLEtBQTVDLEdBQW9ELGlCQUFyRCxDQUFKO0FBQ0QsS0E1SE87O0FBK0hSOzs7OztBQUtBSCxJQUFBQSxPQUFPLEVBQUUsU0FBU0EsT0FBVCxHQUFtQjtBQUMxQixhQUFPckMsS0FBSyxDQUFDUCxLQUFOLElBQWUsQ0FBdEI7QUFDRCxLQXRJTzs7QUF5SVI7Ozs7O0FBS0E2QyxJQUFBQSxLQUFLLEVBQUUsU0FBU0EsS0FBVCxHQUFpQjtBQUN0QixhQUFPdEMsS0FBSyxDQUFDUCxLQUFOLElBQWUsS0FBS3ZFLE1BQTNCO0FBQ0QsS0FoSk87O0FBbUpSOzs7Ozs7QUFNQXFILElBQUFBLFFBQVEsRUFBRSxTQUFTQSxRQUFULEdBQW9CO0FBQzVCLFVBQUl4SixTQUFTLEdBQUcrQyxTQUFTLENBQUNaLE1BQVYsR0FBbUIsQ0FBbkIsSUFBd0JZLFNBQVMsQ0FBQyxDQUFELENBQVQsS0FBaUJXLFNBQXpDLEdBQXFEWCxTQUFTLENBQUMsQ0FBRCxDQUE5RCxHQUFvRVcsU0FBcEY7O0FBRUEsVUFBSSxDQUFDMUQsU0FBTCxFQUFnQjtBQUNkLGVBQU8sS0FBSzBJLEVBQVo7QUFDRDs7QUFFRCxVQUFJLENBQUMsS0FBS0EsRUFBVixFQUFjO0FBQ1osZUFBTyxLQUFQO0FBQ0QsT0FUMkIsQ0FXNUI7OztBQUNBLFVBQUkxSSxTQUFTLEtBQUssSUFBbEIsRUFBd0I7QUFDdEIsZUFBTyxLQUFLOEgsSUFBTCxDQUFVOUgsU0FBVixLQUF3QixHQUF4QixJQUErQixLQUFLOEgsSUFBTCxDQUFVMkIsS0FBVixLQUFvQixHQUExRDtBQUNELE9BZDJCLENBZ0I1Qjs7O0FBQ0EsVUFBSXpKLFNBQVMsS0FBSyxJQUFsQixFQUF3QjtBQUN0QixlQUFPLEtBQUs4SCxJQUFMLENBQVU5SCxTQUFWLEtBQXdCLEdBQXhCLElBQStCLEtBQUs4SCxJQUFMLENBQVUyQixLQUFWLEtBQW9CLEdBQTFEO0FBQ0Q7O0FBRUQsYUFBTyxLQUFLM0IsSUFBTCxDQUFVOUgsU0FBVixLQUF3QkEsU0FBL0I7QUFDRCxLQS9LTzs7QUFrTFI7Ozs7O0FBS0FnSyxJQUFBQSxPQUFPLEVBQUUsU0FBU0EsT0FBVCxHQUFtQjtBQUMxQixhQUFPL0MsS0FBSyxDQUFDdUIsTUFBTixDQUFhLFFBQWIsS0FBMEJ2QixLQUFLLENBQUNkLFFBQU4sQ0FBZXBILE9BQWYsS0FBMkIsUUFBckQsSUFBaUVrSSxLQUFLLENBQUNkLFFBQU4sQ0FBZS9HLEtBQXZGO0FBQ0Q7QUF6TE8sR0FBVjtBQTRMQTs7Ozs7OztBQU1BLFdBQVN1SyxxQkFBVCxDQUErQkQsUUFBL0IsRUFBeUM7QUFDdkMsUUFBSWhELEtBQUssR0FBR08sS0FBSyxDQUFDUCxLQUFsQjs7QUFHQSxRQUFJTyxLQUFLLENBQUN1QixNQUFOLENBQWEsVUFBYixDQUFKLEVBQThCO0FBQzVCLGFBQU85QixLQUFLLEdBQUdnRCxRQUFmO0FBQ0Q7O0FBRUQsV0FBT2hELEtBQUssSUFBSWdELFFBQVEsR0FBR2hELEtBQUssR0FBR2dELFFBQXZCLENBQVo7QUFDRDtBQUVEOzs7Ozs7Ozs7O0FBUUEsV0FBU0UscUJBQVQsQ0FBK0JsRCxLQUEvQixFQUFzQ2dELFFBQXRDLEVBQWdEO0FBQzlDLFFBQUl2SCxNQUFNLEdBQUd5RixHQUFHLENBQUN6RixNQUFqQjs7QUFHQSxRQUFJdUUsS0FBSyxJQUFJdkUsTUFBYixFQUFxQjtBQUNuQixhQUFPdUUsS0FBUDtBQUNEOztBQUVELFFBQUlPLEtBQUssQ0FBQ3VCLE1BQU4sQ0FBYSxVQUFiLENBQUosRUFBOEI7QUFDNUIsYUFBTzlCLEtBQUssSUFBSXZFLE1BQU0sR0FBRyxDQUFiLENBQVo7QUFDRDs7QUFFRCxRQUFJOEUsS0FBSyxDQUFDZCxRQUFOLENBQWV4RyxNQUFuQixFQUEyQjtBQUN6QjtBQUNBO0FBQ0EsVUFBSWlJLEdBQUcsQ0FBQ29DLE9BQUosTUFBaUIsQ0FBQ3BDLEdBQUcsQ0FBQzJCLEtBQUosRUFBdEIsRUFBbUM7QUFDakMsZUFBT3BILE1BQVA7QUFDRDs7QUFFRCxhQUFPLENBQVA7QUFDRDs7QUFFRCxRQUFJeUYsR0FBRyxDQUFDb0MsT0FBSixFQUFKLEVBQW1CO0FBQ2pCLGFBQU83SCxNQUFQO0FBQ0Q7O0FBRUQsV0FBTzhILElBQUksQ0FBQ0MsS0FBTCxDQUFXL0gsTUFBTSxHQUFHdUgsUUFBcEIsSUFBZ0NBLFFBQXZDO0FBQ0Q7QUFFRDs7Ozs7Ozs7QUFNQSxXQUFTSSxzQkFBVCxDQUFnQ0osUUFBaEMsRUFBMEM7QUFDeEMsUUFBSWhELEtBQUssR0FBR08sS0FBSyxDQUFDUCxLQUFsQjs7QUFHQSxRQUFJTyxLQUFLLENBQUN1QixNQUFOLENBQWEsVUFBYixDQUFKLEVBQThCO0FBQzVCLGFBQU85QixLQUFLLEdBQUdnRCxRQUFmO0FBQ0QsS0FOdUMsQ0FReEM7QUFDQTs7O0FBQ0EsUUFBSVMsSUFBSSxHQUFHRixJQUFJLENBQUNHLElBQUwsQ0FBVTFELEtBQUssR0FBR2dELFFBQWxCLENBQVg7QUFFQSxXQUFPLENBQUNTLElBQUksR0FBRyxDQUFSLElBQWFULFFBQXBCO0FBQ0Q7QUFFRDs7Ozs7Ozs7OztBQVFBLFdBQVNLLHNCQUFULENBQWdDckQsS0FBaEMsRUFBdUNnRCxRQUF2QyxFQUFpRDtBQUMvQyxRQUFJdkgsTUFBTSxHQUFHeUYsR0FBRyxDQUFDekYsTUFBakI7O0FBR0EsUUFBSXVFLEtBQUssSUFBSSxDQUFiLEVBQWdCO0FBQ2QsYUFBT0EsS0FBUDtBQUNEOztBQUVELFFBQUlPLEtBQUssQ0FBQ3VCLE1BQU4sQ0FBYSxVQUFiLENBQUosRUFBOEI7QUFDNUIsYUFBTzlCLEtBQUssSUFBSXZFLE1BQU0sR0FBRyxDQUFiLENBQVo7QUFDRDs7QUFFRCxRQUFJOEUsS0FBSyxDQUFDZCxRQUFOLENBQWV4RyxNQUFuQixFQUEyQjtBQUN6QjtBQUNBO0FBQ0EsVUFBSWlJLEdBQUcsQ0FBQ29DLE9BQUosTUFBaUJwQyxHQUFHLENBQUMwQixPQUFKLEVBQXJCLEVBQW9DO0FBQ2xDLGVBQU9uSCxNQUFQO0FBQ0Q7O0FBRUQsYUFBTzhILElBQUksQ0FBQ0MsS0FBTCxDQUFXL0gsTUFBTSxHQUFHdUgsUUFBcEIsSUFBZ0NBLFFBQXZDO0FBQ0Q7O0FBRUQsV0FBTyxDQUFQO0FBQ0Q7O0FBRURqRSxFQUFBQSxNQUFNLENBQUNtQyxHQUFELEVBQU0sTUFBTixFQUFjO0FBQ2xCOzs7OztBQUtBekUsSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsR0FBZTtBQUNsQixhQUFPLEtBQUtrSCxFQUFaO0FBQ0QsS0FSaUI7O0FBV2xCOzs7OztBQUtBMUIsSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsQ0FBYTlFLEtBQWIsRUFBb0I7QUFDdkIsVUFBSXlHLElBQUksR0FBR3pHLEtBQUssQ0FBQzBHLE1BQU4sQ0FBYSxDQUFiLENBQVg7QUFFQSxXQUFLRixFQUFMLEdBQVU7QUFDUnJLLFFBQUFBLFNBQVMsRUFBRTZELEtBQUssQ0FBQzBHLE1BQU4sQ0FBYSxDQUFiLEVBQWdCLENBQWhCLENBREg7QUFFUmQsUUFBQUEsS0FBSyxFQUFFYSxJQUFJLEdBQUc5RixLQUFLLENBQUM4RixJQUFELENBQUwsR0FBYzlGLEtBQUssQ0FBQzhGLElBQUQsQ0FBbkIsR0FBNEJBLElBQS9CLEdBQXNDO0FBRnpDLE9BQVY7QUFJRDtBQXZCaUIsR0FBZCxDQUFOO0FBMEJBN0UsRUFBQUEsTUFBTSxDQUFDbUMsR0FBRCxFQUFNLFFBQU4sRUFBZ0I7QUFDcEI7Ozs7OztBQU1BekUsSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsR0FBZTtBQUNsQixVQUFJZ0QsUUFBUSxHQUFHYyxLQUFLLENBQUNkLFFBQXJCO0FBQ0EsVUFBSWhFLE1BQU0sR0FBRzhHLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0JDLE1BQWhCLENBQXVCdEksTUFBcEMsQ0FGa0IsQ0FJbEI7QUFDQTtBQUNBOztBQUVBLFVBQUksS0FBSzZILE9BQUwsRUFBSixFQUFvQjtBQUNsQixlQUFPN0gsTUFBTSxHQUFHLENBQVQsSUFBY3FDLEtBQUssQ0FBQzJCLFFBQVEsQ0FBQ3JILE9BQVYsQ0FBTCxHQUEwQixDQUF4QyxJQUE2QzBGLEtBQUssQ0FBQzJCLFFBQVEsQ0FBQ3BILE9BQVYsQ0FBekQ7QUFDRDs7QUFFRCxhQUFPb0QsTUFBTSxHQUFHLENBQWhCO0FBQ0Q7QUFwQm1CLEdBQWhCLENBQU47QUF1QkFzRCxFQUFBQSxNQUFNLENBQUNtQyxHQUFELEVBQU0sUUFBTixFQUFnQjtBQUNwQjs7Ozs7QUFLQXpFLElBQUFBLEdBQUcsRUFBRSxTQUFTQSxHQUFULEdBQWU7QUFDbEIsYUFBTyxLQUFLdUYsRUFBWjtBQUNEO0FBUm1CLEdBQWhCLENBQU47QUFXQSxTQUFPZCxHQUFQO0FBQ0Q7QUFFRDs7Ozs7OztBQUtBLFNBQVM4QyxHQUFULEdBQWU7QUFDYixTQUFPLElBQUlDLElBQUosR0FBV0MsT0FBWCxFQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7OztBQVdBLFNBQVM3SyxRQUFULENBQWtCOEssSUFBbEIsRUFBd0JDLElBQXhCLEVBQThCMUUsT0FBOUIsRUFBdUM7QUFDckMsTUFBSTJFLE9BQU8sR0FBRyxLQUFLLENBQW5CO0FBQUEsTUFDSWpFLE9BQU8sR0FBRyxLQUFLLENBRG5CO0FBQUEsTUFFSWtFLElBQUksR0FBRyxLQUFLLENBRmhCO0FBQUEsTUFHSUMsTUFBTSxHQUFHLEtBQUssQ0FIbEI7QUFJQSxNQUFJQyxRQUFRLEdBQUcsQ0FBZjtBQUNBLE1BQUksQ0FBQzlFLE9BQUwsRUFBY0EsT0FBTyxHQUFHLEVBQVY7O0FBRWQsTUFBSStFLEtBQUssR0FBRyxTQUFTQSxLQUFULEdBQWlCO0FBQzNCRCxJQUFBQSxRQUFRLEdBQUc5RSxPQUFPLENBQUNnRixPQUFSLEtBQW9CLEtBQXBCLEdBQTRCLENBQTVCLEdBQWdDVixHQUFHLEVBQTlDO0FBQ0FLLElBQUFBLE9BQU8sR0FBRyxJQUFWO0FBQ0FFLElBQUFBLE1BQU0sR0FBR0osSUFBSSxDQUFDUSxLQUFMLENBQVd2RSxPQUFYLEVBQW9Ca0UsSUFBcEIsQ0FBVDtBQUNBLFFBQUksQ0FBQ0QsT0FBTCxFQUFjakUsT0FBTyxHQUFHa0UsSUFBSSxHQUFHLElBQWpCO0FBQ2YsR0FMRDs7QUFPQSxNQUFJTSxTQUFTLEdBQUcsU0FBU0EsU0FBVCxHQUFxQjtBQUNuQyxRQUFJQyxFQUFFLEdBQUdiLEdBQUcsRUFBWjtBQUNBLFFBQUksQ0FBQ1EsUUFBRCxJQUFhOUUsT0FBTyxDQUFDZ0YsT0FBUixLQUFvQixLQUFyQyxFQUE0Q0YsUUFBUSxHQUFHSyxFQUFYO0FBQzVDLFFBQUlDLFNBQVMsR0FBR1YsSUFBSSxJQUFJUyxFQUFFLEdBQUdMLFFBQVQsQ0FBcEI7QUFDQXBFLElBQUFBLE9BQU8sR0FBRyxJQUFWO0FBQ0FrRSxJQUFBQSxJQUFJLEdBQUdqSSxTQUFQOztBQUNBLFFBQUl5SSxTQUFTLElBQUksQ0FBYixJQUFrQkEsU0FBUyxHQUFHVixJQUFsQyxFQUF3QztBQUN0QyxVQUFJQyxPQUFKLEVBQWE7QUFDWFUsUUFBQUEsWUFBWSxDQUFDVixPQUFELENBQVo7QUFDQUEsUUFBQUEsT0FBTyxHQUFHLElBQVY7QUFDRDs7QUFDREcsTUFBQUEsUUFBUSxHQUFHSyxFQUFYO0FBQ0FOLE1BQUFBLE1BQU0sR0FBR0osSUFBSSxDQUFDUSxLQUFMLENBQVd2RSxPQUFYLEVBQW9Ca0UsSUFBcEIsQ0FBVDtBQUNBLFVBQUksQ0FBQ0QsT0FBTCxFQUFjakUsT0FBTyxHQUFHa0UsSUFBSSxHQUFHLElBQWpCO0FBQ2YsS0FSRCxNQVFPLElBQUksQ0FBQ0QsT0FBRCxJQUFZM0UsT0FBTyxDQUFDc0YsUUFBUixLQUFxQixLQUFyQyxFQUE0QztBQUNqRFgsTUFBQUEsT0FBTyxHQUFHWSxVQUFVLENBQUNSLEtBQUQsRUFBUUssU0FBUixDQUFwQjtBQUNEOztBQUNELFdBQU9QLE1BQVA7QUFDRCxHQWxCRDs7QUFvQkFLLEVBQUFBLFNBQVMsQ0FBQ00sTUFBVixHQUFtQixZQUFZO0FBQzdCSCxJQUFBQSxZQUFZLENBQUNWLE9BQUQsQ0FBWjtBQUNBRyxJQUFBQSxRQUFRLEdBQUcsQ0FBWDtBQUNBSCxJQUFBQSxPQUFPLEdBQUdqRSxPQUFPLEdBQUdrRSxJQUFJLEdBQUcsSUFBM0I7QUFDRCxHQUpEOztBQU1BLFNBQU9NLFNBQVA7QUFDRDs7QUFFRCxJQUFJTyxXQUFXLEdBQUc7QUFDaEJ2TCxFQUFBQSxHQUFHLEVBQUUsQ0FBQyxZQUFELEVBQWUsYUFBZixDQURXO0FBRWhCQyxFQUFBQSxHQUFHLEVBQUUsQ0FBQyxhQUFELEVBQWdCLFlBQWhCO0FBRlcsQ0FBbEI7O0FBS0EsU0FBU3VMLElBQVQsQ0FBZTdFLEtBQWYsRUFBc0JnQyxVQUF0QixFQUFrQ0MsTUFBbEMsRUFBMEM7QUFDeEMsTUFBSTRDLElBQUksR0FBRztBQUNUOzs7Ozs7O0FBT0FULElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULENBQWVaLE1BQWYsRUFBdUI7QUFDNUIsV0FBSyxJQUFJdkksQ0FBQyxHQUFHLENBQVIsRUFBVzZKLEdBQUcsR0FBR3RCLE1BQU0sQ0FBQ3RJLE1BQTdCLEVBQXFDRCxDQUFDLEdBQUc2SixHQUF6QyxFQUE4QzdKLENBQUMsRUFBL0MsRUFBbUQ7QUFDakQsWUFBSThKLEtBQUssR0FBR3ZCLE1BQU0sQ0FBQ3ZJLENBQUQsQ0FBTixDQUFVOEosS0FBdEI7QUFDQSxZQUFJaE0sU0FBUyxHQUFHaUosVUFBVSxDQUFDZ0QsU0FBWCxDQUFxQnBJLEtBQXJDOztBQUVBLFlBQUkzQixDQUFDLEtBQUssQ0FBVixFQUFhO0FBQ1g4SixVQUFBQSxLQUFLLENBQUNILFdBQVcsQ0FBQzdMLFNBQUQsQ0FBWCxDQUF1QixDQUF2QixDQUFELENBQUwsR0FBbUMsS0FBSzZELEtBQUwsR0FBYSxDQUFiLEdBQWlCLElBQXBEO0FBQ0QsU0FGRCxNQUVPO0FBQ0xtSSxVQUFBQSxLQUFLLENBQUNILFdBQVcsQ0FBQzdMLFNBQUQsQ0FBWCxDQUF1QixDQUF2QixDQUFELENBQUwsR0FBbUMsRUFBbkM7QUFDRDs7QUFFRCxZQUFJa0MsQ0FBQyxLQUFLdUksTUFBTSxDQUFDdEksTUFBUCxHQUFnQixDQUExQixFQUE2QjtBQUMzQjZKLFVBQUFBLEtBQUssQ0FBQ0gsV0FBVyxDQUFDN0wsU0FBRCxDQUFYLENBQXVCLENBQXZCLENBQUQsQ0FBTCxHQUFtQyxLQUFLNkQsS0FBTCxHQUFhLENBQWIsR0FBaUIsSUFBcEQ7QUFDRCxTQUZELE1BRU87QUFDTG1JLFVBQUFBLEtBQUssQ0FBQ0gsV0FBVyxDQUFDN0wsU0FBRCxDQUFYLENBQXVCLENBQXZCLENBQUQsQ0FBTCxHQUFtQyxFQUFuQztBQUNEO0FBQ0Y7QUFDRixLQXpCUTs7QUE0QlQ7Ozs7OztBQU1BNEcsSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsQ0FBZ0I2RCxNQUFoQixFQUF3QjtBQUM5QixXQUFLLElBQUl2SSxDQUFDLEdBQUcsQ0FBUixFQUFXNkosR0FBRyxHQUFHdEIsTUFBTSxDQUFDdEksTUFBN0IsRUFBcUNELENBQUMsR0FBRzZKLEdBQXpDLEVBQThDN0osQ0FBQyxFQUEvQyxFQUFtRDtBQUNqRCxZQUFJOEosS0FBSyxHQUFHdkIsTUFBTSxDQUFDdkksQ0FBRCxDQUFOLENBQVU4SixLQUF0QjtBQUVBQSxRQUFBQSxLQUFLLENBQUNFLFVBQU4sR0FBbUIsRUFBbkI7QUFDQUYsUUFBQUEsS0FBSyxDQUFDRyxXQUFOLEdBQW9CLEVBQXBCO0FBQ0Q7QUFDRjtBQXpDUSxHQUFYO0FBNENBMUcsRUFBQUEsTUFBTSxDQUFDcUcsSUFBRCxFQUFPLE9BQVAsRUFBZ0I7QUFDcEI7Ozs7O0FBS0EzSSxJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxHQUFlO0FBQ2xCLGFBQU9xQixLQUFLLENBQUN5QyxLQUFLLENBQUNkLFFBQU4sQ0FBZW5ILEdBQWhCLENBQVo7QUFDRDtBQVJtQixHQUFoQixDQUFOO0FBV0F5RyxFQUFBQSxNQUFNLENBQUNxRyxJQUFELEVBQU8sTUFBUCxFQUFlO0FBQ25COzs7Ozs7QUFNQTNJLElBQUFBLEdBQUcsRUFBRSxTQUFTQSxHQUFULEdBQWU7QUFDbEIsYUFBTzJJLElBQUksQ0FBQ2pJLEtBQUwsR0FBYW9GLFVBQVUsQ0FBQ21ELEtBQVgsQ0FBaUJqSyxNQUFyQztBQUNEO0FBVGtCLEdBQWYsQ0FBTjtBQVlBc0QsRUFBQUEsTUFBTSxDQUFDcUcsSUFBRCxFQUFPLFVBQVAsRUFBbUI7QUFDdkI7Ozs7OztBQU1BM0ksSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsR0FBZTtBQUNsQixVQUFJckUsT0FBTyxHQUFHbUksS0FBSyxDQUFDZCxRQUFOLENBQWVySCxPQUE3QjtBQUVBLGFBQU9nTixJQUFJLENBQUNqSSxLQUFMLElBQWMvRSxPQUFPLEdBQUcsQ0FBeEIsSUFBNkJBLE9BQXBDO0FBQ0Q7QUFYc0IsR0FBbkIsQ0FBTjtBQWNBOzs7Ozs7QUFLQW9LLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxDQUFDLGFBQUQsRUFBZ0IsUUFBaEIsQ0FBVixFQUFxQ3hHLFFBQVEsQ0FBQyxZQUFZO0FBQ3hEK0wsSUFBQUEsSUFBSSxDQUFDVCxLQUFMLENBQVdwQyxVQUFVLENBQUN1QixJQUFYLENBQWdCNkIsT0FBaEIsQ0FBd0JDLFFBQW5DO0FBQ0QsR0FGNEMsRUFFMUMsRUFGMEMsQ0FBN0M7QUFJQTs7Ozs7QUFJQXBELEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxTQUFWLEVBQXFCLFlBQVk7QUFDL0J1RixJQUFBQSxJQUFJLENBQUNsRixNQUFMLENBQVlxQyxVQUFVLENBQUN1QixJQUFYLENBQWdCNkIsT0FBaEIsQ0FBd0JDLFFBQXBDO0FBQ0QsR0FGRDtBQUlBLFNBQU9SLElBQVA7QUFDRDtBQUVEOzs7Ozs7OztBQU1BLFNBQVNTLFFBQVQsQ0FBa0JDLElBQWxCLEVBQXdCO0FBQ3RCLE1BQUlBLElBQUksSUFBSUEsSUFBSSxDQUFDQyxVQUFqQixFQUE2QjtBQUMzQixRQUFJQyxDQUFDLEdBQUdGLElBQUksQ0FBQ0MsVUFBTCxDQUFnQkUsVUFBeEI7QUFDQSxRQUFJQyxPQUFPLEdBQUcsRUFBZDs7QUFFQSxXQUFPRixDQUFQLEVBQVVBLENBQUMsR0FBR0EsQ0FBQyxDQUFDRyxXQUFoQixFQUE2QjtBQUMzQixVQUFJSCxDQUFDLENBQUNJLFFBQUYsS0FBZSxDQUFmLElBQW9CSixDQUFDLEtBQUtGLElBQTlCLEVBQW9DO0FBQ2xDSSxRQUFBQSxPQUFPLENBQUNqRyxJQUFSLENBQWErRixDQUFiO0FBQ0Q7QUFDRjs7QUFFRCxXQUFPRSxPQUFQO0FBQ0Q7O0FBRUQsU0FBTyxFQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7QUFNQSxTQUFTRyxLQUFULENBQWVQLElBQWYsRUFBcUI7QUFDbkIsTUFBSUEsSUFBSSxJQUFJQSxJQUFJLFlBQVlRLE1BQU0sQ0FBQ0MsV0FBbkMsRUFBZ0Q7QUFDOUMsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQO0FBQ0Q7O0FBRUQsSUFBSUMsY0FBYyxHQUFHLHlCQUFyQjs7QUFFQSxTQUFTMUMsSUFBVCxDQUFldkQsS0FBZixFQUFzQmdDLFVBQXRCLEVBQWtDO0FBQ2hDLE1BQUl1QixJQUFJLEdBQUc7QUFDVDs7Ozs7QUFLQXRGLElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULEdBQWlCO0FBQ3RCLFdBQUtpSSxJQUFMLEdBQVlsRyxLQUFLLENBQUNDLFFBQWxCO0FBQ0EsV0FBS2tHLEtBQUwsR0FBYSxLQUFLRCxJQUFMLENBQVVFLGFBQVYsQ0FBd0JILGNBQXhCLENBQWI7QUFDQSxXQUFLekMsTUFBTCxHQUFjeEYsS0FBSyxDQUFDeEQsU0FBTixDQUFnQjZMLEtBQWhCLENBQXNCcEssSUFBdEIsQ0FBMkIsS0FBS21KLE9BQUwsQ0FBYUMsUUFBeEMsRUFBa0RpQixNQUFsRCxDQUF5RCxVQUFVN00sS0FBVixFQUFpQjtBQUN0RixlQUFPLENBQUNBLEtBQUssQ0FBQzhNLFNBQU4sQ0FBZ0JDLFFBQWhCLENBQXlCeEcsS0FBSyxDQUFDZCxRQUFOLENBQWVoRyxPQUFmLENBQXVCTyxLQUF2QixDQUE2QkMsS0FBdEQsQ0FBUjtBQUNELE9BRmEsQ0FBZDtBQUdEO0FBWlEsR0FBWDtBQWVBOEUsRUFBQUEsTUFBTSxDQUFDK0UsSUFBRCxFQUFPLE1BQVAsRUFBZTtBQUNuQjs7Ozs7QUFLQXJILElBQUFBLEdBQUcsRUFBRSxTQUFTQSxHQUFULEdBQWU7QUFDbEIsYUFBT3FILElBQUksQ0FBQ2tELEVBQVo7QUFDRCxLQVJrQjs7QUFXbkI7Ozs7O0FBS0EvRSxJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxDQUFhM0MsQ0FBYixFQUFnQjtBQUNuQixVQUFJcEIsUUFBUSxDQUFDb0IsQ0FBRCxDQUFaLEVBQWlCO0FBQ2ZBLFFBQUFBLENBQUMsR0FBRzJILFFBQVEsQ0FBQ04sYUFBVCxDQUF1QnJILENBQXZCLENBQUo7QUFDRDs7QUFFRCxVQUFJK0csS0FBSyxDQUFDL0csQ0FBRCxDQUFULEVBQWM7QUFDWndFLFFBQUFBLElBQUksQ0FBQ2tELEVBQUwsR0FBVTFILENBQVY7QUFDRCxPQUZELE1BRU87QUFDTGhGLFFBQUFBLElBQUksQ0FBQywyQ0FBRCxDQUFKO0FBQ0Q7QUFDRjtBQTFCa0IsR0FBZixDQUFOO0FBNkJBeUUsRUFBQUEsTUFBTSxDQUFDK0UsSUFBRCxFQUFPLE9BQVAsRUFBZ0I7QUFDcEI7Ozs7O0FBS0FySCxJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxHQUFlO0FBQ2xCLGFBQU9xSCxJQUFJLENBQUNwRCxFQUFaO0FBQ0QsS0FSbUI7O0FBV3BCOzs7OztBQUtBdUIsSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsQ0FBYWlGLENBQWIsRUFBZ0I7QUFDbkIsVUFBSWIsS0FBSyxDQUFDYSxDQUFELENBQVQsRUFBYztBQUNacEQsUUFBQUEsSUFBSSxDQUFDcEQsRUFBTCxHQUFVd0csQ0FBVjtBQUNELE9BRkQsTUFFTztBQUNMNU0sUUFBQUEsSUFBSSxDQUFDLDhDQUE4Q2tNLGNBQTlDLEdBQStELGFBQWhFLENBQUo7QUFDRDtBQUNGO0FBdEJtQixHQUFoQixDQUFOO0FBeUJBekgsRUFBQUEsTUFBTSxDQUFDK0UsSUFBRCxFQUFPLFNBQVAsRUFBa0I7QUFDdEI7Ozs7O0FBS0FySCxJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxHQUFlO0FBQ2xCLGFBQU9xSCxJQUFJLENBQUM0QyxLQUFMLENBQVdkLFFBQVgsQ0FBb0IsQ0FBcEIsQ0FBUDtBQUNEO0FBUnFCLEdBQWxCLENBQU47QUFXQSxTQUFPOUIsSUFBUDtBQUNEOztBQUVELFNBQVNxRCxJQUFULENBQWU1RyxLQUFmLEVBQXNCZ0MsVUFBdEIsRUFBa0NDLE1BQWxDLEVBQTBDO0FBQ3hDLE1BQUkyRSxJQUFJLEdBQUc7QUFDVDs7Ozs7QUFLQTNJLElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULEdBQWlCO0FBQ3RCLFdBQUtyQixLQUFMLEdBQWFvRCxLQUFLLENBQUNkLFFBQU4sQ0FBZWxHLElBQTVCO0FBQ0Q7QUFSUSxHQUFYO0FBV0F3RixFQUFBQSxNQUFNLENBQUNvSSxJQUFELEVBQU8sT0FBUCxFQUFnQjtBQUNwQjs7Ozs7QUFLQTFLLElBQUFBLEdBQUcsRUFBRSxTQUFTQSxHQUFULEdBQWU7QUFDbEIsYUFBTzBLLElBQUksQ0FBQ0MsRUFBWjtBQUNELEtBUm1COztBQVdwQjs7Ozs7O0FBTUFuRixJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxDQUFhOUUsS0FBYixFQUFvQjtBQUN2QixVQUFJZ0IsUUFBUSxDQUFDaEIsS0FBRCxDQUFaLEVBQXFCO0FBQ25CQSxRQUFBQSxLQUFLLENBQUNrSyxNQUFOLEdBQWV2SixLQUFLLENBQUNYLEtBQUssQ0FBQ2tLLE1BQVAsQ0FBcEI7QUFDQWxLLFFBQUFBLEtBQUssQ0FBQ3dGLEtBQU4sR0FBYzdFLEtBQUssQ0FBQ1gsS0FBSyxDQUFDd0YsS0FBUCxDQUFuQjtBQUNELE9BSEQsTUFHTztBQUNMeEYsUUFBQUEsS0FBSyxHQUFHVyxLQUFLLENBQUNYLEtBQUQsQ0FBYjtBQUNEOztBQUVEZ0ssTUFBQUEsSUFBSSxDQUFDQyxFQUFMLEdBQVVqSyxLQUFWO0FBQ0Q7QUExQm1CLEdBQWhCLENBQU47QUE2QkE0QixFQUFBQSxNQUFNLENBQUNvSSxJQUFELEVBQU8sVUFBUCxFQUFtQjtBQUN2Qjs7Ozs7QUFLQTFLLElBQUFBLEdBQUcsRUFBRSxTQUFTQSxHQUFULEdBQWU7QUFDbEIsVUFBSVUsS0FBSyxHQUFHZ0ssSUFBSSxDQUFDaEssS0FBakI7QUFDQSxVQUFJL0UsT0FBTyxHQUFHbUksS0FBSyxDQUFDZCxRQUFOLENBQWVySCxPQUE3Qjs7QUFFQSxVQUFJK0YsUUFBUSxDQUFDaEIsS0FBRCxDQUFaLEVBQXFCO0FBQ25CLGVBQU9BLEtBQUssQ0FBQ2tLLE1BQU4sR0FBZWpQLE9BQWYsR0FBeUIrRSxLQUFLLENBQUN3RixLQUFOLEdBQWN2SyxPQUE5QztBQUNEOztBQUVELGFBQU8rRSxLQUFLLEdBQUcsQ0FBUixHQUFZL0UsT0FBbkI7QUFDRDtBQWZzQixHQUFuQixDQUFOO0FBa0JBOzs7OztBQUlBb0ssRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLENBQUMsUUFBRCxFQUFXLFFBQVgsQ0FBVixFQUFnQyxZQUFZO0FBQzFDc0gsSUFBQUEsSUFBSSxDQUFDM0ksS0FBTDtBQUNELEdBRkQ7QUFJQSxTQUFPMkksSUFBUDtBQUNEOztBQUVELFNBQVMzRixJQUFULENBQWVqQixLQUFmLEVBQXNCZ0MsVUFBdEIsRUFBa0NDLE1BQWxDLEVBQTBDO0FBQ3hDLE1BQUloQixJQUFJLEdBQUc7QUFDVDs7Ozs7QUFLQWhELElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULEdBQWlCO0FBQ3RCLFdBQUt3RCxFQUFMLEdBQVUsQ0FBVjtBQUNELEtBUlE7O0FBV1Q7Ozs7OztBQU1BYixJQUFBQSxJQUFJLEVBQUUsU0FBU0EsSUFBVCxHQUFnQjtBQUNwQixVQUFJc0IsS0FBSyxHQUFHLElBQVo7O0FBRUEsVUFBSTZFLE1BQU0sR0FBR2pMLFNBQVMsQ0FBQ1osTUFBVixHQUFtQixDQUFuQixJQUF3QlksU0FBUyxDQUFDLENBQUQsQ0FBVCxLQUFpQlcsU0FBekMsR0FBcURYLFNBQVMsQ0FBQyxDQUFELENBQTlELEdBQW9FLENBQWpGO0FBRUEsV0FBS2lMLE1BQUwsR0FBY0EsTUFBZDtBQUVBOUUsTUFBQUEsTUFBTSxDQUFDckMsSUFBUCxDQUFZLE1BQVosRUFBb0I7QUFDbEJvSCxRQUFBQSxRQUFRLEVBQUUsS0FBS3BLO0FBREcsT0FBcEI7QUFJQW9GLE1BQUFBLFVBQVUsQ0FBQ2pCLFVBQVgsQ0FBc0JxQixLQUF0QixDQUE0QixZQUFZO0FBQ3RDSCxRQUFBQSxNQUFNLENBQUNyQyxJQUFQLENBQVksWUFBWixFQUEwQjtBQUN4Qm9ILFVBQUFBLFFBQVEsRUFBRTlFLEtBQUssQ0FBQ3RGO0FBRFEsU0FBMUI7QUFHRCxPQUpEO0FBS0Q7QUFqQ1EsR0FBWDtBQW9DQTRCLEVBQUFBLE1BQU0sQ0FBQ3lDLElBQUQsRUFBTyxRQUFQLEVBQWlCO0FBQ3JCOzs7OztBQUtBL0UsSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsR0FBZTtBQUNsQixhQUFPK0UsSUFBSSxDQUFDUSxFQUFaO0FBQ0QsS0FSb0I7O0FBV3JCOzs7OztBQUtBQyxJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxDQUFhOUUsS0FBYixFQUFvQjtBQUN2QnFFLE1BQUFBLElBQUksQ0FBQ1EsRUFBTCxHQUFVLENBQUMzRCxXQUFXLENBQUNsQixLQUFELENBQVosR0FBc0JXLEtBQUssQ0FBQ1gsS0FBRCxDQUEzQixHQUFxQyxDQUEvQztBQUNEO0FBbEJvQixHQUFqQixDQUFOO0FBcUJBNEIsRUFBQUEsTUFBTSxDQUFDeUMsSUFBRCxFQUFPLFdBQVAsRUFBb0I7QUFDeEI7Ozs7O0FBS0EvRSxJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxHQUFlO0FBQ2xCLGFBQU84RixVQUFVLENBQUNtRCxLQUFYLENBQWlCOEIsVUFBakIsR0FBOEJqSCxLQUFLLENBQUNQLEtBQTNDO0FBQ0Q7QUFSdUIsR0FBcEIsQ0FBTjtBQVdBakIsRUFBQUEsTUFBTSxDQUFDeUMsSUFBRCxFQUFPLE9BQVAsRUFBZ0I7QUFDcEI7Ozs7O0FBS0EvRSxJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxHQUFlO0FBQ2xCLFVBQUk2SyxNQUFNLEdBQUcsS0FBS0EsTUFBbEI7QUFDQSxVQUFJRyxTQUFTLEdBQUcsS0FBS0EsU0FBckI7O0FBRUEsVUFBSWxGLFVBQVUsQ0FBQ2dELFNBQVgsQ0FBcUJtQyxFQUFyQixDQUF3QixLQUF4QixDQUFKLEVBQW9DO0FBQ2xDLGVBQU9ELFNBQVMsR0FBR0gsTUFBbkI7QUFDRDs7QUFFRCxhQUFPRyxTQUFTLEdBQUdILE1BQW5CO0FBQ0Q7QUFmbUIsR0FBaEIsQ0FBTjtBQWtCQTs7Ozs7O0FBS0E5RSxFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsQ0FBQyxjQUFELEVBQWlCLEtBQWpCLENBQVYsRUFBbUMsWUFBWTtBQUM3QzJCLElBQUFBLElBQUksQ0FBQ0wsSUFBTDtBQUNELEdBRkQ7QUFJQSxTQUFPSyxJQUFQO0FBQ0Q7O0FBRUQsU0FBU2tFLEtBQVQsQ0FBZ0JuRixLQUFoQixFQUF1QmdDLFVBQXZCLEVBQW1DQyxNQUFuQyxFQUEyQztBQUN6QyxNQUFJa0QsS0FBSyxHQUFHO0FBQ1Y7Ozs7O0FBS0FpQyxJQUFBQSxXQUFXLEVBQUUsU0FBU0EsV0FBVCxHQUF1QjtBQUNsQyxVQUFJQyxLQUFLLEdBQUcsS0FBS0osVUFBTCxHQUFrQixJQUE5QjtBQUNBLFVBQUl6RCxNQUFNLEdBQUd4QixVQUFVLENBQUN1QixJQUFYLENBQWdCQyxNQUE3Qjs7QUFFQSxXQUFLLElBQUl2SSxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHdUksTUFBTSxDQUFDdEksTUFBM0IsRUFBbUNELENBQUMsRUFBcEMsRUFBd0M7QUFDdEN1SSxRQUFBQSxNQUFNLENBQUN2SSxDQUFELENBQU4sQ0FBVThKLEtBQVYsQ0FBZ0JzQyxLQUFoQixHQUF3QkEsS0FBeEI7QUFDRDtBQUNGLEtBYlM7O0FBZ0JWOzs7OztBQUtBQyxJQUFBQSxZQUFZLEVBQUUsU0FBU0EsWUFBVCxHQUF3QjtBQUNwQ3RGLE1BQUFBLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUFoQixDQUF3QkwsS0FBeEIsQ0FBOEJzQyxLQUE5QixHQUFzQyxLQUFLRSxXQUFMLEdBQW1CLElBQXpEO0FBQ0QsS0F2QlM7O0FBMEJWOzs7OztBQUtBNUgsSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsR0FBa0I7QUFDeEIsVUFBSTZELE1BQU0sR0FBR3hCLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0JDLE1BQTdCOztBQUVBLFdBQUssSUFBSXZJLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUd1SSxNQUFNLENBQUN0SSxNQUEzQixFQUFtQ0QsQ0FBQyxFQUFwQyxFQUF3QztBQUN0Q3VJLFFBQUFBLE1BQU0sQ0FBQ3ZJLENBQUQsQ0FBTixDQUFVOEosS0FBVixDQUFnQnNDLEtBQWhCLEdBQXdCLEVBQXhCO0FBQ0Q7O0FBRURyRixNQUFBQSxVQUFVLENBQUN1QixJQUFYLENBQWdCNkIsT0FBaEIsQ0FBd0JMLEtBQXhCLENBQThCc0MsS0FBOUIsR0FBc0MsRUFBdEM7QUFDRDtBQXZDUyxHQUFaO0FBMENBN0ksRUFBQUEsTUFBTSxDQUFDMkcsS0FBRCxFQUFRLFFBQVIsRUFBa0I7QUFDdEI7Ozs7O0FBS0FqSixJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxHQUFlO0FBQ2xCLGFBQU84RixVQUFVLENBQUN1QixJQUFYLENBQWdCQyxNQUFoQixDQUF1QnRJLE1BQTlCO0FBQ0Q7QUFScUIsR0FBbEIsQ0FBTjtBQVdBc0QsRUFBQUEsTUFBTSxDQUFDMkcsS0FBRCxFQUFRLE9BQVIsRUFBaUI7QUFDckI7Ozs7O0FBS0FqSixJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxHQUFlO0FBQ2xCLGFBQU84RixVQUFVLENBQUN1QixJQUFYLENBQWdCMkMsSUFBaEIsQ0FBcUJzQixXQUE1QjtBQUNEO0FBUm9CLEdBQWpCLENBQU47QUFXQWhKLEVBQUFBLE1BQU0sQ0FBQzJHLEtBQUQsRUFBUSxhQUFSLEVBQXVCO0FBQzNCOzs7OztBQUtBakosSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsR0FBZTtBQUNsQixhQUFPaUosS0FBSyxDQUFDOEIsVUFBTixHQUFtQjlCLEtBQUssQ0FBQ2pLLE1BQXpCLEdBQWtDOEcsVUFBVSxDQUFDNkMsSUFBWCxDQUFnQjRDLElBQWxELEdBQXlEekYsVUFBVSxDQUFDMEYsTUFBWCxDQUFrQkQsSUFBbEY7QUFDRDtBQVIwQixHQUF2QixDQUFOO0FBV0FqSixFQUFBQSxNQUFNLENBQUMyRyxLQUFELEVBQVEsWUFBUixFQUFzQjtBQUMxQjs7Ozs7QUFLQWpKLElBQUFBLEdBQUcsRUFBRSxTQUFTQSxHQUFULEdBQWU7QUFDbEIsYUFBT2lKLEtBQUssQ0FBQ2tDLEtBQU4sR0FBY3JILEtBQUssQ0FBQ2QsUUFBTixDQUFlckgsT0FBN0IsR0FBdUNtSyxVQUFVLENBQUM0RSxJQUFYLENBQWdCZSxRQUF2RCxHQUFrRTNGLFVBQVUsQ0FBQzZDLElBQVgsQ0FBZ0I4QyxRQUF6RjtBQUNEO0FBUnlCLEdBQXRCLENBQU47QUFXQTs7Ozs7OztBQU1BMUYsRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLENBQUMsY0FBRCxFQUFpQixRQUFqQixFQUEyQixRQUEzQixDQUFWLEVBQWdELFlBQVk7QUFDMUQ2RixJQUFBQSxLQUFLLENBQUNpQyxXQUFOO0FBQ0FqQyxJQUFBQSxLQUFLLENBQUNtQyxZQUFOO0FBQ0QsR0FIRDtBQUtBOzs7OztBQUlBckYsRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLFNBQVYsRUFBcUIsWUFBWTtBQUMvQjZGLElBQUFBLEtBQUssQ0FBQ3hGLE1BQU47QUFDRCxHQUZEO0FBSUEsU0FBT3dGLEtBQVA7QUFDRDs7QUFFRCxTQUFTeUMsS0FBVCxDQUFnQjVILEtBQWhCLEVBQXVCZ0MsVUFBdkIsRUFBbUNDLE1BQW5DLEVBQTJDO0FBQ3pDLE1BQUkyRixLQUFLLEdBQUc7QUFDVjs7Ozs7O0FBTUEzSixJQUFBQSxLQUFLLEVBQUUsU0FBU0EsS0FBVCxHQUFpQjtBQUN0QmdFLE1BQUFBLE1BQU0sQ0FBQ3JDLElBQVAsQ0FBWSxjQUFaO0FBRUEsV0FBS2lJLFNBQUw7QUFDQSxXQUFLQyxXQUFMO0FBRUE3RixNQUFBQSxNQUFNLENBQUNyQyxJQUFQLENBQVksYUFBWjtBQUNELEtBZFM7O0FBaUJWOzs7OztBQUtBaUksSUFBQUEsU0FBUyxFQUFFLFNBQVNBLFNBQVQsR0FBcUI7QUFDOUI3RixNQUFBQSxVQUFVLENBQUN1QixJQUFYLENBQWdCMkMsSUFBaEIsQ0FBcUJLLFNBQXJCLENBQStCd0IsR0FBL0IsQ0FBbUMvSCxLQUFLLENBQUNkLFFBQU4sQ0FBZWhHLE9BQWYsQ0FBdUJ2QixJQUF2QixDQUE0QnFJLEtBQUssQ0FBQ2QsUUFBTixDQUFldkgsSUFBM0MsQ0FBbkM7QUFDRCxLQXhCUzs7QUEyQlY7Ozs7O0FBS0FtUSxJQUFBQSxXQUFXLEVBQUUsU0FBU0EsV0FBVCxHQUF1QjtBQUNsQyxVQUFJNU8sT0FBTyxHQUFHOEcsS0FBSyxDQUFDZCxRQUFOLENBQWVoRyxPQUE3QjtBQUNBLFVBQUlPLEtBQUssR0FBR3VJLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0JDLE1BQWhCLENBQXVCeEQsS0FBSyxDQUFDUCxLQUE3QixDQUFaOztBQUVBLFVBQUloRyxLQUFKLEVBQVc7QUFDVEEsUUFBQUEsS0FBSyxDQUFDOE0sU0FBTixDQUFnQndCLEdBQWhCLENBQW9CN08sT0FBTyxDQUFDTyxLQUFSLENBQWNFLE1BQWxDO0FBRUEyTCxRQUFBQSxRQUFRLENBQUM3TCxLQUFELENBQVIsQ0FBZ0JxRyxPQUFoQixDQUF3QixVQUFVa0ksT0FBVixFQUFtQjtBQUN6Q0EsVUFBQUEsT0FBTyxDQUFDekIsU0FBUixDQUFrQjVHLE1BQWxCLENBQXlCekcsT0FBTyxDQUFDTyxLQUFSLENBQWNFLE1BQXZDO0FBQ0QsU0FGRDtBQUdEO0FBQ0YsS0EzQ1M7O0FBOENWOzs7OztBQUtBc08sSUFBQUEsYUFBYSxFQUFFLFNBQVNBLGFBQVQsR0FBeUI7QUFDdEMsVUFBSUMscUJBQXFCLEdBQUdsSSxLQUFLLENBQUNkLFFBQU4sQ0FBZWhHLE9BQTNDO0FBQUEsVUFDSXZCLElBQUksR0FBR3VRLHFCQUFxQixDQUFDdlEsSUFEakM7QUFBQSxVQUVJOEIsS0FBSyxHQUFHeU8scUJBQXFCLENBQUN6TyxLQUZsQztBQUtBdUksTUFBQUEsVUFBVSxDQUFDdUIsSUFBWCxDQUFnQjJDLElBQWhCLENBQXFCSyxTQUFyQixDQUErQjVHLE1BQS9CLENBQXNDaEksSUFBSSxDQUFDcUksS0FBSyxDQUFDZCxRQUFOLENBQWV2SCxJQUFoQixDQUExQztBQUVBcUssTUFBQUEsVUFBVSxDQUFDdUIsSUFBWCxDQUFnQkMsTUFBaEIsQ0FBdUIxRCxPQUF2QixDQUErQixVQUFVa0ksT0FBVixFQUFtQjtBQUNoREEsUUFBQUEsT0FBTyxDQUFDekIsU0FBUixDQUFrQjVHLE1BQWxCLENBQXlCbEcsS0FBSyxDQUFDRSxNQUEvQjtBQUNELE9BRkQ7QUFHRDtBQTlEUyxHQUFaO0FBaUVBOzs7Ozs7QUFLQXNJLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxDQUFDLFNBQUQsRUFBWSxRQUFaLENBQVYsRUFBaUMsWUFBWTtBQUMzQ3NJLElBQUFBLEtBQUssQ0FBQ0ssYUFBTjtBQUNELEdBRkQ7QUFJQTs7Ozs7O0FBS0FoRyxFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsQ0FBQyxRQUFELEVBQVcsUUFBWCxDQUFWLEVBQWdDLFlBQVk7QUFDMUNzSSxJQUFBQSxLQUFLLENBQUMzSixLQUFOO0FBQ0QsR0FGRDtBQUlBOzs7OztBQUlBZ0UsRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLFlBQVYsRUFBd0IsWUFBWTtBQUNsQ3NJLElBQUFBLEtBQUssQ0FBQ0UsV0FBTjtBQUNELEdBRkQ7QUFJQSxTQUFPRixLQUFQO0FBQ0Q7O0FBRUQsU0FBU0YsTUFBVCxDQUFpQjFILEtBQWpCLEVBQXdCZ0MsVUFBeEIsRUFBb0NDLE1BQXBDLEVBQTRDO0FBQzFDLE1BQUl5RixNQUFNLEdBQUc7QUFDWDs7O0FBR0F6SixJQUFBQSxLQUFLLEVBQUUsU0FBU0EsS0FBVCxHQUFpQjtBQUN0QixXQUFLa0ssS0FBTCxHQUFhLEVBQWI7O0FBRUEsVUFBSW5JLEtBQUssQ0FBQ3VCLE1BQU4sQ0FBYSxVQUFiLENBQUosRUFBOEI7QUFDNUIsYUFBSzRHLEtBQUwsR0FBYSxLQUFLQyxPQUFMLEVBQWI7QUFDRDtBQUNGLEtBVlU7O0FBYVg7Ozs7O0FBS0FBLElBQUFBLE9BQU8sRUFBRSxTQUFTQSxPQUFULEdBQW1CO0FBQzFCLFVBQUlELEtBQUssR0FBR3JNLFNBQVMsQ0FBQ1osTUFBVixHQUFtQixDQUFuQixJQUF3QlksU0FBUyxDQUFDLENBQUQsQ0FBVCxLQUFpQlcsU0FBekMsR0FBcURYLFNBQVMsQ0FBQyxDQUFELENBQTlELEdBQW9FLEVBQWhGO0FBQ0EsVUFBSTBILE1BQU0sR0FBR3hCLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0JDLE1BQTdCO0FBQ0EsVUFBSTZFLGVBQWUsR0FBR3JJLEtBQUssQ0FBQ2QsUUFBNUI7QUFBQSxVQUNJckgsT0FBTyxHQUFHd1EsZUFBZSxDQUFDeFEsT0FEOUI7QUFBQSxVQUVJcUIsT0FBTyxHQUFHbVAsZUFBZSxDQUFDblAsT0FGOUI7QUFLQSxVQUFJb1AsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDdEksS0FBSyxDQUFDZCxRQUFOLENBQWVsRyxJQUF4QztBQUNBLFVBQUl1UCxVQUFVLEdBQUcxUSxPQUFPLEdBQUd5USxlQUFWLEdBQTRCdEYsSUFBSSxDQUFDd0YsS0FBTCxDQUFXM1EsT0FBTyxHQUFHLENBQXJCLENBQTdDO0FBQ0EsVUFBSTRRLE1BQU0sR0FBR2pGLE1BQU0sQ0FBQzZDLEtBQVAsQ0FBYSxDQUFiLEVBQWdCa0MsVUFBaEIsRUFBNEJHLE9BQTVCLEVBQWI7QUFDQSxVQUFJQyxPQUFPLEdBQUduRixNQUFNLENBQUM2QyxLQUFQLENBQWFrQyxVQUFVLEdBQUcsQ0FBQyxDQUEzQixDQUFkOztBQUVBLFdBQUssSUFBSXhKLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdpRSxJQUFJLENBQUM0RixHQUFMLENBQVMsQ0FBVCxFQUFZNUYsSUFBSSxDQUFDQyxLQUFMLENBQVdwTCxPQUFPLEdBQUcyTCxNQUFNLENBQUN0SSxNQUE1QixDQUFaLENBQXBCLEVBQXNFNkQsQ0FBQyxFQUF2RSxFQUEyRTtBQUN6RSxhQUFLLElBQUk5RCxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHd04sTUFBTSxDQUFDdk4sTUFBM0IsRUFBbUNELENBQUMsRUFBcEMsRUFBd0M7QUFDdEMsY0FBSXZCLEtBQUssR0FBRytPLE1BQU0sQ0FBQ3hOLENBQUQsQ0FBTixDQUFVNE4sU0FBVixDQUFvQixJQUFwQixDQUFaO0FBRUFuUCxVQUFBQSxLQUFLLENBQUM2TSxTQUFOLENBQWdCd0IsR0FBaEIsQ0FBb0I3TyxPQUFPLENBQUNPLEtBQVIsQ0FBY0MsS0FBbEM7QUFFQXlPLFVBQUFBLEtBQUssQ0FBQ3pJLElBQU4sQ0FBV2hHLEtBQVg7QUFDRDs7QUFFRCxhQUFLLElBQUltSSxFQUFFLEdBQUcsQ0FBZCxFQUFpQkEsRUFBRSxHQUFHOEcsT0FBTyxDQUFDek4sTUFBOUIsRUFBc0MyRyxFQUFFLEVBQXhDLEVBQTRDO0FBQzFDLGNBQUlpSCxNQUFNLEdBQUdILE9BQU8sQ0FBQzlHLEVBQUQsQ0FBUCxDQUFZZ0gsU0FBWixDQUFzQixJQUF0QixDQUFiOztBQUVBQyxVQUFBQSxNQUFNLENBQUN2QyxTQUFQLENBQWlCd0IsR0FBakIsQ0FBcUI3TyxPQUFPLENBQUNPLEtBQVIsQ0FBY0MsS0FBbkM7O0FBRUF5TyxVQUFBQSxLQUFLLENBQUNZLE9BQU4sQ0FBY0QsTUFBZDtBQUNEO0FBQ0Y7O0FBRUQsYUFBT1gsS0FBUDtBQUNELEtBbERVOztBQXFEWDs7Ozs7QUFLQU0sSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsR0FBa0I7QUFDeEIsVUFBSU4sS0FBSyxHQUFHLEtBQUtBLEtBQWpCO0FBQ0EsVUFBSWEsZ0JBQWdCLEdBQUdoSCxVQUFVLENBQUN1QixJQUFsQztBQUFBLFVBQ0k2QixPQUFPLEdBQUc0RCxnQkFBZ0IsQ0FBQzVELE9BRC9CO0FBQUEsVUFFSTVCLE1BQU0sR0FBR3dGLGdCQUFnQixDQUFDeEYsTUFGOUI7QUFLQSxVQUFJeUYsSUFBSSxHQUFHakcsSUFBSSxDQUFDQyxLQUFMLENBQVdrRixLQUFLLENBQUNqTixNQUFOLEdBQWUsQ0FBMUIsQ0FBWDtBQUNBLFVBQUl5TixPQUFPLEdBQUdSLEtBQUssQ0FBQzlCLEtBQU4sQ0FBWSxDQUFaLEVBQWU0QyxJQUFmLEVBQXFCUCxPQUFyQixFQUFkO0FBQ0EsVUFBSUQsTUFBTSxHQUFHTixLQUFLLENBQUM5QixLQUFOLENBQVk0QyxJQUFJLEdBQUcsQ0FBQyxDQUFwQixFQUF1QlAsT0FBdkIsRUFBYjtBQUNBLFVBQUlyQixLQUFLLEdBQUdyRixVQUFVLENBQUNtRCxLQUFYLENBQWlCOEIsVUFBakIsR0FBOEIsSUFBMUM7O0FBRUEsV0FBSyxJQUFJaE0sQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR3dOLE1BQU0sQ0FBQ3ZOLE1BQTNCLEVBQW1DRCxDQUFDLEVBQXBDLEVBQXdDO0FBQ3RDbUssUUFBQUEsT0FBTyxDQUFDOEQsV0FBUixDQUFvQlQsTUFBTSxDQUFDeE4sQ0FBRCxDQUExQjtBQUNEOztBQUVELFdBQUssSUFBSWtPLEdBQUcsR0FBRyxDQUFmLEVBQWtCQSxHQUFHLEdBQUdSLE9BQU8sQ0FBQ3pOLE1BQWhDLEVBQXdDaU8sR0FBRyxFQUEzQyxFQUErQztBQUM3Qy9ELFFBQUFBLE9BQU8sQ0FBQ2dFLFlBQVIsQ0FBcUJULE9BQU8sQ0FBQ1EsR0FBRCxDQUE1QixFQUFtQzNGLE1BQU0sQ0FBQyxDQUFELENBQXpDO0FBQ0Q7O0FBRUQsV0FBSyxJQUFJNkYsR0FBRyxHQUFHLENBQWYsRUFBa0JBLEdBQUcsR0FBR2xCLEtBQUssQ0FBQ2pOLE1BQTlCLEVBQXNDbU8sR0FBRyxFQUF6QyxFQUE2QztBQUMzQ2xCLFFBQUFBLEtBQUssQ0FBQ2tCLEdBQUQsQ0FBTCxDQUFXdEUsS0FBWCxDQUFpQnNDLEtBQWpCLEdBQXlCQSxLQUF6QjtBQUNEO0FBQ0YsS0FqRlU7O0FBb0ZYOzs7OztBQUtBMUgsSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsR0FBa0I7QUFDeEIsVUFBSXdJLEtBQUssR0FBRyxLQUFLQSxLQUFqQjs7QUFHQSxXQUFLLElBQUlsTixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHa04sS0FBSyxDQUFDak4sTUFBMUIsRUFBa0NELENBQUMsRUFBbkMsRUFBdUM7QUFDckMrRyxRQUFBQSxVQUFVLENBQUN1QixJQUFYLENBQWdCNkIsT0FBaEIsQ0FBd0JrRSxXQUF4QixDQUFvQ25CLEtBQUssQ0FBQ2xOLENBQUQsQ0FBekM7QUFDRDtBQUNGO0FBaEdVLEdBQWI7QUFtR0F1RCxFQUFBQSxNQUFNLENBQUNrSixNQUFELEVBQVMsTUFBVCxFQUFpQjtBQUNyQjs7Ozs7QUFLQXhMLElBQUFBLEdBQUcsRUFBRSxTQUFTQSxHQUFULEdBQWU7QUFDbEIsYUFBTyxDQUFDOEYsVUFBVSxDQUFDbUQsS0FBWCxDQUFpQjhCLFVBQWpCLEdBQThCakYsVUFBVSxDQUFDNkMsSUFBWCxDQUFnQmpJLEtBQS9DLElBQXdEOEssTUFBTSxDQUFDUyxLQUFQLENBQWFqTixNQUE1RTtBQUNEO0FBUm9CLEdBQWpCLENBQU47QUFXQTs7Ozs7QUFJQStHLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxRQUFWLEVBQW9CLFlBQVk7QUFDOUJvSSxJQUFBQSxNQUFNLENBQUMvSCxNQUFQO0FBQ0ErSCxJQUFBQSxNQUFNLENBQUN6SixLQUFQO0FBQ0F5SixJQUFBQSxNQUFNLENBQUNlLE1BQVA7QUFDRCxHQUpEO0FBTUE7Ozs7O0FBSUF4RyxFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsY0FBVixFQUEwQixZQUFZO0FBQ3BDLFFBQUlVLEtBQUssQ0FBQ3VCLE1BQU4sQ0FBYSxVQUFiLENBQUosRUFBOEI7QUFDNUJtRyxNQUFBQSxNQUFNLENBQUNlLE1BQVA7QUFDRDtBQUNGLEdBSkQ7QUFNQTs7Ozs7QUFJQXhHLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxTQUFWLEVBQXFCLFlBQVk7QUFDL0JvSSxJQUFBQSxNQUFNLENBQUMvSCxNQUFQO0FBQ0QsR0FGRDtBQUlBLFNBQU8rSCxNQUFQO0FBQ0Q7O0FBRUQsSUFBSTZCLFlBQVksR0FBRyxZQUFZO0FBQzdCOzs7QUFHQSxXQUFTQSxZQUFULEdBQXdCO0FBQ3RCLFFBQUlDLFNBQVMsR0FBRzFOLFNBQVMsQ0FBQ1osTUFBVixHQUFtQixDQUFuQixJQUF3QlksU0FBUyxDQUFDLENBQUQsQ0FBVCxLQUFpQlcsU0FBekMsR0FBcURYLFNBQVMsQ0FBQyxDQUFELENBQTlELEdBQW9FLEVBQXBGO0FBQ0FyQixJQUFBQSxjQUFjLENBQUMsSUFBRCxFQUFPOE8sWUFBUCxDQUFkO0FBRUEsU0FBS0MsU0FBTCxHQUFpQkEsU0FBakI7QUFDRDtBQUVEOzs7Ozs7Ozs7OztBQVdBM08sRUFBQUEsV0FBVyxDQUFDME8sWUFBRCxFQUFlLENBQUM7QUFDekI5TixJQUFBQSxHQUFHLEVBQUUsSUFEb0I7QUFFekJtQixJQUFBQSxLQUFLLEVBQUUsU0FBUzBDLEVBQVQsQ0FBWWxCLE1BQVosRUFBb0JxTCxFQUFwQixFQUF3QkMsT0FBeEIsRUFBaUM7QUFDdEMsVUFBSUMsT0FBTyxHQUFHN04sU0FBUyxDQUFDWixNQUFWLEdBQW1CLENBQW5CLElBQXdCWSxTQUFTLENBQUMsQ0FBRCxDQUFULEtBQWlCVyxTQUF6QyxHQUFxRFgsU0FBUyxDQUFDLENBQUQsQ0FBOUQsR0FBb0UsS0FBbEY7O0FBRUEsVUFBSTZCLFFBQVEsQ0FBQ1MsTUFBRCxDQUFaLEVBQXNCO0FBQ3BCQSxRQUFBQSxNQUFNLEdBQUcsQ0FBQ0EsTUFBRCxDQUFUO0FBQ0Q7O0FBRUQsV0FBSyxJQUFJbkQsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR21ELE1BQU0sQ0FBQ2xELE1BQTNCLEVBQW1DRCxDQUFDLEVBQXBDLEVBQXdDO0FBQ3RDLGFBQUt1TyxTQUFMLENBQWVwTCxNQUFNLENBQUNuRCxDQUFELENBQXJCLElBQTRCeU8sT0FBNUI7QUFFQUQsUUFBQUEsRUFBRSxDQUFDRyxnQkFBSCxDQUFvQnhMLE1BQU0sQ0FBQ25ELENBQUQsQ0FBMUIsRUFBK0IsS0FBS3VPLFNBQUwsQ0FBZXBMLE1BQU0sQ0FBQ25ELENBQUQsQ0FBckIsQ0FBL0IsRUFBMEQwTyxPQUExRDtBQUNEO0FBQ0Y7QUFFRDs7Ozs7Ozs7O0FBaEJ5QixHQUFELEVBeUJ2QjtBQUNEbE8sSUFBQUEsR0FBRyxFQUFFLEtBREo7QUFFRG1CLElBQUFBLEtBQUssRUFBRSxTQUFTaU4sR0FBVCxDQUFhekwsTUFBYixFQUFxQnFMLEVBQXJCLEVBQXlCO0FBQzlCLFVBQUlFLE9BQU8sR0FBRzdOLFNBQVMsQ0FBQ1osTUFBVixHQUFtQixDQUFuQixJQUF3QlksU0FBUyxDQUFDLENBQUQsQ0FBVCxLQUFpQlcsU0FBekMsR0FBcURYLFNBQVMsQ0FBQyxDQUFELENBQTlELEdBQW9FLEtBQWxGOztBQUVBLFVBQUk2QixRQUFRLENBQUNTLE1BQUQsQ0FBWixFQUFzQjtBQUNwQkEsUUFBQUEsTUFBTSxHQUFHLENBQUNBLE1BQUQsQ0FBVDtBQUNEOztBQUVELFdBQUssSUFBSW5ELENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdtRCxNQUFNLENBQUNsRCxNQUEzQixFQUFtQ0QsQ0FBQyxFQUFwQyxFQUF3QztBQUN0Q3dPLFFBQUFBLEVBQUUsQ0FBQ0ssbUJBQUgsQ0FBdUIxTCxNQUFNLENBQUNuRCxDQUFELENBQTdCLEVBQWtDLEtBQUt1TyxTQUFMLENBQWVwTCxNQUFNLENBQUNuRCxDQUFELENBQXJCLENBQWxDLEVBQTZEME8sT0FBN0Q7QUFDRDtBQUNGO0FBRUQ7Ozs7OztBQWRDLEdBekJ1QixFQTZDdkI7QUFDRGxPLElBQUFBLEdBQUcsRUFBRSxTQURKO0FBRURtQixJQUFBQSxLQUFLLEVBQUUsU0FBU3NFLE9BQVQsR0FBbUI7QUFDeEIsYUFBTyxLQUFLc0ksU0FBWjtBQUNEO0FBSkEsR0E3Q3VCLENBQWYsQ0FBWDtBQW1EQSxTQUFPRCxZQUFQO0FBQ0QsQ0ExRWtCLEVBQW5COztBQTRFQSxTQUFTUSxNQUFULENBQWlCL0osS0FBakIsRUFBd0JnQyxVQUF4QixFQUFvQ0MsTUFBcEMsRUFBNEM7QUFDMUM7Ozs7O0FBS0EsTUFBSStILE1BQU0sR0FBRyxJQUFJVCxZQUFKLEVBQWI7QUFFQSxNQUFJUSxNQUFNLEdBQUc7QUFDWDs7O0FBR0E5TCxJQUFBQSxLQUFLLEVBQUUsU0FBU0EsS0FBVCxHQUFpQjtBQUN0QixXQUFLZ00sSUFBTDtBQUNELEtBTlU7O0FBU1g7Ozs7OztBQU1BQSxJQUFBQSxJQUFJLEVBQUUsU0FBU0EsSUFBVCxHQUFnQjtBQUNwQkQsTUFBQUEsTUFBTSxDQUFDMUssRUFBUCxDQUFVLFFBQVYsRUFBb0J5RyxNQUFwQixFQUE0QmpOLFFBQVEsQ0FBQyxZQUFZO0FBQy9DbUosUUFBQUEsTUFBTSxDQUFDckMsSUFBUCxDQUFZLFFBQVo7QUFDRCxPQUZtQyxFQUVqQ0ksS0FBSyxDQUFDZCxRQUFOLENBQWVwRyxRQUZrQixDQUFwQztBQUdELEtBbkJVOztBQXNCWDs7Ozs7QUFLQW9SLElBQUFBLE1BQU0sRUFBRSxTQUFTQSxNQUFULEdBQWtCO0FBQ3hCRixNQUFBQSxNQUFNLENBQUNILEdBQVAsQ0FBVyxRQUFYLEVBQXFCOUQsTUFBckI7QUFDRDtBQTdCVSxHQUFiO0FBZ0NBOzs7OztBQUlBOUQsRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLFNBQVYsRUFBcUIsWUFBWTtBQUMvQnlLLElBQUFBLE1BQU0sQ0FBQ0csTUFBUDtBQUNBRixJQUFBQSxNQUFNLENBQUM5SSxPQUFQO0FBQ0QsR0FIRDtBQUtBLFNBQU82SSxNQUFQO0FBQ0Q7O0FBRUQsSUFBSUksZ0JBQWdCLEdBQUcsQ0FBQyxLQUFELEVBQVEsS0FBUixDQUF2QjtBQUNBLElBQUlDLGdCQUFnQixHQUFHO0FBQ3JCLE9BQUssR0FEZ0I7QUFFckIsT0FBSyxHQUZnQjtBQUdyQixPQUFLO0FBSGdCLENBQXZCOztBQU1BLFNBQVNwRixTQUFULENBQW9CaEYsS0FBcEIsRUFBMkJnQyxVQUEzQixFQUF1Q0MsTUFBdkMsRUFBK0M7QUFDN0MsTUFBSStDLFNBQVMsR0FBRztBQUNkOzs7OztBQUtBL0csSUFBQUEsS0FBSyxFQUFFLFNBQVNBLEtBQVQsR0FBaUI7QUFDdEIsV0FBS3JCLEtBQUwsR0FBYW9ELEtBQUssQ0FBQ2QsUUFBTixDQUFlbkcsU0FBNUI7QUFDRCxLQVJhOztBQVdkOzs7Ozs7QUFNQXNSLElBQUFBLE9BQU8sRUFBRSxTQUFTQSxPQUFULENBQWlCM0osT0FBakIsRUFBMEI7QUFDakMsVUFBSTRKLEtBQUssR0FBRzVKLE9BQU8sQ0FBQzJGLEtBQVIsQ0FBYyxDQUFkLEVBQWlCLENBQWpCLENBQVo7O0FBRUEsVUFBSSxLQUFLYyxFQUFMLENBQVEsS0FBUixDQUFKLEVBQW9CO0FBQ2xCLGVBQU96RyxPQUFPLENBQUM2SixLQUFSLENBQWNELEtBQWQsRUFBcUJFLElBQXJCLENBQTBCSixnQkFBZ0IsQ0FBQ0UsS0FBRCxDQUExQyxDQUFQO0FBQ0Q7O0FBRUQsYUFBTzVKLE9BQVA7QUFDRCxLQXpCYTs7QUE0QmQ7Ozs7OztBQU1BeUcsSUFBQUEsRUFBRSxFQUFFLFNBQVNBLEVBQVQsQ0FBWXBPLFNBQVosRUFBdUI7QUFDekIsYUFBTyxLQUFLNkQsS0FBTCxLQUFlN0QsU0FBdEI7QUFDRCxLQXBDYTs7QUF1Q2Q7Ozs7O0FBS0EwUixJQUFBQSxRQUFRLEVBQUUsU0FBU0EsUUFBVCxHQUFvQjtBQUM1QnpJLE1BQUFBLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0IyQyxJQUFoQixDQUFxQkssU0FBckIsQ0FBK0J3QixHQUEvQixDQUFtQy9ILEtBQUssQ0FBQ2QsUUFBTixDQUFlaEcsT0FBZixDQUF1QkgsU0FBdkIsQ0FBaUMsS0FBSzZELEtBQXRDLENBQW5DO0FBQ0QsS0E5Q2E7O0FBaURkOzs7OztBQUtBOE4sSUFBQUEsV0FBVyxFQUFFLFNBQVNBLFdBQVQsR0FBdUI7QUFDbEMxSSxNQUFBQSxVQUFVLENBQUN1QixJQUFYLENBQWdCMkMsSUFBaEIsQ0FBcUJLLFNBQXJCLENBQStCNUcsTUFBL0IsQ0FBc0NLLEtBQUssQ0FBQ2QsUUFBTixDQUFlaEcsT0FBZixDQUF1QkgsU0FBdkIsQ0FBaUMsS0FBSzZELEtBQXRDLENBQXRDO0FBQ0Q7QUF4RGEsR0FBaEI7QUEyREE0QixFQUFBQSxNQUFNLENBQUN3RyxTQUFELEVBQVksT0FBWixFQUFxQjtBQUN6Qjs7Ozs7QUFLQTlJLElBQUFBLEdBQUcsRUFBRSxTQUFTQSxHQUFULEdBQWU7QUFDbEIsYUFBTzhJLFNBQVMsQ0FBQzZCLEVBQWpCO0FBQ0QsS0FSd0I7O0FBV3pCOzs7Ozs7QUFNQW5GLElBQUFBLEdBQUcsRUFBRSxTQUFTQSxHQUFULENBQWE5RSxLQUFiLEVBQW9CO0FBQ3ZCLFVBQUl1TixnQkFBZ0IsQ0FBQ1EsT0FBakIsQ0FBeUIvTixLQUF6QixJQUFrQyxDQUFDLENBQXZDLEVBQTBDO0FBQ3hDb0ksUUFBQUEsU0FBUyxDQUFDNkIsRUFBVixHQUFlakssS0FBZjtBQUNELE9BRkQsTUFFTztBQUNMN0MsUUFBQUEsSUFBSSxDQUFDLHdDQUFELENBQUo7QUFDRDtBQUNGO0FBdkJ3QixHQUFyQixDQUFOO0FBMEJBOzs7Ozs7QUFLQWtJLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxDQUFDLFNBQUQsRUFBWSxRQUFaLENBQVYsRUFBaUMsWUFBWTtBQUMzQzBGLElBQUFBLFNBQVMsQ0FBQzBGLFdBQVY7QUFDRCxHQUZEO0FBSUE7Ozs7O0FBSUF6SSxFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsUUFBVixFQUFvQixZQUFZO0FBQzlCMEYsSUFBQUEsU0FBUyxDQUFDL0csS0FBVjtBQUNELEdBRkQ7QUFJQTs7Ozs7O0FBS0FnRSxFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsQ0FBQyxjQUFELEVBQWlCLFFBQWpCLENBQVYsRUFBc0MsWUFBWTtBQUNoRDBGLElBQUFBLFNBQVMsQ0FBQ3lGLFFBQVY7QUFDRCxHQUZEO0FBSUEsU0FBT3pGLFNBQVA7QUFDRDtBQUVEOzs7Ozs7Ozs7QUFPQSxTQUFTNEYsR0FBVCxDQUFjNUssS0FBZCxFQUFxQmdDLFVBQXJCLEVBQWlDO0FBQy9CLFNBQU87QUFDTDs7Ozs7O0FBTUE2SSxJQUFBQSxNQUFNLEVBQUUsU0FBU0EsTUFBVCxDQUFnQjNELFNBQWhCLEVBQTJCO0FBQ2pDLFVBQUlsRixVQUFVLENBQUNnRCxTQUFYLENBQXFCbUMsRUFBckIsQ0FBd0IsS0FBeEIsQ0FBSixFQUFvQztBQUNsQyxlQUFPLENBQUNELFNBQVI7QUFDRDs7QUFFRCxhQUFPQSxTQUFQO0FBQ0Q7QUFiSSxHQUFQO0FBZUQ7QUFFRDs7Ozs7Ozs7O0FBT0EsU0FBUzRELEdBQVQsQ0FBYzlLLEtBQWQsRUFBcUJnQyxVQUFyQixFQUFpQztBQUMvQixTQUFPO0FBQ0w7Ozs7OztBQU1BNkksSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsQ0FBZ0IzRCxTQUFoQixFQUEyQjtBQUNqQyxVQUFJNkQsVUFBVSxHQUFHL0gsSUFBSSxDQUFDQyxLQUFMLENBQVdpRSxTQUFTLEdBQUdsRixVQUFVLENBQUNtRCxLQUFYLENBQWlCOEIsVUFBeEMsQ0FBakI7QUFDQSxhQUFPQyxTQUFTLEdBQUdsRixVQUFVLENBQUM2QyxJQUFYLENBQWdCakksS0FBaEIsR0FBd0JtTyxVQUEzQztBQUNEO0FBVkksR0FBUDtBQVlEO0FBRUQ7Ozs7Ozs7OztBQU9BLFNBQVNDLElBQVQsQ0FBZWhMLEtBQWYsRUFBc0JnQyxVQUF0QixFQUFrQztBQUNoQyxTQUFPO0FBQ0w7Ozs7OztBQU1BNkksSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsQ0FBZ0IzRCxTQUFoQixFQUEyQjtBQUNqQyxhQUFPQSxTQUFTLEdBQUdsRixVQUFVLENBQUMwRixNQUFYLENBQWtCRCxJQUFsQixHQUF5QixDQUE1QztBQUNEO0FBVEksR0FBUDtBQVdEO0FBRUQ7Ozs7Ozs7OztBQU9BLFNBQVN3RCxPQUFULENBQWtCakwsS0FBbEIsRUFBeUJnQyxVQUF6QixFQUFxQztBQUNuQyxTQUFPO0FBQ0w7Ozs7OztBQU1BNkksSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsQ0FBZ0IzRCxTQUFoQixFQUEyQjtBQUNqQyxVQUFJbEgsS0FBSyxDQUFDZCxRQUFOLENBQWVwSCxPQUFmLElBQTBCLENBQTlCLEVBQWlDO0FBQy9CLFlBQUlrQixJQUFJLEdBQUdnSixVQUFVLENBQUM0RSxJQUFYLENBQWdCaEssS0FBM0I7O0FBRUEsWUFBSWdCLFFBQVEsQ0FBQzVFLElBQUQsQ0FBWixFQUFvQjtBQUNsQixpQkFBT2tPLFNBQVMsR0FBR2xPLElBQUksQ0FBQzhOLE1BQXhCO0FBQ0Q7O0FBRUQsZUFBT0ksU0FBUyxHQUFHbE8sSUFBbkI7QUFDRDs7QUFFRCxhQUFPa08sU0FBUDtBQUNEO0FBbkJJLEdBQVA7QUFxQkQ7QUFFRDs7Ozs7Ozs7O0FBT0EsU0FBU2dFLFFBQVQsQ0FBbUJsTCxLQUFuQixFQUEwQmdDLFVBQTFCLEVBQXNDO0FBQ3BDLFNBQU87QUFDTDs7Ozs7O0FBTUE2SSxJQUFBQSxNQUFNLEVBQUUsU0FBU0EsTUFBVCxDQUFnQjNELFNBQWhCLEVBQTJCO0FBQ2pDLFVBQUluUCxHQUFHLEdBQUdpSyxVQUFVLENBQUM2QyxJQUFYLENBQWdCakksS0FBMUI7QUFDQSxVQUFJeUssS0FBSyxHQUFHckYsVUFBVSxDQUFDbUQsS0FBWCxDQUFpQmtDLEtBQTdCO0FBQ0EsVUFBSXZQLE9BQU8sR0FBR2tJLEtBQUssQ0FBQ2QsUUFBTixDQUFlcEgsT0FBN0I7QUFDQSxVQUFJbVAsVUFBVSxHQUFHakYsVUFBVSxDQUFDbUQsS0FBWCxDQUFpQjhCLFVBQWxDOztBQUVBLFVBQUluUCxPQUFPLEtBQUssUUFBaEIsRUFBMEI7QUFDeEIsZUFBT29QLFNBQVMsSUFBSUcsS0FBSyxHQUFHLENBQVIsR0FBWUosVUFBVSxHQUFHLENBQTdCLENBQWhCO0FBQ0Q7O0FBRUQsYUFBT0MsU0FBUyxHQUFHRCxVQUFVLEdBQUduUCxPQUF6QixHQUFtQ0MsR0FBRyxHQUFHRCxPQUFoRDtBQUNEO0FBbEJJLEdBQVA7QUFvQkQ7QUFFRDs7Ozs7Ozs7O0FBT0EsU0FBU3FULE9BQVQsQ0FBa0JuTCxLQUFsQixFQUF5QmdDLFVBQXpCLEVBQXFDQyxNQUFyQyxFQUE2QztBQUMzQzs7Ozs7OztBQU9BLE1BQUltSixZQUFZLEdBQUcsQ0FBQ04sR0FBRCxFQUFNRSxJQUFOLEVBQVlDLE9BQVosRUFBcUJDLFFBQXJCLEVBQStCRyxNQUEvQixDQUFzQ3JMLEtBQUssQ0FBQ0csRUFBNUMsRUFBZ0QsQ0FBQ3lLLEdBQUQsQ0FBaEQsQ0FBbkI7QUFFQSxTQUFPO0FBQ0w7Ozs7OztBQU1BdEssSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsQ0FBZ0I0RyxTQUFoQixFQUEyQjtBQUNqQyxXQUFLLElBQUlqTSxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHbVEsWUFBWSxDQUFDbFEsTUFBakMsRUFBeUNELENBQUMsRUFBMUMsRUFBOEM7QUFDNUMsWUFBSXFRLFdBQVcsR0FBR0YsWUFBWSxDQUFDblEsQ0FBRCxDQUE5Qjs7QUFFQSxZQUFJNEMsVUFBVSxDQUFDeU4sV0FBRCxDQUFWLElBQTJCek4sVUFBVSxDQUFDeU4sV0FBVyxHQUFHVCxNQUFmLENBQXpDLEVBQWlFO0FBQy9EM0QsVUFBQUEsU0FBUyxHQUFHb0UsV0FBVyxDQUFDdEwsS0FBRCxFQUFRZ0MsVUFBUixFQUFvQkMsTUFBcEIsQ0FBWCxDQUF1QzRJLE1BQXZDLENBQThDM0QsU0FBOUMsQ0FBWjtBQUNELFNBRkQsTUFFTztBQUNMbk4sVUFBQUEsSUFBSSxDQUFDLGdGQUFELENBQUo7QUFDRDtBQUNGOztBQUVELGFBQU9tTixTQUFQO0FBQ0Q7QUFuQkksR0FBUDtBQXFCRDs7QUFFRCxTQUFTcUUsU0FBVCxDQUFvQnZMLEtBQXBCLEVBQTJCZ0MsVUFBM0IsRUFBdUNDLE1BQXZDLEVBQStDO0FBQzdDLE1BQUlzSixTQUFTLEdBQUc7QUFDZDs7Ozs7O0FBTUE3SixJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxDQUFhOUUsS0FBYixFQUFvQjtBQUN2QixVQUFJNE8sU0FBUyxHQUFHTCxPQUFPLENBQUNuTCxLQUFELEVBQVFnQyxVQUFSLENBQVAsQ0FBMkIxQixNQUEzQixDQUFrQzFELEtBQWxDLENBQWhCO0FBRUFvRixNQUFBQSxVQUFVLENBQUN1QixJQUFYLENBQWdCNkIsT0FBaEIsQ0FBd0JMLEtBQXhCLENBQThCeUcsU0FBOUIsR0FBMEMsaUJBQWlCLENBQUMsQ0FBRCxHQUFLQSxTQUF0QixHQUFrQyxlQUE1RTtBQUNELEtBWGE7O0FBY2Q7Ozs7O0FBS0E3TCxJQUFBQSxNQUFNLEVBQUUsU0FBU0EsTUFBVCxHQUFrQjtBQUN4QnFDLE1BQUFBLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUFoQixDQUF3QkwsS0FBeEIsQ0FBOEJ5RyxTQUE5QixHQUEwQyxFQUExQztBQUNELEtBckJhOztBQXdCZDs7O0FBR0FDLElBQUFBLGFBQWEsRUFBRSxTQUFTQSxhQUFULEdBQXlCO0FBQ3RDLFVBQUl2USxNQUFNLEdBQUc4RyxVQUFVLENBQUNtRCxLQUFYLENBQWlCakssTUFBOUI7QUFDQSxVQUFJdUUsS0FBSyxHQUFHTyxLQUFLLENBQUNQLEtBQWxCO0FBQ0EsVUFBSTVILE9BQU8sR0FBR21JLEtBQUssQ0FBQ2QsUUFBTixDQUFlckgsT0FBN0I7O0FBRUEsVUFBSW1LLFVBQVUsQ0FBQ3JCLEdBQVgsQ0FBZTRCLFFBQWYsQ0FBd0IsR0FBeEIsS0FBZ0NQLFVBQVUsQ0FBQ3JCLEdBQVgsQ0FBZTRCLFFBQWYsQ0FBd0IsSUFBeEIsQ0FBcEMsRUFBbUU7QUFDakUsZUFBT3JILE1BQU0sSUFBSXVFLEtBQUssR0FBRzVILE9BQVosQ0FBYjtBQUNELE9BUHFDLENBU3RDOzs7QUFDQSxhQUFPLENBQUM0SCxLQUFLLEdBQUc1SCxPQUFULElBQW9CcUQsTUFBM0I7QUFDRCxLQXRDYTs7QUF5Q2Q7OztBQUdBd1EsSUFBQUEsaUJBQWlCLEVBQUUsU0FBU0EsaUJBQVQsR0FBNkI7QUFDOUMsVUFBSUMsY0FBYyxHQUFHM0osVUFBVSxDQUFDbUQsS0FBWCxDQUFpQjhCLFVBQWpCLEdBQThCakgsS0FBSyxDQUFDZCxRQUFOLENBQWVySCxPQUFsRTs7QUFFQSxVQUFJbUssVUFBVSxDQUFDckIsR0FBWCxDQUFlNEIsUUFBZixDQUF3QixHQUF4QixLQUFnQ1AsVUFBVSxDQUFDckIsR0FBWCxDQUFlNEIsUUFBZixDQUF3QixJQUF4QixDQUFwQyxFQUFtRTtBQUNqRTtBQUNBLGVBQU9vSixjQUFjLEdBQUcsQ0FBQyxDQUF6QjtBQUNEOztBQUVELGFBQU9BLGNBQVA7QUFDRDtBQXJEYSxHQUFoQjtBQXdEQTs7Ozs7O0FBS0ExSixFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsTUFBVixFQUFrQixVQUFVTyxPQUFWLEVBQW1CO0FBQ25DLFFBQUksQ0FBQ0csS0FBSyxDQUFDdUIsTUFBTixDQUFhLFVBQWIsQ0FBRCxJQUE2QixDQUFDUyxVQUFVLENBQUNyQixHQUFYLENBQWU0QixRQUFmLEVBQWxDLEVBQTZEO0FBQzNELGFBQU9nSixTQUFTLENBQUM3SixHQUFWLENBQWM3QixPQUFPLENBQUNtSCxRQUF0QixDQUFQO0FBQ0Q7O0FBRURoRixJQUFBQSxVQUFVLENBQUNqQixVQUFYLENBQXNCcUIsS0FBdEIsQ0FBNEIsWUFBWTtBQUN0Q0gsTUFBQUEsTUFBTSxDQUFDckMsSUFBUCxDQUFZLGdCQUFaO0FBRUEyTCxNQUFBQSxTQUFTLENBQUM3SixHQUFWLENBQWNNLFVBQVUsQ0FBQ21ELEtBQVgsQ0FBaUI4QixVQUFqQixHQUE4QmpILEtBQUssQ0FBQ1AsS0FBbEQ7QUFDRCxLQUpEO0FBTUEsUUFBSW1NLFVBQVUsR0FBRzVKLFVBQVUsQ0FBQ21ELEtBQVgsQ0FBaUI4QixVQUFqQixHQUE4QmpGLFVBQVUsQ0FBQ3VKLFNBQVgsQ0FBcUJFLGFBQXJCLEVBQS9DO0FBQ0EsV0FBT0YsU0FBUyxDQUFDN0osR0FBVixDQUFja0ssVUFBVSxHQUFHNUosVUFBVSxDQUFDdUosU0FBWCxDQUFxQkcsaUJBQXJCLEVBQTNCLENBQVA7QUFDRCxHQWJEO0FBZUE7Ozs7O0FBSUF6SixFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsU0FBVixFQUFxQixZQUFZO0FBQy9CaU0sSUFBQUEsU0FBUyxDQUFDNUwsTUFBVjtBQUNELEdBRkQ7QUFJQSxTQUFPNEwsU0FBUDtBQUNEOztBQUVELFNBQVN4SyxVQUFULENBQXFCZixLQUFyQixFQUE0QmdDLFVBQTVCLEVBQXdDQyxNQUF4QyxFQUFnRDtBQUM5Qzs7Ozs7O0FBTUEsTUFBSXBJLFFBQVEsR0FBRyxLQUFmO0FBRUEsTUFBSWtILFVBQVUsR0FBRztBQUNmOzs7Ozs7QUFNQThLLElBQUFBLE9BQU8sRUFBRSxTQUFTQSxPQUFULENBQWlCelAsUUFBakIsRUFBMkI7QUFDbEMsVUFBSThDLFFBQVEsR0FBR2MsS0FBSyxDQUFDZCxRQUFyQjs7QUFFQSxVQUFJLENBQUNyRixRQUFMLEVBQWU7QUFDYixlQUFPdUMsUUFBUSxHQUFHLEdBQVgsR0FBaUIsS0FBSzBQLFFBQXRCLEdBQWlDLEtBQWpDLEdBQXlDNU0sUUFBUSxDQUFDdEcsbUJBQXpEO0FBQ0Q7O0FBRUQsYUFBT3dELFFBQVEsR0FBRyxPQUFYLEdBQXFCOEMsUUFBUSxDQUFDdEcsbUJBQXJDO0FBQ0QsS0FmYzs7QUFrQmY7Ozs7OztBQU1BOEksSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsR0FBZTtBQUNsQixVQUFJdEYsUUFBUSxHQUFHTixTQUFTLENBQUNaLE1BQVYsR0FBbUIsQ0FBbkIsSUFBd0JZLFNBQVMsQ0FBQyxDQUFELENBQVQsS0FBaUJXLFNBQXpDLEdBQXFEWCxTQUFTLENBQUMsQ0FBRCxDQUE5RCxHQUFvRSxXQUFuRjtBQUVBa0csTUFBQUEsVUFBVSxDQUFDdUIsSUFBWCxDQUFnQjZCLE9BQWhCLENBQXdCTCxLQUF4QixDQUE4QmdILFVBQTlCLEdBQTJDLEtBQUtGLE9BQUwsQ0FBYXpQLFFBQWIsQ0FBM0M7QUFDRCxLQTVCYzs7QUErQmY7Ozs7O0FBS0F1RCxJQUFBQSxNQUFNLEVBQUUsU0FBU0EsTUFBVCxHQUFrQjtBQUN4QnFDLE1BQUFBLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUFoQixDQUF3QkwsS0FBeEIsQ0FBOEJnSCxVQUE5QixHQUEyQyxFQUEzQztBQUNELEtBdENjOztBQXlDZjs7Ozs7O0FBTUEzSixJQUFBQSxLQUFLLEVBQUUsU0FBU0EsS0FBVCxDQUFlNEosUUFBZixFQUF5QjtBQUM5QnRILE1BQUFBLFVBQVUsQ0FBQyxZQUFZO0FBQ3JCc0gsUUFBQUEsUUFBUTtBQUNULE9BRlMsRUFFUCxLQUFLRixRQUZFLENBQVY7QUFHRCxLQW5EYzs7QUFzRGY7Ozs7O0FBS0F4SyxJQUFBQSxNQUFNLEVBQUUsU0FBU0EsTUFBVCxHQUFrQjtBQUN4QnpILE1BQUFBLFFBQVEsR0FBRyxLQUFYO0FBRUEsV0FBSzZILEdBQUw7QUFDRCxLQS9EYzs7QUFrRWY7Ozs7O0FBS0FWLElBQUFBLE9BQU8sRUFBRSxTQUFTQSxPQUFULEdBQW1CO0FBQzFCbkgsTUFBQUEsUUFBUSxHQUFHLElBQVg7QUFFQSxXQUFLNkgsR0FBTDtBQUNEO0FBM0VjLEdBQWpCO0FBOEVBbEQsRUFBQUEsTUFBTSxDQUFDdUMsVUFBRCxFQUFhLFVBQWIsRUFBeUI7QUFDN0I7Ozs7OztBQU1BN0UsSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsR0FBZTtBQUNsQixVQUFJZ0QsUUFBUSxHQUFHYyxLQUFLLENBQUNkLFFBQXJCOztBQUVBLFVBQUljLEtBQUssQ0FBQ3VCLE1BQU4sQ0FBYSxRQUFiLEtBQTBCUyxVQUFVLENBQUNyQixHQUFYLENBQWVvRyxNQUE3QyxFQUFxRDtBQUNuRCxlQUFPN0gsUUFBUSxDQUFDdkcsY0FBaEI7QUFDRDs7QUFFRCxhQUFPdUcsUUFBUSxDQUFDekcsaUJBQWhCO0FBQ0Q7QUFmNEIsR0FBekIsQ0FBTjtBQWtCQTs7Ozs7QUFJQXdKLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxNQUFWLEVBQWtCLFlBQVk7QUFDNUJ5QixJQUFBQSxVQUFVLENBQUNXLEdBQVg7QUFDRCxHQUZEO0FBSUE7Ozs7Ozs7QUFNQU8sRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLENBQUMsY0FBRCxFQUFpQixRQUFqQixFQUEyQixnQkFBM0IsQ0FBVixFQUF3RCxZQUFZO0FBQ2xFeUIsSUFBQUEsVUFBVSxDQUFDQyxPQUFYO0FBQ0QsR0FGRDtBQUlBOzs7OztBQUlBaUIsRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLEtBQVYsRUFBaUIsWUFBWTtBQUMzQnlCLElBQUFBLFVBQVUsQ0FBQ08sTUFBWDtBQUNELEdBRkQ7QUFJQTs7Ozs7QUFJQVcsRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLFNBQVYsRUFBcUIsWUFBWTtBQUMvQnlCLElBQUFBLFVBQVUsQ0FBQ3BCLE1BQVg7QUFDRCxHQUZEO0FBSUEsU0FBT29CLFVBQVA7QUFDRDtBQUVEOzs7Ozs7OztBQU9BLElBQUlrTCxlQUFlLEdBQUcsS0FBdEI7O0FBRUEsSUFBSTtBQUNGLE1BQUlDLElBQUksR0FBRzNRLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQixFQUF0QixFQUEwQixTQUExQixFQUFxQztBQUM5Q1UsSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsR0FBZTtBQUNsQitQLE1BQUFBLGVBQWUsR0FBRyxJQUFsQjtBQUNEO0FBSDZDLEdBQXJDLENBQVg7QUFNQWxHLEVBQUFBLE1BQU0sQ0FBQzZELGdCQUFQLENBQXdCLGFBQXhCLEVBQXVDLElBQXZDLEVBQTZDc0MsSUFBN0M7QUFDQW5HLEVBQUFBLE1BQU0sQ0FBQytELG1CQUFQLENBQTJCLGFBQTNCLEVBQTBDLElBQTFDLEVBQWdEb0MsSUFBaEQ7QUFDRCxDQVRELENBU0UsT0FBT0MsQ0FBUCxFQUFVLENBQUU7O0FBRWQsSUFBSUMsaUJBQWlCLEdBQUdILGVBQXhCO0FBRUEsSUFBSUksWUFBWSxHQUFHLENBQUMsWUFBRCxFQUFlLFdBQWYsQ0FBbkI7QUFDQSxJQUFJQyxXQUFXLEdBQUcsQ0FBQyxXQUFELEVBQWMsV0FBZCxDQUFsQjtBQUNBLElBQUlDLFVBQVUsR0FBRyxDQUFDLFVBQUQsRUFBYSxhQUFiLEVBQTRCLFNBQTVCLEVBQXVDLFlBQXZDLENBQWpCO0FBQ0EsSUFBSUMsWUFBWSxHQUFHLENBQUMsV0FBRCxFQUFjLFdBQWQsRUFBMkIsU0FBM0IsRUFBc0MsWUFBdEMsQ0FBbkI7O0FBRUEsU0FBU0MsS0FBVCxDQUFnQnpNLEtBQWhCLEVBQXVCZ0MsVUFBdkIsRUFBbUNDLE1BQW5DLEVBQTJDO0FBQ3pDOzs7OztBQUtBLE1BQUkrSCxNQUFNLEdBQUcsSUFBSVQsWUFBSixFQUFiO0FBRUEsTUFBSW1ELFFBQVEsR0FBRyxDQUFmO0FBQ0EsTUFBSUMsV0FBVyxHQUFHLENBQWxCO0FBQ0EsTUFBSUMsV0FBVyxHQUFHLENBQWxCO0FBQ0EsTUFBSS9TLFFBQVEsR0FBRyxLQUFmO0FBQ0EsTUFBSThQLE9BQU8sR0FBR3lDLGlCQUFpQixHQUFHO0FBQUVTLElBQUFBLE9BQU8sRUFBRTtBQUFYLEdBQUgsR0FBdUIsS0FBdEQ7QUFFQSxNQUFJQyxLQUFLLEdBQUc7QUFDVjs7Ozs7QUFLQTdPLElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULEdBQWlCO0FBQ3RCLFdBQUs4TyxjQUFMO0FBQ0QsS0FSUzs7QUFXVjs7Ozs7O0FBTUFDLElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULENBQWV6TixLQUFmLEVBQXNCO0FBQzNCLFVBQUksQ0FBQzFGLFFBQUQsSUFBYSxDQUFDbUcsS0FBSyxDQUFDbkcsUUFBeEIsRUFBa0M7QUFDaEMsYUFBS21ILE9BQUw7QUFFQSxZQUFJeUwsS0FBSyxHQUFHLEtBQUtRLE9BQUwsQ0FBYTFOLEtBQWIsQ0FBWjtBQUVBbU4sUUFBQUEsUUFBUSxHQUFHLElBQVg7QUFDQUMsUUFBQUEsV0FBVyxHQUFHcFAsS0FBSyxDQUFDa1AsS0FBSyxDQUFDUyxLQUFQLENBQW5CO0FBQ0FOLFFBQUFBLFdBQVcsR0FBR3JQLEtBQUssQ0FBQ2tQLEtBQUssQ0FBQ1UsS0FBUCxDQUFuQjtBQUVBLGFBQUtDLGFBQUw7QUFDQSxhQUFLQyxZQUFMO0FBRUFwTCxRQUFBQSxNQUFNLENBQUNyQyxJQUFQLENBQVksYUFBWjtBQUNEO0FBQ0YsS0FoQ1M7O0FBbUNWOzs7OztBQUtBaUIsSUFBQUEsSUFBSSxFQUFFLFNBQVNBLElBQVQsQ0FBY3RCLEtBQWQsRUFBcUI7QUFDekIsVUFBSSxDQUFDUyxLQUFLLENBQUNuRyxRQUFYLEVBQXFCO0FBQ25CLFlBQUl3TyxlQUFlLEdBQUdySSxLQUFLLENBQUNkLFFBQTVCO0FBQUEsWUFDSTFHLFVBQVUsR0FBRzZQLGVBQWUsQ0FBQzdQLFVBRGpDO0FBQUEsWUFFSUQsVUFBVSxHQUFHOFAsZUFBZSxDQUFDOVAsVUFGakM7QUFBQSxZQUdJVyxPQUFPLEdBQUdtUCxlQUFlLENBQUNuUCxPQUg5QjtBQU1BLFlBQUl1VCxLQUFLLEdBQUcsS0FBS1EsT0FBTCxDQUFhMU4sS0FBYixDQUFaO0FBRUEsWUFBSStOLE9BQU8sR0FBRy9QLEtBQUssQ0FBQ2tQLEtBQUssQ0FBQ1MsS0FBUCxDQUFMLEdBQXFCUCxXQUFuQztBQUNBLFlBQUlZLE9BQU8sR0FBR2hRLEtBQUssQ0FBQ2tQLEtBQUssQ0FBQ1UsS0FBUCxDQUFMLEdBQXFCUCxXQUFuQztBQUNBLFlBQUlZLEtBQUssR0FBR3hLLElBQUksQ0FBQ3lLLEdBQUwsQ0FBU0gsT0FBTyxJQUFJLENBQXBCLENBQVo7QUFDQSxZQUFJSSxLQUFLLEdBQUcxSyxJQUFJLENBQUN5SyxHQUFMLENBQVNGLE9BQU8sSUFBSSxDQUFwQixDQUFaO0FBQ0EsWUFBSUksZUFBZSxHQUFHM0ssSUFBSSxDQUFDNEssSUFBTCxDQUFVSixLQUFLLEdBQUdFLEtBQWxCLENBQXRCO0FBQ0EsWUFBSUcsYUFBYSxHQUFHN0ssSUFBSSxDQUFDNEssSUFBTCxDQUFVRixLQUFWLENBQXBCO0FBRUFoQixRQUFBQSxRQUFRLEdBQUcxSixJQUFJLENBQUM4SyxJQUFMLENBQVVELGFBQWEsR0FBR0YsZUFBMUIsQ0FBWDs7QUFFQSxZQUFJakIsUUFBUSxHQUFHLEdBQVgsR0FBaUIxSixJQUFJLENBQUMrSyxFQUF0QixHQUEyQnZWLFVBQS9CLEVBQTJDO0FBQ3pDK0csVUFBQUEsS0FBSyxDQUFDeU8sZUFBTjtBQUVBaE0sVUFBQUEsVUFBVSxDQUFDZixJQUFYLENBQWdCTCxJQUFoQixDQUFxQjBNLE9BQU8sR0FBRzdQLE9BQU8sQ0FBQ2xGLFVBQUQsQ0FBdEM7QUFFQXlKLFVBQUFBLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0IyQyxJQUFoQixDQUFxQkssU0FBckIsQ0FBK0J3QixHQUEvQixDQUFtQzdPLE9BQU8sQ0FBQ0UsUUFBM0M7QUFFQTZJLFVBQUFBLE1BQU0sQ0FBQ3JDLElBQVAsQ0FBWSxZQUFaO0FBQ0QsU0FSRCxNQVFPO0FBQ0wsaUJBQU8sS0FBUDtBQUNEO0FBQ0Y7QUFDRixLQXZFUzs7QUEwRVY7Ozs7OztBQU1BcU8sSUFBQUEsR0FBRyxFQUFFLFNBQVNBLEdBQVQsQ0FBYTFPLEtBQWIsRUFBb0I7QUFDdkIsVUFBSSxDQUFDUyxLQUFLLENBQUNuRyxRQUFYLEVBQXFCO0FBQ25CLFlBQUlxVSxnQkFBZ0IsR0FBR2xPLEtBQUssQ0FBQ2QsUUFBN0I7QUFBQSxZQUNJNUcsUUFBUSxHQUFHNFYsZ0JBQWdCLENBQUM1VixRQURoQztBQUFBLFlBRUlFLFVBQVUsR0FBRzBWLGdCQUFnQixDQUFDMVYsVUFGbEM7QUFBQSxZQUdJVSxPQUFPLEdBQUdnVixnQkFBZ0IsQ0FBQ2hWLE9BSC9CO0FBTUEsWUFBSXVULEtBQUssR0FBRyxLQUFLUSxPQUFMLENBQWExTixLQUFiLENBQVo7QUFDQSxZQUFJNE8sU0FBUyxHQUFHLEtBQUtBLFNBQUwsQ0FBZTVPLEtBQWYsQ0FBaEI7QUFFQSxZQUFJNk8sYUFBYSxHQUFHM0IsS0FBSyxDQUFDUyxLQUFOLEdBQWNQLFdBQWxDO0FBQ0EsWUFBSTBCLFFBQVEsR0FBRzNCLFFBQVEsR0FBRyxHQUFYLEdBQWlCMUosSUFBSSxDQUFDK0ssRUFBckM7QUFFQSxhQUFLek0sTUFBTDs7QUFFQSxZQUFJOE0sYUFBYSxHQUFHRCxTQUFoQixJQUE2QkUsUUFBUSxHQUFHN1YsVUFBNUMsRUFBd0Q7QUFDdER3SixVQUFBQSxVQUFVLENBQUNyQixHQUFYLENBQWVDLElBQWYsQ0FBb0JvQixVQUFVLENBQUNnRCxTQUFYLENBQXFCcUYsT0FBckIsQ0FBNkIvUixRQUFRLEdBQUcsR0FBeEMsQ0FBcEI7QUFDRCxTQUZELE1BRU8sSUFBSThWLGFBQWEsR0FBRyxDQUFDRCxTQUFqQixJQUE4QkUsUUFBUSxHQUFHN1YsVUFBN0MsRUFBeUQ7QUFDOUR3SixVQUFBQSxVQUFVLENBQUNyQixHQUFYLENBQWVDLElBQWYsQ0FBb0JvQixVQUFVLENBQUNnRCxTQUFYLENBQXFCcUYsT0FBckIsQ0FBNkIvUixRQUFRLEdBQUcsR0FBeEMsQ0FBcEI7QUFDRCxTQUZNLE1BRUE7QUFDTDtBQUNBMEosVUFBQUEsVUFBVSxDQUFDZixJQUFYLENBQWdCTCxJQUFoQjtBQUNEOztBQUVEb0IsUUFBQUEsVUFBVSxDQUFDdUIsSUFBWCxDQUFnQjJDLElBQWhCLENBQXFCSyxTQUFyQixDQUErQjVHLE1BQS9CLENBQXNDekcsT0FBTyxDQUFDRSxRQUE5QztBQUVBLGFBQUtrVixlQUFMO0FBQ0EsYUFBS0MsY0FBTDtBQUVBdE0sUUFBQUEsTUFBTSxDQUFDckMsSUFBUCxDQUFZLFdBQVo7QUFDRDtBQUNGLEtBaEhTOztBQW1IVjs7Ozs7QUFLQW1OLElBQUFBLGNBQWMsRUFBRSxTQUFTQSxjQUFULEdBQTBCO0FBQ3hDLFVBQUk3SyxLQUFLLEdBQUcsSUFBWjs7QUFFQSxVQUFJc00sZ0JBQWdCLEdBQUd4TyxLQUFLLENBQUNkLFFBQTdCO0FBQUEsVUFDSTlHLGNBQWMsR0FBR29XLGdCQUFnQixDQUFDcFcsY0FEdEM7QUFBQSxVQUVJQyxhQUFhLEdBQUdtVyxnQkFBZ0IsQ0FBQ25XLGFBRnJDOztBQUtBLFVBQUlELGNBQUosRUFBb0I7QUFDbEI0UixRQUFBQSxNQUFNLENBQUMxSyxFQUFQLENBQVUrTSxZQUFZLENBQUMsQ0FBRCxDQUF0QixFQUEyQnJLLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUEzQyxFQUFvRCxVQUFVN0YsS0FBVixFQUFpQjtBQUNuRTJDLFVBQUFBLEtBQUssQ0FBQzhLLEtBQU4sQ0FBWXpOLEtBQVo7QUFDRCxTQUZELEVBRUdvSyxPQUZIO0FBR0Q7O0FBRUQsVUFBSXRSLGFBQUosRUFBbUI7QUFDakIyUixRQUFBQSxNQUFNLENBQUMxSyxFQUFQLENBQVUrTSxZQUFZLENBQUMsQ0FBRCxDQUF0QixFQUEyQnJLLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUEzQyxFQUFvRCxVQUFVN0YsS0FBVixFQUFpQjtBQUNuRTJDLFVBQUFBLEtBQUssQ0FBQzhLLEtBQU4sQ0FBWXpOLEtBQVo7QUFDRCxTQUZELEVBRUdvSyxPQUZIO0FBR0Q7QUFDRixLQTNJUzs7QUE4SVY7Ozs7O0FBS0E4RSxJQUFBQSxnQkFBZ0IsRUFBRSxTQUFTQSxnQkFBVCxHQUE0QjtBQUM1Q3pFLE1BQUFBLE1BQU0sQ0FBQ0gsR0FBUCxDQUFXd0MsWUFBWSxDQUFDLENBQUQsQ0FBdkIsRUFBNEJySyxVQUFVLENBQUN1QixJQUFYLENBQWdCNkIsT0FBNUMsRUFBcUR1RSxPQUFyRDtBQUNBSyxNQUFBQSxNQUFNLENBQUNILEdBQVAsQ0FBV3dDLFlBQVksQ0FBQyxDQUFELENBQXZCLEVBQTRCckssVUFBVSxDQUFDdUIsSUFBWCxDQUFnQjZCLE9BQTVDLEVBQXFEdUUsT0FBckQ7QUFDRCxLQXRKUzs7QUF5SlY7Ozs7O0FBS0F5RCxJQUFBQSxhQUFhLEVBQUUsU0FBU0EsYUFBVCxHQUF5QjtBQUN0QyxVQUFJc0IsTUFBTSxHQUFHLElBQWI7O0FBRUExRSxNQUFBQSxNQUFNLENBQUMxSyxFQUFQLENBQVVnTixXQUFWLEVBQXVCdEssVUFBVSxDQUFDdUIsSUFBWCxDQUFnQjZCLE9BQXZDLEVBQWdEdE0sUUFBUSxDQUFDLFVBQVV5RyxLQUFWLEVBQWlCO0FBQ3hFbVAsUUFBQUEsTUFBTSxDQUFDN04sSUFBUCxDQUFZdEIsS0FBWjtBQUNELE9BRnVELEVBRXJEUyxLQUFLLENBQUNkLFFBQU4sQ0FBZXBHLFFBRnNDLENBQXhELEVBRTZCNlEsT0FGN0I7QUFHRCxLQXBLUzs7QUF1S1Y7Ozs7O0FBS0EyRSxJQUFBQSxlQUFlLEVBQUUsU0FBU0EsZUFBVCxHQUEyQjtBQUMxQ3RFLE1BQUFBLE1BQU0sQ0FBQ0gsR0FBUCxDQUFXeUMsV0FBWCxFQUF3QnRLLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUF4QyxFQUFpRHVFLE9BQWpEO0FBQ0QsS0E5S1M7O0FBaUxWOzs7OztBQUtBMEQsSUFBQUEsWUFBWSxFQUFFLFNBQVNBLFlBQVQsR0FBd0I7QUFDcEMsVUFBSXNCLE1BQU0sR0FBRyxJQUFiOztBQUVBM0UsTUFBQUEsTUFBTSxDQUFDMUssRUFBUCxDQUFVaU4sVUFBVixFQUFzQnZLLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUF0QyxFQUErQyxVQUFVN0YsS0FBVixFQUFpQjtBQUM5RG9QLFFBQUFBLE1BQU0sQ0FBQ1YsR0FBUCxDQUFXMU8sS0FBWDtBQUNELE9BRkQ7QUFHRCxLQTVMUzs7QUErTFY7Ozs7O0FBS0FnUCxJQUFBQSxjQUFjLEVBQUUsU0FBU0EsY0FBVCxHQUEwQjtBQUN4Q3ZFLE1BQUFBLE1BQU0sQ0FBQ0gsR0FBUCxDQUFXMEMsVUFBWCxFQUF1QnZLLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUF2QztBQUNELEtBdE1TOztBQXlNVjs7Ozs7QUFLQTZILElBQUFBLE9BQU8sRUFBRSxTQUFTQSxPQUFULENBQWlCMU4sS0FBakIsRUFBd0I7QUFDL0IsVUFBSWlOLFlBQVksQ0FBQzdCLE9BQWIsQ0FBcUJwTCxLQUFLLENBQUM1SCxJQUEzQixJQUFtQyxDQUFDLENBQXhDLEVBQTJDO0FBQ3pDLGVBQU80SCxLQUFQO0FBQ0Q7O0FBRUQsYUFBT0EsS0FBSyxDQUFDME4sT0FBTixDQUFjLENBQWQsS0FBb0IxTixLQUFLLENBQUNxUCxjQUFOLENBQXFCLENBQXJCLENBQTNCO0FBQ0QsS0FwTlM7O0FBdU5WOzs7OztBQUtBVCxJQUFBQSxTQUFTLEVBQUUsU0FBU0EsU0FBVCxDQUFtQjVPLEtBQW5CLEVBQTBCO0FBQ25DLFVBQUlMLFFBQVEsR0FBR2MsS0FBSyxDQUFDZCxRQUFyQjs7QUFFQSxVQUFJc04sWUFBWSxDQUFDN0IsT0FBYixDQUFxQnBMLEtBQUssQ0FBQzVILElBQTNCLElBQW1DLENBQUMsQ0FBeEMsRUFBMkM7QUFDekMsZUFBT3VILFFBQVEsQ0FBQzdHLGFBQWhCO0FBQ0Q7O0FBRUQsYUFBTzZHLFFBQVEsQ0FBQzlHLGNBQWhCO0FBQ0QsS0FwT1M7O0FBdU9WOzs7OztBQUtBa0osSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsR0FBa0I7QUFDeEJ6SCxNQUFBQSxRQUFRLEdBQUcsS0FBWDtBQUVBbUksTUFBQUEsVUFBVSxDQUFDakIsVUFBWCxDQUFzQk8sTUFBdEI7QUFFQSxhQUFPLElBQVA7QUFDRCxLQWxQUzs7QUFxUFY7Ozs7O0FBS0FOLElBQUFBLE9BQU8sRUFBRSxTQUFTQSxPQUFULEdBQW1CO0FBQzFCbkgsTUFBQUEsUUFBUSxHQUFHLElBQVg7QUFFQW1JLE1BQUFBLFVBQVUsQ0FBQ2pCLFVBQVgsQ0FBc0JDLE9BQXRCO0FBRUEsYUFBTyxJQUFQO0FBQ0Q7QUFoUVMsR0FBWjtBQW1RQTs7Ozs7QUFJQWlCLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxhQUFWLEVBQXlCLFlBQVk7QUFDbkMwQyxJQUFBQSxVQUFVLENBQUN1QixJQUFYLENBQWdCMkMsSUFBaEIsQ0FBcUJLLFNBQXJCLENBQStCd0IsR0FBL0IsQ0FBbUMvSCxLQUFLLENBQUNkLFFBQU4sQ0FBZWhHLE9BQWYsQ0FBdUJDLFNBQTFEO0FBQ0QsR0FGRDtBQUlBOzs7OztBQUlBOEksRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLFNBQVYsRUFBcUIsWUFBWTtBQUMvQndOLElBQUFBLEtBQUssQ0FBQzJCLGdCQUFOO0FBQ0EzQixJQUFBQSxLQUFLLENBQUN3QixlQUFOO0FBQ0F4QixJQUFBQSxLQUFLLENBQUN5QixjQUFOO0FBQ0F2RSxJQUFBQSxNQUFNLENBQUM5SSxPQUFQO0FBQ0QsR0FMRDtBQU9BLFNBQU80TCxLQUFQO0FBQ0Q7O0FBRUQsU0FBUytCLE1BQVQsQ0FBaUI3TyxLQUFqQixFQUF3QmdDLFVBQXhCLEVBQW9DQyxNQUFwQyxFQUE0QztBQUMxQzs7Ozs7QUFLQSxNQUFJK0gsTUFBTSxHQUFHLElBQUlULFlBQUosRUFBYjtBQUVBLE1BQUl1RixNQUFNLEdBQUc7QUFDWDs7Ozs7QUFLQTdRLElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULEdBQWlCO0FBQ3RCLFdBQUtnTSxJQUFMO0FBQ0QsS0FSVTs7QUFXWDs7Ozs7QUFLQUEsSUFBQUEsSUFBSSxFQUFFLFNBQVNBLElBQVQsR0FBZ0I7QUFDcEJELE1BQUFBLE1BQU0sQ0FBQzFLLEVBQVAsQ0FBVSxXQUFWLEVBQXVCMEMsVUFBVSxDQUFDdUIsSUFBWCxDQUFnQjZCLE9BQXZDLEVBQWdELEtBQUsySixTQUFyRDtBQUNELEtBbEJVOztBQXFCWDs7Ozs7QUFLQTdFLElBQUFBLE1BQU0sRUFBRSxTQUFTQSxNQUFULEdBQWtCO0FBQ3hCRixNQUFBQSxNQUFNLENBQUNILEdBQVAsQ0FBVyxXQUFYLEVBQXdCN0gsVUFBVSxDQUFDdUIsSUFBWCxDQUFnQjZCLE9BQXhDO0FBQ0QsS0E1QlU7O0FBK0JYOzs7OztBQUtBMkosSUFBQUEsU0FBUyxFQUFFLFNBQVNBLFNBQVQsQ0FBbUJ4UCxLQUFuQixFQUEwQjtBQUNuQ0EsTUFBQUEsS0FBSyxDQUFDeVAsY0FBTjtBQUNEO0FBdENVLEdBQWI7QUF5Q0E7Ozs7O0FBSUEvTSxFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsU0FBVixFQUFxQixZQUFZO0FBQy9Cd1AsSUFBQUEsTUFBTSxDQUFDNUUsTUFBUDtBQUNBRixJQUFBQSxNQUFNLENBQUM5SSxPQUFQO0FBQ0QsR0FIRDtBQUtBLFNBQU80TixNQUFQO0FBQ0Q7O0FBRUQsU0FBU0csT0FBVCxDQUFrQmpQLEtBQWxCLEVBQXlCZ0MsVUFBekIsRUFBcUNDLE1BQXJDLEVBQTZDO0FBQzNDOzs7OztBQUtBLE1BQUkrSCxNQUFNLEdBQUcsSUFBSVQsWUFBSixFQUFiO0FBRUE7Ozs7Ozs7O0FBT0EsTUFBSTJGLFFBQVEsR0FBRyxLQUFmO0FBRUE7Ozs7Ozs7O0FBT0EsTUFBSUMsU0FBUyxHQUFHLEtBQWhCO0FBRUEsTUFBSUMsT0FBTyxHQUFHO0FBQ1o7Ozs7O0FBS0FuUixJQUFBQSxLQUFLLEVBQUUsU0FBU0EsS0FBVCxHQUFpQjtBQUN0Qjs7Ozs7O0FBTUEsV0FBS29SLEVBQUwsR0FBVXJOLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUFoQixDQUF3QmtLLGdCQUF4QixDQUF5QyxHQUF6QyxDQUFWO0FBRUEsV0FBS3JGLElBQUw7QUFDRCxLQWhCVzs7QUFtQlo7Ozs7O0FBS0FBLElBQUFBLElBQUksRUFBRSxTQUFTQSxJQUFULEdBQWdCO0FBQ3BCRCxNQUFBQSxNQUFNLENBQUMxSyxFQUFQLENBQVUsT0FBVixFQUFtQjBDLFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUFuQyxFQUE0QyxLQUFLbUssS0FBakQ7QUFDRCxLQTFCVzs7QUE2Qlo7Ozs7O0FBS0FyRixJQUFBQSxNQUFNLEVBQUUsU0FBU0EsTUFBVCxHQUFrQjtBQUN4QkYsTUFBQUEsTUFBTSxDQUFDSCxHQUFQLENBQVcsT0FBWCxFQUFvQjdILFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0I2QixPQUFwQztBQUNELEtBcENXOztBQXVDWjs7Ozs7O0FBTUFtSyxJQUFBQSxLQUFLLEVBQUUsU0FBU0EsS0FBVCxDQUFlaFEsS0FBZixFQUFzQjtBQUMzQixVQUFJNFAsU0FBSixFQUFlO0FBQ2I1UCxRQUFBQSxLQUFLLENBQUN5TyxlQUFOO0FBQ0F6TyxRQUFBQSxLQUFLLENBQUN5UCxjQUFOO0FBQ0Q7QUFDRixLQWxEVzs7QUFxRFo7Ozs7O0FBS0FRLElBQUFBLE1BQU0sRUFBRSxTQUFTQSxNQUFULEdBQWtCO0FBQ3hCTCxNQUFBQSxTQUFTLEdBQUcsSUFBWjs7QUFFQSxVQUFJLENBQUNELFFBQUwsRUFBZTtBQUNiLGFBQUssSUFBSWpVLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcsS0FBS2tOLEtBQUwsQ0FBV2pOLE1BQS9CLEVBQXVDRCxDQUFDLEVBQXhDLEVBQTRDO0FBQzFDLGVBQUtrTixLQUFMLENBQVdsTixDQUFYLEVBQWN3VSxTQUFkLEdBQTBCLEtBQTFCO0FBRUEsZUFBS3RILEtBQUwsQ0FBV2xOLENBQVgsRUFBY3lVLFlBQWQsQ0FBMkIsV0FBM0IsRUFBd0MsS0FBS3ZILEtBQUwsQ0FBV2xOLENBQVgsRUFBYzBVLFlBQWQsQ0FBMkIsTUFBM0IsQ0FBeEM7QUFFQSxlQUFLeEgsS0FBTCxDQUFXbE4sQ0FBWCxFQUFjMlUsZUFBZCxDQUE4QixNQUE5QjtBQUNEOztBQUVEVixRQUFBQSxRQUFRLEdBQUcsSUFBWDtBQUNEOztBQUVELGFBQU8sSUFBUDtBQUNELEtBMUVXOztBQTZFWjs7Ozs7QUFLQVcsSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsR0FBa0I7QUFDeEJWLE1BQUFBLFNBQVMsR0FBRyxLQUFaOztBQUVBLFVBQUlELFFBQUosRUFBYztBQUNaLGFBQUssSUFBSWpVLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcsS0FBS2tOLEtBQUwsQ0FBV2pOLE1BQS9CLEVBQXVDRCxDQUFDLEVBQXhDLEVBQTRDO0FBQzFDLGVBQUtrTixLQUFMLENBQVdsTixDQUFYLEVBQWN3VSxTQUFkLEdBQTBCLElBQTFCO0FBRUEsZUFBS3RILEtBQUwsQ0FBV2xOLENBQVgsRUFBY3lVLFlBQWQsQ0FBMkIsTUFBM0IsRUFBbUMsS0FBS3ZILEtBQUwsQ0FBV2xOLENBQVgsRUFBYzBVLFlBQWQsQ0FBMkIsV0FBM0IsQ0FBbkM7QUFDRDs7QUFFRFQsUUFBQUEsUUFBUSxHQUFHLEtBQVg7QUFDRDs7QUFFRCxhQUFPLElBQVA7QUFDRDtBQWhHVyxHQUFkO0FBbUdBMVEsRUFBQUEsTUFBTSxDQUFDNFEsT0FBRCxFQUFVLE9BQVYsRUFBbUI7QUFDdkI7Ozs7O0FBS0FsVCxJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxHQUFlO0FBQ2xCLGFBQU9rVCxPQUFPLENBQUNDLEVBQWY7QUFDRDtBQVJzQixHQUFuQixDQUFOO0FBV0E7Ozs7O0FBSUFwTixFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsWUFBVixFQUF3QixZQUFZO0FBQ2xDOFAsSUFBQUEsT0FBTyxDQUFDSSxNQUFSO0FBQ0QsR0FGRDtBQUlBOzs7OztBQUlBdk4sRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLFdBQVYsRUFBdUIsWUFBWTtBQUNqQzBDLElBQUFBLFVBQVUsQ0FBQ2pCLFVBQVgsQ0FBc0JxQixLQUF0QixDQUE0QixZQUFZO0FBQ3RDZ04sTUFBQUEsT0FBTyxDQUFDUyxNQUFSO0FBQ0QsS0FGRDtBQUdELEdBSkQ7QUFNQTs7Ozs7QUFJQTVOLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxTQUFWLEVBQXFCLFlBQVk7QUFDL0I4UCxJQUFBQSxPQUFPLENBQUNTLE1BQVI7QUFDQVQsSUFBQUEsT0FBTyxDQUFDbEYsTUFBUjtBQUNBRixJQUFBQSxNQUFNLENBQUM5SSxPQUFQO0FBQ0QsR0FKRDtBQU1BLFNBQU9rTyxPQUFQO0FBQ0Q7O0FBRUQsSUFBSVUsWUFBWSxHQUFHLGlDQUFuQjtBQUNBLElBQUlDLGlCQUFpQixHQUFHLDZCQUF4Qjs7QUFFQSxTQUFTQyxRQUFULENBQW1CaFEsS0FBbkIsRUFBMEJnQyxVQUExQixFQUFzQ0MsTUFBdEMsRUFBOEM7QUFDNUM7Ozs7O0FBS0EsTUFBSStILE1BQU0sR0FBRyxJQUFJVCxZQUFKLEVBQWI7QUFFQSxNQUFJSSxPQUFPLEdBQUd5QyxpQkFBaUIsR0FBRztBQUFFUyxJQUFBQSxPQUFPLEVBQUU7QUFBWCxHQUFILEdBQXVCLEtBQXREO0FBRUEsTUFBSW9ELFFBQVEsR0FBRztBQUNiOzs7Ozs7QUFNQWhTLElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULEdBQWlCO0FBQ3RCOzs7Ozs7QUFNQSxXQUFLaVMsRUFBTCxHQUFVbE8sVUFBVSxDQUFDdUIsSUFBWCxDQUFnQjJDLElBQWhCLENBQXFCb0osZ0JBQXJCLENBQXNDUSxZQUF0QyxDQUFWO0FBRUE7Ozs7Ozs7QUFNQSxXQUFLNVAsRUFBTCxHQUFVOEIsVUFBVSxDQUFDdUIsSUFBWCxDQUFnQjJDLElBQWhCLENBQXFCb0osZ0JBQXJCLENBQXNDUyxpQkFBdEMsQ0FBVjtBQUVBLFdBQUtJLFdBQUw7QUFDRCxLQXpCWTs7QUE0QmI7Ozs7O0FBS0FDLElBQUFBLFNBQVMsRUFBRSxTQUFTQSxTQUFULEdBQXFCO0FBQzlCLFdBQUssSUFBSW5WLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcsS0FBS2lWLEVBQUwsQ0FBUWhWLE1BQTVCLEVBQW9DRCxDQUFDLEVBQXJDLEVBQXlDO0FBQ3ZDLGFBQUt3UCxRQUFMLENBQWMsS0FBS3lGLEVBQUwsQ0FBUWpWLENBQVIsRUFBV29LLFFBQXpCO0FBQ0Q7QUFDRixLQXJDWTs7QUF3Q2I7Ozs7O0FBS0FnTCxJQUFBQSxZQUFZLEVBQUUsU0FBU0EsWUFBVCxHQUF3QjtBQUNwQyxXQUFLLElBQUlwVixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHLEtBQUtpVixFQUFMLENBQVFoVixNQUE1QixFQUFvQ0QsQ0FBQyxFQUFyQyxFQUF5QztBQUN2QyxhQUFLeVAsV0FBTCxDQUFpQixLQUFLd0YsRUFBTCxDQUFRalYsQ0FBUixFQUFXb0ssUUFBNUI7QUFDRDtBQUNGLEtBakRZOztBQW9EYjs7Ozs7O0FBTUFvRixJQUFBQSxRQUFRLEVBQUUsU0FBU0EsUUFBVCxDQUFrQnVGLFFBQWxCLEVBQTRCO0FBQ3BDLFVBQUk5USxRQUFRLEdBQUdjLEtBQUssQ0FBQ2QsUUFBckI7QUFDQSxVQUFJYSxJQUFJLEdBQUdpUSxRQUFRLENBQUNoUSxLQUFLLENBQUNQLEtBQVAsQ0FBbkI7O0FBRUEsVUFBSU0sSUFBSixFQUFVO0FBQ1JBLFFBQUFBLElBQUksQ0FBQ3dHLFNBQUwsQ0FBZXdCLEdBQWYsQ0FBbUI3SSxRQUFRLENBQUNoRyxPQUFULENBQWlCWSxHQUFqQixDQUFxQkgsTUFBeEM7QUFFQTJMLFFBQUFBLFFBQVEsQ0FBQ3ZGLElBQUQsQ0FBUixDQUFlRCxPQUFmLENBQXVCLFVBQVVrSSxPQUFWLEVBQW1CO0FBQ3hDQSxVQUFBQSxPQUFPLENBQUN6QixTQUFSLENBQWtCNUcsTUFBbEIsQ0FBeUJULFFBQVEsQ0FBQ2hHLE9BQVQsQ0FBaUJZLEdBQWpCLENBQXFCSCxNQUE5QztBQUNELFNBRkQ7QUFHRDtBQUNGLEtBckVZOztBQXdFYjs7Ozs7O0FBTUErUSxJQUFBQSxXQUFXLEVBQUUsU0FBU0EsV0FBVCxDQUFxQnNGLFFBQXJCLEVBQStCO0FBQzFDLFVBQUlqUSxJQUFJLEdBQUdpUSxRQUFRLENBQUNoUSxLQUFLLENBQUNQLEtBQVAsQ0FBbkI7O0FBRUEsVUFBSU0sSUFBSixFQUFVO0FBQ1JBLFFBQUFBLElBQUksQ0FBQ3dHLFNBQUwsQ0FBZTVHLE1BQWYsQ0FBc0JLLEtBQUssQ0FBQ2QsUUFBTixDQUFlaEcsT0FBZixDQUF1QlksR0FBdkIsQ0FBMkJILE1BQWpEO0FBQ0Q7QUFDRixLQXBGWTs7QUF1RmI7Ozs7O0FBS0F3VyxJQUFBQSxXQUFXLEVBQUUsU0FBU0EsV0FBVCxHQUF1QjtBQUNsQyxXQUFLLElBQUlsVixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHLEtBQUtpRixFQUFMLENBQVFoRixNQUE1QixFQUFvQ0QsQ0FBQyxFQUFyQyxFQUF5QztBQUN2QyxhQUFLZ1AsSUFBTCxDQUFVLEtBQUsvSixFQUFMLENBQVFqRixDQUFSLEVBQVdvSyxRQUFyQjtBQUNEO0FBQ0YsS0FoR1k7O0FBbUdiOzs7OztBQUtBaUwsSUFBQUEsY0FBYyxFQUFFLFNBQVNBLGNBQVQsR0FBMEI7QUFDeEMsV0FBSyxJQUFJclYsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBRyxLQUFLaUYsRUFBTCxDQUFRaEYsTUFBNUIsRUFBb0NELENBQUMsRUFBckMsRUFBeUM7QUFDdkMsYUFBS2lQLE1BQUwsQ0FBWSxLQUFLaEssRUFBTCxDQUFRakYsQ0FBUixFQUFXb0ssUUFBdkI7QUFDRDtBQUNGLEtBNUdZOztBQStHYjs7Ozs7O0FBTUE0RSxJQUFBQSxJQUFJLEVBQUUsU0FBU0EsSUFBVCxDQUFjc0csUUFBZCxFQUF3QjtBQUM1QixXQUFLLElBQUl0VixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHc1YsUUFBUSxDQUFDclYsTUFBN0IsRUFBcUNELENBQUMsRUFBdEMsRUFBMEM7QUFDeEMrTyxRQUFBQSxNQUFNLENBQUMxSyxFQUFQLENBQVUsT0FBVixFQUFtQmlSLFFBQVEsQ0FBQ3RWLENBQUQsQ0FBM0IsRUFBZ0MsS0FBS3NVLEtBQXJDO0FBQ0F2RixRQUFBQSxNQUFNLENBQUMxSyxFQUFQLENBQVUsWUFBVixFQUF3QmlSLFFBQVEsQ0FBQ3RWLENBQUQsQ0FBaEMsRUFBcUMsS0FBS3NVLEtBQTFDLEVBQWlENUYsT0FBakQ7QUFDRDtBQUNGLEtBMUhZOztBQTZIYjs7Ozs7O0FBTUFPLElBQUFBLE1BQU0sRUFBRSxTQUFTQSxNQUFULENBQWdCcUcsUUFBaEIsRUFBMEI7QUFDaEMsV0FBSyxJQUFJdFYsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR3NWLFFBQVEsQ0FBQ3JWLE1BQTdCLEVBQXFDRCxDQUFDLEVBQXRDLEVBQTBDO0FBQ3hDK08sUUFBQUEsTUFBTSxDQUFDSCxHQUFQLENBQVcsQ0FBQyxPQUFELEVBQVUsWUFBVixDQUFYLEVBQW9DMEcsUUFBUSxDQUFDdFYsQ0FBRCxDQUE1QztBQUNEO0FBQ0YsS0F2SVk7O0FBMEliOzs7Ozs7OztBQVFBc1UsSUFBQUEsS0FBSyxFQUFFLFNBQVNBLEtBQVQsQ0FBZWhRLEtBQWYsRUFBc0I7QUFDM0JBLE1BQUFBLEtBQUssQ0FBQ3lQLGNBQU47QUFFQWhOLE1BQUFBLFVBQVUsQ0FBQ3JCLEdBQVgsQ0FBZUMsSUFBZixDQUFvQm9CLFVBQVUsQ0FBQ2dELFNBQVgsQ0FBcUJxRixPQUFyQixDQUE2QjlLLEtBQUssQ0FBQ2lSLGFBQU4sQ0FBb0JiLFlBQXBCLENBQWlDLGdCQUFqQyxDQUE3QixDQUFwQjtBQUNEO0FBdEpZLEdBQWY7QUF5SkFuUixFQUFBQSxNQUFNLENBQUN5UixRQUFELEVBQVcsT0FBWCxFQUFvQjtBQUN4Qjs7Ozs7QUFLQS9ULElBQUFBLEdBQUcsRUFBRSxTQUFTQSxHQUFULEdBQWU7QUFDbEIsYUFBTytULFFBQVEsQ0FBQy9QLEVBQWhCO0FBQ0Q7QUFSdUIsR0FBcEIsQ0FBTjtBQVdBOzs7Ozs7QUFLQStCLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxDQUFDLGFBQUQsRUFBZ0IsWUFBaEIsQ0FBVixFQUF5QyxZQUFZO0FBQ25EMlEsSUFBQUEsUUFBUSxDQUFDRyxTQUFUO0FBQ0QsR0FGRDtBQUlBOzs7OztBQUlBbk8sRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLFNBQVYsRUFBcUIsWUFBWTtBQUMvQjJRLElBQUFBLFFBQVEsQ0FBQ0ssY0FBVDtBQUNBTCxJQUFBQSxRQUFRLENBQUNJLFlBQVQ7QUFDQXJHLElBQUFBLE1BQU0sQ0FBQzlJLE9BQVA7QUFDRCxHQUpEO0FBTUEsU0FBTytPLFFBQVA7QUFDRDs7QUFFRCxTQUFTL1gsUUFBVCxDQUFtQjhILEtBQW5CLEVBQTBCZ0MsVUFBMUIsRUFBc0NDLE1BQXRDLEVBQThDO0FBQzVDOzs7OztBQUtBLE1BQUkrSCxNQUFNLEdBQUcsSUFBSVQsWUFBSixFQUFiO0FBRUEsTUFBSWtILFFBQVEsR0FBRztBQUNiOzs7OztBQUtBeFMsSUFBQUEsS0FBSyxFQUFFLFNBQVNBLEtBQVQsR0FBaUI7QUFDdEIsVUFBSStCLEtBQUssQ0FBQ2QsUUFBTixDQUFlaEgsUUFBbkIsRUFBNkI7QUFDM0IsYUFBSytSLElBQUw7QUFDRDtBQUNGLEtBVlk7O0FBYWI7Ozs7O0FBS0FBLElBQUFBLElBQUksRUFBRSxTQUFTQSxJQUFULEdBQWdCO0FBQ3BCRCxNQUFBQSxNQUFNLENBQUMxSyxFQUFQLENBQVUsT0FBVixFQUFtQm9ILFFBQW5CLEVBQTZCLEtBQUtnSyxLQUFsQztBQUNELEtBcEJZOztBQXVCYjs7Ozs7QUFLQXhHLElBQUFBLE1BQU0sRUFBRSxTQUFTQSxNQUFULEdBQWtCO0FBQ3hCRixNQUFBQSxNQUFNLENBQUNILEdBQVAsQ0FBVyxPQUFYLEVBQW9CbkQsUUFBcEI7QUFDRCxLQTlCWTs7QUFpQ2I7Ozs7OztBQU1BZ0ssSUFBQUEsS0FBSyxFQUFFLFNBQVNBLEtBQVQsQ0FBZW5SLEtBQWYsRUFBc0I7QUFDM0IsVUFBSUEsS0FBSyxDQUFDb1IsT0FBTixLQUFrQixFQUF0QixFQUEwQjtBQUN4QjNPLFFBQUFBLFVBQVUsQ0FBQ3JCLEdBQVgsQ0FBZUMsSUFBZixDQUFvQm9CLFVBQVUsQ0FBQ2dELFNBQVgsQ0FBcUJxRixPQUFyQixDQUE2QixHQUE3QixDQUFwQjtBQUNEOztBQUVELFVBQUk5SyxLQUFLLENBQUNvUixPQUFOLEtBQWtCLEVBQXRCLEVBQTBCO0FBQ3hCM08sUUFBQUEsVUFBVSxDQUFDckIsR0FBWCxDQUFlQyxJQUFmLENBQW9Cb0IsVUFBVSxDQUFDZ0QsU0FBWCxDQUFxQnFGLE9BQXJCLENBQTZCLEdBQTdCLENBQXBCO0FBQ0Q7QUFDRjtBQS9DWSxHQUFmO0FBa0RBOzs7Ozs7QUFLQXBJLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxDQUFDLFNBQUQsRUFBWSxRQUFaLENBQVYsRUFBaUMsWUFBWTtBQUMzQ21SLElBQUFBLFFBQVEsQ0FBQ3ZHLE1BQVQ7QUFDRCxHQUZEO0FBSUE7Ozs7O0FBSUFqSSxFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsUUFBVixFQUFvQixZQUFZO0FBQzlCbVIsSUFBQUEsUUFBUSxDQUFDeFMsS0FBVDtBQUNELEdBRkQ7QUFJQTs7Ozs7QUFJQWdFLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxTQUFWLEVBQXFCLFlBQVk7QUFDL0IwSyxJQUFBQSxNQUFNLENBQUM5SSxPQUFQO0FBQ0QsR0FGRDtBQUlBLFNBQU91UCxRQUFQO0FBQ0Q7O0FBRUQsU0FBU3pZLFFBQVQsQ0FBbUJnSSxLQUFuQixFQUEwQmdDLFVBQTFCLEVBQXNDQyxNQUF0QyxFQUE4QztBQUM1Qzs7Ozs7QUFLQSxNQUFJK0gsTUFBTSxHQUFHLElBQUlULFlBQUosRUFBYjtBQUVBLE1BQUlxSCxRQUFRLEdBQUc7QUFDYjs7Ozs7QUFLQTNTLElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULEdBQWlCO0FBQ3RCLFdBQUsrTyxLQUFMOztBQUVBLFVBQUloTixLQUFLLENBQUNkLFFBQU4sQ0FBZWpILFVBQW5CLEVBQStCO0FBQzdCLGFBQUtnUyxJQUFMO0FBQ0Q7QUFDRixLQVpZOztBQWViOzs7Ozs7QUFNQStDLElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULEdBQWlCO0FBQ3RCLFVBQUk5SyxLQUFLLEdBQUcsSUFBWjs7QUFFQSxVQUFJbEMsS0FBSyxDQUFDZCxRQUFOLENBQWVsSCxRQUFuQixFQUE2QjtBQUMzQixZQUFJOEYsV0FBVyxDQUFDLEtBQUsrRCxFQUFOLENBQWYsRUFBMEI7QUFDeEIsZUFBS0EsRUFBTCxHQUFVZ1AsV0FBVyxDQUFDLFlBQVk7QUFDaEMzTyxZQUFBQSxLQUFLLENBQUM0TyxJQUFOOztBQUVBOU8sWUFBQUEsVUFBVSxDQUFDckIsR0FBWCxDQUFlQyxJQUFmLENBQW9CLEdBQXBCOztBQUVBc0IsWUFBQUEsS0FBSyxDQUFDOEssS0FBTjtBQUNELFdBTm9CLEVBTWxCLEtBQUsrRCxJQU5hLENBQXJCO0FBT0Q7QUFDRjtBQUNGLEtBbkNZOztBQXNDYjs7Ozs7QUFLQUQsSUFBQUEsSUFBSSxFQUFFLFNBQVNBLElBQVQsR0FBZ0I7QUFDcEIsV0FBS2pQLEVBQUwsR0FBVW1QLGFBQWEsQ0FBQyxLQUFLblAsRUFBTixDQUF2QjtBQUNELEtBN0NZOztBQWdEYjs7Ozs7QUFLQW9JLElBQUFBLElBQUksRUFBRSxTQUFTQSxJQUFULEdBQWdCO0FBQ3BCLFVBQUl5RSxNQUFNLEdBQUcsSUFBYjs7QUFFQTFFLE1BQUFBLE1BQU0sQ0FBQzFLLEVBQVAsQ0FBVSxXQUFWLEVBQXVCMEMsVUFBVSxDQUFDdUIsSUFBWCxDQUFnQjJDLElBQXZDLEVBQTZDLFlBQVk7QUFDdkR3SSxRQUFBQSxNQUFNLENBQUNvQyxJQUFQO0FBQ0QsT0FGRDtBQUlBOUcsTUFBQUEsTUFBTSxDQUFDMUssRUFBUCxDQUFVLFVBQVYsRUFBc0IwQyxVQUFVLENBQUN1QixJQUFYLENBQWdCMkMsSUFBdEMsRUFBNEMsWUFBWTtBQUN0RHdJLFFBQUFBLE1BQU0sQ0FBQzFCLEtBQVA7QUFDRCxPQUZEO0FBR0QsS0EvRFk7O0FBa0ViOzs7OztBQUtBOUMsSUFBQUEsTUFBTSxFQUFFLFNBQVNBLE1BQVQsR0FBa0I7QUFDeEJGLE1BQUFBLE1BQU0sQ0FBQ0gsR0FBUCxDQUFXLENBQUMsV0FBRCxFQUFjLFVBQWQsQ0FBWCxFQUFzQzdILFVBQVUsQ0FBQ3VCLElBQVgsQ0FBZ0IyQyxJQUF0RDtBQUNEO0FBekVZLEdBQWY7QUE0RUExSCxFQUFBQSxNQUFNLENBQUNvUyxRQUFELEVBQVcsTUFBWCxFQUFtQjtBQUN2Qjs7Ozs7O0FBTUExVSxJQUFBQSxHQUFHLEVBQUUsU0FBU0EsR0FBVCxHQUFlO0FBQ2xCLFVBQUlsRSxRQUFRLEdBQUdnSyxVQUFVLENBQUN1QixJQUFYLENBQWdCQyxNQUFoQixDQUF1QnhELEtBQUssQ0FBQ1AsS0FBN0IsRUFBb0NrUSxZQUFwQyxDQUFpRCxxQkFBakQsQ0FBZjs7QUFFQSxVQUFJM1gsUUFBSixFQUFjO0FBQ1osZUFBT3VGLEtBQUssQ0FBQ3ZGLFFBQUQsQ0FBWjtBQUNEOztBQUVELGFBQU91RixLQUFLLENBQUN5QyxLQUFLLENBQUNkLFFBQU4sQ0FBZWxILFFBQWhCLENBQVo7QUFDRDtBQWZzQixHQUFuQixDQUFOO0FBa0JBOzs7Ozs7QUFLQWlLLEVBQUFBLE1BQU0sQ0FBQzNDLEVBQVAsQ0FBVSxDQUFDLFNBQUQsRUFBWSxRQUFaLENBQVYsRUFBaUMsWUFBWTtBQUMzQ3NSLElBQUFBLFFBQVEsQ0FBQzFHLE1BQVQ7QUFDRCxHQUZEO0FBSUE7Ozs7Ozs7OztBQVFBakksRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLENBQUMsWUFBRCxFQUFlLE9BQWYsRUFBd0IsU0FBeEIsRUFBbUMsYUFBbkMsRUFBa0QsUUFBbEQsQ0FBVixFQUF1RSxZQUFZO0FBQ2pGc1IsSUFBQUEsUUFBUSxDQUFDRSxJQUFUO0FBQ0QsR0FGRDtBQUlBOzs7Ozs7O0FBTUE3TyxFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsQ0FBQyxXQUFELEVBQWMsTUFBZCxFQUFzQixXQUF0QixDQUFWLEVBQThDLFlBQVk7QUFDeERzUixJQUFBQSxRQUFRLENBQUM1RCxLQUFUO0FBQ0QsR0FGRDtBQUlBOzs7OztBQUlBL0ssRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLFFBQVYsRUFBb0IsWUFBWTtBQUM5QnNSLElBQUFBLFFBQVEsQ0FBQzNTLEtBQVQ7QUFDRCxHQUZEO0FBSUE7Ozs7O0FBSUFnRSxFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsU0FBVixFQUFxQixZQUFZO0FBQy9CMEssSUFBQUEsTUFBTSxDQUFDOUksT0FBUDtBQUNELEdBRkQ7QUFJQSxTQUFPMFAsUUFBUDtBQUNEO0FBRUQ7Ozs7Ozs7O0FBTUEsU0FBU0ssZUFBVCxDQUF5QkMsTUFBekIsRUFBaUM7QUFDL0IsTUFBSXRULFFBQVEsQ0FBQ3NULE1BQUQsQ0FBWixFQUFzQjtBQUNwQixXQUFPdlMsUUFBUSxDQUFDdVMsTUFBRCxDQUFmO0FBQ0QsR0FGRCxNQUVPO0FBQ0xuWCxJQUFBQSxJQUFJLENBQUMsc0NBQUQsQ0FBSjtBQUNEOztBQUVELFNBQU8sRUFBUDtBQUNEOztBQUVELFNBQVNkLFdBQVQsQ0FBc0IrRyxLQUF0QixFQUE2QmdDLFVBQTdCLEVBQXlDQyxNQUF6QyxFQUFpRDtBQUMvQzs7Ozs7QUFLQSxNQUFJK0gsTUFBTSxHQUFHLElBQUlULFlBQUosRUFBYjtBQUVBOzs7Ozs7QUFLQSxNQUFJckssUUFBUSxHQUFHYyxLQUFLLENBQUNkLFFBQXJCO0FBRUE7Ozs7Ozs7O0FBT0EsTUFBSWdTLE1BQU0sR0FBR0QsZUFBZSxDQUFDL1IsUUFBUSxDQUFDakcsV0FBVixDQUE1QjtBQUVBOzs7Ozs7QUFLQSxNQUFJdkIsUUFBUSxHQUFHa0UsUUFBUSxDQUFDLEVBQUQsRUFBS3NELFFBQUwsQ0FBdkI7O0FBRUEsTUFBSWlTLFdBQVcsR0FBRztBQUNoQjs7Ozs7O0FBTUFDLElBQUFBLEtBQUssRUFBRSxTQUFTQSxLQUFULENBQWVGLE1BQWYsRUFBdUI7QUFDNUIsVUFBSSxPQUFPbkwsTUFBTSxDQUFDc0wsVUFBZCxLQUE2QixXQUFqQyxFQUE4QztBQUM1QyxhQUFLLElBQUlDLEtBQVQsSUFBa0JKLE1BQWxCLEVBQTBCO0FBQ3hCLGNBQUlBLE1BQU0sQ0FBQ2xWLGNBQVAsQ0FBc0JzVixLQUF0QixDQUFKLEVBQWtDO0FBQ2hDLGdCQUFJdkwsTUFBTSxDQUFDc0wsVUFBUCxDQUFrQixpQkFBaUJDLEtBQWpCLEdBQXlCLEtBQTNDLEVBQWtEQyxPQUF0RCxFQUErRDtBQUM3RCxxQkFBT0wsTUFBTSxDQUFDSSxLQUFELENBQWI7QUFDRDtBQUNGO0FBQ0Y7QUFDRjs7QUFFRCxhQUFPNVosUUFBUDtBQUNEO0FBbkJlLEdBQWxCO0FBc0JBOzs7OztBQUlBa0UsRUFBQUEsUUFBUSxDQUFDc0QsUUFBRCxFQUFXaVMsV0FBVyxDQUFDQyxLQUFaLENBQWtCRixNQUFsQixDQUFYLENBQVI7QUFFQTs7Ozs7O0FBSUFsSCxFQUFBQSxNQUFNLENBQUMxSyxFQUFQLENBQVUsUUFBVixFQUFvQnlHLE1BQXBCLEVBQTRCak4sUUFBUSxDQUFDLFlBQVk7QUFDL0NrSCxJQUFBQSxLQUFLLENBQUNkLFFBQU4sR0FBaUJELFlBQVksQ0FBQ0MsUUFBRCxFQUFXaVMsV0FBVyxDQUFDQyxLQUFaLENBQWtCRixNQUFsQixDQUFYLENBQTdCO0FBQ0QsR0FGbUMsRUFFakNsUixLQUFLLENBQUNkLFFBQU4sQ0FBZXBHLFFBRmtCLENBQXBDO0FBSUE7Ozs7O0FBSUFtSixFQUFBQSxNQUFNLENBQUMzQyxFQUFQLENBQVUsUUFBVixFQUFvQixZQUFZO0FBQzlCNFIsSUFBQUEsTUFBTSxHQUFHRCxlQUFlLENBQUNDLE1BQUQsQ0FBeEI7QUFFQXhaLElBQUFBLFFBQVEsR0FBR2tFLFFBQVEsQ0FBQyxFQUFELEVBQUtzRCxRQUFMLENBQW5CO0FBQ0QsR0FKRDtBQU1BOzs7OztBQUlBK0MsRUFBQUEsTUFBTSxDQUFDM0MsRUFBUCxDQUFVLFNBQVYsRUFBcUIsWUFBWTtBQUMvQjBLLElBQUFBLE1BQU0sQ0FBQ0gsR0FBUCxDQUFXLFFBQVgsRUFBcUI5RCxNQUFyQjtBQUNELEdBRkQ7QUFJQSxTQUFPb0wsV0FBUDtBQUNEOztBQUVELElBQUlLLFVBQVUsR0FBRztBQUNmak8sRUFBQUEsSUFBSSxFQUFFQSxJQURTO0FBRWZnSSxFQUFBQSxTQUFTLEVBQUVBLFNBRkk7QUFHZnhLLEVBQUFBLFVBQVUsRUFBRUEsVUFIRztBQUlmaUUsRUFBQUEsU0FBUyxFQUFFQSxTQUpJO0FBS2Y0QixFQUFBQSxJQUFJLEVBQUVBLElBTFM7QUFNZnpCLEVBQUFBLEtBQUssRUFBRUEsS0FOUTtBQU9mTixFQUFBQSxJQUFJLEVBQUVBLElBUFM7QUFRZjVELEVBQUFBLElBQUksRUFBRUEsSUFSUztBQVNmeUcsRUFBQUEsTUFBTSxFQUFFQSxNQVRPO0FBVWZxQyxFQUFBQSxNQUFNLEVBQUVBLE1BVk87QUFXZm5DLEVBQUFBLEtBQUssRUFBRUEsS0FYUTtBQVlmakgsRUFBQUEsR0FBRyxFQUFFQTtBQVpVLENBQWpCOztBQWVBLElBQUk4USxPQUFPLEdBQUcsVUFBVUMsS0FBVixFQUFpQjtBQUM3QjVVLEVBQUFBLFFBQVEsQ0FBQzZVLFFBQUQsRUFBV0QsS0FBWCxDQUFSOztBQUVBLFdBQVNDLFFBQVQsR0FBb0I7QUFDbEJsWCxJQUFBQSxjQUFjLENBQUMsSUFBRCxFQUFPa1gsUUFBUCxDQUFkO0FBQ0EsV0FBT3ZVLHlCQUF5QixDQUFDLElBQUQsRUFBTyxDQUFDdVUsUUFBUSxDQUFDeFUsU0FBVCxJQUFzQjVCLE1BQU0sQ0FBQ29CLGNBQVAsQ0FBc0JnVixRQUF0QixDQUF2QixFQUF3RHZOLEtBQXhELENBQThELElBQTlELEVBQW9FdEksU0FBcEUsQ0FBUCxDQUFoQztBQUNEOztBQUVEakIsRUFBQUEsV0FBVyxDQUFDOFcsUUFBRCxFQUFXLENBQUM7QUFDckJsVyxJQUFBQSxHQUFHLEVBQUUsT0FEZ0I7QUFFckJtQixJQUFBQSxLQUFLLEVBQUUsU0FBU3FCLEtBQVQsR0FBaUI7QUFDdEIsVUFBSUUsVUFBVSxHQUFHckMsU0FBUyxDQUFDWixNQUFWLEdBQW1CLENBQW5CLElBQXdCWSxTQUFTLENBQUMsQ0FBRCxDQUFULEtBQWlCVyxTQUF6QyxHQUFxRFgsU0FBUyxDQUFDLENBQUQsQ0FBOUQsR0FBb0UsRUFBckY7QUFFQSxhQUFPSSxHQUFHLENBQUN5VixRQUFRLENBQUNuWCxTQUFULENBQW1CMkMsU0FBbkIsSUFBZ0M1QixNQUFNLENBQUNvQixjQUFQLENBQXNCZ1YsUUFBUSxDQUFDblgsU0FBL0IsQ0FBakMsRUFBNEUsT0FBNUUsRUFBcUYsSUFBckYsQ0FBSCxDQUE4RnlCLElBQTlGLENBQW1HLElBQW5HLEVBQXlHTCxRQUFRLENBQUMsRUFBRCxFQUFLNFYsVUFBTCxFQUFpQnJULFVBQWpCLENBQWpILENBQVA7QUFDRDtBQU5vQixHQUFELENBQVgsQ0FBWDtBQVFBLFNBQU93VCxRQUFQO0FBQ0QsQ0FqQmEsQ0FpQlozUixLQWpCWSxDQUFkOztlQW1CZXlSLE8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEdsaWRlLmpzIHYzLjMuMFxuICogKGMpIDIwMTMtMjAxOSBKxJlkcnplaiBDaGHFgnViZWsgPGplZHJ6ZWouY2hhbHViZWtAZ21haWwuY29tPiAoaHR0cDovL2plZHJ6ZWpjaGFsdWJlay5jb20vKVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgdGhlIG1vdmVtZW50LlxuICAgKlxuICAgKiBBdmFpbGFibGUgdHlwZXM6XG4gICAqIGBzbGlkZXJgIC0gUmV3aW5kcyBzbGlkZXIgdG8gdGhlIHN0YXJ0L2VuZCB3aGVuIGl0IHJlYWNoZXMgdGhlIGZpcnN0IG9yIGxhc3Qgc2xpZGUuXG4gICAqIGBjYXJvdXNlbGAgLSBDaGFuZ2VzIHNsaWRlcyB3aXRob3V0IHN0YXJ0aW5nIG92ZXIgd2hlbiBpdCByZWFjaGVzIHRoZSBmaXJzdCBvciBsYXN0IHNsaWRlLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgdHlwZTogJ3NsaWRlcicsXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGF0IHNwZWNpZmljIHNsaWRlIG51bWJlciBkZWZpbmVkIHdpdGggemVyby1iYXNlZCBpbmRleC5cbiAgICpcbiAgICogQHR5cGUge051bWJlcn1cbiAgICovXG4gIHN0YXJ0QXQ6IDAsXG5cbiAgLyoqXG4gICAqIEEgbnVtYmVyIG9mIHNsaWRlcyB2aXNpYmxlIG9uIHRoZSBzaW5nbGUgdmlld3BvcnQuXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBwZXJWaWV3OiAxLFxuXG4gIC8qKlxuICAgKiBGb2N1cyBjdXJyZW50bHkgYWN0aXZlIHNsaWRlIGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSB0cmFjay5cbiAgICpcbiAgICogQXZhaWxhYmxlIGlucHV0czpcbiAgICogYGNlbnRlcmAgLSBDdXJyZW50IHNsaWRlIHdpbGwgYmUgYWx3YXlzIGZvY3VzZWQgYXQgdGhlIGNlbnRlciBvZiBhIHRyYWNrLlxuICAgKiBgMCwxLDIsMy4uLmAgLSBDdXJyZW50IHNsaWRlIHdpbGwgYmUgZm9jdXNlZCBvbiB0aGUgc3BlY2lmaWVkIHplcm8tYmFzZWQgaW5kZXguXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmd8TnVtYmVyfVxuICAgKi9cbiAgZm9jdXNBdDogMCxcblxuICAvKipcbiAgICogQSBzaXplIG9mIHRoZSBnYXAgYWRkZWQgYmV0d2VlbiBzbGlkZXMuXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnYXA6IDEwLFxuXG4gIC8qKlxuICAgKiBDaGFuZ2Ugc2xpZGVzIGFmdGVyIGEgc3BlY2lmaWVkIGludGVydmFsLiBVc2UgYGZhbHNlYCBmb3IgdHVybmluZyBvZmYgYXV0b3BsYXkuXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ8Qm9vbGVhbn1cbiAgICovXG4gIGF1dG9wbGF5OiBmYWxzZSxcblxuICAvKipcbiAgICogU3RvcCBhdXRvcGxheSBvbiBtb3VzZW92ZXIgZXZlbnQuXG4gICAqXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgaG92ZXJwYXVzZTogdHJ1ZSxcblxuICAvKipcbiAgICogQWxsb3cgZm9yIGNoYW5naW5nIHNsaWRlcyB3aXRoIGxlZnQgYW5kIHJpZ2h0IGtleWJvYXJkIGFycm93cy5cbiAgICpcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICBrZXlib2FyZDogdHJ1ZSxcblxuICAvKipcbiAgICogU3RvcCBydW5uaW5nIGBwZXJWaWV3YCBudW1iZXIgb2Ygc2xpZGVzIGZyb20gdGhlIGVuZC4gVXNlIHRoaXNcbiAgICogb3B0aW9uIGlmIHlvdSBkb24ndCB3YW50IHRvIGhhdmUgYW4gZW1wdHkgc3BhY2UgYWZ0ZXJcbiAgICogYSBzbGlkZXIuIFdvcmtzIG9ubHkgd2l0aCBgc2xpZGVyYCB0eXBlIGFuZCBhXG4gICAqIG5vbi1jZW50ZXJlZCBgZm9jdXNBdGAgc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICBib3VuZDogZmFsc2UsXG5cbiAgLyoqXG4gICAqIE1pbmltYWwgc3dpcGUgZGlzdGFuY2UgbmVlZGVkIHRvIGNoYW5nZSB0aGUgc2xpZGUuIFVzZSBgZmFsc2VgIGZvciB0dXJuaW5nIG9mZiBhIHN3aXBpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ8Qm9vbGVhbn1cbiAgICovXG4gIHN3aXBlVGhyZXNob2xkOiA4MCxcblxuICAvKipcbiAgICogTWluaW1hbCBtb3VzZSBkcmFnIGRpc3RhbmNlIG5lZWRlZCB0byBjaGFuZ2UgdGhlIHNsaWRlLiBVc2UgYGZhbHNlYCBmb3IgdHVybmluZyBvZmYgYSBkcmFnZ2luZy5cbiAgICpcbiAgICogQHR5cGUge051bWJlcnxCb29sZWFufVxuICAgKi9cbiAgZHJhZ1RocmVzaG9sZDogMTIwLFxuXG4gIC8qKlxuICAgKiBBIG51bWJlciBvZiBzbGlkZXMgbW92ZWQgb24gc2luZ2xlIHN3aXBlLlxuICAgKlxuICAgKiBBdmFpbGFibGUgdHlwZXM6XG4gICAqIGBgIC0gTW92ZXMgc2xpZGVyIGJ5IG9uZSBzbGlkZSBwZXIgc3dpcGVcbiAgICogYHxgIC0gTW92ZXMgc2xpZGVyIGJldHdlZW4gdmlld3MgcGVyIHN3aXBlIChudW1iZXIgb2Ygc2xpZGVzIGRlZmluZWQgaW4gYHBlclZpZXdgIG9wdGlvbnMpXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBwZXJTd2lwZTogJ3wnLFxuXG4gIC8qKlxuICAgKiBNb3ZpbmcgZGlzdGFuY2UgcmF0aW8gb2YgdGhlIHNsaWRlcyBvbiBhIHN3aXBpbmcgYW5kIGRyYWdnaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgdG91Y2hSYXRpbzogMC41LFxuXG4gIC8qKlxuICAgKiBBbmdsZSByZXF1aXJlZCB0byBhY3RpdmF0ZSBzbGlkZXMgbW92aW5nIG9uIHN3aXBpbmcgb3IgZHJhZ2dpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICB0b3VjaEFuZ2xlOiA0NSxcblxuICAvKipcbiAgICogRHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBhbmltYXRpb25EdXJhdGlvbjogNDAwLFxuXG4gIC8qKlxuICAgKiBBbGxvd3MgbG9vcGluZyB0aGUgYHNsaWRlcmAgdHlwZS4gU2xpZGVyIHdpbGwgcmV3aW5kIHRvIHRoZSBmaXJzdC9sYXN0IHNsaWRlIHdoZW4gaXQncyBhdCB0aGUgc3RhcnQvZW5kLlxuICAgKlxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICovXG4gIHJld2luZDogdHJ1ZSxcblxuICAvKipcbiAgICogRHVyYXRpb24gb2YgdGhlIHJld2luZGluZyBhbmltYXRpb24gb2YgdGhlIGBzbGlkZXJgIHR5cGUgaW4gbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgcmV3aW5kRHVyYXRpb246IDgwMCxcblxuICAvKipcbiAgICogRWFzaW5nIGZ1bmN0aW9uIGZvciB0aGUgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgYW5pbWF0aW9uVGltaW5nRnVuYzogJ2N1YmljLWJlemllciguMTY1LCAuODQwLCAuNDQwLCAxKScsXG5cbiAgLyoqXG4gICAqIFdhaXQgZm9yIHRoZSBhbmltYXRpb24gdG8gZmluaXNoIHVudGlsIHRoZSBuZXh0IHVzZXIgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZFxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHdhaXRGb3JUcmFuc2l0aW9uOiB0cnVlLFxuXG4gIC8qKlxuICAgKiBUaHJvdHRsZSBjb3N0bHkgZXZlbnRzIGF0IG1vc3Qgb25jZSBwZXIgZXZlcnkgd2FpdCBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICB0aHJvdHRsZTogMTAsXG5cbiAgLyoqXG4gICAqIE1vdmluZyBkaXJlY3Rpb24gbW9kZS5cbiAgICpcbiAgICogQXZhaWxhYmxlIGlucHV0czpcbiAgICogLSAnbHRyJyAtIGxlZnQgdG8gcmlnaHQgbW92ZW1lbnQsXG4gICAqIC0gJ3J0bCcgLSByaWdodCB0byBsZWZ0IG1vdmVtZW50LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZGlyZWN0aW9uOiAnbHRyJyxcblxuICAvKipcbiAgICogVGhlIGRpc3RhbmNlIHZhbHVlIG9mIHRoZSBuZXh0IGFuZCBwcmV2aW91cyB2aWV3cG9ydHMgd2hpY2hcbiAgICogaGF2ZSB0byBwZWVrIGluIHRoZSBjdXJyZW50IHZpZXcuIEFjY2VwdHMgbnVtYmVyIGFuZFxuICAgKiBwaXhlbHMgYXMgYSBzdHJpbmcuIExlZnQgYW5kIHJpZ2h0IHBlZWtpbmcgY2FuIGJlXG4gICAqIHNldCB1cCBzZXBhcmF0ZWx5IHdpdGggYSBkaXJlY3Rpb25zIG9iamVjdC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqIGAxMDBgIC0gUGVlayAxMDBweCBvbiB0aGUgYm90aCBzaWRlcy5cbiAgICogeyBiZWZvcmU6IDEwMCwgYWZ0ZXI6IDUwIH1gIC0gUGVlayAxMDBweCBvbiB0aGUgbGVmdCBzaWRlIGFuZCA1MHB4IG9uIHRoZSByaWdodCBzaWRlLlxuICAgKlxuICAgKiBAdHlwZSB7TnVtYmVyfFN0cmluZ3xPYmplY3R9XG4gICAqL1xuICBwZWVrOiAwLFxuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIG9wdGlvbnMgYXBwbGllZCBhdCBzcGVjaWZpZWQgbWVkaWEgYnJlYWtwb2ludHMuXG4gICAqIEZvciBleGFtcGxlOiBkaXNwbGF5IHR3byBzbGlkZXMgcGVyIHZpZXcgdW5kZXIgODAwcHguXG4gICAqIGB7XG4gICAqICAgJzgwMHB4Jzoge1xuICAgKiAgICAgcGVyVmlldzogMlxuICAgKiAgIH1cbiAgICogfWBcbiAgICovXG4gIGJyZWFrcG9pbnRzOiB7fSxcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBpbnRlcm5hbGx5IHVzZWQgSFRNTCBjbGFzc2VzLlxuICAgKlxuICAgKiBAdG9kbyBSZWZhY3RvciBgc2xpZGVyYCBhbmQgYGNhcm91c2VsYCBwcm9wZXJ0aWVzIHRvIHNpbmdsZSBgdHlwZTogeyBzbGlkZXI6ICcnLCBjYXJvdXNlbDogJycgfWAgb2JqZWN0XG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBjbGFzc2VzOiB7XG4gICAgc3dpcGVhYmxlOiAnZ2xpZGUtLXN3aXBlYWJsZScsXG4gICAgZHJhZ2dpbmc6ICdnbGlkZS0tZHJhZ2dpbmcnLFxuICAgIGRpcmVjdGlvbjoge1xuICAgICAgbHRyOiAnZ2xpZGUtLWx0cicsXG4gICAgICBydGw6ICdnbGlkZS0tcnRsJ1xuICAgIH0sXG4gICAgdHlwZToge1xuICAgICAgc2xpZGVyOiAnZ2xpZGUtLXNsaWRlcicsXG4gICAgICBjYXJvdXNlbDogJ2dsaWRlLS1jYXJvdXNlbCdcbiAgICB9LFxuICAgIHNsaWRlOiB7XG4gICAgICBjbG9uZTogJ2dsaWRlX19zbGlkZS0tY2xvbmUnLFxuICAgICAgYWN0aXZlOiAnZ2xpZGVfX3NsaWRlLS1hY3RpdmUnXG4gICAgfSxcbiAgICBhcnJvdzoge1xuICAgICAgZGlzYWJsZWQ6ICdnbGlkZV9fYXJyb3ctLWRpc2FibGVkJ1xuICAgIH0sXG4gICAgbmF2OiB7XG4gICAgICBhY3RpdmU6ICdnbGlkZV9fYnVsbGV0LS1hY3RpdmUnXG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIE91dHB1dHMgd2FybmluZyBtZXNzYWdlIHRvIHRoZSBib3dzZXIgY29uc29sZS5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG1zZ1xuICogQHJldHVybiB7Vm9pZH1cbiAqL1xuZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgY29uc29sZS5lcnJvcihcIltHbGlkZSB3YXJuXTogXCIgKyBtc2cpO1xufVxuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iajtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xufTtcblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBnZXQgPSBmdW5jdGlvbiBnZXQob2JqZWN0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcblxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXQocGFyZW50LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykge1xuICAgIHJldHVybiBkZXNjLnZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBnZXR0ZXIgPSBkZXNjLmdldDtcblxuICAgIGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpO1xuICB9XG59O1xuXG52YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB2YWx1ZSBlbnRlcmVkIGFzIG51bWJlclxuICogb3Igc3RyaW5nIHRvIGludGVnZXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiB0b0ludCh2YWx1ZSkge1xuICByZXR1cm4gcGFyc2VJbnQodmFsdWUpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHZhbHVlIGVudGVyZWQgYXMgbnVtYmVyXG4gKiBvciBzdHJpbmcgdG8gZmxhdCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHRvRmxvYXQodmFsdWUpIHtcbiAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtICB7Kn0gICB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtICB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmVcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHZhbHVlKTtcblxuICByZXR1cm4gdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlID09PSAnb2JqZWN0JyAmJiAhIXZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1peGVkLW9wZXJhdG9yc1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSAgeyp9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSAgeyp9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc0FycmF5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgZXh0ZW5zaW9ucy5cbiAqIEVhY2ggZXh0ZW5zaW9uIHJlY2VpdmVzIGFjY2VzcyB0byBpbnN0YW5jZSBvZiBnbGlkZSBhbmQgcmVzdCBvZiBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBnbGlkZVxuICogQHBhcmFtIHtPYmplY3R9IGV4dGVuc2lvbnNcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBtb3VudChnbGlkZSwgZXh0ZW5zaW9ucywgZXZlbnRzKSB7XG4gIHZhciBjb21wb25lbnRzID0ge307XG5cbiAgZm9yICh2YXIgbmFtZSBpbiBleHRlbnNpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oZXh0ZW5zaW9uc1tuYW1lXSkpIHtcbiAgICAgIGNvbXBvbmVudHNbbmFtZV0gPSBleHRlbnNpb25zW25hbWVdKGdsaWRlLCBjb21wb25lbnRzLCBldmVudHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuKCdFeHRlbnNpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX25hbWUgaW4gY29tcG9uZW50cykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbXBvbmVudHNbX25hbWVdLm1vdW50KSkge1xuICAgICAgY29tcG9uZW50c1tfbmFtZV0ubW91bnQoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50cztcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGdldHRlciBhbmQgc2V0dGVyIHByb3BlcnR5IG9uIHRoZSBzcGVjaWZpZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqICAgICAgICAgT2JqZWN0IHdoZXJlIHByb3BlcnR5IGhhcyB0byBiZSBkZWZpbmVkLlxuICogQHBhcmFtICB7U3RyaW5nfSBwcm9wICAgICAgICBOYW1lIG9mIHRoZSBkZWZpbmVkIHByb3BlcnR5LlxuICogQHBhcmFtICB7T2JqZWN0fSBkZWZpbml0aW9uICBHZXQgYW5kIHNldCBkZWZpbml0aW9ucyBmb3IgdGhlIHByb3BlcnR5LlxuICogQHJldHVybiB7Vm9pZH1cbiAqL1xuZnVuY3Rpb24gZGVmaW5lKG9iaiwgcHJvcCwgZGVmaW5pdGlvbikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZWZpbml0aW9uKTtcbn1cblxuLyoqXG4gKiBTb3J0cyBhcGhhYmV0aWNhbGx5IG9iamVjdCBrZXlzLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHNvcnRLZXlzKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uIChyLCBrKSB7XG4gICAgcltrXSA9IG9ialtrXTtcblxuICAgIHJldHVybiByW2tdLCByO1xuICB9LCB7fSk7XG59XG5cbi8qKlxuICogTWVyZ2VzIHBhc3NlZCBzZXR0aW5ncyBvYmplY3Qgd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBkZWZhdWx0c1xuICogQHBhcmFtICB7T2JqZWN0fSBzZXR0aW5nc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBtZXJnZU9wdGlvbnMoZGVmYXVsdHMsIHNldHRpbmdzKSB7XG4gIHZhciBvcHRpb25zID0gX2V4dGVuZHMoe30sIGRlZmF1bHRzLCBzZXR0aW5ncyk7XG5cbiAgLy8gYE9iamVjdC5hc3NpZ25gIGRvIG5vdCBkZWVwbHkgbWVyZ2Ugb2JqZWN0cywgc28gd2VcbiAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseSBmb3IgZXZlcnkgbmVzdGVkIG9iamVjdFxuICAvLyBpbiBvcHRpb25zLiBBbHRob3VnaCBpdCBkb2VzIG5vdCBsb29rIHNtYXJ0LFxuICAvLyBpdCdzIHNtYWxsZXIgYW5kIGZhc3RlciB0aGFuIHNvbWUgZmFuY3lcbiAgLy8gbWVyZ2luZyBkZWVwLW1lcmdlIGFsZ29yaXRobSBzY3JpcHQuXG4gIGlmIChzZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eSgnY2xhc3NlcycpKSB7XG4gICAgb3B0aW9ucy5jbGFzc2VzID0gX2V4dGVuZHMoe30sIGRlZmF1bHRzLmNsYXNzZXMsIHNldHRpbmdzLmNsYXNzZXMpO1xuXG4gICAgaWYgKHNldHRpbmdzLmNsYXNzZXMuaGFzT3duUHJvcGVydHkoJ2RpcmVjdGlvbicpKSB7XG4gICAgICBvcHRpb25zLmNsYXNzZXMuZGlyZWN0aW9uID0gX2V4dGVuZHMoe30sIGRlZmF1bHRzLmNsYXNzZXMuZGlyZWN0aW9uLCBzZXR0aW5ncy5jbGFzc2VzLmRpcmVjdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmNsYXNzZXMuaGFzT3duUHJvcGVydHkoJ3R5cGUnKSkge1xuICAgICAgb3B0aW9ucy5jbGFzc2VzLnR5cGUgPSBfZXh0ZW5kcyh7fSwgZGVmYXVsdHMuY2xhc3Nlcy50eXBlLCBzZXR0aW5ncy5jbGFzc2VzLnR5cGUpO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5jbGFzc2VzLmhhc093blByb3BlcnR5KCdzbGlkZScpKSB7XG4gICAgICBvcHRpb25zLmNsYXNzZXMuc2xpZGUgPSBfZXh0ZW5kcyh7fSwgZGVmYXVsdHMuY2xhc3Nlcy5zbGlkZSwgc2V0dGluZ3MuY2xhc3Nlcy5zbGlkZSk7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmNsYXNzZXMuaGFzT3duUHJvcGVydHkoJ2Fycm93JykpIHtcbiAgICAgIG9wdGlvbnMuY2xhc3Nlcy5hcnJvdyA9IF9leHRlbmRzKHt9LCBkZWZhdWx0cy5jbGFzc2VzLmFycm93LCBzZXR0aW5ncy5jbGFzc2VzLmFycm93KTtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuY2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSgnbmF2JykpIHtcbiAgICAgIG9wdGlvbnMuY2xhc3Nlcy5uYXYgPSBfZXh0ZW5kcyh7fSwgZGVmYXVsdHMuY2xhc3Nlcy5uYXYsIHNldHRpbmdzLmNsYXNzZXMubmF2KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2V0dGluZ3MuaGFzT3duUHJvcGVydHkoJ2JyZWFrcG9pbnRzJykpIHtcbiAgICBvcHRpb25zLmJyZWFrcG9pbnRzID0gX2V4dGVuZHMoe30sIGRlZmF1bHRzLmJyZWFrcG9pbnRzLCBzZXR0aW5ncy5icmVha3BvaW50cyk7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxudmFyIEV2ZW50c0J1cyA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIEV2ZW50QnVzIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRzXG4gICAqL1xuICBmdW5jdGlvbiBFdmVudHNCdXMoKSB7XG4gICAgdmFyIGV2ZW50cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRzQnVzKTtcblxuICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xuICAgIHRoaXMuaG9wID0gZXZlbnRzLmhhc093blByb3BlcnR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbGlzdGVuZXIgdG8gdGhlIHNwZWNpZmVkIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEV2ZW50c0J1cywgW3tcbiAgICBrZXk6ICdvbicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMub24oZXZlbnRbaV0sIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgZXZlbnQncyBvYmplY3QgaWYgbm90IHlldCBjcmVhdGVkXG4gICAgICBpZiAoIXRoaXMuaG9wLmNhbGwodGhpcy5ldmVudHMsIGV2ZW50KSkge1xuICAgICAgICB0aGlzLmV2ZW50c1tldmVudF0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRoZSBoYW5kbGVyIHRvIHF1ZXVlXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLmV2ZW50c1tldmVudF0ucHVzaChoYW5kbGVyKSAtIDE7XG5cbiAgICAgIC8vIFByb3ZpZGUgaGFuZGxlIGJhY2sgZm9yIHJlbW92YWwgb2YgZXZlbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c1tldmVudF1baW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgcmVnaXN0ZXJlZCBoYW5kbGVycyBmb3Igc3BlY2lmaWVkIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGV2ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb250ZXh0XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2VtaXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbWl0KGV2ZW50LCBjb250ZXh0KSB7XG4gICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuZW1pdChldmVudFtpXSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGV2ZW50IGRvZXNuJ3QgZXhpc3QsIG9yIHRoZXJlJ3Mgbm8gaGFuZGxlcnMgaW4gcXVldWUsIGp1c3QgbGVhdmVcbiAgICAgIGlmICghdGhpcy5ob3AuY2FsbCh0aGlzLmV2ZW50cywgZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ3ljbGUgdGhyb3VnaCBldmVudHMgcXVldWUsIGZpcmUhXG4gICAgICB0aGlzLmV2ZW50c1tldmVudF0uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpdGVtKGNvbnRleHQgfHwge30pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBFdmVudHNCdXM7XG59KCk7XG5cbnZhciBHbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdCBnbGlkZS5cbiAgICpcbiAgICogQHBhcmFtICB7U3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIEdsaWRlKHNlbGVjdG9yKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEdsaWRlKTtcblxuICAgIHRoaXMuX2MgPSB7fTtcbiAgICB0aGlzLl90ID0gW107XG4gICAgdGhpcy5fZSA9IG5ldyBFdmVudHNCdXMoKTtcblxuICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgdGhpcy5zZXR0aW5ncyA9IG1lcmdlT3B0aW9ucyhkZWZhdWx0cywgb3B0aW9ucyk7XG4gICAgdGhpcy5pbmRleCA9IHRoaXMuc2V0dGluZ3Muc3RhcnRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBnbGlkZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGV4dGVuc2lvbnMgQ29sbGVjdGlvbiBvZiBleHRlbnNpb25zIHRvIGluaXRpYWxpemUuXG4gICAqIEByZXR1cm4ge0dsaWRlfVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEdsaWRlLCBbe1xuICAgIGtleTogJ21vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnQkJDEoKSB7XG4gICAgICB2YXIgZXh0ZW5zaW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICAgIHRoaXMuX2UuZW1pdCgnbW91bnQuYmVmb3JlJyk7XG5cbiAgICAgIGlmIChpc09iamVjdChleHRlbnNpb25zKSkge1xuICAgICAgICB0aGlzLl9jID0gbW91bnQodGhpcywgZXh0ZW5zaW9ucywgdGhpcy5fZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKCdZb3UgbmVlZCB0byBwcm92aWRlIGEgb2JqZWN0IG9uIGBtb3VudCgpYCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lLmVtaXQoJ21vdW50LmFmdGVyJyk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3RzIGFuIGluc3RhbmNlIGB0cmFuc2xhdGVgIHRyYW5zZm9ybWVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0FycmF5fSB0cmFuc2Zvcm1lcnMgQ29sbGVjdGlvbiBvZiB0cmFuc2Zvcm1lcnMuXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbXV0YXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbXV0YXRlKCkge1xuICAgICAgdmFyIHRyYW5zZm9ybWVycyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG5cbiAgICAgIGlmIChpc0FycmF5KHRyYW5zZm9ybWVycykpIHtcbiAgICAgICAgdGhpcy5fdCA9IHRyYW5zZm9ybWVycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oJ1lvdSBuZWVkIHRvIHByb3ZpZGUgYSBhcnJheSBvbiBgbXV0YXRlKClgJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgZ2xpZGUgd2l0aCBzcGVjaWZpZWQgc2V0dGluZ3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc2V0dGluZ3NcbiAgICAgKiBAcmV0dXJuIHtHbGlkZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAndXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgdmFyIHNldHRpbmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgICAgdGhpcy5zZXR0aW5ncyA9IG1lcmdlT3B0aW9ucyh0aGlzLnNldHRpbmdzLCBzZXR0aW5ncyk7XG5cbiAgICAgIGlmIChzZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eSgnc3RhcnRBdCcpKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBzZXR0aW5ncy5zdGFydEF0O1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lLmVtaXQoJ3VwZGF0ZScpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2Ugc2xpZGUgd2l0aCBzcGVjaWZpZWQgcGF0dGVybi4gQSBwYXR0ZXJuIG11c3QgYmUgaW4gdGhlIHNwZWNpYWwgZm9ybWF0OlxuICAgICAqIGA+YCAtIE1vdmUgb25lIGZvcndhcmRcbiAgICAgKiBgPGAgLSBNb3ZlIG9uZSBiYWNrd2FyZFxuICAgICAqIGA9e2l9YCAtIEdvIHRvIHtpfSB6ZXJvLWJhc2VkIHNsaWRlIChlcS4gJz0xJywgd2lsbCBnbyB0byBzZWNvbmQgc2xpZGUpXG4gICAgICogYD4+YCAtIFJld2luZHMgdG8gZW5kIChsYXN0IHNsaWRlKVxuICAgICAqIGA8PGAgLSBSZXdpbmRzIHRvIHN0YXJ0IChmaXJzdCBzbGlkZSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXR0ZXJuXG4gICAgICogQHJldHVybiB7R2xpZGV9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2dvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ28ocGF0dGVybikge1xuICAgICAgdGhpcy5fYy5SdW4ubWFrZShwYXR0ZXJuKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSB0cmFjayBieSBzcGVjaWZpZWQgZGlzdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGlzdGFuY2VcbiAgICAgKiBAcmV0dXJuIHtHbGlkZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbW92ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmUoZGlzdGFuY2UpIHtcbiAgICAgIHRoaXMuX2MuVHJhbnNpdGlvbi5kaXNhYmxlKCk7XG4gICAgICB0aGlzLl9jLk1vdmUubWFrZShkaXN0YW5jZSk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgaW5zdGFuY2UgYW5kIHJldmVydCBhbGwgY2hhbmdlcyBkb25lIGJ5IHRoaXMuX2MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHbGlkZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9lLmVtaXQoJ2Rlc3Ryb3knKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgaW5zdGFuY2UgYXV0b3BsYXlpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW58TnVtYmVyfSBpbnRlcnZhbCBSdW4gYXV0b3BsYXlpbmcgd2l0aCBwYXNzZWQgaW50ZXJ2YWwgcmVnYXJkbGVzcyBvZiBgYXV0b3BsYXlgIHNldHRpbmdzXG4gICAgICogQHJldHVybiB7R2xpZGV9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3BsYXknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdmFyIGludGVydmFsID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgICAgaWYgKGludGVydmFsKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MuYXV0b3BsYXkgPSBpbnRlcnZhbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZS5lbWl0KCdwbGF5Jyk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3AgaW5zdGFuY2UgYXV0b3BsYXlpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHbGlkZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAncGF1c2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMuX2UuZW1pdCgncGF1c2UnKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBnbGlkZSBpbnRvIGEgaWRsZSBzdGF0dXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHbGlkZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGlzYWJsZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBnbGlkZSBpbnRvIGEgYWN0aXZlIHN0YXR1cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dsaWRlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdlbmFibGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGUoKSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgY3V1dG9tIGV2ZW50IGxpc3RlbmVyIHdpdGggaGFuZGxlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ3xBcnJheX0gZXZlbnRcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgICAqIEByZXR1cm4ge0dsaWRlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdvbicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICB0aGlzLl9lLm9uKGV2ZW50LCBoYW5kbGVyKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGdsaWRlIGlzIGEgcHJlY2lzZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2lzVHlwZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzVHlwZShuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy50eXBlID09PSBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdmFsdWUgb2YgdGhlIGNvcmUgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc2V0dGluZ3MnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX287XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB2YWx1ZSBvZiB0aGUgY29yZSBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBvXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEobykge1xuICAgICAgaWYgKGlzT2JqZWN0KG8pKSB7XG4gICAgICAgIHRoaXMuX28gPSBvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybignT3B0aW9ucyBtdXN0IGJlIGFuIGBvYmplY3RgIGluc3RhbmNlLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgY3VycmVudCBpbmRleCBvZiB0aGUgc2xpZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpbmRleCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGN1cnJlbnQgaW5kZXggYSBzbGlkZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKGkpIHtcbiAgICAgIHRoaXMuX2kgPSB0b0ludChpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHR5cGUgbmFtZSBvZiB0aGUgc2xpZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB2YWx1ZSBvZiB0aGUgaWRsZSBzdGF0dXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkaXNhYmxlZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHZhbHVlIG9mIHRoZSBpZGxlIHN0YXR1cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKHN0YXR1cykge1xuICAgICAgdGhpcy5fZCA9ICEhc3RhdHVzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gR2xpZGU7XG59KCk7XG5cbmZ1bmN0aW9uIFJ1biAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICB2YXIgUnVuID0ge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGF1dG9ydW5uaW5nIG9mIHRoZSBnbGlkZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgdGhpcy5fbyA9IGZhbHNlO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIGdsaWRlcyBydW5uaW5nIGJhc2VkIG9uIHRoZSBwYXNzZWQgbW92aW5nIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtb3ZlXG4gICAgICovXG4gICAgbWFrZTogZnVuY3Rpb24gbWFrZShtb3ZlKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoIUdsaWRlLmRpc2FibGVkKSB7XG4gICAgICAgICFHbGlkZS5zZXR0aW5ncy53YWl0Rm9yVHJhbnNpdGlvbiB8fCBHbGlkZS5kaXNhYmxlKCk7XG5cbiAgICAgICAgdGhpcy5tb3ZlID0gbW92ZTtcblxuICAgICAgICBFdmVudHMuZW1pdCgncnVuLmJlZm9yZScsIHRoaXMubW92ZSk7XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGUoKTtcblxuICAgICAgICBFdmVudHMuZW1pdCgncnVuJywgdGhpcy5tb3ZlKTtcblxuICAgICAgICBDb21wb25lbnRzLlRyYW5zaXRpb24uYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChfdGhpcy5pc1N0YXJ0KCkpIHtcbiAgICAgICAgICAgIEV2ZW50cy5lbWl0KCdydW4uc3RhcnQnLCBfdGhpcy5tb3ZlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMuaXNFbmQoKSkge1xuICAgICAgICAgICAgRXZlbnRzLmVtaXQoJ3J1bi5lbmQnLCBfdGhpcy5tb3ZlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMuaXNPZmZzZXQoKSkge1xuICAgICAgICAgICAgX3RoaXMuX28gPSBmYWxzZTtcblxuICAgICAgICAgICAgRXZlbnRzLmVtaXQoJ3J1bi5vZmZzZXQnLCBfdGhpcy5tb3ZlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBFdmVudHMuZW1pdCgncnVuLmFmdGVyJywgX3RoaXMubW92ZSk7XG5cbiAgICAgICAgICBHbGlkZS5lbmFibGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyBjdXJyZW50IGluZGV4IGJhc2VkIG9uIGRlZmluZWQgbW92ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcnxVbmRlZmluZWR9XG4gICAgICovXG4gICAgY2FsY3VsYXRlOiBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7XG4gICAgICB2YXIgbW92ZSA9IHRoaXMubW92ZSxcbiAgICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICAgIHZhciBzdGVwcyA9IG1vdmUuc3RlcHMsXG4gICAgICAgICAgZGlyZWN0aW9uID0gbW92ZS5kaXJlY3Rpb247XG5cbiAgICAgIC8vIEJ5IGRlZmF1bHQgYXNzdW1lIHRoYXQgc2l6ZSBvZiB2aWV3IGlzIGVxdWFsIHRvIG9uZSBzbGlkZVxuXG4gICAgICB2YXIgdmlld1NpemUgPSAxO1xuXG4gICAgICAvLyBXaGlsZSBkaXJlY3Rpb24gaXMgYD1gIHdlIHdhbnQganVtcCB0b1xuICAgICAgLy8gYSBzcGVjaWZpZWQgaW5kZXggZGVzY3JpYmVkIGluIHN0ZXBzLlxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJz0nKSB7XG4gICAgICAgIEdsaWRlLmluZGV4ID0gc3RlcHM7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBXaGVuIHBhdHRlcm4gaXMgZXF1YWwgdG8gYD4+YCB3ZSB3YW50XG4gICAgICAvLyBmYXN0IGZvcndhcmQgdG8gdGhlIGxhc3Qgc2xpZGUuXG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAnPicgJiYgc3RlcHMgPT09ICc+Jykge1xuICAgICAgICBHbGlkZS5pbmRleCA9IGxlbmd0aDtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gcGF0dGVybiBpcyBlcXVhbCB0byBgPDxgIHdlIHdhbnRcbiAgICAgIC8vIGZhc3QgZm9yd2FyZCB0byB0aGUgZmlyc3Qgc2xpZGUuXG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAnPCcgJiYgc3RlcHMgPT09ICc8Jykge1xuICAgICAgICBHbGlkZS5pbmRleCA9IDA7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBwYWdpbmF0aW9uIG1vdmVtZW50XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAnfCcpIHtcbiAgICAgICAgdmlld1NpemUgPSBHbGlkZS5zZXR0aW5ncy5wZXJWaWV3IHx8IDE7XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGFyZSBtb3ZpbmcgZm9yd2FyZFxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJz4nIHx8IGRpcmVjdGlvbiA9PT0gJ3wnICYmIHN0ZXBzID09PSAnPicpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY2FsY3VsYXRlRm9yd2FyZEluZGV4KHZpZXdTaXplKTtcblxuICAgICAgICBpZiAoaW5kZXggPiBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9vID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIEdsaWRlLmluZGV4ID0gbm9ybWFsaXplRm9yd2FyZEluZGV4KGluZGV4LCB2aWV3U2l6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyB3ZSBhcmUgbW92aW5nIGJhY2t3YXJkXG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAnPCcgfHwgZGlyZWN0aW9uID09PSAnfCcgJiYgc3RlcHMgPT09ICc8Jykge1xuICAgICAgICB2YXIgX2luZGV4ID0gY2FsY3VsYXRlQmFja3dhcmRJbmRleCh2aWV3U2l6ZSk7XG5cbiAgICAgICAgaWYgKF9pbmRleCA8IDApIHtcbiAgICAgICAgICB0aGlzLl9vID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIEdsaWRlLmluZGV4ID0gbm9ybWFsaXplQmFja3dhcmRJbmRleChfaW5kZXgsIHZpZXdTaXplKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdhcm4oJ0ludmFsaWQgZGlyZWN0aW9uIHBhdHRlcm4gWycgKyBkaXJlY3Rpb24gKyBzdGVwcyArICddIGhhcyBiZWVuIHVzZWQnKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgd2UgYXJlIG9uIHRoZSBmaXJzdCBzbGlkZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTdGFydDogZnVuY3Rpb24gaXNTdGFydCgpIHtcbiAgICAgIHJldHVybiBHbGlkZS5pbmRleCA8PSAwO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB3ZSBhcmUgb24gdGhlIGxhc3Qgc2xpZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzRW5kOiBmdW5jdGlvbiBpc0VuZCgpIHtcbiAgICAgIHJldHVybiBHbGlkZS5pbmRleCA+PSB0aGlzLmxlbmd0aDtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgd2UgYXJlIG1ha2luZyBhIG9mZnNldCBydW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGlyZWN0aW9uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc09mZnNldDogZnVuY3Rpb24gaXNPZmZzZXQoKSB7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICghZGlyZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX28pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBkaWQgd2UgdmlldyB0byB0aGUgcmlnaHQ/XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAnfD4nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vdmUuZGlyZWN0aW9uID09PSAnfCcgJiYgdGhpcy5tb3ZlLnN0ZXBzID09PSAnPic7XG4gICAgICB9XG5cbiAgICAgIC8vIGRpZCB3ZSB2aWV3IHRvIHRoZSBsZWZ0P1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3w8Jykge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3ZlLmRpcmVjdGlvbiA9PT0gJ3wnICYmIHRoaXMubW92ZS5zdGVwcyA9PT0gJzwnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5tb3ZlLmRpcmVjdGlvbiA9PT0gZGlyZWN0aW9uO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBib3VuZCBtb2RlIGlzIGFjdGl2ZVxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0JvdW5kOiBmdW5jdGlvbiBpc0JvdW5kKCkge1xuICAgICAgcmV0dXJuIEdsaWRlLmlzVHlwZSgnc2xpZGVyJykgJiYgR2xpZGUuc2V0dGluZ3MuZm9jdXNBdCAhPT0gJ2NlbnRlcicgJiYgR2xpZGUuc2V0dGluZ3MuYm91bmQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGluZGV4IHZhbHVlIHRvIG1vdmUgZm9yd2FyZC90byB0aGUgcmlnaHRcbiAgICpcbiAgICogQHBhcmFtIHZpZXdTaXplXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBjYWxjdWxhdGVGb3J3YXJkSW5kZXgodmlld1NpemUpIHtcbiAgICB2YXIgaW5kZXggPSBHbGlkZS5pbmRleDtcblxuXG4gICAgaWYgKEdsaWRlLmlzVHlwZSgnY2Fyb3VzZWwnKSkge1xuICAgICAgcmV0dXJuIGluZGV4ICsgdmlld1NpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4ICsgKHZpZXdTaXplIC0gaW5kZXggJSB2aWV3U2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyB0aGUgZ2l2ZW4gZm9yd2FyZCBpbmRleCBiYXNlZCBvbiBnbGlkZSBzZXR0aW5ncywgcHJldmVudGluZyBpdCB0byBleGNlZWQgY2VydGFpbiBib3VuZGFyaWVzXG4gICAqXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKiBAcGFyYW0gbGVuZ3RoXG4gICAqIEBwYXJhbSB2aWV3U2l6ZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplRm9yd2FyZEluZGV4KGluZGV4LCB2aWV3U2l6ZSkge1xuICAgIHZhciBsZW5ndGggPSBSdW4ubGVuZ3RoO1xuXG5cbiAgICBpZiAoaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKEdsaWRlLmlzVHlwZSgnY2Fyb3VzZWwnKSkge1xuICAgICAgcmV0dXJuIGluZGV4IC0gKGxlbmd0aCArIDEpO1xuICAgIH1cblxuICAgIGlmIChHbGlkZS5zZXR0aW5ncy5yZXdpbmQpIHtcbiAgICAgIC8vIGJvdW5kIGRvZXMgZnVubnkgdGhpbmdzIHdpdGggdGhlIGxlbmd0aCwgdGhlcmVmb3Igd2UgaGF2ZSB0byBiZSBjZXJ0YWluXG4gICAgICAvLyB0aGF0IHdlIGFyZSBvbiB0aGUgbGFzdCBwb3NzaWJsZSBpbmRleCB2YWx1ZSBnaXZlbiBieSBib3VuZFxuICAgICAgaWYgKFJ1bi5pc0JvdW5kKCkgJiYgIVJ1bi5pc0VuZCgpKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmIChSdW4uaXNCb3VuZCgpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLmZsb29yKGxlbmd0aCAvIHZpZXdTaXplKSAqIHZpZXdTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgaW5kZXggdmFsdWUgdG8gbW92ZSBiYWNrd2FyZC90byB0aGUgbGVmdFxuICAgKlxuICAgKiBAcGFyYW0gdmlld1NpemVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2t3YXJkSW5kZXgodmlld1NpemUpIHtcbiAgICB2YXIgaW5kZXggPSBHbGlkZS5pbmRleDtcblxuXG4gICAgaWYgKEdsaWRlLmlzVHlwZSgnY2Fyb3VzZWwnKSkge1xuICAgICAgcmV0dXJuIGluZGV4IC0gdmlld1NpemU7XG4gICAgfVxuXG4gICAgLy8gZW5zdXJlIG91ciBiYWNrIG5hdmlnYXRpb24gcmVzdWx0cyBpbiB0aGUgc2FtZSBpbmRleCBhcyBhIGZvcndhcmQgbmF2aWdhdGlvblxuICAgIC8vIHRvIGV4cGVyaWVuY2UgYSBob21vZ2VuZW91cyBwYWdpbmdcbiAgICB2YXIgdmlldyA9IE1hdGguY2VpbChpbmRleCAvIHZpZXdTaXplKTtcblxuICAgIHJldHVybiAodmlldyAtIDEpICogdmlld1NpemU7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyB0aGUgZ2l2ZW4gYmFja3dhcmQgaW5kZXggYmFzZWQgb24gZ2xpZGUgc2V0dGluZ3MsIHByZXZlbnRpbmcgaXQgdG8gZXhjZWVkIGNlcnRhaW4gYm91bmRhcmllc1xuICAgKlxuICAgKiBAcGFyYW0gaW5kZXhcbiAgICogQHBhcmFtIGxlbmd0aFxuICAgKiBAcGFyYW0gdmlld1NpemVcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVCYWNrd2FyZEluZGV4KGluZGV4LCB2aWV3U2l6ZSkge1xuICAgIHZhciBsZW5ndGggPSBSdW4ubGVuZ3RoO1xuXG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGlmIChHbGlkZS5pc1R5cGUoJ2Nhcm91c2VsJykpIHtcbiAgICAgIHJldHVybiBpbmRleCArIChsZW5ndGggKyAxKTtcbiAgICB9XG5cbiAgICBpZiAoR2xpZGUuc2V0dGluZ3MucmV3aW5kKSB7XG4gICAgICAvLyBib3VuZCBkb2VzIGZ1bm55IHRoaW5ncyB3aXRoIHRoZSBsZW5ndGgsIHRoZXJlZm9yIHdlIGhhdmUgdG8gYmUgY2VydGFpblxuICAgICAgLy8gdGhhdCB3ZSBhcmUgb24gZmlyc3QgcG9zc2libGUgaW5kZXggdmFsdWUgYmVmb3JlIHdlIHRvIHJld2luZCB0byB0aGUgbGVuZ3RoIGdpdmVuIGJ5IGJvdW5kXG4gICAgICBpZiAoUnVuLmlzQm91bmQoKSAmJiBSdW4uaXNTdGFydCgpKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBNYXRoLmZsb29yKGxlbmd0aCAvIHZpZXdTaXplKSAqIHZpZXdTaXplO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgZGVmaW5lKFJ1biwgJ21vdmUnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB2YWx1ZSBvZiB0aGUgbW92ZSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX207XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU2V0cyB2YWx1ZSBvZiB0aGUgbW92ZSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB2YXIgc3RlcCA9IHZhbHVlLnN1YnN0cigxKTtcblxuICAgICAgdGhpcy5fbSA9IHtcbiAgICAgICAgZGlyZWN0aW9uOiB2YWx1ZS5zdWJzdHIoMCwgMSksXG4gICAgICAgIHN0ZXBzOiBzdGVwID8gdG9JbnQoc3RlcCkgPyB0b0ludChzdGVwKSA6IHN0ZXAgOiAwXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG5cbiAgZGVmaW5lKFJ1biwgJ2xlbmd0aCcsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHZhbHVlIG9mIHRoZSBydW5uaW5nIGRpc3RhbmNlIGJhc2VkXG4gICAgICogb24gemVyby1pbmRleGluZyBudW1iZXIgb2Ygc2xpZGVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIHNldHRpbmdzID0gR2xpZGUuc2V0dGluZ3M7XG4gICAgICB2YXIgbGVuZ3RoID0gQ29tcG9uZW50cy5IdG1sLnNsaWRlcy5sZW5ndGg7XG5cbiAgICAgIC8vIElmIHRoZSBgYm91bmRgIG9wdGlvbiBpcyBhY3RpdmUsIGEgbWF4aW11bSBydW5uaW5nIGRpc3RhbmNlIHNob3VsZCBiZVxuICAgICAgLy8gcmVkdWNlZCBieSBgcGVyVmlld2AgYW5kIGBmb2N1c0F0YCBzZXR0aW5ncy4gUnVubmluZyBkaXN0YW5jZVxuICAgICAgLy8gc2hvdWxkIGVuZCBiZWZvcmUgY3JlYXRpbmcgYW4gZW1wdHkgc3BhY2UgYWZ0ZXIgaW5zdGFuY2UuXG5cbiAgICAgIGlmICh0aGlzLmlzQm91bmQoKSkge1xuICAgICAgICByZXR1cm4gbGVuZ3RoIC0gMSAtICh0b0ludChzZXR0aW5ncy5wZXJWaWV3KSAtIDEpICsgdG9JbnQoc2V0dGluZ3MuZm9jdXNBdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsZW5ndGggLSAxO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVmaW5lKFJ1biwgJ29mZnNldCcsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHN0YXR1cyBvZiB0aGUgb2Zmc2V0dGluZyBmbGFnLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIFJ1bjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY3VycmVudCB0aW1lLlxuICpcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uLCB0aGF0LCB3aGVuIGludm9rZWQsIHdpbGwgb25seSBiZSB0cmlnZ2VyZWRcbiAqIGF0IG1vc3Qgb25jZSBkdXJpbmcgYSBnaXZlbiB3aW5kb3cgb2YgdGltZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdFxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZVxuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciB0aW1lb3V0ID0gdm9pZCAwLFxuICAgICAgY29udGV4dCA9IHZvaWQgMCxcbiAgICAgIGFyZ3MgPSB2b2lkIDAsXG4gICAgICByZXN1bHQgPSB2b2lkIDA7XG4gIHZhciBwcmV2aW91cyA9IDA7XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuXG4gIHZhciBsYXRlciA9IGZ1bmN0aW9uIGxhdGVyKCkge1xuICAgIHByZXZpb3VzID0gb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSA/IDAgOiBub3coKTtcbiAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICB9O1xuXG4gIHZhciB0aHJvdHRsZWQgPSBmdW5jdGlvbiB0aHJvdHRsZWQoKSB7XG4gICAgdmFyIGF0ID0gbm93KCk7XG4gICAgaWYgKCFwcmV2aW91cyAmJiBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlKSBwcmV2aW91cyA9IGF0O1xuICAgIHZhciByZW1haW5pbmcgPSB3YWl0IC0gKGF0IC0gcHJldmlvdXMpO1xuICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgaWYgKHJlbWFpbmluZyA8PSAwIHx8IHJlbWFpbmluZyA+IHdhaXQpIHtcbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgICBwcmV2aW91cyA9IGF0O1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQgJiYgb3B0aW9ucy50cmFpbGluZyAhPT0gZmFsc2UpIHtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHRocm90dGxlZC5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHByZXZpb3VzID0gMDtcbiAgICB0aW1lb3V0ID0gY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICB9O1xuXG4gIHJldHVybiB0aHJvdHRsZWQ7XG59XG5cbnZhciBNQVJHSU5fVFlQRSA9IHtcbiAgbHRyOiBbJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnXSxcbiAgcnRsOiBbJ21hcmdpblJpZ2h0JywgJ21hcmdpbkxlZnQnXVxufTtcblxuZnVuY3Rpb24gR2FwcyAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICB2YXIgR2FwcyA9IHtcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGdhcHMgYmV0d2VlbiBzbGlkZXMuIEZpcnN0IGFuZCBsYXN0XG4gICAgICogc2xpZGVzIGRvIG5vdCByZWNlaXZlIGl0J3MgZWRnZSBtYXJnaW5zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MQ29sbGVjdGlvbn0gc2xpZGVzXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBhcHBseTogZnVuY3Rpb24gYXBwbHkoc2xpZGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc2xpZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHNsaWRlc1tpXS5zdHlsZTtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IENvbXBvbmVudHMuRGlyZWN0aW9uLnZhbHVlO1xuXG4gICAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgICAgc3R5bGVbTUFSR0lOX1RZUEVbZGlyZWN0aW9uXVswXV0gPSB0aGlzLnZhbHVlIC8gMiArICdweCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3R5bGVbTUFSR0lOX1RZUEVbZGlyZWN0aW9uXVswXV0gPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpICE9PSBzbGlkZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHN0eWxlW01BUkdJTl9UWVBFW2RpcmVjdGlvbl1bMV1dID0gdGhpcy52YWx1ZSAvIDIgKyAncHgnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0eWxlW01BUkdJTl9UWVBFW2RpcmVjdGlvbl1bMV1dID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGdhcHMgZnJvbSB0aGUgc2xpZGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MQ29sbGVjdGlvbn0gc2xpZGVzXG4gICAgICogQHJldHVybnMge1ZvaWR9XG4gICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShzbGlkZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzbGlkZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHN0eWxlID0gc2xpZGVzW2ldLnN0eWxlO1xuXG4gICAgICAgIHN0eWxlLm1hcmdpbkxlZnQgPSAnJztcbiAgICAgICAgc3R5bGUubWFyZ2luUmlnaHQgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZGVmaW5lKEdhcHMsICd2YWx1ZScsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHZhbHVlIG9mIHRoZSBnYXAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRvSW50KEdsaWRlLnNldHRpbmdzLmdhcCk7XG4gICAgfVxuICB9KTtcblxuICBkZWZpbmUoR2FwcywgJ2dyb3cnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBhZGRpdGlvbmFsIGRpbWVudGlvbnMgdmFsdWUgY2F1c2VkIGJ5IGdhcHMuXG4gICAgICogVXNlZCB0byBpbmNyZWFzZSB3aWR0aCBvZiB0aGUgc2xpZGVzIHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIEdhcHMudmFsdWUgKiBDb21wb25lbnRzLlNpemVzLmxlbmd0aDtcbiAgICB9XG4gIH0pO1xuXG4gIGRlZmluZShHYXBzLCAncmVkdWN0b3InLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyByZWR1Y3Rpb24gdmFsdWUgY2F1c2VkIGJ5IGdhcHMuXG4gICAgICogVXNlZCB0byBzdWJ0cmFjdCB3aWR0aCBvZiB0aGUgc2xpZGVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBwZXJWaWV3ID0gR2xpZGUuc2V0dGluZ3MucGVyVmlldztcblxuICAgICAgcmV0dXJuIEdhcHMudmFsdWUgKiAocGVyVmlldyAtIDEpIC8gcGVyVmlldztcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBBcHBseSBjYWxjdWxhdGVkIGdhcHM6XG4gICAqIC0gYWZ0ZXIgYnVpbGRpbmcsIHNvIHNsaWRlcyAoaW5jbHVkaW5nIGNsb25lcykgd2lsbCByZWNlaXZlIHByb3BlciBtYXJnaW5zXG4gICAqIC0gb24gdXBkYXRpbmcgdmlhIEFQSSwgdG8gcmVjYWxjdWxhdGUgZ2FwcyB3aXRoIG5ldyBvcHRpb25zXG4gICAqL1xuICBFdmVudHMub24oWydidWlsZC5hZnRlcicsICd1cGRhdGUnXSwgdGhyb3R0bGUoZnVuY3Rpb24gKCkge1xuICAgIEdhcHMuYXBwbHkoQ29tcG9uZW50cy5IdG1sLndyYXBwZXIuY2hpbGRyZW4pO1xuICB9LCAzMCkpO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgZ2FwczpcbiAgICogLSBvbiBkZXN0cm95aW5nIHRvIGJyaW5nIG1hcmt1cCB0byBpdHMgaW5pdGFsIHN0YXRlXG4gICAqL1xuICBFdmVudHMub24oJ2Rlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgR2Fwcy5yZW1vdmUoQ29tcG9uZW50cy5IdG1sLndyYXBwZXIuY2hpbGRyZW4pO1xuICB9KTtcblxuICByZXR1cm4gR2Fwcztcbn1cblxuLyoqXG4gKiBGaW5kcyBzaWJsaW5ncyBub2RlcyBvZiB0aGUgcGFzc2VkIG5vZGUuXG4gKlxuICogQHBhcmFtICB7RWxlbWVudH0gbm9kZVxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdzKG5vZGUpIHtcbiAgaWYgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgdmFyIG4gPSBub2RlLnBhcmVudE5vZGUuZmlyc3RDaGlsZDtcbiAgICB2YXIgbWF0Y2hlZCA9IFtdO1xuXG4gICAgZm9yICg7IG47IG4gPSBuLm5leHRTaWJsaW5nKSB7XG4gICAgICBpZiAobi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBub2RlKSB7XG4gICAgICAgIG1hdGNoZWQucHVzaChuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hlZDtcbiAgfVxuXG4gIHJldHVybiBbXTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgcGFzc2VkIG5vZGUgZXhpc3QgYW5kIGlzIGEgdmFsaWQgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBleGlzdChub2RlKSB7XG4gIGlmIChub2RlICYmIG5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIFRSQUNLX1NFTEVDVE9SID0gJ1tkYXRhLWdsaWRlLWVsPVwidHJhY2tcIl0nO1xuXG5mdW5jdGlvbiBIdG1sIChHbGlkZSwgQ29tcG9uZW50cykge1xuICB2YXIgSHRtbCA9IHtcbiAgICAvKipcbiAgICAgKiBTZXR1cCBzbGlkZXIgSFRNTCBub2Rlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7R2xpZGV9IGdsaWRlXG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgdGhpcy5yb290ID0gR2xpZGUuc2VsZWN0b3I7XG4gICAgICB0aGlzLnRyYWNrID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoVFJBQ0tfU0VMRUNUT1IpO1xuICAgICAgdGhpcy5zbGlkZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLndyYXBwZXIuY2hpbGRyZW4pLmZpbHRlcihmdW5jdGlvbiAoc2xpZGUpIHtcbiAgICAgICAgcmV0dXJuICFzbGlkZS5jbGFzc0xpc3QuY29udGFpbnMoR2xpZGUuc2V0dGluZ3MuY2xhc3Nlcy5zbGlkZS5jbG9uZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgZGVmaW5lKEh0bWwsICdyb290Jywge1xuICAgIC8qKlxuICAgICAqIEdldHMgbm9kZSBvZiB0aGUgZ2xpZGUgbWFpbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIEh0bWwuX3I7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU2V0cyBub2RlIG9mIHRoZSBnbGlkZSBtYWluIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQocikge1xuICAgICAgaWYgKGlzU3RyaW5nKHIpKSB7XG4gICAgICAgIHIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhpc3QocikpIHtcbiAgICAgICAgSHRtbC5fciA9IHI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKCdSb290IGVsZW1lbnQgbXVzdCBiZSBhIGV4aXN0aW5nIEh0bWwgbm9kZScpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZGVmaW5lKEh0bWwsICd0cmFjaycsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIG5vZGUgb2YgdGhlIGdsaWRlIHRyYWNrIHdpdGggc2xpZGVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIEh0bWwuX3Q7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU2V0cyBub2RlIG9mIHRoZSBnbGlkZSB0cmFjayB3aXRoIHNsaWRlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh0KSB7XG4gICAgICBpZiAoZXhpc3QodCkpIHtcbiAgICAgICAgSHRtbC5fdCA9IHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKCdDb3VsZCBub3QgZmluZCB0cmFjayBlbGVtZW50LiBQbGVhc2UgdXNlICcgKyBUUkFDS19TRUxFQ1RPUiArICcgYXR0cmlidXRlLicpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZGVmaW5lKEh0bWwsICd3cmFwcGVyJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgbm9kZSBvZiB0aGUgc2xpZGVzIHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gSHRtbC50cmFjay5jaGlsZHJlblswXTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBIdG1sO1xufVxuXG5mdW5jdGlvbiBQZWVrIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIHZhciBQZWVrID0ge1xuICAgIC8qKlxuICAgICAqIFNldHVwcyBob3cgbXVjaCB0byBwZWVrIGJhc2VkIG9uIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBtb3VudDogZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgICB0aGlzLnZhbHVlID0gR2xpZGUuc2V0dGluZ3MucGVlaztcbiAgICB9XG4gIH07XG5cbiAgZGVmaW5lKFBlZWssICd2YWx1ZScsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHZhbHVlIG9mIHRoZSBwZWVrLlxuICAgICAqXG4gICAgICogQHJldHVybnMge051bWJlcnxPYmplY3R9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gUGVlay5fdjtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHZhbHVlIG9mIHRoZSBwZWVrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ8T2JqZWN0fSB2YWx1ZVxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuYmVmb3JlID0gdG9JbnQodmFsdWUuYmVmb3JlKTtcbiAgICAgICAgdmFsdWUuYWZ0ZXIgPSB0b0ludCh2YWx1ZS5hZnRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHRvSW50KHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgUGVlay5fdiA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVmaW5lKFBlZWssICdyZWR1Y3RvcicsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHJlZHVjdGlvbiB2YWx1ZSBjYXVzZWQgYnkgcGVlay5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBQZWVrLnZhbHVlO1xuICAgICAgdmFyIHBlclZpZXcgPSBHbGlkZS5zZXR0aW5ncy5wZXJWaWV3O1xuXG4gICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5iZWZvcmUgLyBwZXJWaWV3ICsgdmFsdWUuYWZ0ZXIgLyBwZXJWaWV3O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWUgKiAyIC8gcGVyVmlldztcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBSZWNhbGN1bGF0ZSBwZWVraW5nIHNpemVzIG9uOlxuICAgKiAtIHdoZW4gcmVzaXppbmcgd2luZG93IHRvIHVwZGF0ZSB0byBwcm9wZXIgcGVyY2VudHNcbiAgICovXG4gIEV2ZW50cy5vbihbJ3Jlc2l6ZScsICd1cGRhdGUnXSwgZnVuY3Rpb24gKCkge1xuICAgIFBlZWsubW91bnQoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIFBlZWs7XG59XG5cbmZ1bmN0aW9uIE1vdmUgKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgdmFyIE1vdmUgPSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBtb3ZlIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtWb2lkfVxuICAgICAqL1xuICAgIG1vdW50OiBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICAgIHRoaXMuX28gPSAwO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgYSBtb3ZlbWVudCB2YWx1ZSBiYXNlZCBvbiBwYXNzZWQgb2Zmc2V0IGFuZCBjdXJyZW50bHkgYWN0aXZlIGluZGV4LlxuICAgICAqXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBvZmZzZXRcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIG1ha2U6IGZ1bmN0aW9uIG1ha2UoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwO1xuXG4gICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcblxuICAgICAgRXZlbnRzLmVtaXQoJ21vdmUnLCB7XG4gICAgICAgIG1vdmVtZW50OiB0aGlzLnZhbHVlXG4gICAgICB9KTtcblxuICAgICAgQ29tcG9uZW50cy5UcmFuc2l0aW9uLmFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgRXZlbnRzLmVtaXQoJ21vdmUuYWZ0ZXInLCB7XG4gICAgICAgICAgbW92ZW1lbnQ6IF90aGlzLnZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGRlZmluZShNb3ZlLCAnb2Zmc2V0Jywge1xuICAgIC8qKlxuICAgICAqIEdldHMgYW4gb2Zmc2V0IHZhbHVlIHVzZWQgdG8gbW9kaWZ5IGN1cnJlbnQgdHJhbnNsYXRlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIE1vdmUuX287XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhbiBvZmZzZXQgdmFsdWUgdXNlZCB0byBtb2RpZnkgY3VycmVudCB0cmFuc2xhdGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIE1vdmUuX28gPSAhaXNVbmRlZmluZWQodmFsdWUpID8gdG9JbnQodmFsdWUpIDogMDtcbiAgICB9XG4gIH0pO1xuXG4gIGRlZmluZShNb3ZlLCAndHJhbnNsYXRlJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgYSByYXcgbW92ZW1lbnQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gQ29tcG9uZW50cy5TaXplcy5zbGlkZVdpZHRoICogR2xpZGUuaW5kZXg7XG4gICAgfVxuICB9KTtcblxuICBkZWZpbmUoTW92ZSwgJ3ZhbHVlJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYWN0dWFsIG1vdmVtZW50IHZhbHVlIGNvcnJlY3RlZCBieSBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICB2YXIgdHJhbnNsYXRlID0gdGhpcy50cmFuc2xhdGU7XG5cbiAgICAgIGlmIChDb21wb25lbnRzLkRpcmVjdGlvbi5pcygncnRsJykpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZSArIG9mZnNldDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYW5zbGF0ZSAtIG9mZnNldDtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBNYWtlIG1vdmVtZW50IHRvIHByb3BlciBzbGlkZSBvbjpcbiAgICogLSBiZWZvcmUgYnVpbGQsIHNvIGdsaWRlIHdpbGwgc3RhcnQgYXQgYHN0YXJ0QXRgIGluZGV4XG4gICAqIC0gb24gZWFjaCBzdGFuZGFyZCBydW4gdG8gbW92ZSB0byBuZXdseSBjYWxjdWxhdGVkIGluZGV4XG4gICAqL1xuICBFdmVudHMub24oWydidWlsZC5iZWZvcmUnLCAncnVuJ10sIGZ1bmN0aW9uICgpIHtcbiAgICBNb3ZlLm1ha2UoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIE1vdmU7XG59XG5cbmZ1bmN0aW9uIFNpemVzIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIHZhciBTaXplcyA9IHtcbiAgICAvKipcbiAgICAgKiBTZXR1cHMgZGltZW50aW9ucyBvZiBzbGlkZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHNldHVwU2xpZGVzOiBmdW5jdGlvbiBzZXR1cFNsaWRlcygpIHtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMuc2xpZGVXaWR0aCArICdweCc7XG4gICAgICB2YXIgc2xpZGVzID0gQ29tcG9uZW50cy5IdG1sLnNsaWRlcztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGlkZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2xpZGVzW2ldLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU2V0dXBzIGRpbWVudGlvbnMgb2Ygc2xpZGVzIHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHNldHVwV3JhcHBlcjogZnVuY3Rpb24gc2V0dXBXcmFwcGVyKCkge1xuICAgICAgQ29tcG9uZW50cy5IdG1sLndyYXBwZXIuc3R5bGUud2lkdGggPSB0aGlzLndyYXBwZXJTaXplICsgJ3B4JztcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFwcGxpZWQgc3R5bGVzIGZyb20gSFRNTCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtWb2lkfVxuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgdmFyIHNsaWRlcyA9IENvbXBvbmVudHMuSHRtbC5zbGlkZXM7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNsaWRlc1tpXS5zdHlsZS53aWR0aCA9ICcnO1xuICAgICAgfVxuXG4gICAgICBDb21wb25lbnRzLkh0bWwud3JhcHBlci5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cbiAgfTtcblxuICBkZWZpbmUoU2l6ZXMsICdsZW5ndGgnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBjb3VudCBudW1iZXIgb2YgdGhlIHNsaWRlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBDb21wb25lbnRzLkh0bWwuc2xpZGVzLmxlbmd0aDtcbiAgICB9XG4gIH0pO1xuXG4gIGRlZmluZShTaXplcywgJ3dpZHRoJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgd2lkdGggdmFsdWUgb2YgdGhlIHNsaWRlciAodmlzaWJsZSBhcmVhKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBDb21wb25lbnRzLkh0bWwucm9vdC5vZmZzZXRXaWR0aDtcbiAgICB9XG4gIH0pO1xuXG4gIGRlZmluZShTaXplcywgJ3dyYXBwZXJTaXplJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgc2l6ZSBvZiB0aGUgc2xpZGVzIHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gU2l6ZXMuc2xpZGVXaWR0aCAqIFNpemVzLmxlbmd0aCArIENvbXBvbmVudHMuR2Fwcy5ncm93ICsgQ29tcG9uZW50cy5DbG9uZXMuZ3JvdztcbiAgICB9XG4gIH0pO1xuXG4gIGRlZmluZShTaXplcywgJ3NsaWRlV2lkdGgnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB3aWR0aCB2YWx1ZSBvZiBhIHNpbmdsZSBzbGlkZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBTaXplcy53aWR0aCAvIEdsaWRlLnNldHRpbmdzLnBlclZpZXcgLSBDb21wb25lbnRzLlBlZWsucmVkdWN0b3IgLSBDb21wb25lbnRzLkdhcHMucmVkdWN0b3I7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogQXBwbHkgY2FsY3VsYXRlZCBnbGlkZSdzIGRpbWVuc2lvbnM6XG4gICAqIC0gYmVmb3JlIGJ1aWxkaW5nLCBzbyBvdGhlciBkaW1lbnRpb25zIChlLmcuIHRyYW5zbGF0ZSkgd2lsbCBiZSBjYWxjdWxhdGVkIHByb3BlcnRseVxuICAgKiAtIHdoZW4gcmVzaXppbmcgd2luZG93IHRvIHJlY2FsY3VsYXRlIHNpbGRlcyBkaW1lbnNpb25zXG4gICAqIC0gb24gdXBkYXRpbmcgdmlhIEFQSSwgdG8gY2FsY3VsYXRlIGRpbWVuc2lvbnMgYmFzZWQgb24gbmV3IG9wdGlvbnNcbiAgICovXG4gIEV2ZW50cy5vbihbJ2J1aWxkLmJlZm9yZScsICdyZXNpemUnLCAndXBkYXRlJ10sIGZ1bmN0aW9uICgpIHtcbiAgICBTaXplcy5zZXR1cFNsaWRlcygpO1xuICAgIFNpemVzLnNldHVwV3JhcHBlcigpO1xuICB9KTtcblxuICAvKipcbiAgICogUmVtb3ZlIGNhbGN1bGF0ZWQgZ2xpZGUncyBkaW1lbnNpb25zOlxuICAgKiAtIG9uIGRlc3RvdGluZyB0byBicmluZyBtYXJrdXAgdG8gaXRzIGluaXRhbCBzdGF0ZVxuICAgKi9cbiAgRXZlbnRzLm9uKCdkZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgIFNpemVzLnJlbW92ZSgpO1xuICB9KTtcblxuICByZXR1cm4gU2l6ZXM7XG59XG5cbmZ1bmN0aW9uIEJ1aWxkIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIHZhciBCdWlsZCA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0IGdsaWRlIGJ1aWxkaW5nLiBBZGRzIGNsYXNzZXMsIHNldHNcbiAgICAgKiBkaW1lbnNpb25zIGFuZCBzZXR1cHMgaW5pdGlhbCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgRXZlbnRzLmVtaXQoJ2J1aWxkLmJlZm9yZScpO1xuXG4gICAgICB0aGlzLnR5cGVDbGFzcygpO1xuICAgICAgdGhpcy5hY3RpdmVDbGFzcygpO1xuXG4gICAgICBFdmVudHMuZW1pdCgnYnVpbGQuYWZ0ZXInKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGB0eXBlYCBjbGFzcyB0byB0aGUgZ2xpZGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgdHlwZUNsYXNzOiBmdW5jdGlvbiB0eXBlQ2xhc3MoKSB7XG4gICAgICBDb21wb25lbnRzLkh0bWwucm9vdC5jbGFzc0xpc3QuYWRkKEdsaWRlLnNldHRpbmdzLmNsYXNzZXMudHlwZVtHbGlkZS5zZXR0aW5ncy50eXBlXSk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhY3RpdmUgY2xhc3MgdG8gY3VycmVudCBzbGlkZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYWN0aXZlQ2xhc3M6IGZ1bmN0aW9uIGFjdGl2ZUNsYXNzKCkge1xuICAgICAgdmFyIGNsYXNzZXMgPSBHbGlkZS5zZXR0aW5ncy5jbGFzc2VzO1xuICAgICAgdmFyIHNsaWRlID0gQ29tcG9uZW50cy5IdG1sLnNsaWRlc1tHbGlkZS5pbmRleF07XG5cbiAgICAgIGlmIChzbGlkZSkge1xuICAgICAgICBzbGlkZS5jbGFzc0xpc3QuYWRkKGNsYXNzZXMuc2xpZGUuYWN0aXZlKTtcblxuICAgICAgICBzaWJsaW5ncyhzbGlkZSkuZm9yRWFjaChmdW5jdGlvbiAoc2libGluZykge1xuICAgICAgICAgIHNpYmxpbmcuY2xhc3NMaXN0LnJlbW92ZShjbGFzc2VzLnNsaWRlLmFjdGl2ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgSFRNTCBjbGFzc2VzIGFwcGxpZWQgYXQgYnVpbGRpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHJlbW92ZUNsYXNzZXM6IGZ1bmN0aW9uIHJlbW92ZUNsYXNzZXMoKSB7XG4gICAgICB2YXIgX0dsaWRlJHNldHRpbmdzJGNsYXNzID0gR2xpZGUuc2V0dGluZ3MuY2xhc3NlcyxcbiAgICAgICAgICB0eXBlID0gX0dsaWRlJHNldHRpbmdzJGNsYXNzLnR5cGUsXG4gICAgICAgICAgc2xpZGUgPSBfR2xpZGUkc2V0dGluZ3MkY2xhc3Muc2xpZGU7XG5cblxuICAgICAgQ29tcG9uZW50cy5IdG1sLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSh0eXBlW0dsaWRlLnNldHRpbmdzLnR5cGVdKTtcblxuICAgICAgQ29tcG9uZW50cy5IdG1sLnNsaWRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzaWJsaW5nKSB7XG4gICAgICAgIHNpYmxpbmcuY2xhc3NMaXN0LnJlbW92ZShzbGlkZS5hY3RpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDbGVhciBidWlsZGluZyBjbGFzc2VzOlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcgdG8gYnJpbmcgSFRNTCB0byBpdHMgaW5pdGlhbCBzdGF0ZVxuICAgKiAtIG9uIHVwZGF0aW5nIHRvIHJlbW92ZSBjbGFzc2VzIGJlZm9yZSByZW1vdW50aW5nIGNvbXBvbmVudFxuICAgKi9cbiAgRXZlbnRzLm9uKFsnZGVzdHJveScsICd1cGRhdGUnXSwgZnVuY3Rpb24gKCkge1xuICAgIEJ1aWxkLnJlbW92ZUNsYXNzZXMoKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFJlbW91bnQgY29tcG9uZW50OlxuICAgKiAtIG9uIHJlc2l6aW5nIG9mIHRoZSB3aW5kb3cgdG8gY2FsY3VsYXRlIG5ldyBkaW1lbnRpb25zXG4gICAqIC0gb24gdXBkYXRpbmcgc2V0dGluZ3MgdmlhIEFQSVxuICAgKi9cbiAgRXZlbnRzLm9uKFsncmVzaXplJywgJ3VwZGF0ZSddLCBmdW5jdGlvbiAoKSB7XG4gICAgQnVpbGQubW91bnQoKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFN3YXAgYWN0aXZlIGNsYXNzIG9mIGN1cnJlbnQgc2xpZGU6XG4gICAqIC0gYWZ0ZXIgZWFjaCBtb3ZlIHRvIHRoZSBuZXcgaW5kZXhcbiAgICovXG4gIEV2ZW50cy5vbignbW92ZS5hZnRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBCdWlsZC5hY3RpdmVDbGFzcygpO1xuICB9KTtcblxuICByZXR1cm4gQnVpbGQ7XG59XG5cbmZ1bmN0aW9uIENsb25lcyAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICB2YXIgQ2xvbmVzID0ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwYXR0ZXJuIG1hcCBhbmQgY29sbGVjdCBzbGlkZXMgdG8gYmUgY2xvbmVkLlxuICAgICAqL1xuICAgIG1vdW50OiBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICAgIHRoaXMuaXRlbXMgPSBbXTtcblxuICAgICAgaWYgKEdsaWRlLmlzVHlwZSgnY2Fyb3VzZWwnKSkge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5jb2xsZWN0KCk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdCBjbG9uZXMgd2l0aCBwYXR0ZXJuLlxuICAgICAqXG4gICAgICogQHJldHVybiB7W119XG4gICAgICovXG4gICAgY29sbGVjdDogZnVuY3Rpb24gY29sbGVjdCgpIHtcbiAgICAgIHZhciBpdGVtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgICB2YXIgc2xpZGVzID0gQ29tcG9uZW50cy5IdG1sLnNsaWRlcztcbiAgICAgIHZhciBfR2xpZGUkc2V0dGluZ3MgPSBHbGlkZS5zZXR0aW5ncyxcbiAgICAgICAgICBwZXJWaWV3ID0gX0dsaWRlJHNldHRpbmdzLnBlclZpZXcsXG4gICAgICAgICAgY2xhc3NlcyA9IF9HbGlkZSRzZXR0aW5ncy5jbGFzc2VzO1xuXG5cbiAgICAgIHZhciBwZWVrSW5jcmVtZW50ZXIgPSArISFHbGlkZS5zZXR0aW5ncy5wZWVrO1xuICAgICAgdmFyIGNsb25lQ291bnQgPSBwZXJWaWV3ICsgcGVla0luY3JlbWVudGVyICsgTWF0aC5yb3VuZChwZXJWaWV3IC8gMik7XG4gICAgICB2YXIgYXBwZW5kID0gc2xpZGVzLnNsaWNlKDAsIGNsb25lQ291bnQpLnJldmVyc2UoKTtcbiAgICAgIHZhciBwcmVwZW5kID0gc2xpZGVzLnNsaWNlKGNsb25lQ291bnQgKiAtMSk7XG5cbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihwZXJWaWV3IC8gc2xpZGVzLmxlbmd0aCkpOyByKyspIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcHBlbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY2xvbmUgPSBhcHBlbmRbaV0uY2xvbmVOb2RlKHRydWUpO1xuXG4gICAgICAgICAgY2xvbmUuY2xhc3NMaXN0LmFkZChjbGFzc2VzLnNsaWRlLmNsb25lKTtcblxuICAgICAgICAgIGl0ZW1zLnB1c2goY2xvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHByZXBlbmQubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgdmFyIF9jbG9uZSA9IHByZXBlbmRbX2ldLmNsb25lTm9kZSh0cnVlKTtcblxuICAgICAgICAgIF9jbG9uZS5jbGFzc0xpc3QuYWRkKGNsYXNzZXMuc2xpZGUuY2xvbmUpO1xuXG4gICAgICAgICAgaXRlbXMudW5zaGlmdChfY2xvbmUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBBcHBlbmQgY2xvbmVkIHNsaWRlcyB3aXRoIGdlbmVyYXRlZCBwYXR0ZXJuLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBhcHBlbmQ6IGZ1bmN0aW9uIGFwcGVuZCgpIHtcbiAgICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgICB2YXIgX0NvbXBvbmVudHMkSHRtbCA9IENvbXBvbmVudHMuSHRtbCxcbiAgICAgICAgICB3cmFwcGVyID0gX0NvbXBvbmVudHMkSHRtbC53cmFwcGVyLFxuICAgICAgICAgIHNsaWRlcyA9IF9Db21wb25lbnRzJEh0bWwuc2xpZGVzO1xuXG5cbiAgICAgIHZhciBoYWxmID0gTWF0aC5mbG9vcihpdGVtcy5sZW5ndGggLyAyKTtcbiAgICAgIHZhciBwcmVwZW5kID0gaXRlbXMuc2xpY2UoMCwgaGFsZikucmV2ZXJzZSgpO1xuICAgICAgdmFyIGFwcGVuZCA9IGl0ZW1zLnNsaWNlKGhhbGYgKiAtMSkucmV2ZXJzZSgpO1xuICAgICAgdmFyIHdpZHRoID0gQ29tcG9uZW50cy5TaXplcy5zbGlkZVdpZHRoICsgJ3B4JztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcHBlbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChhcHBlbmRbaV0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBwcmVwZW5kLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgd3JhcHBlci5pbnNlcnRCZWZvcmUocHJlcGVuZFtfaTJdLCBzbGlkZXNbMF0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBpdGVtcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICAgIGl0ZW1zW19pM10uc3R5bGUud2lkdGggPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIGNsb25lZCBzbGlkZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcblxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLnJlbW92ZUNoaWxkKGl0ZW1zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZGVmaW5lKENsb25lcywgJ2dyb3cnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBhZGRpdGlvbmFsIGRpbWVudGlvbnMgdmFsdWUgY2F1c2VkIGJ5IGNsb25lcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiAoQ29tcG9uZW50cy5TaXplcy5zbGlkZVdpZHRoICsgQ29tcG9uZW50cy5HYXBzLnZhbHVlKSAqIENsb25lcy5pdGVtcy5sZW5ndGg7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogQXBwZW5kIGFkZGl0aW9uYWwgc2xpZGUncyBjbG9uZXM6XG4gICAqIC0gd2hpbGUgZ2xpZGUncyB0eXBlIGlzIGBjYXJvdXNlbGBcbiAgICovXG4gIEV2ZW50cy5vbigndXBkYXRlJywgZnVuY3Rpb24gKCkge1xuICAgIENsb25lcy5yZW1vdmUoKTtcbiAgICBDbG9uZXMubW91bnQoKTtcbiAgICBDbG9uZXMuYXBwZW5kKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBBcHBlbmQgYWRkaXRpb25hbCBzbGlkZSdzIGNsb25lczpcbiAgICogLSB3aGlsZSBnbGlkZSdzIHR5cGUgaXMgYGNhcm91c2VsYFxuICAgKi9cbiAgRXZlbnRzLm9uKCdidWlsZC5iZWZvcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKEdsaWRlLmlzVHlwZSgnY2Fyb3VzZWwnKSkge1xuICAgICAgQ2xvbmVzLmFwcGVuZCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBjbG9uZXMgSFRNTEVsZW1lbnRzOlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcsIHRvIGJyaW5nIEhUTUwgdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgICovXG4gIEV2ZW50cy5vbignZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICBDbG9uZXMucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBDbG9uZXM7XG59XG5cbnZhciBFdmVudHNCaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBFdmVudHNCaW5kZXIgaW5zdGFuY2UuXG4gICAqL1xuICBmdW5jdGlvbiBFdmVudHNCaW5kZXIoKSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRzQmluZGVyKTtcblxuICAgIHRoaXMubGlzdGVuZXJzID0gbGlzdGVuZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZXZlbnRzIGxpc3RlbmVycyB0byBhcnJvd3MgSFRNTCBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtICB7U3RyaW5nfEFycmF5fSBldmVudHNcbiAgICogQHBhcmFtICB7RWxlbWVudHxXaW5kb3d8RG9jdW1lbnR9IGVsXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjbG9zdXJlXG4gICAqIEBwYXJhbSAge0Jvb2xlYW58T2JqZWN0fSBjYXB0dXJlXG4gICAqIEByZXR1cm4ge1ZvaWR9XG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoRXZlbnRzQmluZGVyLCBbe1xuICAgIGtleTogJ29uJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnRzLCBlbCwgY2xvc3VyZSkge1xuICAgICAgdmFyIGNhcHR1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuXG4gICAgICBpZiAoaXNTdHJpbmcoZXZlbnRzKSkge1xuICAgICAgICBldmVudHMgPSBbZXZlbnRzXTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnRzW2ldXSA9IGNsb3N1cmU7XG5cbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudHNbaV0sIHRoaXMubGlzdGVuZXJzW2V2ZW50c1tpXV0sIGNhcHR1cmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzIGZyb20gYXJyb3dzIEhUTUwgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXl9IGV2ZW50c1xuICAgICAqIEBwYXJhbSAge0VsZW1lbnR8V2luZG93fERvY3VtZW50fSBlbFxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW58T2JqZWN0fSBjYXB0dXJlXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnb2ZmJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKGV2ZW50cywgZWwpIHtcbiAgICAgIHZhciBjYXB0dXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICAgICAgaWYgKGlzU3RyaW5nKGV2ZW50cykpIHtcbiAgICAgICAgZXZlbnRzID0gW2V2ZW50c107XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRzW2ldLCB0aGlzLmxpc3RlbmVyc1tldmVudHNbaV1dLCBjYXB0dXJlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGNvbGxlY3RlZCBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Vm9pZH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnM7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBFdmVudHNCaW5kZXI7XG59KCk7XG5cbmZ1bmN0aW9uIFJlc2l6ZSAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIGJpbmRlciBmb3IgRE9NIEV2ZW50cy5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50c0JpbmRlcn1cbiAgICovXG4gIHZhciBCaW5kZXIgPSBuZXcgRXZlbnRzQmluZGVyKCk7XG5cbiAgdmFyIFJlc2l6ZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyB3aW5kb3cgYmluZGluZ3MuXG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgdGhpcy5iaW5kKCk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQmluZHMgYHJlenNpemVgIGxpc3RlbmVyIHRvIHRoZSB3aW5kb3cuXG4gICAgICogSXQncyBhIGNvc3RseSBldmVudCwgc28gd2UgYXJlIGRlYm91bmNpbmcgaXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGJpbmQ6IGZ1bmN0aW9uIGJpbmQoKSB7XG4gICAgICBCaW5kZXIub24oJ3Jlc2l6ZScsIHdpbmRvdywgdGhyb3R0bGUoZnVuY3Rpb24gKCkge1xuICAgICAgICBFdmVudHMuZW1pdCgncmVzaXplJyk7XG4gICAgICB9LCBHbGlkZS5zZXR0aW5ncy50aHJvdHRsZSkpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFVuYmluZHMgbGlzdGVuZXJzIGZyb20gdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQoKSB7XG4gICAgICBCaW5kZXIub2ZmKCdyZXNpemUnLCB3aW5kb3cpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGJpbmRpbmdzIGZyb20gd2luZG93OlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcsIHRvIHJlbW92ZSBhZGRlZCBFdmVudExpc3RlbmVyXG4gICAqL1xuICBFdmVudHMub24oJ2Rlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgUmVzaXplLnVuYmluZCgpO1xuICAgIEJpbmRlci5kZXN0cm95KCk7XG4gIH0pO1xuXG4gIHJldHVybiBSZXNpemU7XG59XG5cbnZhciBWQUxJRF9ESVJFQ1RJT05TID0gWydsdHInLCAncnRsJ107XG52YXIgRkxJUEVEX01PVkVNRU5UUyA9IHtcbiAgJz4nOiAnPCcsXG4gICc8JzogJz4nLFxuICAnPSc6ICc9J1xufTtcblxuZnVuY3Rpb24gRGlyZWN0aW9uIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIHZhciBEaXJlY3Rpb24gPSB7XG4gICAgLyoqXG4gICAgICogU2V0dXBzIGdhcCB2YWx1ZSBiYXNlZCBvbiBzZXR0aW5ncy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgdGhpcy52YWx1ZSA9IEdsaWRlLnNldHRpbmdzLmRpcmVjdGlvbjtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBwYXR0ZXJuIGJhc2VkIG9uIGRpcmVjdGlvbiB2YWx1ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm5cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUocGF0dGVybikge1xuICAgICAgdmFyIHRva2VuID0gcGF0dGVybi5zbGljZSgwLCAxKTtcblxuICAgICAgaWYgKHRoaXMuaXMoJ3J0bCcpKSB7XG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnNwbGl0KHRva2VuKS5qb2luKEZMSVBFRF9NT1ZFTUVOVFNbdG9rZW5dKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHZhbHVlIG9mIGRpcmVjdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRpcmVjdGlvblxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzOiBmdW5jdGlvbiBpcyhkaXJlY3Rpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlID09PSBkaXJlY3Rpb247XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBkaXJlY3Rpb24gY2xhc3MgdG8gdGhlIHJvb3QgSFRNTCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBhZGRDbGFzczogZnVuY3Rpb24gYWRkQ2xhc3MoKSB7XG4gICAgICBDb21wb25lbnRzLkh0bWwucm9vdC5jbGFzc0xpc3QuYWRkKEdsaWRlLnNldHRpbmdzLmNsYXNzZXMuZGlyZWN0aW9uW3RoaXMudmFsdWVdKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGRpcmVjdGlvbiBjbGFzcyBmcm9tIHRoZSByb290IEhUTUwgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKCkge1xuICAgICAgQ29tcG9uZW50cy5IdG1sLnJvb3QuY2xhc3NMaXN0LnJlbW92ZShHbGlkZS5zZXR0aW5ncy5jbGFzc2VzLmRpcmVjdGlvblt0aGlzLnZhbHVlXSk7XG4gICAgfVxuICB9O1xuXG4gIGRlZmluZShEaXJlY3Rpb24sICd2YWx1ZScsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHZhbHVlIG9mIHRoZSBkaXJlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERpcmVjdGlvbi5fdjtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHZhbHVlIG9mIHRoZSBkaXJlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBpZiAoVkFMSURfRElSRUNUSU9OUy5pbmRleE9mKHZhbHVlKSA+IC0xKSB7XG4gICAgICAgIERpcmVjdGlvbi5fdiA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybignRGlyZWN0aW9uIHZhbHVlIG11c3QgYmUgYGx0cmAgb3IgYHJ0bGAnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBDbGVhciBkaXJlY3Rpb24gY2xhc3M6XG4gICAqIC0gb24gZGVzdHJveSB0byBicmluZyBIVE1MIHRvIGl0cyBpbml0aWFsIHN0YXRlXG4gICAqIC0gb24gdXBkYXRlIHRvIHJlbW92ZSBjbGFzcyBiZWZvcmUgcmVhcHBsaW5nIGJlbGxvd1xuICAgKi9cbiAgRXZlbnRzLm9uKFsnZGVzdHJveScsICd1cGRhdGUnXSwgZnVuY3Rpb24gKCkge1xuICAgIERpcmVjdGlvbi5yZW1vdmVDbGFzcygpO1xuICB9KTtcblxuICAvKipcbiAgICogUmVtb3VudCBjb21wb25lbnQ6XG4gICAqIC0gb24gdXBkYXRlIHRvIHJlZmxlY3QgY2hhbmdlcyBpbiBkaXJlY3Rpb24gdmFsdWVcbiAgICovXG4gIEV2ZW50cy5vbigndXBkYXRlJywgZnVuY3Rpb24gKCkge1xuICAgIERpcmVjdGlvbi5tb3VudCgpO1xuICB9KTtcblxuICAvKipcbiAgICogQXBwbHkgZGlyZWN0aW9uIGNsYXNzOlxuICAgKiAtIGJlZm9yZSBidWlsZGluZyB0byBhcHBseSBjbGFzcyBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICogLSBvbiB1cGRhdGluZyB0byByZWFwcGx5IGRpcmVjdGlvbiBjbGFzcyB0aGF0IG1heSBjaGFuZ2VkXG4gICAqL1xuICBFdmVudHMub24oWydidWlsZC5iZWZvcmUnLCAndXBkYXRlJ10sIGZ1bmN0aW9uICgpIHtcbiAgICBEaXJlY3Rpb24uYWRkQ2xhc3MoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIERpcmVjdGlvbjtcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyB2YWx1ZSBvZiBnbGlkZSBtb3ZlbWVudC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IEdsaWRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IENvbXBvbmVudHNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gUnRsIChHbGlkZSwgQ29tcG9uZW50cykge1xuICByZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIE5lZ2F0ZXMgdGhlIHBhc3NlZCB0cmFuc2xhdGUgaWYgZ2xpZGUgaXMgaW4gUlRMIG9wdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gdHJhbnNsYXRlXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIG1vZGlmeTogZnVuY3Rpb24gbW9kaWZ5KHRyYW5zbGF0ZSkge1xuICAgICAgaWYgKENvbXBvbmVudHMuRGlyZWN0aW9uLmlzKCdydGwnKSkge1xuICAgICAgICByZXR1cm4gLXRyYW5zbGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYW5zbGF0ZTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXBkYXRlcyBnbGlkZSBtb3ZlbWVudCB3aXRoIGEgYGdhcGAgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBHbGlkZVxuICogQHBhcmFtICB7T2JqZWN0fSBDb21wb25lbnRzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIEdhcCAoR2xpZGUsIENvbXBvbmVudHMpIHtcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBNb2RpZmllcyBwYXNzZWQgdHJhbnNsYXRlIHZhbHVlIHdpdGggbnVtYmVyIGluIHRoZSBgZ2FwYCBzZXR0aW5ncy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gdHJhbnNsYXRlXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIG1vZGlmeTogZnVuY3Rpb24gbW9kaWZ5KHRyYW5zbGF0ZSkge1xuICAgICAgdmFyIG11bHRpcGxpZXIgPSBNYXRoLmZsb29yKHRyYW5zbGF0ZSAvIENvbXBvbmVudHMuU2l6ZXMuc2xpZGVXaWR0aCk7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlICsgQ29tcG9uZW50cy5HYXBzLnZhbHVlICogbXVsdGlwbGllcjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXBkYXRlcyBnbGlkZSBtb3ZlbWVudCB3aXRoIHdpZHRoIG9mIGFkZGl0aW9uYWwgY2xvbmVzIHdpZHRoLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gR2xpZGVcbiAqIEBwYXJhbSAge09iamVjdH0gQ29tcG9uZW50c1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBHcm93IChHbGlkZSwgQ29tcG9uZW50cykge1xuICByZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIEFkZHMgdG8gdGhlIHBhc3NlZCB0cmFuc2xhdGUgd2lkdGggb2YgdGhlIGhhbGYgb2YgY2xvbmVzLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSB0cmFuc2xhdGVcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgbW9kaWZ5OiBmdW5jdGlvbiBtb2RpZnkodHJhbnNsYXRlKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlICsgQ29tcG9uZW50cy5DbG9uZXMuZ3JvdyAvIDI7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgZ2xpZGUgbW92ZW1lbnQgd2l0aCBhIGBwZWVrYCBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IEdsaWRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IENvbXBvbmVudHNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gUGVla2luZyAoR2xpZGUsIENvbXBvbmVudHMpIHtcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBNb2RpZmllcyBwYXNzZWQgdHJhbnNsYXRlIHZhbHVlIHdpdGggYSBgcGVla2Agc2V0dGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gdHJhbnNsYXRlXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIG1vZGlmeTogZnVuY3Rpb24gbW9kaWZ5KHRyYW5zbGF0ZSkge1xuICAgICAgaWYgKEdsaWRlLnNldHRpbmdzLmZvY3VzQXQgPj0gMCkge1xuICAgICAgICB2YXIgcGVlayA9IENvbXBvbmVudHMuUGVlay52YWx1ZTtcblxuICAgICAgICBpZiAoaXNPYmplY3QocGVlaykpIHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlIC0gcGVlay5iZWZvcmU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlIC0gcGVlaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYW5zbGF0ZTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXBkYXRlcyBnbGlkZSBtb3ZlbWVudCB3aXRoIGEgYGZvY3VzQXRgIHNldHRpbmdzLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gR2xpZGVcbiAqIEBwYXJhbSAge09iamVjdH0gQ29tcG9uZW50c1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBGb2N1c2luZyAoR2xpZGUsIENvbXBvbmVudHMpIHtcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBNb2RpZmllcyBwYXNzZWQgdHJhbnNsYXRlIHZhbHVlIHdpdGggaW5kZXggaW4gdGhlIGBmb2N1c0F0YCBzZXR0aW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSB0cmFuc2xhdGVcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgbW9kaWZ5OiBmdW5jdGlvbiBtb2RpZnkodHJhbnNsYXRlKSB7XG4gICAgICB2YXIgZ2FwID0gQ29tcG9uZW50cy5HYXBzLnZhbHVlO1xuICAgICAgdmFyIHdpZHRoID0gQ29tcG9uZW50cy5TaXplcy53aWR0aDtcbiAgICAgIHZhciBmb2N1c0F0ID0gR2xpZGUuc2V0dGluZ3MuZm9jdXNBdDtcbiAgICAgIHZhciBzbGlkZVdpZHRoID0gQ29tcG9uZW50cy5TaXplcy5zbGlkZVdpZHRoO1xuXG4gICAgICBpZiAoZm9jdXNBdCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZSAtICh3aWR0aCAvIDIgLSBzbGlkZVdpZHRoIC8gMik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cmFuc2xhdGUgLSBzbGlkZVdpZHRoICogZm9jdXNBdCAtIGdhcCAqIGZvY3VzQXQ7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEFwcGxpZXMgZGlmZnJlbnQgdHJhbnNmb3JtZXJzIG9uIHRyYW5zbGF0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IEdsaWRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IENvbXBvbmVudHNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbXV0YXRvciAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICAvKipcbiAgICogTWVyZ2UgaW5zdGFuY2UgdHJhbnNmb3JtZXJzIHdpdGggY29sbGVjdGlvbiBvZiBkZWZhdWx0IHRyYW5zZm9ybWVycy5cbiAgICogSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgUnRsIGNvbXBvbmVudCBiZSBsYXN0IG9uIHRoZSBsaXN0LFxuICAgKiBzbyBpdCByZWZsZWN0cyBhbGwgcHJldmlvdXMgdHJhbnNmb3JtYXRpb25zLlxuICAgKlxuICAgKiBAdHlwZSB7QXJyYXl9XG4gICAqL1xuICB2YXIgVFJBTlNGT1JNRVJTID0gW0dhcCwgR3JvdywgUGVla2luZywgRm9jdXNpbmddLmNvbmNhdChHbGlkZS5fdCwgW1J0bF0pO1xuXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogUGlwbGluZXMgdHJhbnNsYXRlIHZhbHVlIHdpdGggcmVnaXN0ZXJlZCB0cmFuc2Zvcm1lcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHRyYW5zbGF0ZVxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZSh0cmFuc2xhdGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgVFJBTlNGT1JNRVJTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm1lciA9IFRSQU5TRk9STUVSU1tpXTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbih0cmFuc2Zvcm1lcikgJiYgaXNGdW5jdGlvbih0cmFuc2Zvcm1lcigpLm1vZGlmeSkpIHtcbiAgICAgICAgICB0cmFuc2xhdGUgPSB0cmFuc2Zvcm1lcihHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKS5tb2RpZnkodHJhbnNsYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YXJuKCdUcmFuc2Zvcm1lciBzaG91bGQgYmUgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gb2JqZWN0IHdpdGggYG1vZGlmeSgpYCBtZXRob2QnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhbnNsYXRlO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gVHJhbnNsYXRlIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIHZhciBUcmFuc2xhdGUgPSB7XG4gICAgLyoqXG4gICAgICogU2V0cyB2YWx1ZSBvZiB0cmFuc2xhdGUgb24gSFRNTCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IG11dGF0b3IoR2xpZGUsIENvbXBvbmVudHMpLm11dGF0ZSh2YWx1ZSk7XG5cbiAgICAgIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUzZCgnICsgLTEgKiB0cmFuc2Zvcm0gKyAncHgsIDBweCwgMHB4KSc7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB2YWx1ZSBvZiB0cmFuc2xhdGUgZnJvbSBIVE1MIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgQ29tcG9uZW50cy5IdG1sLndyYXBwZXIuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldFN0YXJ0SW5kZXg6IGZ1bmN0aW9uIGdldFN0YXJ0SW5kZXgoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gQ29tcG9uZW50cy5TaXplcy5sZW5ndGg7XG4gICAgICB2YXIgaW5kZXggPSBHbGlkZS5pbmRleDtcbiAgICAgIHZhciBwZXJWaWV3ID0gR2xpZGUuc2V0dGluZ3MucGVyVmlldztcblxuICAgICAgaWYgKENvbXBvbmVudHMuUnVuLmlzT2Zmc2V0KCc+JykgfHwgQ29tcG9uZW50cy5SdW4uaXNPZmZzZXQoJ3w+JykpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCArIChpbmRleCAtIHBlclZpZXcpO1xuICAgICAgfVxuXG4gICAgICAvLyBcIm1vZHVsbyBsZW5ndGhcIiBjb252ZXJ0cyBhbiBpbmRleCB0aGF0IGVxdWFscyBsZW5ndGggdG8gemVyb1xuICAgICAgcmV0dXJuIChpbmRleCArIHBlclZpZXcpICUgbGVuZ3RoO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRUcmF2ZWxEaXN0YW5jZTogZnVuY3Rpb24gZ2V0VHJhdmVsRGlzdGFuY2UoKSB7XG4gICAgICB2YXIgdHJhdmVsRGlzdGFuY2UgPSBDb21wb25lbnRzLlNpemVzLnNsaWRlV2lkdGggKiBHbGlkZS5zZXR0aW5ncy5wZXJWaWV3O1xuXG4gICAgICBpZiAoQ29tcG9uZW50cy5SdW4uaXNPZmZzZXQoJz4nKSB8fCBDb21wb25lbnRzLlJ1bi5pc09mZnNldCgnfD4nKSkge1xuICAgICAgICAvLyByZXZlcnNlIHRyYXZlbCBkaXN0YW5jZSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2hhbmdlIHN1YnRyYWN0IG9wZXJhdGlvbnNcbiAgICAgICAgcmV0dXJuIHRyYXZlbERpc3RhbmNlICogLTE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cmF2ZWxEaXN0YW5jZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBuZXcgdHJhbnNsYXRlIHZhbHVlOlxuICAgKiAtIG9uIG1vdmUgdG8gcmVmbGVjdCBpbmRleCBjaGFuZ2VcbiAgICogLSBvbiB1cGRhdGluZyB2aWEgQVBJIHRvIHJlZmxlY3QgcG9zc2libGUgY2hhbmdlcyBpbiBvcHRpb25zXG4gICAqL1xuICBFdmVudHMub24oJ21vdmUnLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIGlmICghR2xpZGUuaXNUeXBlKCdjYXJvdXNlbCcpIHx8ICFDb21wb25lbnRzLlJ1bi5pc09mZnNldCgpKSB7XG4gICAgICByZXR1cm4gVHJhbnNsYXRlLnNldChjb250ZXh0Lm1vdmVtZW50KTtcbiAgICB9XG5cbiAgICBDb21wb25lbnRzLlRyYW5zaXRpb24uYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgRXZlbnRzLmVtaXQoJ3RyYW5zbGF0ZS5qdW1wJyk7XG5cbiAgICAgIFRyYW5zbGF0ZS5zZXQoQ29tcG9uZW50cy5TaXplcy5zbGlkZVdpZHRoICogR2xpZGUuaW5kZXgpO1xuICAgIH0pO1xuXG4gICAgdmFyIHN0YXJ0V2lkdGggPSBDb21wb25lbnRzLlNpemVzLnNsaWRlV2lkdGggKiBDb21wb25lbnRzLlRyYW5zbGF0ZS5nZXRTdGFydEluZGV4KCk7XG4gICAgcmV0dXJuIFRyYW5zbGF0ZS5zZXQoc3RhcnRXaWR0aCAtIENvbXBvbmVudHMuVHJhbnNsYXRlLmdldFRyYXZlbERpc3RhbmNlKCkpO1xuICB9KTtcblxuICAvKipcbiAgICogUmVtb3ZlIHRyYW5zbGF0ZTpcbiAgICogLSBvbiBkZXN0cm95aW5nIHRvIGJyaW5nIG1hcmt1cCB0byBpdHMgaW5pdGFsIHN0YXRlXG4gICAqL1xuICBFdmVudHMub24oJ2Rlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgVHJhbnNsYXRlLnJlbW92ZSgpO1xuICB9KTtcblxuICByZXR1cm4gVHJhbnNsYXRlO1xufVxuXG5mdW5jdGlvbiBUcmFuc2l0aW9uIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIC8qKlxuICAgKiBIb2xkcyBpbmFjdGl2aXR5IHN0YXR1cyBvZiB0cmFuc2l0aW9uLlxuICAgKiBXaGVuIHRydWUgdHJhbnNpdGlvbiBpcyBub3QgYXBwbGllZC5cbiAgICpcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICB2YXIgZGlzYWJsZWQgPSBmYWxzZTtcblxuICB2YXIgVHJhbnNpdGlvbiA9IHtcbiAgICAvKipcbiAgICAgKiBDb21wb3NlcyBzdHJpbmcgb2YgdGhlIENTUyB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGNvbXBvc2U6IGZ1bmN0aW9uIGNvbXBvc2UocHJvcGVydHkpIHtcbiAgICAgIHZhciBzZXR0aW5ncyA9IEdsaWRlLnNldHRpbmdzO1xuXG4gICAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eSArICcgJyArIHRoaXMuZHVyYXRpb24gKyAnbXMgJyArIHNldHRpbmdzLmFuaW1hdGlvblRpbWluZ0Z1bmM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9wZXJ0eSArICcgMG1zICcgKyBzZXR0aW5ncy5hbmltYXRpb25UaW1pbmdGdW5jO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFNldHMgdmFsdWUgb2YgdHJhbnNpdGlvbiBvbiBIVE1MIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IHByb3BlcnR5XG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ3RyYW5zZm9ybSc7XG5cbiAgICAgIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLnN0eWxlLnRyYW5zaXRpb24gPSB0aGlzLmNvbXBvc2UocHJvcGVydHkpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdmFsdWUgb2YgdHJhbnNpdGlvbiBmcm9tIEhUTUwgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICBDb21wb25lbnRzLkh0bWwud3JhcHBlci5zdHlsZS50cmFuc2l0aW9uID0gJyc7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogUnVucyBjYWxsYmFjayBhZnRlciBhbmltYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGFmdGVyOiBmdW5jdGlvbiBhZnRlcihjYWxsYmFjaykge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LCB0aGlzLmR1cmF0aW9uKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgZW5hYmxlOiBmdW5jdGlvbiBlbmFibGUoKSB7XG4gICAgICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICB0aGlzLnNldCgpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgZGlzYWJsZTogZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICAgIGRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5zZXQoKTtcbiAgICB9XG4gIH07XG5cbiAgZGVmaW5lKFRyYW5zaXRpb24sICdkdXJhdGlvbicsIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIGJhc2VkXG4gICAgICogb24gY3VycmVudGx5IHJ1bm5pbmcgYW5pbWF0aW9uIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgc2V0dGluZ3MgPSBHbGlkZS5zZXR0aW5ncztcblxuICAgICAgaWYgKEdsaWRlLmlzVHlwZSgnc2xpZGVyJykgJiYgQ29tcG9uZW50cy5SdW4ub2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5ncy5yZXdpbmREdXJhdGlvbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNldHRpbmdzLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIFNldCB0cmFuc2l0aW9uIGBzdHlsZWAgdmFsdWU6XG4gICAqIC0gb24gZWFjaCBtb3ZpbmcsIGJlY2F1c2UgaXQgbWF5IGJlIGNsZWFyZWQgYnkgb2Zmc2V0IG1vdmVcbiAgICovXG4gIEV2ZW50cy5vbignbW92ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBUcmFuc2l0aW9uLnNldCgpO1xuICB9KTtcblxuICAvKipcbiAgICogRGlzYWJsZSB0cmFuc2l0aW9uOlxuICAgKiAtIGJlZm9yZSBpbml0aWFsIGJ1aWxkIHRvIGF2b2lkIHRyYW5zaXRpb25pbmcgZnJvbSBgMGAgdG8gYHN0YXJ0QXRgIGluZGV4XG4gICAqIC0gd2hpbGUgcmVzaXppbmcgd2luZG93IGFuZCByZWNhbGN1bGF0aW5nIGRpbWVudGlvbnNcbiAgICogLSBvbiBqdW1waW5nIGZyb20gb2Zmc2V0IHRyYW5zaXRpb24gYXQgc3RhcnQgYW5kIGVuZCBlZGdlcyBpbiBgY2Fyb3VzZWxgIHR5cGVcbiAgICovXG4gIEV2ZW50cy5vbihbJ2J1aWxkLmJlZm9yZScsICdyZXNpemUnLCAndHJhbnNsYXRlLmp1bXAnXSwgZnVuY3Rpb24gKCkge1xuICAgIFRyYW5zaXRpb24uZGlzYWJsZSgpO1xuICB9KTtcblxuICAvKipcbiAgICogRW5hYmxlIHRyYW5zaXRpb246XG4gICAqIC0gb24gZWFjaCBydW5uaW5nLCBiZWNhdXNlIGl0IG1heSBiZSBkaXNhYmxlZCBieSBvZmZzZXQgbW92ZVxuICAgKi9cbiAgRXZlbnRzLm9uKCdydW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgVHJhbnNpdGlvbi5lbmFibGUoKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0cmFuc2l0aW9uOlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcgdG8gYnJpbmcgbWFya3VwIHRvIGl0cyBpbml0YWwgc3RhdGVcbiAgICovXG4gIEV2ZW50cy5vbignZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICBUcmFuc2l0aW9uLnJlbW92ZSgpO1xuICB9KTtcblxuICByZXR1cm4gVHJhbnNpdGlvbjtcbn1cblxuLyoqXG4gKiBUZXN0IHZpYSBhIGdldHRlciBpbiB0aGUgb3B0aW9ucyBvYmplY3QgdG8gc2VlXG4gKiBpZiB0aGUgcGFzc2l2ZSBwcm9wZXJ0eSBpcyBhY2Nlc3NlZC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL0V2ZW50TGlzdGVuZXJPcHRpb25zL2Jsb2IvZ2gtcGFnZXMvZXhwbGFpbmVyLm1kI2ZlYXR1cmUtZGV0ZWN0aW9uXG4gKi9cblxudmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlJywgbnVsbCwgb3B0cyk7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIG9wdHMpO1xufSBjYXRjaCAoZSkge31cblxudmFyIHN1cHBvcnRzUGFzc2l2ZSQxID0gc3VwcG9ydHNQYXNzaXZlO1xuXG52YXIgU1RBUlRfRVZFTlRTID0gWyd0b3VjaHN0YXJ0JywgJ21vdXNlZG93biddO1xudmFyIE1PVkVfRVZFTlRTID0gWyd0b3VjaG1vdmUnLCAnbW91c2Vtb3ZlJ107XG52YXIgRU5EX0VWRU5UUyA9IFsndG91Y2hlbmQnLCAndG91Y2hjYW5jZWwnLCAnbW91c2V1cCcsICdtb3VzZWxlYXZlJ107XG52YXIgTU9VU0VfRVZFTlRTID0gWydtb3VzZWRvd24nLCAnbW91c2Vtb3ZlJywgJ21vdXNldXAnLCAnbW91c2VsZWF2ZSddO1xuXG5mdW5jdGlvbiBzd2lwZSAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIGJpbmRlciBmb3IgRE9NIEV2ZW50cy5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50c0JpbmRlcn1cbiAgICovXG4gIHZhciBCaW5kZXIgPSBuZXcgRXZlbnRzQmluZGVyKCk7XG5cbiAgdmFyIHN3aXBlU2luID0gMDtcbiAgdmFyIHN3aXBlU3RhcnRYID0gMDtcbiAgdmFyIHN3aXBlU3RhcnRZID0gMDtcbiAgdmFyIGRpc2FibGVkID0gZmFsc2U7XG4gIHZhciBjYXB0dXJlID0gc3VwcG9ydHNQYXNzaXZlJDEgPyB7IHBhc3NpdmU6IHRydWUgfSA6IGZhbHNlO1xuXG4gIHZhciBTd2lwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBzd2lwZSBiaW5kaW5ncy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgdGhpcy5iaW5kU3dpcGVTdGFydCgpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXIgZm9yIGBzd2lwZXN0YXJ0YCBldmVudC4gQ2FsY3VsYXRlcyBlbnRyeSBwb2ludHMgb2YgdGhlIHVzZXIncyB0YXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHN0YXJ0OiBmdW5jdGlvbiBzdGFydChldmVudCkge1xuICAgICAgaWYgKCFkaXNhYmxlZCAmJiAhR2xpZGUuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlKCk7XG5cbiAgICAgICAgdmFyIHN3aXBlID0gdGhpcy50b3VjaGVzKGV2ZW50KTtcblxuICAgICAgICBzd2lwZVNpbiA9IG51bGw7XG4gICAgICAgIHN3aXBlU3RhcnRYID0gdG9JbnQoc3dpcGUucGFnZVgpO1xuICAgICAgICBzd2lwZVN0YXJ0WSA9IHRvSW50KHN3aXBlLnBhZ2VZKTtcblxuICAgICAgICB0aGlzLmJpbmRTd2lwZU1vdmUoKTtcbiAgICAgICAgdGhpcy5iaW5kU3dpcGVFbmQoKTtcblxuICAgICAgICBFdmVudHMuZW1pdCgnc3dpcGUuc3RhcnQnKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIGZvciBgc3dpcGVtb3ZlYCBldmVudC4gQ2FsY3VsYXRlcyB1c2VyJ3MgdGFwIGFuZ2xlIGFuZCBkaXN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAqL1xuICAgIG1vdmU6IGZ1bmN0aW9uIG1vdmUoZXZlbnQpIHtcbiAgICAgIGlmICghR2xpZGUuZGlzYWJsZWQpIHtcbiAgICAgICAgdmFyIF9HbGlkZSRzZXR0aW5ncyA9IEdsaWRlLnNldHRpbmdzLFxuICAgICAgICAgICAgdG91Y2hBbmdsZSA9IF9HbGlkZSRzZXR0aW5ncy50b3VjaEFuZ2xlLFxuICAgICAgICAgICAgdG91Y2hSYXRpbyA9IF9HbGlkZSRzZXR0aW5ncy50b3VjaFJhdGlvLFxuICAgICAgICAgICAgY2xhc3NlcyA9IF9HbGlkZSRzZXR0aW5ncy5jbGFzc2VzO1xuXG5cbiAgICAgICAgdmFyIHN3aXBlID0gdGhpcy50b3VjaGVzKGV2ZW50KTtcblxuICAgICAgICB2YXIgc3ViRXhTeCA9IHRvSW50KHN3aXBlLnBhZ2VYKSAtIHN3aXBlU3RhcnRYO1xuICAgICAgICB2YXIgc3ViRXlTeSA9IHRvSW50KHN3aXBlLnBhZ2VZKSAtIHN3aXBlU3RhcnRZO1xuICAgICAgICB2YXIgcG93RVggPSBNYXRoLmFicyhzdWJFeFN4IDw8IDIpO1xuICAgICAgICB2YXIgcG93RVkgPSBNYXRoLmFicyhzdWJFeVN5IDw8IDIpO1xuICAgICAgICB2YXIgc3dpcGVIeXBvdGVudXNlID0gTWF0aC5zcXJ0KHBvd0VYICsgcG93RVkpO1xuICAgICAgICB2YXIgc3dpcGVDYXRoZXR1cyA9IE1hdGguc3FydChwb3dFWSk7XG5cbiAgICAgICAgc3dpcGVTaW4gPSBNYXRoLmFzaW4oc3dpcGVDYXRoZXR1cyAvIHN3aXBlSHlwb3RlbnVzZSk7XG5cbiAgICAgICAgaWYgKHN3aXBlU2luICogMTgwIC8gTWF0aC5QSSA8IHRvdWNoQW5nbGUpIHtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgIENvbXBvbmVudHMuTW92ZS5tYWtlKHN1YkV4U3ggKiB0b0Zsb2F0KHRvdWNoUmF0aW8pKTtcblxuICAgICAgICAgIENvbXBvbmVudHMuSHRtbC5yb290LmNsYXNzTGlzdC5hZGQoY2xhc3Nlcy5kcmFnZ2luZyk7XG5cbiAgICAgICAgICBFdmVudHMuZW1pdCgnc3dpcGUubW92ZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXIgZm9yIGBzd2lwZWVuZGAgZXZlbnQuIEZpbml0aWFsaXplcyB1c2VyJ3MgdGFwIGFuZCBkZWNpZGVzIGFib3V0IGdsaWRlIG1vdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGVuZDogZnVuY3Rpb24gZW5kKGV2ZW50KSB7XG4gICAgICBpZiAoIUdsaWRlLmRpc2FibGVkKSB7XG4gICAgICAgIHZhciBfR2xpZGUkc2V0dGluZ3MyID0gR2xpZGUuc2V0dGluZ3MsXG4gICAgICAgICAgICBwZXJTd2lwZSA9IF9HbGlkZSRzZXR0aW5nczIucGVyU3dpcGUsXG4gICAgICAgICAgICB0b3VjaEFuZ2xlID0gX0dsaWRlJHNldHRpbmdzMi50b3VjaEFuZ2xlLFxuICAgICAgICAgICAgY2xhc3NlcyA9IF9HbGlkZSRzZXR0aW5nczIuY2xhc3NlcztcblxuXG4gICAgICAgIHZhciBzd2lwZSA9IHRoaXMudG91Y2hlcyhldmVudCk7XG4gICAgICAgIHZhciB0aHJlc2hvbGQgPSB0aGlzLnRocmVzaG9sZChldmVudCk7XG5cbiAgICAgICAgdmFyIHN3aXBlRGlzdGFuY2UgPSBzd2lwZS5wYWdlWCAtIHN3aXBlU3RhcnRYO1xuICAgICAgICB2YXIgc3dpcGVEZWcgPSBzd2lwZVNpbiAqIDE4MCAvIE1hdGguUEk7XG5cbiAgICAgICAgdGhpcy5lbmFibGUoKTtcblxuICAgICAgICBpZiAoc3dpcGVEaXN0YW5jZSA+IHRocmVzaG9sZCAmJiBzd2lwZURlZyA8IHRvdWNoQW5nbGUpIHtcbiAgICAgICAgICBDb21wb25lbnRzLlJ1bi5tYWtlKENvbXBvbmVudHMuRGlyZWN0aW9uLnJlc29sdmUocGVyU3dpcGUgKyAnPCcpKTtcbiAgICAgICAgfSBlbHNlIGlmIChzd2lwZURpc3RhbmNlIDwgLXRocmVzaG9sZCAmJiBzd2lwZURlZyA8IHRvdWNoQW5nbGUpIHtcbiAgICAgICAgICBDb21wb25lbnRzLlJ1bi5tYWtlKENvbXBvbmVudHMuRGlyZWN0aW9uLnJlc29sdmUocGVyU3dpcGUgKyAnPicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXaGlsZSBzd2lwZSBkb24ndCByZWFjaCBkaXN0YW5jZSBhcHBseSBwcmV2aW91cyB0cmFuc2Zvcm0uXG4gICAgICAgICAgQ29tcG9uZW50cy5Nb3ZlLm1ha2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIENvbXBvbmVudHMuSHRtbC5yb290LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3Nlcy5kcmFnZ2luZyk7XG5cbiAgICAgICAgdGhpcy51bmJpbmRTd2lwZU1vdmUoKTtcbiAgICAgICAgdGhpcy51bmJpbmRTd2lwZUVuZCgpO1xuXG4gICAgICAgIEV2ZW50cy5lbWl0KCdzd2lwZS5lbmQnKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBzd2lwZSdzIHN0YXJ0aW5nIGV2ZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBiaW5kU3dpcGVTdGFydDogZnVuY3Rpb24gYmluZFN3aXBlU3RhcnQoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgX0dsaWRlJHNldHRpbmdzMyA9IEdsaWRlLnNldHRpbmdzLFxuICAgICAgICAgIHN3aXBlVGhyZXNob2xkID0gX0dsaWRlJHNldHRpbmdzMy5zd2lwZVRocmVzaG9sZCxcbiAgICAgICAgICBkcmFnVGhyZXNob2xkID0gX0dsaWRlJHNldHRpbmdzMy5kcmFnVGhyZXNob2xkO1xuXG5cbiAgICAgIGlmIChzd2lwZVRocmVzaG9sZCkge1xuICAgICAgICBCaW5kZXIub24oU1RBUlRfRVZFTlRTWzBdLCBDb21wb25lbnRzLkh0bWwud3JhcHBlciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgX3RoaXMuc3RhcnQoZXZlbnQpO1xuICAgICAgICB9LCBjYXB0dXJlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdUaHJlc2hvbGQpIHtcbiAgICAgICAgQmluZGVyLm9uKFNUQVJUX0VWRU5UU1sxXSwgQ29tcG9uZW50cy5IdG1sLndyYXBwZXIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIF90aGlzLnN0YXJ0KGV2ZW50KTtcbiAgICAgICAgfSwgY2FwdHVyZSk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogVW5iaW5kcyBzd2lwZSdzIHN0YXJ0aW5nIGV2ZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICB1bmJpbmRTd2lwZVN0YXJ0OiBmdW5jdGlvbiB1bmJpbmRTd2lwZVN0YXJ0KCkge1xuICAgICAgQmluZGVyLm9mZihTVEFSVF9FVkVOVFNbMF0sIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLCBjYXB0dXJlKTtcbiAgICAgIEJpbmRlci5vZmYoU1RBUlRfRVZFTlRTWzFdLCBDb21wb25lbnRzLkh0bWwud3JhcHBlciwgY2FwdHVyZSk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQmluZHMgc3dpcGUncyBtb3ZpbmcgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGJpbmRTd2lwZU1vdmU6IGZ1bmN0aW9uIGJpbmRTd2lwZU1vdmUoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgQmluZGVyLm9uKE1PVkVfRVZFTlRTLCBDb21wb25lbnRzLkh0bWwud3JhcHBlciwgdGhyb3R0bGUoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIF90aGlzMi5tb3ZlKGV2ZW50KTtcbiAgICAgIH0sIEdsaWRlLnNldHRpbmdzLnRocm90dGxlKSwgY2FwdHVyZSk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogVW5iaW5kcyBzd2lwZSdzIG1vdmluZyBldmVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgdW5iaW5kU3dpcGVNb3ZlOiBmdW5jdGlvbiB1bmJpbmRTd2lwZU1vdmUoKSB7XG4gICAgICBCaW5kZXIub2ZmKE1PVkVfRVZFTlRTLCBDb21wb25lbnRzLkh0bWwud3JhcHBlciwgY2FwdHVyZSk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQmluZHMgc3dpcGUncyBlbmRpbmcgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGJpbmRTd2lwZUVuZDogZnVuY3Rpb24gYmluZFN3aXBlRW5kKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIEJpbmRlci5vbihFTkRfRVZFTlRTLCBDb21wb25lbnRzLkh0bWwud3JhcHBlciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIF90aGlzMy5lbmQoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogVW5iaW5kcyBzd2lwZSdzIGVuZGluZyBldmVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgdW5iaW5kU3dpcGVFbmQ6IGZ1bmN0aW9uIHVuYmluZFN3aXBlRW5kKCkge1xuICAgICAgQmluZGVyLm9mZihFTkRfRVZFTlRTLCBDb21wb25lbnRzLkh0bWwud3JhcHBlcik7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBldmVudCB0b3VjaGVzIHBvaW50cyBhY2NvcnRpbmcgdG8gZGlmZmVyZW50IHR5cGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICovXG4gICAgdG91Y2hlczogZnVuY3Rpb24gdG91Y2hlcyhldmVudCkge1xuICAgICAgaWYgKE1PVVNFX0VWRU5UUy5pbmRleE9mKGV2ZW50LnR5cGUpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXZlbnQudG91Y2hlc1swXSB8fCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHZhbHVlIG9mIG1pbmltdW0gc3dpcGUgZGlzdGFuY2Ugc2V0dGluZ3MgYmFzZWQgb24gZXZlbnQgdHlwZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICB0aHJlc2hvbGQ6IGZ1bmN0aW9uIHRocmVzaG9sZChldmVudCkge1xuICAgICAgdmFyIHNldHRpbmdzID0gR2xpZGUuc2V0dGluZ3M7XG5cbiAgICAgIGlmIChNT1VTRV9FVkVOVFMuaW5kZXhPZihldmVudC50eXBlKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5ncy5kcmFnVGhyZXNob2xkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2V0dGluZ3Muc3dpcGVUaHJlc2hvbGQ7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBzd2lwZSBldmVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3NlbGZ9XG4gICAgICovXG4gICAgZW5hYmxlOiBmdW5jdGlvbiBlbmFibGUoKSB7XG4gICAgICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICBDb21wb25lbnRzLlRyYW5zaXRpb24uZW5hYmxlKCk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHN3aXBlIGV2ZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7c2VsZn1cbiAgICAgKi9cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgICBDb21wb25lbnRzLlRyYW5zaXRpb24uZGlzYWJsZSgpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBjb21wb25lbnQgY2xhc3M6XG4gICAqIC0gYWZ0ZXIgaW5pdGlhbCBidWlsZGluZ1xuICAgKi9cbiAgRXZlbnRzLm9uKCdidWlsZC5hZnRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBDb21wb25lbnRzLkh0bWwucm9vdC5jbGFzc0xpc3QuYWRkKEdsaWRlLnNldHRpbmdzLmNsYXNzZXMuc3dpcGVhYmxlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBzd2lwaW5nIGJpbmRpbmdzOlxuICAgKiAtIG9uIGRlc3Ryb3lpbmcsIHRvIHJlbW92ZSBhZGRlZCBFdmVudExpc3RlbmVyc1xuICAgKi9cbiAgRXZlbnRzLm9uKCdkZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgIFN3aXBlLnVuYmluZFN3aXBlU3RhcnQoKTtcbiAgICBTd2lwZS51bmJpbmRTd2lwZU1vdmUoKTtcbiAgICBTd2lwZS51bmJpbmRTd2lwZUVuZCgpO1xuICAgIEJpbmRlci5kZXN0cm95KCk7XG4gIH0pO1xuXG4gIHJldHVybiBTd2lwZTtcbn1cblxuZnVuY3Rpb24gaW1hZ2VzIChHbGlkZSwgQ29tcG9uZW50cywgRXZlbnRzKSB7XG4gIC8qKlxuICAgKiBJbnN0YW5jZSBvZiB0aGUgYmluZGVyIGZvciBET00gRXZlbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRzQmluZGVyfVxuICAgKi9cbiAgdmFyIEJpbmRlciA9IG5ldyBFdmVudHNCaW5kZXIoKTtcblxuICB2YXIgSW1hZ2VzID0ge1xuICAgIC8qKlxuICAgICAqIEJpbmRzIGxpc3RlbmVyIHRvIGdsaWRlIHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIG1vdW50OiBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICAgIHRoaXMuYmluZCgpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEJpbmRzIGBkcmFnc3RhcnRgIGV2ZW50IG9uIHdyYXBwZXIgdG8gcHJldmVudCBkcmFnZ2luZyBpbWFnZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGJpbmQ6IGZ1bmN0aW9uIGJpbmQoKSB7XG4gICAgICBCaW5kZXIub24oJ2RyYWdzdGFydCcsIENvbXBvbmVudHMuSHRtbC53cmFwcGVyLCB0aGlzLmRyYWdzdGFydCk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogVW5iaW5kcyBgZHJhZ3N0YXJ0YCBldmVudCBvbiB3cmFwcGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZCgpIHtcbiAgICAgIEJpbmRlci5vZmYoJ2RyYWdzdGFydCcsIENvbXBvbmVudHMuSHRtbC53cmFwcGVyKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyLiBQcmV2ZW50cyBkcmFnZ2luZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgZHJhZ3N0YXJ0OiBmdW5jdGlvbiBkcmFnc3RhcnQoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYmluZGluZ3MgZnJvbSBpbWFnZXM6XG4gICAqIC0gb24gZGVzdHJveWluZywgdG8gcmVtb3ZlIGFkZGVkIEV2ZW50TGlzdGVuZXJzXG4gICAqL1xuICBFdmVudHMub24oJ2Rlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgSW1hZ2VzLnVuYmluZCgpO1xuICAgIEJpbmRlci5kZXN0cm95KCk7XG4gIH0pO1xuXG4gIHJldHVybiBJbWFnZXM7XG59XG5cbmZ1bmN0aW9uIGFuY2hvcnMgKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgLyoqXG4gICAqIEluc3RhbmNlIG9mIHRoZSBiaW5kZXIgZm9yIERPTSBFdmVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudHNCaW5kZXJ9XG4gICAqL1xuICB2YXIgQmluZGVyID0gbmV3IEV2ZW50c0JpbmRlcigpO1xuXG4gIC8qKlxuICAgKiBIb2xkcyBkZXRhY2hpbmcgc3RhdHVzIG9mIGFuY2hvcnMuXG4gICAqIFByZXZlbnRzIGRldGFjaGluZyBvZiBhbHJlYWR5IGRldGFjaGVkIGFuY2hvcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgdmFyIGRldGFjaGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhvbGRzIHByZXZlbnRpbmcgc3RhdHVzIG9mIGFuY2hvcnMuXG4gICAqIElmIGB0cnVlYCByZWRpcmVjdGlvbiBhZnRlciBjbGljayB3aWxsIGJlIGRpc2FibGVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICovXG4gIHZhciBwcmV2ZW50ZWQgPSBmYWxzZTtcblxuICB2YXIgQW5jaG9ycyA9IHtcbiAgICAvKipcbiAgICAgKiBTZXR1cHMgYSBpbml0aWFsIHN0YXRlIG9mIGFuY2hvcnMgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMge1ZvaWR9XG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgLyoqXG4gICAgICAgKiBIb2xkcyBjb2xsZWN0aW9uIG9mIGFuY2hvcnMgZWxlbWVudHMuXG4gICAgICAgKlxuICAgICAgICogQHByaXZhdGVcbiAgICAgICAqIEB0eXBlIHtIVE1MQ29sbGVjdGlvbn1cbiAgICAgICAqL1xuICAgICAgdGhpcy5fYSA9IENvbXBvbmVudHMuSHRtbC53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcblxuICAgICAgdGhpcy5iaW5kKCk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQmluZHMgZXZlbnRzIHRvIGFuY2hvcnMgaW5zaWRlIGEgdHJhY2suXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGJpbmQ6IGZ1bmN0aW9uIGJpbmQoKSB7XG4gICAgICBCaW5kZXIub24oJ2NsaWNrJywgQ29tcG9uZW50cy5IdG1sLndyYXBwZXIsIHRoaXMuY2xpY2spO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFVuYmluZHMgZXZlbnRzIGF0dGFjaGVkIHRvIGFuY2hvcnMgaW5zaWRlIGEgdHJhY2suXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKCkge1xuICAgICAgQmluZGVyLm9mZignY2xpY2snLCBDb21wb25lbnRzLkh0bWwud3JhcHBlcik7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuIFByZXZlbnRzIGNsaWNrcyB3aGVuIGdsaWRlIGlzIGluIGBwcmV2ZW50YCBzdGF0dXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGV2ZW50XG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBjbGljazogZnVuY3Rpb24gY2xpY2soZXZlbnQpIHtcbiAgICAgIGlmIChwcmV2ZW50ZWQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogRGV0YWNoZXMgYW5jaG9ycyBjbGljayBldmVudCBpbnNpZGUgZ2xpZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzZWxmfVxuICAgICAqL1xuICAgIGRldGFjaDogZnVuY3Rpb24gZGV0YWNoKCkge1xuICAgICAgcHJldmVudGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKCFkZXRhY2hlZCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLml0ZW1zW2ldLmRyYWdnYWJsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgdGhpcy5pdGVtc1tpXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHJlZicsIHRoaXMuaXRlbXNbaV0uZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuXG4gICAgICAgICAgdGhpcy5pdGVtc1tpXS5yZW1vdmVBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGFjaGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYW5jaG9ycyBjbGljayBldmVudHMgaW5zaWRlIGdsaWRlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c2VsZn1cbiAgICAgKi9cbiAgICBhdHRhY2g6IGZ1bmN0aW9uIGF0dGFjaCgpIHtcbiAgICAgIHByZXZlbnRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoZGV0YWNoZWQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5pdGVtc1tpXS5kcmFnZ2FibGUgPSB0cnVlO1xuXG4gICAgICAgICAgdGhpcy5pdGVtc1tpXS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB0aGlzLml0ZW1zW2ldLmdldEF0dHJpYnV0ZSgnZGF0YS1ocmVmJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGV0YWNoZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9O1xuXG4gIGRlZmluZShBbmNob3JzLCAnaXRlbXMnLCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBjb2xsZWN0aW9uIG9mIHRoZSBhcnJvd3MgSFRNTCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0hUTUxFbGVtZW50W119XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gQW5jaG9ycy5fYTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBEZXRhY2ggYW5jaG9ycyBpbnNpZGUgc2xpZGVzOlxuICAgKiAtIG9uIHN3aXBpbmcsIHNvIHRoZXkgd29uJ3QgcmVkaXJlY3QgdG8gaXRzIGBocmVmYCBhdHRyaWJ1dGVzXG4gICAqL1xuICBFdmVudHMub24oJ3N3aXBlLm1vdmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgQW5jaG9ycy5kZXRhY2goKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhbmNob3JzIGluc2lkZSBzbGlkZXM6XG4gICAqIC0gYWZ0ZXIgc3dpcGluZyBhbmQgdHJhbnNpdGlvbnMgZW5kcywgc28gdGhleSBjYW4gcmVkaXJlY3QgYWZ0ZXIgY2xpY2sgYWdhaW5cbiAgICovXG4gIEV2ZW50cy5vbignc3dpcGUuZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIENvbXBvbmVudHMuVHJhbnNpdGlvbi5hZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBBbmNob3JzLmF0dGFjaCgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogVW5iaW5kIGFuY2hvcnMgaW5zaWRlIHNsaWRlczpcbiAgICogLSBvbiBkZXN0cm95aW5nLCB0byBicmluZyBhbmNob3JzIHRvIGl0cyBpbml0aWFsIHN0YXRlXG4gICAqL1xuICBFdmVudHMub24oJ2Rlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgQW5jaG9ycy5hdHRhY2goKTtcbiAgICBBbmNob3JzLnVuYmluZCgpO1xuICAgIEJpbmRlci5kZXN0cm95KCk7XG4gIH0pO1xuXG4gIHJldHVybiBBbmNob3JzO1xufVxuXG52YXIgTkFWX1NFTEVDVE9SID0gJ1tkYXRhLWdsaWRlLWVsPVwiY29udHJvbHNbbmF2XVwiXSc7XG52YXIgQ09OVFJPTFNfU0VMRUNUT1IgPSAnW2RhdGEtZ2xpZGUtZWxePVwiY29udHJvbHNcIl0nO1xuXG5mdW5jdGlvbiBjb250cm9scyAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIGJpbmRlciBmb3IgRE9NIEV2ZW50cy5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50c0JpbmRlcn1cbiAgICovXG4gIHZhciBCaW5kZXIgPSBuZXcgRXZlbnRzQmluZGVyKCk7XG5cbiAgdmFyIGNhcHR1cmUgPSBzdXBwb3J0c1Bhc3NpdmUkMSA/IHsgcGFzc2l2ZTogdHJ1ZSB9IDogZmFsc2U7XG5cbiAgdmFyIENvbnRyb2xzID0ge1xuICAgIC8qKlxuICAgICAqIEluaXRzIGFycm93cy4gQmluZHMgZXZlbnRzIGxpc3RlbmVyc1xuICAgICAqIHRvIHRoZSBhcnJvd3MgSFRNTCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KCkge1xuICAgICAgLyoqXG4gICAgICAgKiBDb2xsZWN0aW9uIG9mIG5hdmlnYXRpb24gSFRNTCBlbGVtZW50cy5cbiAgICAgICAqXG4gICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICogQHR5cGUge0hUTUxDb2xsZWN0aW9ufVxuICAgICAgICovXG4gICAgICB0aGlzLl9uID0gQ29tcG9uZW50cy5IdG1sLnJvb3QucXVlcnlTZWxlY3RvckFsbChOQVZfU0VMRUNUT1IpO1xuXG4gICAgICAvKipcbiAgICAgICAqIENvbGxlY3Rpb24gb2YgY29udHJvbHMgSFRNTCBlbGVtZW50cy5cbiAgICAgICAqXG4gICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICogQHR5cGUge0hUTUxDb2xsZWN0aW9ufVxuICAgICAgICovXG4gICAgICB0aGlzLl9jID0gQ29tcG9uZW50cy5IdG1sLnJvb3QucXVlcnlTZWxlY3RvckFsbChDT05UUk9MU19TRUxFQ1RPUik7XG5cbiAgICAgIHRoaXMuYWRkQmluZGluZ3MoKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGFjdGl2ZSBjbGFzcyB0byBjdXJyZW50IHNsaWRlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBzZXRBY3RpdmU6IGZ1bmN0aW9uIHNldEFjdGl2ZSgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmFkZENsYXNzKHRoaXMuX25baV0uY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWN0aXZlIGNsYXNzIHRvIGN1cnJlbnQgc2xpZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHJlbW92ZUFjdGl2ZTogZnVuY3Rpb24gcmVtb3ZlQWN0aXZlKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2xhc3ModGhpcy5fbltpXS5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyBhY3RpdmUgY2xhc3Mgb24gaXRlbXMgaW5zaWRlIG5hdmlnYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gY29udHJvbHNcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGFkZENsYXNzOiBmdW5jdGlvbiBhZGRDbGFzcyhjb250cm9scykge1xuICAgICAgdmFyIHNldHRpbmdzID0gR2xpZGUuc2V0dGluZ3M7XG4gICAgICB2YXIgaXRlbSA9IGNvbnRyb2xzW0dsaWRlLmluZGV4XTtcblxuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKHNldHRpbmdzLmNsYXNzZXMubmF2LmFjdGl2ZSk7XG5cbiAgICAgICAgc2libGluZ3MoaXRlbSkuZm9yRWFjaChmdW5jdGlvbiAoc2libGluZykge1xuICAgICAgICAgIHNpYmxpbmcuY2xhc3NMaXN0LnJlbW92ZShzZXR0aW5ncy5jbGFzc2VzLm5hdi5hY3RpdmUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFjdGl2ZSBjbGFzcyBmcm9tIGFjdGl2ZSBjb250cm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGNvbnRyb2xzXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmVDbGFzczogZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoY29udHJvbHMpIHtcbiAgICAgIHZhciBpdGVtID0gY29udHJvbHNbR2xpZGUuaW5kZXhdO1xuXG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoR2xpZGUuc2V0dGluZ3MuY2xhc3Nlcy5uYXYuYWN0aXZlKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGhhbmRsZXMgdG8gdGhlIGVhY2ggZ3JvdXAgb2YgY29udHJvbHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGFkZEJpbmRpbmdzOiBmdW5jdGlvbiBhZGRCaW5kaW5ncygpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fYy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmJpbmQodGhpcy5fY1tpXS5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBoYW5kbGVzIGZyb20gdGhlIGVhY2ggZ3JvdXAgb2YgY29udHJvbHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHJlbW92ZUJpbmRpbmdzOiBmdW5jdGlvbiByZW1vdmVCaW5kaW5ncygpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fYy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnVuYmluZCh0aGlzLl9jW2ldLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBldmVudHMgdG8gYXJyb3dzIEhUTUwgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxDb2xsZWN0aW9ufSBlbGVtZW50c1xuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYmluZDogZnVuY3Rpb24gYmluZChlbGVtZW50cykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBCaW5kZXIub24oJ2NsaWNrJywgZWxlbWVudHNbaV0sIHRoaXMuY2xpY2spO1xuICAgICAgICBCaW5kZXIub24oJ3RvdWNoc3RhcnQnLCBlbGVtZW50c1tpXSwgdGhpcy5jbGljaywgY2FwdHVyZSk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogVW5iaW5kcyBldmVudHMgYmluZGVkIHRvIHRoZSBhcnJvd3MgSFRNTCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTENvbGxlY3Rpb259IGVsZW1lbnRzXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZChlbGVtZW50cykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBCaW5kZXIub2ZmKFsnY2xpY2snLCAndG91Y2hzdGFydCddLCBlbGVtZW50c1tpXSk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBgY2xpY2tgIGV2ZW50IG9uIHRoZSBhcnJvd3MgSFRNTCBlbGVtZW50cy5cbiAgICAgKiBNb3ZlcyBzbGlkZXIgaW4gZHJpZWN0aW9uIHByZWNpc2VkIGluXG4gICAgICogYGRhdGEtZ2xpZGUtZGlyYCBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGNsaWNrOiBmdW5jdGlvbiBjbGljayhldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgQ29tcG9uZW50cy5SdW4ubWFrZShDb21wb25lbnRzLkRpcmVjdGlvbi5yZXNvbHZlKGV2ZW50LmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWdsaWRlLWRpcicpKSk7XG4gICAgfVxuICB9O1xuXG4gIGRlZmluZShDb250cm9scywgJ2l0ZW1zJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgY29sbGVjdGlvbiBvZiB0aGUgY29udHJvbHMgSFRNTCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0hUTUxFbGVtZW50W119XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gQ29udHJvbHMuX2M7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogU3dhcCBhY3RpdmUgY2xhc3Mgb2YgY3VycmVudCBuYXZpZ2F0aW9uIGl0ZW06XG4gICAqIC0gYWZ0ZXIgbW91bnRpbmcgdG8gc2V0IGl0IHRvIGluaXRpYWwgaW5kZXhcbiAgICogLSBhZnRlciBlYWNoIG1vdmUgdG8gdGhlIG5ldyBpbmRleFxuICAgKi9cbiAgRXZlbnRzLm9uKFsnbW91bnQuYWZ0ZXInLCAnbW92ZS5hZnRlciddLCBmdW5jdGlvbiAoKSB7XG4gICAgQ29udHJvbHMuc2V0QWN0aXZlKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYmluZGluZ3MgYW5kIEhUTUwgQ2xhc3NlczpcbiAgICogLSBvbiBkZXN0cm95aW5nLCB0byBicmluZyBtYXJrdXAgdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgICovXG4gIEV2ZW50cy5vbignZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICBDb250cm9scy5yZW1vdmVCaW5kaW5ncygpO1xuICAgIENvbnRyb2xzLnJlbW92ZUFjdGl2ZSgpO1xuICAgIEJpbmRlci5kZXN0cm95KCk7XG4gIH0pO1xuXG4gIHJldHVybiBDb250cm9scztcbn1cblxuZnVuY3Rpb24ga2V5Ym9hcmQgKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgLyoqXG4gICAqIEluc3RhbmNlIG9mIHRoZSBiaW5kZXIgZm9yIERPTSBFdmVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudHNCaW5kZXJ9XG4gICAqL1xuICB2YXIgQmluZGVyID0gbmV3IEV2ZW50c0JpbmRlcigpO1xuXG4gIHZhciBLZXlib2FyZCA9IHtcbiAgICAvKipcbiAgICAgKiBCaW5kcyBrZXlib2FyZCBldmVudHMgb24gY29tcG9uZW50IG1vdW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBtb3VudDogZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgICBpZiAoR2xpZGUuc2V0dGluZ3Mua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5iaW5kKCk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQWRkcyBrZXlib2FyZCBwcmVzcyBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIGJpbmQ6IGZ1bmN0aW9uIGJpbmQoKSB7XG4gICAgICBCaW5kZXIub24oJ2tleXVwJywgZG9jdW1lbnQsIHRoaXMucHJlc3MpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMga2V5Ym9hcmQgcHJlc3MgZXZlbnRzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZCgpIHtcbiAgICAgIEJpbmRlci5vZmYoJ2tleXVwJywgZG9jdW1lbnQpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMga2V5Ym9hcmQncyBhcnJvd3MgcHJlc3MgYW5kIG1vdmluZyBnbGlkZSBmb3dhcmQgYW5kIGJhY2t3YXJkLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBldmVudFxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgcHJlc3M6IGZ1bmN0aW9uIHByZXNzKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzkpIHtcbiAgICAgICAgQ29tcG9uZW50cy5SdW4ubWFrZShDb21wb25lbnRzLkRpcmVjdGlvbi5yZXNvbHZlKCc+JykpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzcpIHtcbiAgICAgICAgQ29tcG9uZW50cy5SdW4ubWFrZShDb21wb25lbnRzLkRpcmVjdGlvbi5yZXNvbHZlKCc8JykpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGJpbmRpbmdzIGZyb20ga2V5Ym9hcmQ6XG4gICAqIC0gb24gZGVzdHJveWluZyB0byByZW1vdmUgYWRkZWQgZXZlbnRzXG4gICAqIC0gb24gdXBkYXRpbmcgdG8gcmVtb3ZlIGV2ZW50cyBiZWZvcmUgcmVtb3VudGluZ1xuICAgKi9cbiAgRXZlbnRzLm9uKFsnZGVzdHJveScsICd1cGRhdGUnXSwgZnVuY3Rpb24gKCkge1xuICAgIEtleWJvYXJkLnVuYmluZCgpO1xuICB9KTtcblxuICAvKipcbiAgICogUmVtb3VudCBjb21wb25lbnRcbiAgICogLSBvbiB1cGRhdGluZyB0byByZWZsZWN0IHBvdGVudGlhbCBjaGFuZ2VzIGluIHNldHRpbmdzXG4gICAqL1xuICBFdmVudHMub24oJ3VwZGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBLZXlib2FyZC5tb3VudCgpO1xuICB9KTtcblxuICAvKipcbiAgICogRGVzdHJveSBiaW5kZXI6XG4gICAqIC0gb24gZGVzdHJveWluZyB0byByZW1vdmUgbGlzdGVuZXJzXG4gICAqL1xuICBFdmVudHMub24oJ2Rlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgQmluZGVyLmRlc3Ryb3koKTtcbiAgfSk7XG5cbiAgcmV0dXJuIEtleWJvYXJkO1xufVxuXG5mdW5jdGlvbiBhdXRvcGxheSAoR2xpZGUsIENvbXBvbmVudHMsIEV2ZW50cykge1xuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIGJpbmRlciBmb3IgRE9NIEV2ZW50cy5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50c0JpbmRlcn1cbiAgICovXG4gIHZhciBCaW5kZXIgPSBuZXcgRXZlbnRzQmluZGVyKCk7XG5cbiAgdmFyIEF1dG9wbGF5ID0ge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGF1dG9wbGF5aW5nIGFuZCBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIG1vdW50OiBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICAgIHRoaXMuc3RhcnQoKTtcblxuICAgICAgaWYgKEdsaWRlLnNldHRpbmdzLmhvdmVycGF1c2UpIHtcbiAgICAgICAgdGhpcy5iaW5kKCk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIGF1dG9wbGF5aW5nIGluIGNvbmZpZ3VyZWQgaW50ZXJ2YWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW58TnVtYmVyfSBmb3JjZSBSdW4gYXV0b3BsYXlpbmcgd2l0aCBwYXNzZWQgaW50ZXJ2YWwgcmVnYXJkbGVzcyBvZiBgYXV0b3BsYXlgIHNldHRpbmdzXG4gICAgICogQHJldHVybiB7Vm9pZH1cbiAgICAgKi9cbiAgICBzdGFydDogZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoR2xpZGUuc2V0dGluZ3MuYXV0b3BsYXkpIHtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHRoaXMuX2kpKSB7XG4gICAgICAgICAgdGhpcy5faSA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnN0b3AoKTtcblxuICAgICAgICAgICAgQ29tcG9uZW50cy5SdW4ubWFrZSgnPicpO1xuXG4gICAgICAgICAgICBfdGhpcy5zdGFydCgpO1xuICAgICAgICAgIH0sIHRoaXMudGltZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyBhdXRvcnVubmluZyBvZiB0aGUgZ2xpZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWb2lkfVxuICAgICAqL1xuICAgIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICB0aGlzLl9pID0gY2xlYXJJbnRlcnZhbCh0aGlzLl9pKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyBhdXRvcGxheWluZyB3aGlsZSBtb3VzZSBpcyBvdmVyIGdsaWRlJ3MgYXJlYS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZvaWR9XG4gICAgICovXG4gICAgYmluZDogZnVuY3Rpb24gYmluZCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBCaW5kZXIub24oJ21vdXNlb3ZlcicsIENvbXBvbmVudHMuSHRtbC5yb290LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5zdG9wKCk7XG4gICAgICB9KTtcblxuICAgICAgQmluZGVyLm9uKCdtb3VzZW91dCcsIENvbXBvbmVudHMuSHRtbC5yb290LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5zdGFydCgpO1xuICAgICAgfSk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogVW5iaW5kIG1vdXNlb3ZlciBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Vm9pZH1cbiAgICAgKi9cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZCgpIHtcbiAgICAgIEJpbmRlci5vZmYoWydtb3VzZW92ZXInLCAnbW91c2VvdXQnXSwgQ29tcG9uZW50cy5IdG1sLnJvb3QpO1xuICAgIH1cbiAgfTtcblxuICBkZWZpbmUoQXV0b3BsYXksICd0aW1lJywge1xuICAgIC8qKlxuICAgICAqIEdldHMgdGltZSBwZXJpb2QgdmFsdWUgZm9yIHRoZSBhdXRvcGxheSBpbnRlcnZhbC4gUHJpb3JpdGl6ZXNcbiAgICAgKiB0aW1lcyBpbiBgZGF0YS1nbGlkZS1hdXRvcGxheWAgYXR0cnVidXRlcyBvdmVyIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgYXV0b3BsYXkgPSBDb21wb25lbnRzLkh0bWwuc2xpZGVzW0dsaWRlLmluZGV4XS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ2xpZGUtYXV0b3BsYXknKTtcblxuICAgICAgaWYgKGF1dG9wbGF5KSB7XG4gICAgICAgIHJldHVybiB0b0ludChhdXRvcGxheSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b0ludChHbGlkZS5zZXR0aW5ncy5hdXRvcGxheSk7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogU3RvcCBhdXRvcGxheWluZyBhbmQgdW5iaW5kIGV2ZW50czpcbiAgICogLSBvbiBkZXN0cm95aW5nLCB0byBjbGVhciBkZWZpbmVkIGludGVydmFsXG4gICAqIC0gb24gdXBkYXRpbmcgdmlhIEFQSSB0byByZXNldCBpbnRlcnZhbCB0aGF0IG1heSBjaGFuZ2VkXG4gICAqL1xuICBFdmVudHMub24oWydkZXN0cm95JywgJ3VwZGF0ZSddLCBmdW5jdGlvbiAoKSB7XG4gICAgQXV0b3BsYXkudW5iaW5kKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBTdG9wIGF1dG9wbGF5aW5nOlxuICAgKiAtIGJlZm9yZSBlYWNoIHJ1biwgdG8gcmVzdGFydCBhdXRvcGxheWluZ1xuICAgKiAtIG9uIHBhdXNpbmcgdmlhIEFQSVxuICAgKiAtIG9uIGRlc3Ryb3lpbmcsIHRvIGNsZWFyIGRlZmluZWQgaW50ZXJ2YWxcbiAgICogLSB3aGlsZSBzdGFydGluZyBhIHN3aXBlXG4gICAqIC0gb24gdXBkYXRpbmcgdmlhIEFQSSB0byByZXNldCBpbnRlcnZhbCB0aGF0IG1heSBjaGFuZ2VkXG4gICAqL1xuICBFdmVudHMub24oWydydW4uYmVmb3JlJywgJ3BhdXNlJywgJ2Rlc3Ryb3knLCAnc3dpcGUuc3RhcnQnLCAndXBkYXRlJ10sIGZ1bmN0aW9uICgpIHtcbiAgICBBdXRvcGxheS5zdG9wKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBTdGFydCBhdXRvcGxheWluZzpcbiAgICogLSBhZnRlciBlYWNoIHJ1biwgdG8gcmVzdGFydCBhdXRvcGxheWluZ1xuICAgKiAtIG9uIHBsYXlpbmcgdmlhIEFQSVxuICAgKiAtIHdoaWxlIGVuZGluZyBhIHN3aXBlXG4gICAqL1xuICBFdmVudHMub24oWydydW4uYWZ0ZXInLCAncGxheScsICdzd2lwZS5lbmQnXSwgZnVuY3Rpb24gKCkge1xuICAgIEF1dG9wbGF5LnN0YXJ0KCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBSZW1vdW50IGF1dG9wbGF5aW5nOlxuICAgKiAtIG9uIHVwZGF0aW5nIHZpYSBBUEkgdG8gcmVzZXQgaW50ZXJ2YWwgdGhhdCBtYXkgY2hhbmdlZFxuICAgKi9cbiAgRXZlbnRzLm9uKCd1cGRhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgQXV0b3BsYXkubW91bnQoKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgYSBiaW5kZXI6XG4gICAqIC0gb24gZGVzdHJveWluZyBnbGlkZSBpbnN0YW5jZSB0byBjbGVhcnVwIGxpc3RlbmVyc1xuICAgKi9cbiAgRXZlbnRzLm9uKCdkZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgIEJpbmRlci5kZXN0cm95KCk7XG4gIH0pO1xuXG4gIHJldHVybiBBdXRvcGxheTtcbn1cblxuLyoqXG4gKiBTb3J0cyBrZXlzIG9mIGJyZWFrcG9pbnQgb2JqZWN0IHNvIHRoZXkgd2lsbCBiZSBvcmRlcmVkIGZyb20gbG93ZXIgdG8gYmlnZ2VyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwb2ludHNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHNvcnRCcmVha3BvaW50cyhwb2ludHMpIHtcbiAgaWYgKGlzT2JqZWN0KHBvaW50cykpIHtcbiAgICByZXR1cm4gc29ydEtleXMocG9pbnRzKTtcbiAgfSBlbHNlIHtcbiAgICB3YXJuKCdCcmVha3BvaW50cyBvcHRpb24gbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gYnJlYWtwb2ludHMgKEdsaWRlLCBDb21wb25lbnRzLCBFdmVudHMpIHtcbiAgLyoqXG4gICAqIEluc3RhbmNlIG9mIHRoZSBiaW5kZXIgZm9yIERPTSBFdmVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudHNCaW5kZXJ9XG4gICAqL1xuICB2YXIgQmluZGVyID0gbmV3IEV2ZW50c0JpbmRlcigpO1xuXG4gIC8qKlxuICAgKiBIb2xkcyByZWZlcmVuY2UgdG8gc2V0dGluZ3MuXG4gICAqXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICB2YXIgc2V0dGluZ3MgPSBHbGlkZS5zZXR0aW5ncztcblxuICAvKipcbiAgICogSG9sZHMgcmVmZXJlbmNlIHRvIGJyZWFrcG9pbnRzIG9iamVjdCBpbiBzZXR0aW5ncy4gU29ydHMgYnJlYWtwb2ludHNcbiAgICogZnJvbSBzbWFsbGVyIHRvIGxhcmdlci4gSXQgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gcHJvcGVyXG4gICAqIG1hdGNoaW5nIGN1cnJlbnRseSBhY3RpdmUgYnJlYWtwb2ludCBzZXR0aW5ncy5cbiAgICpcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHZhciBwb2ludHMgPSBzb3J0QnJlYWtwb2ludHMoc2V0dGluZ3MuYnJlYWtwb2ludHMpO1xuXG4gIC8qKlxuICAgKiBDYWNoZSBpbml0aWFsIHNldHRpbmdzIGJlZm9yZSBvdmVyd3JpdHRpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICB2YXIgZGVmYXVsdHMgPSBfZXh0ZW5kcyh7fSwgc2V0dGluZ3MpO1xuXG4gIHZhciBCcmVha3BvaW50cyA9IHtcbiAgICAvKipcbiAgICAgKiBNYXRjaGVzIHNldHRpbmdzIGZvciBjdXJyZWN0bHkgbWF0Y2hpbmcgbWVkaWEgYnJlYWtwb2ludC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwb2ludHNcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIG1hdGNoOiBmdW5jdGlvbiBtYXRjaChwb2ludHMpIHtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZvciAodmFyIHBvaW50IGluIHBvaW50cykge1xuICAgICAgICAgIGlmIChwb2ludHMuaGFzT3duUHJvcGVydHkocG9pbnQpKSB7XG4gICAgICAgICAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6ICcgKyBwb2ludCArICdweCknKS5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwb2ludHNbcG9pbnRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBPdmVyd3JpdGUgaW5zdGFuY2Ugc2V0dGluZ3Mgd2l0aCBjdXJyZW50bHkgbWF0Y2hpbmcgYnJlYWtwb2ludCBzZXR0aW5ncy5cbiAgICogVGhpcyBoYXBwZW5zIHJpZ2h0IGFmdGVyIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbi5cbiAgICovXG4gIF9leHRlbmRzKHNldHRpbmdzLCBCcmVha3BvaW50cy5tYXRjaChwb2ludHMpKTtcblxuICAvKipcbiAgICogVXBkYXRlIGdsaWRlIHdpdGggc2V0dGluZ3Mgb2YgbWF0Y2hlZCBicmVrcG9pbnQ6XG4gICAqIC0gd2luZG93IHJlc2l6ZSB0byB1cGRhdGUgc2xpZGVyXG4gICAqL1xuICBCaW5kZXIub24oJ3Jlc2l6ZScsIHdpbmRvdywgdGhyb3R0bGUoZnVuY3Rpb24gKCkge1xuICAgIEdsaWRlLnNldHRpbmdzID0gbWVyZ2VPcHRpb25zKHNldHRpbmdzLCBCcmVha3BvaW50cy5tYXRjaChwb2ludHMpKTtcbiAgfSwgR2xpZGUuc2V0dGluZ3MudGhyb3R0bGUpKTtcblxuICAvKipcbiAgICogUmVzb3J0IGFuZCB1cGRhdGUgZGVmYXVsdCBzZXR0aW5nczpcbiAgICogLSBvbiByZWluaXQgdmlhIEFQSSwgc28gYnJlYWtwb2ludCBtYXRjaGluZyB3aWxsIGJlIHBlcmZvcm1lZCB3aXRoIG9wdGlvbnNcbiAgICovXG4gIEV2ZW50cy5vbigndXBkYXRlJywgZnVuY3Rpb24gKCkge1xuICAgIHBvaW50cyA9IHNvcnRCcmVha3BvaW50cyhwb2ludHMpO1xuXG4gICAgZGVmYXVsdHMgPSBfZXh0ZW5kcyh7fSwgc2V0dGluZ3MpO1xuICB9KTtcblxuICAvKipcbiAgICogVW5iaW5kIHJlc2l6ZSBsaXN0ZW5lcjpcbiAgICogLSBvbiBkZXN0cm95aW5nLCB0byBicmluZyBtYXJrdXAgdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgICovXG4gIEV2ZW50cy5vbignZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICBCaW5kZXIub2ZmKCdyZXNpemUnLCB3aW5kb3cpO1xuICB9KTtcblxuICByZXR1cm4gQnJlYWtwb2ludHM7XG59XG5cbnZhciBDT01QT05FTlRTID0ge1xuICBIdG1sOiBIdG1sLFxuICBUcmFuc2xhdGU6IFRyYW5zbGF0ZSxcbiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbixcbiAgRGlyZWN0aW9uOiBEaXJlY3Rpb24sXG4gIFBlZWs6IFBlZWssXG4gIFNpemVzOiBTaXplcyxcbiAgR2FwczogR2FwcyxcbiAgTW92ZTogTW92ZSxcbiAgQ2xvbmVzOiBDbG9uZXMsXG4gIFJlc2l6ZTogUmVzaXplLFxuICBCdWlsZDogQnVpbGQsXG4gIFJ1bjogUnVuXG59O1xuXG52YXIgR2xpZGUkMSA9IGZ1bmN0aW9uIChfQ29yZSkge1xuICBpbmhlcml0cyhHbGlkZSQkMSwgX0NvcmUpO1xuXG4gIGZ1bmN0aW9uIEdsaWRlJCQxKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEdsaWRlJCQxKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoR2xpZGUkJDEuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihHbGlkZSQkMSkpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoR2xpZGUkJDEsIFt7XG4gICAga2V5OiAnbW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICAgIHZhciBleHRlbnNpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgICAgcmV0dXJuIGdldChHbGlkZSQkMS5wcm90b3R5cGUuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihHbGlkZSQkMS5wcm90b3R5cGUpLCAnbW91bnQnLCB0aGlzKS5jYWxsKHRoaXMsIF9leHRlbmRzKHt9LCBDT01QT05FTlRTLCBleHRlbnNpb25zKSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBHbGlkZSQkMTtcbn0oR2xpZGUpO1xuXG5leHBvcnQgZGVmYXVsdCBHbGlkZSQxO1xuZXhwb3J0IHsgc3dpcGUgYXMgU3dpcGUsIGltYWdlcyBhcyBJbWFnZXMsIGFuY2hvcnMgYXMgQW5jaG9ycywgY29udHJvbHMgYXMgQ29udHJvbHMsIGtleWJvYXJkIGFzIEtleWJvYXJkLCBhdXRvcGxheSBhcyBBdXRvcGxheSwgYnJlYWtwb2ludHMgYXMgQnJlYWtwb2ludHMgfTtcbiJdfQ==\n},{}]},{},[1])"]}