Ticket #34350: 34350.8.diff
| File 34350.8.diff, 745.5 KB (added by , 10 years ago) |
|---|
-
src/wp-admin/js/customize-widgets.js
663 663 */ 664 664 _setupReorderUI: function() { 665 665 var self = this, selectSidebarItem, $moveWidgetArea, 666 $reorderNav, updateAvailableSidebars ;666 $reorderNav, updateAvailableSidebars, template; 667 667 668 668 /** 669 669 * select the provided sidebar list item in the move widget area … … 681 681 * Add the widget reordering elements to the widget control 682 682 */ 683 683 this.container.find( '.widget-title-action' ).after( $( api.Widgets.data.tpl.widgetReorderNav ) ); 684 $moveWidgetArea = $( 685 _.template( api.Widgets.data.tpl.moveWidgetArea, { 684 685 686 template = _.template( api.Widgets.data.tpl.moveWidgetArea ); 687 $moveWidgetArea = $( template( { 686 688 sidebars: _( api.Widgets.registeredSidebars.toArray() ).pluck( 'attributes' ) 687 689 } ) 688 690 ); -
src/wp-includes/js/backbone.js
1 // Backbone.js 1. 1.21 // Backbone.js 1.2.3 2 2 3 // (c) 2010-201 4Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors3 // (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 4 4 // Backbone may be freely distributed under the MIT license. 5 5 // For all details and documentation: 6 6 // http://backbonejs.org 7 7 8 (function( root,factory) {8 (function(factory) { 9 9 10 // Establish the root object, `window` (`self`) in the browser, or `global` on the server. 11 // We use `self` instead of `window` for `WebWorker` support. 12 var root = (typeof self == 'object' && self.self == self && self) || 13 (typeof global == 'object' && global.global == global && global); 14 10 15 // Set up Backbone appropriately for the environment. Start with AMD. 11 16 if (typeof define === 'function' && define.amd) { 12 17 define(['underscore', 'jquery', 'exports'], function(_, $, exports) { … … 17 22 18 23 // Next for Node.js or CommonJS. jQuery may not be needed as a module. 19 24 } else if (typeof exports !== 'undefined') { 20 var _ = require('underscore'); 21 factory(root, exports, _); 25 var _ = require('underscore'), $; 26 try { $ = require('jquery'); } catch(e) {} 27 factory(root, exports, _, $); 22 28 23 29 // Finally, as a browser global. 24 30 } else { … … 25 31 root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$)); 26 32 } 27 33 28 }( this,function(root, Backbone, _, $) {34 }(function(root, Backbone, _, $) { 29 35 30 36 // Initial Setup 31 37 // ------------- … … 34 40 // restored later on, if `noConflict` is used. 35 41 var previousBackbone = root.Backbone; 36 42 37 // Create local references to array methods we'll want to use later. 38 var array = []; 39 var push = array.push; 40 var slice = array.slice; 41 var splice = array.splice; 43 // Create a local reference to a common array method we'll want to use later. 44 var slice = Array.prototype.slice; 42 45 43 46 // Current version of the library. Keep in sync with `package.json`. 44 Backbone.VERSION = '1. 1.2';47 Backbone.VERSION = '1.2.3'; 45 48 46 49 // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns 47 50 // the `$` variable. … … 60 63 Backbone.emulateHTTP = false; 61 64 62 65 // Turn on `emulateJSON` to support legacy servers that can't deal with direct 63 // `application/json` requests ... will encode the body as66 // `application/json` requests ... this will encode the body as 64 67 // `application/x-www-form-urlencoded` instead and will send the model in a 65 68 // form param named `model`. 66 69 Backbone.emulateJSON = false; 67 70 71 // Proxy Backbone class methods to Underscore functions, wrapping the model's 72 // `attributes` object or collection's `models` array behind the scenes. 73 // 74 // collection.filter(function(model) { return model.get('age') > 10 }); 75 // collection.each(this.addView); 76 // 77 // `Function#apply` can be slow so we use the method's arg count, if we know it. 78 var addMethod = function(length, method, attribute) { 79 switch (length) { 80 case 1: return function() { 81 return _[method](this[attribute]); 82 }; 83 case 2: return function(value) { 84 return _[method](this[attribute], value); 85 }; 86 case 3: return function(iteratee, context) { 87 return _[method](this[attribute], cb(iteratee, this), context); 88 }; 89 case 4: return function(iteratee, defaultVal, context) { 90 return _[method](this[attribute], cb(iteratee, this), defaultVal, context); 91 }; 92 default: return function() { 93 var args = slice.call(arguments); 94 args.unshift(this[attribute]); 95 return _[method].apply(_, args); 96 }; 97 } 98 }; 99 var addUnderscoreMethods = function(Class, methods, attribute) { 100 _.each(methods, function(length, method) { 101 if (_[method]) Class.prototype[method] = addMethod(length, method, attribute); 102 }); 103 }; 104 105 // Support `collection.sortBy('attr')` and `collection.findWhere({id: 1})`. 106 var cb = function(iteratee, instance) { 107 if (_.isFunction(iteratee)) return iteratee; 108 if (_.isObject(iteratee) && !instance._isModel(iteratee)) return modelMatcher(iteratee); 109 if (_.isString(iteratee)) return function(model) { return model.get(iteratee); }; 110 return iteratee; 111 }; 112 var modelMatcher = function(attrs) { 113 var matcher = _.matches(attrs); 114 return function(model) { 115 return matcher(model.attributes); 116 }; 117 }; 118 68 119 // Backbone.Events 69 120 // --------------- 70 121 71 122 // A module that can be mixed in to *any object* in order to provide it with 72 // custom events. You may bind with `on` or remove with `off` callback73 // functions to an event; `trigger`-ing an event fires all callbacks in123 // a custom event channel. You may bind a callback to an event with `on` or 124 // remove with `off`; `trigger`-ing an event fires all callbacks in 74 125 // succession. 75 126 // 76 127 // var object = {}; … … 78 129 // object.on('expand', function(){ alert('expanded'); }); 79 130 // object.trigger('expand'); 80 131 // 81 var Events = Backbone.Events = { 132 var Events = Backbone.Events = {}; 82 133 83 // Bind an event to a `callback` function. Passing `"all"` will bind 84 // the callback to all events fired. 85 on: function(name, callback, context) { 86 if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this; 87 this._events || (this._events = {}); 88 var events = this._events[name] || (this._events[name] = []); 89 events.push({callback: callback, context: context, ctx: context || this}); 90 return this; 91 }, 134 // Regular expression used to split event strings. 135 var eventSplitter = /\s+/; 92 136 93 // Bind an event to only be triggered a single time. After the first time 94 // the callback is invoked, it will be removed. 95 once: function(name, callback, context) { 96 if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this; 97 var self = this; 98 var once = _.once(function() { 99 self.off(name, once); 100 callback.apply(this, arguments); 101 }); 102 once._callback = callback; 103 return this.on(name, once, context); 104 }, 105 106 // Remove one or many callbacks. If `context` is null, removes all 107 // callbacks with that function. If `callback` is null, removes all 108 // callbacks for the event. If `name` is null, removes all bound 109 // callbacks for all events. 110 off: function(name, callback, context) { 111 var retain, ev, events, names, i, l, j, k; 112 if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this; 113 if (!name && !callback && !context) { 114 this._events = void 0; 115 return this; 137 // Iterates over the standard `event, callback` (as well as the fancy multiple 138 // space-separated events `"change blur", callback` and jQuery-style event 139 // maps `{event: callback}`). 140 var eventsApi = function(iteratee, events, name, callback, opts) { 141 var i = 0, names; 142 if (name && typeof name === 'object') { 143 // Handle event maps. 144 if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback; 145 for (names = _.keys(name); i < names.length ; i++) { 146 events = eventsApi(iteratee, events, names[i], name[names[i]], opts); 116 147 } 117 names = name ? [name] : _.keys(this._events); 118 for (i = 0, l = names.length; i < l; i++) { 119 name = names[i]; 120 if (events = this._events[name]) { 121 this._events[name] = retain = []; 122 if (callback || context) { 123 for (j = 0, k = events.length; j < k; j++) { 124 ev = events[j]; 125 if ((callback && callback !== ev.callback && callback !== ev.callback._callback) || 126 (context && context !== ev.context)) { 127 retain.push(ev); 128 } 129 } 130 } 131 if (!retain.length) delete this._events[name]; 132 } 148 } else if (name && eventSplitter.test(name)) { 149 // Handle space separated event names by delegating them individually. 150 for (names = name.split(eventSplitter); i < names.length; i++) { 151 events = iteratee(events, names[i], callback, opts); 133 152 } 153 } else { 154 // Finally, standard events. 155 events = iteratee(events, name, callback, opts); 156 } 157 return events; 158 }; 134 159 135 return this; 136 }, 160 // Bind an event to a `callback` function. Passing `"all"` will bind 161 // the callback to all events fired. 162 Events.on = function(name, callback, context) { 163 return internalOn(this, name, callback, context); 164 }; 137 165 138 // Trigger one or many events, firing all bound callbacks. Callbacks are 139 // passed the same arguments as `trigger` is, apart from the event name 140 // (unless you're listening on `"all"`, which will cause your callback to 141 // receive the true name of the event as the first argument). 142 trigger: function(name) { 143 if (!this._events) return this; 144 var args = slice.call(arguments, 1); 145 if (!eventsApi(this, 'trigger', name, args)) return this; 146 var events = this._events[name]; 147 var allEvents = this._events.all; 148 if (events) triggerEvents(events, args); 149 if (allEvents) triggerEvents(allEvents, arguments); 150 return this; 151 }, 166 // Guard the `listening` argument from the public API. 167 var internalOn = function(obj, name, callback, context, listening) { 168 obj._events = eventsApi(onApi, obj._events || {}, name, callback, { 169 context: context, 170 ctx: obj, 171 listening: listening 172 }); 152 173 153 // Tell this object to stop listening to either specific events ... or 154 // to every object it's currently listening to. 155 stopListening: function(obj, name, callback) { 156 var listeningTo = this._listeningTo; 157 if (!listeningTo) return this; 158 var remove = !name && !callback; 159 if (!callback && typeof name === 'object') callback = this; 160 if (obj) (listeningTo = {})[obj._listenId] = obj; 161 for (var id in listeningTo) { 162 obj = listeningTo[id]; 163 obj.off(name, callback, this); 164 if (remove || _.isEmpty(obj._events)) delete this._listeningTo[id]; 165 } 166 return this; 174 if (listening) { 175 var listeners = obj._listeners || (obj._listeners = {}); 176 listeners[listening.id] = listening; 167 177 } 168 178 179 return obj; 169 180 }; 170 181 171 // Regular expression used to split event strings. 172 var eventSplitter = /\s+/; 182 // Inversion-of-control versions of `on`. Tell *this* object to listen to 183 // an event in another object... keeping track of what it's listening to 184 // for easier unbinding later. 185 Events.listenTo = function(obj, name, callback) { 186 if (!obj) return this; 187 var id = obj._listenId || (obj._listenId = _.uniqueId('l')); 188 var listeningTo = this._listeningTo || (this._listeningTo = {}); 189 var listening = listeningTo[id]; 173 190 174 // Implement fancy features of the Events API such as multiple event 175 // names `"change blur"` and jQuery-style event maps `{change: action}` 176 // in terms of the existing API. 177 var eventsApi = function(obj, action, name, rest) { 178 if (!name) return true; 191 // This object is not listening to any other events on `obj` yet. 192 // Setup the necessary references to track the listening callbacks. 193 if (!listening) { 194 var thisId = this._listenId || (this._listenId = _.uniqueId('l')); 195 listening = listeningTo[id] = {obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0}; 196 } 179 197 180 // Handle event maps. 181 if (typeof name === 'object') { 182 for (var key in name) { 183 obj[action].apply(obj, [key, name[key]].concat(rest)); 198 // Bind callbacks on obj, and keep track of them on listening. 199 internalOn(obj, name, callback, this, listening); 200 return this; 201 }; 202 203 // The reducing API that adds a callback to the `events` object. 204 var onApi = function(events, name, callback, options) { 205 if (callback) { 206 var handlers = events[name] || (events[name] = []); 207 var context = options.context, ctx = options.ctx, listening = options.listening; 208 if (listening) listening.count++; 209 210 handlers.push({ callback: callback, context: context, ctx: context || ctx, listening: listening }); 211 } 212 return events; 213 }; 214 215 // Remove one or many callbacks. If `context` is null, removes all 216 // callbacks with that function. If `callback` is null, removes all 217 // callbacks for the event. If `name` is null, removes all bound 218 // callbacks for all events. 219 Events.off = function(name, callback, context) { 220 if (!this._events) return this; 221 this._events = eventsApi(offApi, this._events, name, callback, { 222 context: context, 223 listeners: this._listeners 224 }); 225 return this; 226 }; 227 228 // Tell this object to stop listening to either specific events ... or 229 // to every object it's currently listening to. 230 Events.stopListening = function(obj, name, callback) { 231 var listeningTo = this._listeningTo; 232 if (!listeningTo) return this; 233 234 var ids = obj ? [obj._listenId] : _.keys(listeningTo); 235 236 for (var i = 0; i < ids.length; i++) { 237 var listening = listeningTo[ids[i]]; 238 239 // If listening doesn't exist, this object is not currently 240 // listening to obj. Break out early. 241 if (!listening) break; 242 243 listening.obj.off(name, callback, this); 244 } 245 if (_.isEmpty(listeningTo)) this._listeningTo = void 0; 246 247 return this; 248 }; 249 250 // The reducing API that removes a callback from the `events` object. 251 var offApi = function(events, name, callback, options) { 252 if (!events) return; 253 254 var i = 0, listening; 255 var context = options.context, listeners = options.listeners; 256 257 // Delete all events listeners and "drop" events. 258 if (!name && !callback && !context) { 259 var ids = _.keys(listeners); 260 for (; i < ids.length; i++) { 261 listening = listeners[ids[i]]; 262 delete listeners[listening.id]; 263 delete listening.listeningTo[listening.objId]; 184 264 } 185 return false;265 return; 186 266 } 187 267 188 // Handle space separated event names. 189 if (eventSplitter.test(name)) { 190 var names = name.split(eventSplitter); 191 for (var i = 0, l = names.length; i < l; i++) { 192 obj[action].apply(obj, [names[i]].concat(rest)); 268 var names = name ? [name] : _.keys(events); 269 for (; i < names.length; i++) { 270 name = names[i]; 271 var handlers = events[name]; 272 273 // Bail out if there are no events stored. 274 if (!handlers) break; 275 276 // Replace events if there are any remaining. Otherwise, clean up. 277 var remaining = []; 278 for (var j = 0; j < handlers.length; j++) { 279 var handler = handlers[j]; 280 if ( 281 callback && callback !== handler.callback && 282 callback !== handler.callback._callback || 283 context && context !== handler.context 284 ) { 285 remaining.push(handler); 286 } else { 287 listening = handler.listening; 288 if (listening && --listening.count === 0) { 289 delete listeners[listening.id]; 290 delete listening.listeningTo[listening.objId]; 291 } 292 } 193 293 } 194 return false; 294 295 // Update tail event if the list has any events. Otherwise, clean up. 296 if (remaining.length) { 297 events[name] = remaining; 298 } else { 299 delete events[name]; 300 } 195 301 } 302 if (_.size(events)) return events; 303 }; 196 304 197 return true; 305 // Bind an event to only be triggered a single time. After the first time 306 // the callback is invoked, its listener will be removed. If multiple events 307 // are passed in using the space-separated syntax, the handler will fire 308 // once for each event, not once for a combination of all events. 309 Events.once = function(name, callback, context) { 310 // Map the event into a `{event: once}` object. 311 var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this)); 312 return this.on(events, void 0, context); 198 313 }; 199 314 315 // Inversion-of-control versions of `once`. 316 Events.listenToOnce = function(obj, name, callback) { 317 // Map the event into a `{event: once}` object. 318 var events = eventsApi(onceMap, {}, name, callback, _.bind(this.stopListening, this, obj)); 319 return this.listenTo(obj, events); 320 }; 321 322 // Reduces the event callbacks into a map of `{event: onceWrapper}`. 323 // `offer` unbinds the `onceWrapper` after it has been called. 324 var onceMap = function(map, name, callback, offer) { 325 if (callback) { 326 var once = map[name] = _.once(function() { 327 offer(name, once); 328 callback.apply(this, arguments); 329 }); 330 once._callback = callback; 331 } 332 return map; 333 }; 334 335 // Trigger one or many events, firing all bound callbacks. Callbacks are 336 // passed the same arguments as `trigger` is, apart from the event name 337 // (unless you're listening on `"all"`, which will cause your callback to 338 // receive the true name of the event as the first argument). 339 Events.trigger = function(name) { 340 if (!this._events) return this; 341 342 var length = Math.max(0, arguments.length - 1); 343 var args = Array(length); 344 for (var i = 0; i < length; i++) args[i] = arguments[i + 1]; 345 346 eventsApi(triggerApi, this._events, name, void 0, args); 347 return this; 348 }; 349 350 // Handles triggering the appropriate event callbacks. 351 var triggerApi = function(objEvents, name, cb, args) { 352 if (objEvents) { 353 var events = objEvents[name]; 354 var allEvents = objEvents.all; 355 if (events && allEvents) allEvents = allEvents.slice(); 356 if (events) triggerEvents(events, args); 357 if (allEvents) triggerEvents(allEvents, [name].concat(args)); 358 } 359 return objEvents; 360 }; 361 200 362 // A difficult-to-believe, but optimized internal dispatch function for 201 363 // triggering events. Tries to keep the usual cases speedy (most internal 202 364 // Backbone events have 3 arguments). … … 211 373 } 212 374 }; 213 375 214 var listenMethods = {listenTo: 'on', listenToOnce: 'once'};215 216 // Inversion-of-control versions of `on` and `once`. Tell *this* object to217 // listen to an event in another object ... keeping track of what it's218 // listening to.219 _.each(listenMethods, function(implementation, method) {220 Events[method] = function(obj, name, callback) {221 var listeningTo = this._listeningTo || (this._listeningTo = {});222 var id = obj._listenId || (obj._listenId = _.uniqueId('l'));223 listeningTo[id] = obj;224 if (!callback && typeof name === 'object') callback = this;225 obj[implementation](name, callback, this);226 return this;227 };228 });229 230 376 // Aliases for backwards compatibility. 231 377 Events.bind = Events.on; 232 378 Events.unbind = Events.off; … … 248 394 var Model = Backbone.Model = function(attributes, options) { 249 395 var attrs = attributes || {}; 250 396 options || (options = {}); 251 this.cid = _.uniqueId( 'c');397 this.cid = _.uniqueId(this.cidPrefix); 252 398 this.attributes = {}; 253 399 if (options.collection) this.collection = options.collection; 254 400 if (options.parse) attrs = this.parse(attrs, options) || {}; … … 271 417 // CouchDB users may want to set this to `"_id"`. 272 418 idAttribute: 'id', 273 419 420 // The prefix is used to create the client id which is used to identify models locally. 421 // You may want to override this if you're experiencing name clashes with model ids. 422 cidPrefix: 'c', 423 274 424 // Initialize is an empty function by default. Override it with your own 275 425 // initialization logic. 276 426 initialize: function(){}, … … 302 452 return this.get(attr) != null; 303 453 }, 304 454 455 // Special-cased proxy to underscore's `_.matches` method. 456 matches: function(attrs) { 457 return !!_.iteratee(attrs, this)(this.attributes); 458 }, 459 305 460 // Set a hash of model attributes on the object, firing `"change"`. This is 306 461 // the core primitive operation of a model, updating the data and notifying 307 462 // anyone who needs to know about the change in state. The heart of the beast. 308 463 set: function(key, val, options) { 309 var attr, attrs, unset, changes, silent, changing, prev, current;310 464 if (key == null) return this; 311 465 312 466 // Handle both `"key", value` and `{key: value}` -style arguments. 467 var attrs; 313 468 if (typeof key === 'object') { 314 469 attrs = key; 315 470 options = val; … … 323 478 if (!this._validate(attrs, options)) return false; 324 479 325 480 // Extract attributes and options. 326 unset= options.unset;327 silent= options.silent;328 changes= [];329 changing= this._changing;330 this._changing = true;481 var unset = options.unset; 482 var silent = options.silent; 483 var changes = []; 484 var changing = this._changing; 485 this._changing = true; 331 486 332 487 if (!changing) { 333 488 this._previousAttributes = _.clone(this.attributes); 334 489 this.changed = {}; 335 490 } 336 current = this.attributes, prev = this._previousAttributes;337 491 338 // Check for changes of `id`. 339 if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; 492 var current = this.attributes; 493 var changed = this.changed; 494 var prev = this._previousAttributes; 340 495 341 496 // For each `set` attribute, update or delete the current value. 342 for ( attr in attrs) {497 for (var attr in attrs) { 343 498 val = attrs[attr]; 344 499 if (!_.isEqual(current[attr], val)) changes.push(attr); 345 500 if (!_.isEqual(prev[attr], val)) { 346 this.changed[attr] = val;501 changed[attr] = val; 347 502 } else { 348 delete this.changed[attr];503 delete changed[attr]; 349 504 } 350 505 unset ? delete current[attr] : current[attr] = val; 351 506 } 352 507 508 // Update the `id`. 509 this.id = this.get(this.idAttribute); 510 353 511 // Trigger all relevant attribute changes. 354 512 if (!silent) { 355 513 if (changes.length) this._pending = options; 356 for (var i = 0 , l = changes.length; i < l; i++) {514 for (var i = 0; i < changes.length; i++) { 357 515 this.trigger('change:' + changes[i], this, current[changes[i]], options); 358 516 } 359 517 } … … 401 559 // determining if there *would be* a change. 402 560 changedAttributes: function(diff) { 403 561 if (!diff) return this.hasChanged() ? _.clone(this.changed) : false; 404 var val, changed = false;405 562 var old = this._changing ? this._previousAttributes : this.attributes; 563 var changed = {}; 406 564 for (var attr in diff) { 407 if (_.isEqual(old[attr], (val = diff[attr]))) continue; 408 (changed || (changed = {}))[attr] = val; 565 var val = diff[attr]; 566 if (_.isEqual(old[attr], val)) continue; 567 changed[attr] = val; 409 568 } 410 return changed;569 return _.size(changed) ? changed : false; 411 570 }, 412 571 413 572 // Get the previous value of an attribute, recorded at the time the last … … 423 582 return _.clone(this._previousAttributes); 424 583 }, 425 584 426 // Fetch the model from the server. If the server's representation of the 427 // model differs from its current attributes, they will be overridden, 428 // triggering a `"change"` event. 585 // Fetch the model from the server, merging the response with the model's 586 // local attributes. Any changed attributes will trigger a "change" event. 429 587 fetch: function(options) { 430 options = options ? _.clone(options) : {}; 431 if (options.parse === void 0) options.parse = true; 588 options = _.extend({parse: true}, options); 432 589 var model = this; 433 590 var success = options.success; 434 591 options.success = function(resp) { 435 if (!model.set(model.parse(resp, options), options)) return false; 436 if (success) success(model, resp, options); 592 var serverAttrs = options.parse ? model.parse(resp, options) : resp; 593 if (!model.set(serverAttrs, options)) return false; 594 if (success) success.call(options.context, model, resp, options); 437 595 model.trigger('sync', model, resp, options); 438 596 }; 439 597 wrapError(this, options); … … 444 602 // If the server returns an attributes hash that differs, the model's 445 603 // state will be `set` again. 446 604 save: function(key, val, options) { 447 var attrs, method, xhr, attributes = this.attributes;448 449 605 // Handle both `"key", value` and `{key: value}` -style arguments. 606 var attrs; 450 607 if (key == null || typeof key === 'object') { 451 608 attrs = key; 452 609 options = val; … … 454 611 (attrs = {})[key] = val; 455 612 } 456 613 457 options = _.extend({validate: true}, options); 614 options = _.extend({validate: true, parse: true}, options); 615 var wait = options.wait; 458 616 459 617 // If we're not waiting and attributes exist, save acts as 460 618 // `set(attr).save(null, opts)` with validation. Otherwise, check if 461 619 // the model will be valid when the attributes, if any, are set. 462 if (attrs && ! options.wait) {620 if (attrs && !wait) { 463 621 if (!this.set(attrs, options)) return false; 464 622 } else { 465 623 if (!this._validate(attrs, options)) return false; 466 624 } 467 625 468 // Set temporary attributes if `{wait: true}`.469 if (attrs && options.wait) {470 this.attributes = _.extend({}, attributes, attrs);471 }472 473 626 // After a successful server-side save, the client is (optionally) 474 627 // updated with the server-side state. 475 if (options.parse === void 0) options.parse = true;476 628 var model = this; 477 629 var success = options.success; 630 var attributes = this.attributes; 478 631 options.success = function(resp) { 479 632 // Ensure attributes are restored during synchronous saves. 480 633 model.attributes = attributes; 481 var serverAttrs = model.parse(resp, options); 482 if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); 483 if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) { 484 return false; 485 } 486 if (success) success(model, resp, options); 634 var serverAttrs = options.parse ? model.parse(resp, options) : resp; 635 if (wait) serverAttrs = _.extend({}, attrs, serverAttrs); 636 if (serverAttrs && !model.set(serverAttrs, options)) return false; 637 if (success) success.call(options.context, model, resp, options); 487 638 model.trigger('sync', model, resp, options); 488 639 }; 489 640 wrapError(this, options); 490 641 491 method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); 492 if (method === 'patch') options.attrs = attrs; 493 xhr = this.sync(method, this, options); 642 // Set temporary attributes if `{wait: true}` to properly find new ids. 643 if (attrs && wait) this.attributes = _.extend({}, attributes, attrs); 494 644 645 var method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); 646 if (method === 'patch' && !options.attrs) options.attrs = attrs; 647 var xhr = this.sync(method, this, options); 648 495 649 // Restore attributes. 496 if (attrs && options.wait)this.attributes = attributes;650 this.attributes = attributes; 497 651 498 652 return xhr; 499 653 }, … … 505 659 options = options ? _.clone(options) : {}; 506 660 var model = this; 507 661 var success = options.success; 662 var wait = options.wait; 508 663 509 664 var destroy = function() { 665 model.stopListening(); 510 666 model.trigger('destroy', model, model.collection, options); 511 667 }; 512 668 513 669 options.success = function(resp) { 514 if ( options.wait || model.isNew()) destroy();515 if (success) success (model, resp, options);670 if (wait) destroy(); 671 if (success) success.call(options.context, model, resp, options); 516 672 if (!model.isNew()) model.trigger('sync', model, resp, options); 517 673 }; 518 674 675 var xhr = false; 519 676 if (this.isNew()) { 520 options.success(); 521 return false; 677 _.defer(options.success); 678 } else { 679 wrapError(this, options); 680 xhr = this.sync('delete', this, options); 522 681 } 523 wrapError(this, options); 524 525 var xhr = this.sync('delete', this, options); 526 if (!options.wait) destroy(); 682 if (!wait) destroy(); 527 683 return xhr; 528 684 }, 529 685 … … 536 692 _.result(this.collection, 'url') || 537 693 urlError(); 538 694 if (this.isNew()) return base; 539 return base.replace(/([^\/])$/, '$1/') + encodeURIComponent(this.id); 695 var id = this.get(this.idAttribute); 696 return base.replace(/[^\/]$/, '$&/') + encodeURIComponent(id); 540 697 }, 541 698 542 699 // **parse** converts a response into the hash of attributes to be `set` on … … 557 714 558 715 // Check if the model is currently in a valid state. 559 716 isValid: function(options) { 560 return this._validate({}, _. extend(options || {}, { validate: true }));717 return this._validate({}, _.defaults({validate: true}, options)); 561 718 }, 562 719 563 720 // Run validation against the next complete set of model attributes, … … 573 730 574 731 }); 575 732 576 // Underscore methods that we want to implement on the Model. 577 var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit']; 733 // Underscore methods that we want to implement on the Model, mapped to the 734 // number of arguments they take. 735 var modelMethods = { keys: 1, values: 1, pairs: 1, invert: 1, pick: 0, 736 omit: 0, chain: 1, isEmpty: 1 }; 578 737 579 738 // Mix in each Underscore method as a proxy to `Model#attributes`. 580 _.each(modelMethods, function(method) { 581 Model.prototype[method] = function() { 582 var args = slice.call(arguments); 583 args.unshift(this.attributes); 584 return _[method].apply(_, args); 585 }; 586 }); 739 addUnderscoreMethods(Model, modelMethods, 'attributes'); 587 740 588 741 // Backbone.Collection 589 742 // ------------------- 590 743 591 744 // If models tend to represent a single row of data, a Backbone Collection is 592 // more anal agous to a table full of data ... or a small slice or page of that745 // more analogous to a table full of data ... or a small slice or page of that 593 746 // table, or a collection of rows that belong together for a particular reason 594 747 // -- all of the messages in this particular folder, all of the documents 595 748 // belonging to this particular author, and so on. Collections maintain … … 611 764 var setOptions = {add: true, remove: true, merge: true}; 612 765 var addOptions = {add: true, remove: false}; 613 766 767 // Splices `insert` into `array` at index `at`. 768 var splice = function(array, insert, at) { 769 at = Math.min(Math.max(at, 0), array.length); 770 var tail = Array(array.length - at); 771 var length = insert.length; 772 for (var i = 0; i < tail.length; i++) tail[i] = array[i + at]; 773 for (i = 0; i < length; i++) array[i + at] = insert[i]; 774 for (i = 0; i < tail.length; i++) array[i + length + at] = tail[i]; 775 }; 776 614 777 // Define the Collection's inheritable methods. 615 778 _.extend(Collection.prototype, Events, { 616 779 … … 625 788 // The JSON representation of a Collection is an array of the 626 789 // models' attributes. 627 790 toJSON: function(options) { 628 return this.map(function(model) { return model.toJSON(options); });791 return this.map(function(model) { return model.toJSON(options); }); 629 792 }, 630 793 631 794 // Proxy `Backbone.sync` by default. … … 633 796 return Backbone.sync.apply(this, arguments); 634 797 }, 635 798 636 // Add a model, or list of models to the set. 799 // Add a model, or list of models to the set. `models` may be Backbone 800 // Models or raw JavaScript objects to be converted to Models, or any 801 // combination of the two. 637 802 add: function(models, options) { 638 803 return this.set(models, _.extend({merge: false}, options, addOptions)); 639 804 }, … … 640 805 641 806 // Remove a model, or a list of models from the set. 642 807 remove: function(models, options) { 808 options = _.extend({}, options); 643 809 var singular = !_.isArray(models); 644 810 models = singular ? [models] : _.clone(models); 645 options || (options = {}); 646 var i, l, index, model; 647 for (i = 0, l = models.length; i < l; i++) { 648 model = models[i] = this.get(models[i]); 649 if (!model) continue; 650 delete this._byId[model.id]; 651 delete this._byId[model.cid]; 652 index = this.indexOf(model); 653 this.models.splice(index, 1); 654 this.length--; 655 if (!options.silent) { 656 options.index = index; 657 model.trigger('remove', model, this, options); 658 } 659 this._removeReference(model, options); 660 } 661 return singular ? models[0] : models; 811 var removed = this._removeModels(models, options); 812 if (!options.silent && removed) this.trigger('update', this, options); 813 return singular ? removed[0] : removed; 662 814 }, 663 815 664 816 // Update a collection by `set`-ing a new list of models, adding new ones, … … 666 818 // already exist in the collection, as necessary. Similar to **Model#set**, 667 819 // the core operation for updating the data contained by the collection. 668 820 set: function(models, options) { 821 if (models == null) return; 822 669 823 options = _.defaults({}, options, setOptions); 670 if (options.parse) models = this.parse(models, options); 824 if (options.parse && !this._isModel(models)) models = this.parse(models, options); 825 671 826 var singular = !_.isArray(models); 672 models = singular ? (models ? [models] : []) : _.clone(models);673 var i, l, id, model, attrs, existing, sort; 827 models = singular ? [models] : models.slice(); 828 674 829 var at = options.at; 675 var targetModel = this.model; 830 if (at != null) at = +at; 831 if (at < 0) at += this.length + 1; 832 833 var set = []; 834 var toAdd = []; 835 var toRemove = []; 836 var modelMap = {}; 837 838 var add = options.add; 839 var merge = options.merge; 840 var remove = options.remove; 841 842 var sort = false; 676 843 var sortable = this.comparator && (at == null) && options.sort !== false; 677 844 var sortAttr = _.isString(this.comparator) ? this.comparator : null; 678 var toAdd = [], toRemove = [], modelMap = {};679 var add = options.add, merge = options.merge, remove = options.remove;680 var order = !sortable && add && remove ? [] : false;681 845 682 846 // Turn bare objects into model references, and prevent invalid models 683 847 // from being added. 684 for (i = 0, l = models.length; i < l; i++) { 685 attrs = models[i] || {}; 686 if (attrs instanceof Model) { 687 id = model = attrs; 688 } else { 689 id = attrs[targetModel.prototype.idAttribute || 'id']; 690 } 848 var model; 849 for (var i = 0; i < models.length; i++) { 850 model = models[i]; 691 851 692 852 // If a duplicate is found, prevent it from being added and 693 853 // optionally merge it into the existing model. 694 if (existing = this.get(id)) {695 if (remove) modelMap[existing.cid] = true;696 if (merge ) {697 attrs = attrs === model ? model.attributes : attrs;854 var existing = this.get(model); 855 if (existing) { 856 if (merge && model !== existing) { 857 var attrs = this._isModel(model) ? model.attributes : model; 698 858 if (options.parse) attrs = existing.parse(attrs, options); 699 859 existing.set(attrs, options); 700 if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;860 if (sortable && !sort) sort = existing.hasChanged(sortAttr); 701 861 } 862 if (!modelMap[existing.cid]) { 863 modelMap[existing.cid] = true; 864 set.push(existing); 865 } 702 866 models[i] = existing; 703 867 704 868 // If this is a new, valid model, push it to the `toAdd` list. 705 869 } else if (add) { 706 model = models[i] = this._prepareModel(attrs, options); 707 if (!model) continue; 708 toAdd.push(model); 709 this._addReference(model, options); 870 model = models[i] = this._prepareModel(model, options); 871 if (model) { 872 toAdd.push(model); 873 this._addReference(model, options); 874 modelMap[model.cid] = true; 875 set.push(model); 876 } 710 877 } 711 712 // Do not add multiple models with the same `id`.713 model = existing || model;714 if (order && (model.isNew() || !modelMap[model.id])) order.push(model);715 modelMap[model.id] = true;716 878 } 717 879 718 // Remove nonexistent models if appropriate.880 // Remove stale models. 719 881 if (remove) { 720 for (i = 0, l = this.length; i < l; ++i) { 721 if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model); 882 for (i = 0; i < this.length; i++) { 883 model = this.models[i]; 884 if (!modelMap[model.cid]) toRemove.push(model); 722 885 } 723 if (toRemove.length) this. remove(toRemove, options);886 if (toRemove.length) this._removeModels(toRemove, options); 724 887 } 725 888 726 889 // See if sorting is needed, update `length` and splice in new models. 727 if (toAdd.length || (order && order.length)) { 890 var orderChanged = false; 891 var replace = !sortable && add && remove; 892 if (set.length && replace) { 893 orderChanged = this.length != set.length || _.some(this.models, function(model, index) { 894 return model !== set[index]; 895 }); 896 this.models.length = 0; 897 splice(this.models, set, 0); 898 this.length = this.models.length; 899 } else if (toAdd.length) { 728 900 if (sortable) sort = true; 729 this.length += toAdd.length; 730 if (at != null) { 731 for (i = 0, l = toAdd.length; i < l; i++) { 732 this.models.splice(at + i, 0, toAdd[i]); 733 } 734 } else { 735 if (order) this.models.length = 0; 736 var orderedModels = order || toAdd; 737 for (i = 0, l = orderedModels.length; i < l; i++) { 738 this.models.push(orderedModels[i]); 739 } 740 } 901 splice(this.models, toAdd, at == null ? this.length : at); 902 this.length = this.models.length; 741 903 } 742 904 743 905 // Silently sort the collection if appropriate. … … 745 907 746 908 // Unless silenced, it's time to fire all appropriate add/sort events. 747 909 if (!options.silent) { 748 for (i = 0, l = toAdd.length; i < l; i++) { 749 (model = toAdd[i]).trigger('add', model, this, options); 910 for (i = 0; i < toAdd.length; i++) { 911 if (at != null) options.index = at + i; 912 model = toAdd[i]; 913 model.trigger('add', model, this, options); 750 914 } 751 if (sort || (order && order.length)) this.trigger('sort', this, options); 915 if (sort || orderChanged) this.trigger('sort', this, options); 916 if (toAdd.length || toRemove.length) this.trigger('update', this, options); 752 917 } 753 918 754 919 // Return the added (or merged) model (or models). … … 760 925 // any granular `add` or `remove` events. Fires `reset` when finished. 761 926 // Useful for bulk operations and optimizations. 762 927 reset: function(models, options) { 763 options || (options = {});764 for (var i = 0 , l = this.models.length; i < l; i++) {928 options = options ? _.clone(options) : {}; 929 for (var i = 0; i < this.models.length; i++) { 765 930 this._removeReference(this.models[i], options); 766 931 } 767 932 options.previousModels = this.models; … … 779 944 // Remove a model from the end of the collection. 780 945 pop: function(options) { 781 946 var model = this.at(this.length - 1); 782 this.remove(model, options); 783 return model; 947 return this.remove(model, options); 784 948 }, 785 949 786 950 // Add a model to the beginning of the collection. … … 791 955 // Remove a model from the beginning of the collection. 792 956 shift: function(options) { 793 957 var model = this.at(0); 794 this.remove(model, options); 795 return model; 958 return this.remove(model, options); 796 959 }, 797 960 798 961 // Slice out a sub-array of models from the collection. … … 803 966 // Get a model from the set by id. 804 967 get: function(obj) { 805 968 if (obj == null) return void 0; 806 return this._byId[obj] || this._byId[obj.id] || this._byId[obj.cid]; 969 var id = this.modelId(this._isModel(obj) ? obj.attributes : obj); 970 return this._byId[obj] || this._byId[id] || this._byId[obj.cid]; 807 971 }, 808 972 809 973 // Get the model at the given index. 810 974 at: function(index) { 975 if (index < 0) index += this.length; 811 976 return this.models[index]; 812 977 }, 813 978 … … 814 979 // Return models with matching attributes. Useful for simple cases of 815 980 // `filter`. 816 981 where: function(attrs, first) { 817 if (_.isEmpty(attrs)) return first ? void 0 : []; 818 return this[first ? 'find' : 'filter'](function(model) { 819 for (var key in attrs) { 820 if (attrs[key] !== model.get(key)) return false; 821 } 822 return true; 823 }); 982 return this[first ? 'find' : 'filter'](attrs); 824 983 }, 825 984 826 985 // Return the first model with matching attributes. Useful for simple cases … … 833 992 // normal circumstances, as the set will maintain sort order as each item 834 993 // is added. 835 994 sort: function(options) { 836 if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); 995 var comparator = this.comparator; 996 if (!comparator) throw new Error('Cannot sort a set without a comparator'); 837 997 options || (options = {}); 838 998 999 var length = comparator.length; 1000 if (_.isFunction(comparator)) comparator = _.bind(comparator, this); 1001 839 1002 // Run sort based on type of `comparator`. 840 if ( _.isString(this.comparator) || this.comparator.length === 1) {841 this.models = this.sortBy( this.comparator, this);1003 if (length === 1 || _.isString(comparator)) { 1004 this.models = this.sortBy(comparator); 842 1005 } else { 843 this.models.sort( _.bind(this.comparator, this));1006 this.models.sort(comparator); 844 1007 } 845 846 1008 if (!options.silent) this.trigger('sort', this, options); 847 1009 return this; 848 1010 }, … … 856 1018 // collection when they arrive. If `reset: true` is passed, the response 857 1019 // data will be passed through the `reset` method instead of `set`. 858 1020 fetch: function(options) { 859 options = options ? _.clone(options) : {}; 860 if (options.parse === void 0) options.parse = true; 1021 options = _.extend({parse: true}, options); 861 1022 var success = options.success; 862 1023 var collection = this; 863 1024 options.success = function(resp) { 864 1025 var method = options.reset ? 'reset' : 'set'; 865 1026 collection[method](resp, options); 866 if (success) success (collection, resp, options);1027 if (success) success.call(options.context, collection, resp, options); 867 1028 collection.trigger('sync', collection, resp, options); 868 1029 }; 869 1030 wrapError(this, options); … … 875 1036 // wait for the server to agree. 876 1037 create: function(model, options) { 877 1038 options = options ? _.clone(options) : {}; 878 if (!(model = this._prepareModel(model, options))) return false; 879 if (!options.wait) this.add(model, options); 1039 var wait = options.wait; 1040 model = this._prepareModel(model, options); 1041 if (!model) return false; 1042 if (!wait) this.add(model, options); 880 1043 var collection = this; 881 1044 var success = options.success; 882 options.success = function(model, resp ) {883 if ( options.wait) collection.add(model, options);884 if (success) success (model, resp, options);1045 options.success = function(model, resp, callbackOpts) { 1046 if (wait) collection.add(model, callbackOpts); 1047 if (success) success.call(callbackOpts.context, model, resp, callbackOpts); 885 1048 }; 886 1049 model.save(null, options); 887 1050 return model; … … 895 1058 896 1059 // Create a new collection with an identical list of models as this one. 897 1060 clone: function() { 898 return new this.constructor(this.models); 1061 return new this.constructor(this.models, { 1062 model: this.model, 1063 comparator: this.comparator 1064 }); 899 1065 }, 900 1066 1067 // Define how to uniquely identify models in the collection. 1068 modelId: function (attrs) { 1069 return attrs[this.model.prototype.idAttribute || 'id']; 1070 }, 1071 901 1072 // Private method to reset all internal state. Called when the collection 902 1073 // is first initialized or reset. 903 1074 _reset: function() { … … 909 1080 // Prepare a hash of attributes (or other model) to be added to this 910 1081 // collection. 911 1082 _prepareModel: function(attrs, options) { 912 if (attrs instanceof Model) return attrs; 1083 if (this._isModel(attrs)) { 1084 if (!attrs.collection) attrs.collection = this; 1085 return attrs; 1086 } 913 1087 options = options ? _.clone(options) : {}; 914 1088 options.collection = this; 915 1089 var model = new this.model(attrs, options); … … 918 1092 return false; 919 1093 }, 920 1094 1095 // Internal method called by both remove and set. 1096 _removeModels: function(models, options) { 1097 var removed = []; 1098 for (var i = 0; i < models.length; i++) { 1099 var model = this.get(models[i]); 1100 if (!model) continue; 1101 1102 var index = this.indexOf(model); 1103 this.models.splice(index, 1); 1104 this.length--; 1105 1106 if (!options.silent) { 1107 options.index = index; 1108 model.trigger('remove', model, this, options); 1109 } 1110 1111 removed.push(model); 1112 this._removeReference(model, options); 1113 } 1114 return removed.length ? removed : false; 1115 }, 1116 1117 // Method for checking whether an object should be considered a model for 1118 // the purposes of adding to the collection. 1119 _isModel: function (model) { 1120 return model instanceof Model; 1121 }, 1122 921 1123 // Internal method to create a model's ties to a collection. 922 1124 _addReference: function(model, options) { 923 1125 this._byId[model.cid] = model; 924 if (model.id != null) this._byId[model.id] = model;925 if ( !model.collection) model.collection = this;1126 var id = this.modelId(model.attributes); 1127 if (id != null) this._byId[id] = model; 926 1128 model.on('all', this._onModelEvent, this); 927 1129 }, 928 1130 929 1131 // Internal method to sever a model's ties to a collection. 930 1132 _removeReference: function(model, options) { 1133 delete this._byId[model.cid]; 1134 var id = this.modelId(model.attributes); 1135 if (id != null) delete this._byId[id]; 931 1136 if (this === model.collection) delete model.collection; 932 1137 model.off('all', this._onModelEvent, this); 933 1138 }, … … 939 1144 _onModelEvent: function(event, model, collection, options) { 940 1145 if ((event === 'add' || event === 'remove') && collection !== this) return; 941 1146 if (event === 'destroy') this.remove(model, options); 942 if (model && event === 'change:' + model.idAttribute) { 943 delete this._byId[model.previous(model.idAttribute)]; 944 if (model.id != null) this._byId[model.id] = model; 1147 if (event === 'change') { 1148 var prevId = this.modelId(model.previousAttributes()); 1149 var id = this.modelId(model.attributes); 1150 if (prevId !== id) { 1151 if (prevId != null) delete this._byId[prevId]; 1152 if (id != null) this._byId[id] = model; 1153 } 945 1154 } 946 1155 this.trigger.apply(this, arguments); 947 1156 } … … 951 1160 // Underscore methods that we want to implement on the Collection. 952 1161 // 90% of the core usefulness of Backbone Collections is actually implemented 953 1162 // right here: 954 var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl', 955 'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select', 956 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke', 957 'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest', 958 'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle', 959 'lastIndexOf', 'isEmpty', 'chain', 'sample']; 1163 var collectionMethods = { forEach: 3, each: 3, map: 3, collect: 3, reduce: 4, 1164 foldl: 4, inject: 4, reduceRight: 4, foldr: 4, find: 3, detect: 3, filter: 3, 1165 select: 3, reject: 3, every: 3, all: 3, some: 3, any: 3, include: 3, includes: 3, 1166 contains: 3, invoke: 0, max: 3, min: 3, toArray: 1, size: 1, first: 3, 1167 head: 3, take: 3, initial: 3, rest: 3, tail: 3, drop: 3, last: 3, 1168 without: 0, difference: 0, indexOf: 3, shuffle: 1, lastIndexOf: 3, 1169 isEmpty: 1, chain: 1, sample: 3, partition: 3, groupBy: 3, countBy: 3, 1170 sortBy: 3, indexBy: 3}; 960 1171 961 1172 // Mix in each Underscore method as a proxy to `Collection#models`. 962 _.each(methods, function(method) { 963 Collection.prototype[method] = function() { 964 var args = slice.call(arguments); 965 args.unshift(this.models); 966 return _[method].apply(_, args); 967 }; 968 }); 1173 addUnderscoreMethods(Collection, collectionMethods, 'models'); 969 1174 970 // Underscore methods that take a property name as an argument.971 var attributeMethods = ['groupBy', 'countBy', 'sortBy', 'indexBy'];972 973 // Use attributes instead of properties.974 _.each(attributeMethods, function(method) {975 Collection.prototype[method] = function(value, context) {976 var iterator = _.isFunction(value) ? value : function(model) {977 return model.get(value);978 };979 return _[method](this.models, iterator, context);980 };981 });982 983 1175 // Backbone.View 984 1176 // ------------- 985 1177 … … 995 1187 // if an existing element is not provided... 996 1188 var View = Backbone.View = function(options) { 997 1189 this.cid = _.uniqueId('view'); 998 options || (options = {});999 1190 _.extend(this, _.pick(options, viewOptions)); 1000 1191 this._ensureElement(); 1001 1192 this.initialize.apply(this, arguments); 1002 this.delegateEvents();1003 1193 }; 1004 1194 1005 1195 // Cached regex to split keys for `delegate`. 1006 1196 var delegateEventSplitter = /^(\S+)\s*(.*)$/; 1007 1197 1008 // List of view options to be mergedas properties.1198 // List of view options to be set as properties. 1009 1199 var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events']; 1010 1200 1011 1201 // Set up all inheritable **Backbone.View** properties and methods. … … 1034 1224 // Remove this view by taking the element out of the DOM, and removing any 1035 1225 // applicable Backbone.Events listeners. 1036 1226 remove: function() { 1037 this. $el.remove();1227 this._removeElement(); 1038 1228 this.stopListening(); 1039 1229 return this; 1040 1230 }, 1041 1231 1042 // Change the view's element (`this.el` property), including event 1043 // re-delegation. 1044 setElement: function(element, delegate) { 1045 if (this.$el) this.undelegateEvents(); 1046 this.$el = element instanceof Backbone.$ ? element : Backbone.$(element); 1047 this.el = this.$el[0]; 1048 if (delegate !== false) this.delegateEvents(); 1232 // Remove this view's element from the document and all event listeners 1233 // attached to it. Exposed for subclasses using an alternative DOM 1234 // manipulation API. 1235 _removeElement: function() { 1236 this.$el.remove(); 1237 }, 1238 1239 // Change the view's element (`this.el` property) and re-delegate the 1240 // view's events on the new element. 1241 setElement: function(element) { 1242 this.undelegateEvents(); 1243 this._setElement(element); 1244 this.delegateEvents(); 1049 1245 return this; 1050 1246 }, 1051 1247 1248 // Creates the `this.el` and `this.$el` references for this view using the 1249 // given `el`. `el` can be a CSS selector or an HTML string, a jQuery 1250 // context or an element. Subclasses can override this to utilize an 1251 // alternative DOM manipulation API and are only required to set the 1252 // `this.el` property. 1253 _setElement: function(el) { 1254 this.$el = el instanceof Backbone.$ ? el : Backbone.$(el); 1255 this.el = this.$el[0]; 1256 }, 1257 1052 1258 // Set callbacks, where `this.events` is a hash of 1053 1259 // 1054 1260 // *{"event selector": "callback"}* … … 1062 1268 // pairs. Callbacks will be bound to the view, with `this` set properly. 1063 1269 // Uses event delegation for efficiency. 1064 1270 // Omitting the selector binds the event to `this.el`. 1065 // This only works for delegate-able events: not `focus`, `blur`, and1066 // not `change`, `submit`, and `reset` in Internet Explorer.1067 1271 delegateEvents: function(events) { 1068 if (!(events || (events = _.result(this, 'events')))) return this; 1272 events || (events = _.result(this, 'events')); 1273 if (!events) return this; 1069 1274 this.undelegateEvents(); 1070 1275 for (var key in events) { 1071 1276 var method = events[key]; 1072 if (!_.isFunction(method)) method = this[ events[key]];1277 if (!_.isFunction(method)) method = this[method]; 1073 1278 if (!method) continue; 1074 1075 1279 var match = key.match(delegateEventSplitter); 1076 var eventName = match[1], selector = match[2]; 1077 method = _.bind(method, this); 1078 eventName += '.delegateEvents' + this.cid; 1079 if (selector === '') { 1080 this.$el.on(eventName, method); 1081 } else { 1082 this.$el.on(eventName, selector, method); 1083 } 1280 this.delegate(match[1], match[2], _.bind(method, this)); 1084 1281 } 1085 1282 return this; 1086 1283 }, 1087 1284 1088 // Clears all callbacks previously bound to the view with `delegateEvents`. 1285 // Add a single event listener to the view's element (or a child element 1286 // using `selector`). This only works for delegate-able events: not `focus`, 1287 // `blur`, and not `change`, `submit`, and `reset` in Internet Explorer. 1288 delegate: function(eventName, selector, listener) { 1289 this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener); 1290 return this; 1291 }, 1292 1293 // Clears all callbacks previously bound to the view by `delegateEvents`. 1089 1294 // You usually don't need to use this, but may wish to if you have multiple 1090 1295 // Backbone views attached to the same DOM element. 1091 1296 undelegateEvents: function() { 1092 this.$el.off('.delegateEvents' + this.cid);1297 if (this.$el) this.$el.off('.delegateEvents' + this.cid); 1093 1298 return this; 1094 1299 }, 1095 1300 1301 // A finer-grained `undelegateEvents` for removing a single delegated event. 1302 // `selector` and `listener` are both optional. 1303 undelegate: function(eventName, selector, listener) { 1304 this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener); 1305 return this; 1306 }, 1307 1308 // Produces a DOM element to be assigned to your view. Exposed for 1309 // subclasses using an alternative DOM manipulation API. 1310 _createElement: function(tagName) { 1311 return document.createElement(tagName); 1312 }, 1313 1096 1314 // Ensure that the View has a DOM element to render into. 1097 1315 // If `this.el` is a string, pass it through `$()`, take the first 1098 1316 // matching element, and re-assign it to `el`. Otherwise, create … … 1102 1320 var attrs = _.extend({}, _.result(this, 'attributes')); 1103 1321 if (this.id) attrs.id = _.result(this, 'id'); 1104 1322 if (this.className) attrs['class'] = _.result(this, 'className'); 1105 var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);1106 this. setElement($el, false);1323 this.setElement(this._createElement(_.result(this, 'tagName'))); 1324 this._setAttributes(attrs); 1107 1325 } else { 1108 this.setElement(_.result(this, 'el') , false);1326 this.setElement(_.result(this, 'el')); 1109 1327 } 1328 }, 1329 1330 // Set attributes from a hash on this view's element. Exposed for 1331 // subclasses using an alternative DOM manipulation API. 1332 _setAttributes: function(attributes) { 1333 this.$el.attr(attributes); 1110 1334 } 1111 1335 1112 1336 }); … … 1175 1399 params.processData = false; 1176 1400 } 1177 1401 1178 // If we're sending a `PATCH` request, and we're in an old Internet Explorer 1179 // that still has ActiveX enabled by default, override jQuery to use that 1180 // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8. 1181 if (params.type === 'PATCH' && noXhrPatch) { 1182 params.xhr = function() { 1183 return new ActiveXObject("Microsoft.XMLHTTP"); 1184 }; 1185 } 1402 // Pass along `textStatus` and `errorThrown` from jQuery. 1403 var error = options.error; 1404 options.error = function(xhr, textStatus, errorThrown) { 1405 options.textStatus = textStatus; 1406 options.errorThrown = errorThrown; 1407 if (error) error.call(options.context, xhr, textStatus, errorThrown); 1408 }; 1186 1409 1187 1410 // Make the request, allowing the user to override any Ajax options. 1188 1411 var xhr = options.xhr = Backbone.ajax(_.extend(params, options)); … … 1190 1413 return xhr; 1191 1414 }; 1192 1415 1193 var noXhrPatch =1194 typeof window !== 'undefined' && !!window.ActiveXObject &&1195 !(window.XMLHttpRequest && (new XMLHttpRequest).dispatchEvent);1196 1197 1416 // Map from CRUD to HTTP for our default `Backbone.sync` implementation. 1198 1417 var methodMap = { 1199 1418 'create': 'POST', … … 1251 1470 var router = this; 1252 1471 Backbone.history.route(route, function(fragment) { 1253 1472 var args = router._extractParameters(route, fragment); 1254 router.execute(callback, args); 1255 router.trigger.apply(router, ['route:' + name].concat(args)); 1256 router.trigger('route', name, args); 1257 Backbone.history.trigger('route', router, name, args); 1473 if (router.execute(callback, args, name) !== false) { 1474 router.trigger.apply(router, ['route:' + name].concat(args)); 1475 router.trigger('route', name, args); 1476 Backbone.history.trigger('route', router, name, args); 1477 } 1258 1478 }); 1259 1479 return this; 1260 1480 }, … … 1261 1481 1262 1482 // Execute a route handler with the provided parameters. This is an 1263 1483 // excellent place to do pre-route setup or post-route cleanup. 1264 execute: function(callback, args ) {1484 execute: function(callback, args, name) { 1265 1485 if (callback) callback.apply(this, args); 1266 1486 }, 1267 1487 … … 1319 1539 // falls back to polling. 1320 1540 var History = Backbone.History = function() { 1321 1541 this.handlers = []; 1322 _.bindAll(this, 'checkUrl');1542 this.checkUrl = _.bind(this.checkUrl, this); 1323 1543 1324 1544 // Ensure that `History` can be used outside of the browser. 1325 1545 if (typeof window !== 'undefined') { … … 1334 1554 // Cached regex for stripping leading and trailing slashes. 1335 1555 var rootStripper = /^\/+|\/+$/g; 1336 1556 1337 // Cached regex for detecting MSIE.1338 var isExplorer = /msie [\w.]+/;1339 1340 // Cached regex for removing a trailing slash.1341 var trailingSlash = /\/$/;1342 1343 1557 // Cached regex for stripping urls of hash. 1344 1558 var pathStripper = /#.*$/; 1345 1559 … … 1355 1569 1356 1570 // Are we at the app root? 1357 1571 atRoot: function() { 1358 return this.location.pathname.replace(/[^\/]$/, '$&/') === this.root; 1572 var path = this.location.pathname.replace(/[^\/]$/, '$&/'); 1573 return path === this.root && !this.getSearch(); 1359 1574 }, 1360 1575 1576 // Does the pathname match the root? 1577 matchRoot: function() { 1578 var path = this.decodeFragment(this.location.pathname); 1579 var root = path.slice(0, this.root.length - 1) + '/'; 1580 return root === this.root; 1581 }, 1582 1583 // Unicode characters in `location.pathname` are percent encoded so they're 1584 // decoded for comparison. `%25` should not be decoded since it may be part 1585 // of an encoded parameter. 1586 decodeFragment: function(fragment) { 1587 return decodeURI(fragment.replace(/%25/g, '%2525')); 1588 }, 1589 1590 // In IE6, the hash fragment and search params are incorrect if the 1591 // fragment contains `?`. 1592 getSearch: function() { 1593 var match = this.location.href.replace(/#.*/, '').match(/\?.+/); 1594 return match ? match[0] : ''; 1595 }, 1596 1361 1597 // Gets the true hash value. Cannot use location.hash directly due to bug 1362 1598 // in Firefox where location.hash will always be decoded. 1363 1599 getHash: function(window) { … … 1365 1601 return match ? match[1] : ''; 1366 1602 }, 1367 1603 1368 // Get the cross-browser normalized URL fragment, either from the URL, 1369 // the hash, or the override. 1370 getFragment: function(fragment, forcePushState) { 1604 // Get the pathname and search params, without the root. 1605 getPath: function() { 1606 var path = this.decodeFragment( 1607 this.location.pathname + this.getSearch() 1608 ).slice(this.root.length - 1); 1609 return path.charAt(0) === '/' ? path.slice(1) : path; 1610 }, 1611 1612 // Get the cross-browser normalized URL fragment from the path or hash. 1613 getFragment: function(fragment) { 1371 1614 if (fragment == null) { 1372 if (this._hasPushState || !this._wantsHashChange || forcePushState) { 1373 fragment = decodeURI(this.location.pathname + this.location.search); 1374 var root = this.root.replace(trailingSlash, ''); 1375 if (!fragment.indexOf(root)) fragment = fragment.slice(root.length); 1615 if (this._usePushState || !this._wantsHashChange) { 1616 fragment = this.getPath(); 1376 1617 } else { 1377 1618 fragment = this.getHash(); 1378 1619 } … … 1383 1624 // Start the hash change handling, returning `true` if the current URL matches 1384 1625 // an existing route, and `false` otherwise. 1385 1626 start: function(options) { 1386 if (History.started) throw new Error( "Backbone.history has already been started");1627 if (History.started) throw new Error('Backbone.history has already been started'); 1387 1628 History.started = true; 1388 1629 1389 1630 // Figure out the initial configuration. Do we need an iframe? … … 1391 1632 this.options = _.extend({root: '/'}, this.options, options); 1392 1633 this.root = this.options.root; 1393 1634 this._wantsHashChange = this.options.hashChange !== false; 1635 this._hasHashChange = 'onhashchange' in window && (document.documentMode === void 0 || document.documentMode > 7); 1636 this._useHashChange = this._wantsHashChange && this._hasHashChange; 1394 1637 this._wantsPushState = !!this.options.pushState; 1395 this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState); 1396 var fragment = this.getFragment(); 1397 var docMode = document.documentMode; 1398 var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7)); 1638 this._hasPushState = !!(this.history && this.history.pushState); 1639 this._usePushState = this._wantsPushState && this._hasPushState; 1640 this.fragment = this.getFragment(); 1399 1641 1400 1642 // Normalize root to always include a leading and trailing slash. 1401 1643 this.root = ('/' + this.root + '/').replace(rootStripper, '/'); 1402 1644 1403 if (oldIE && this._wantsHashChange) {1404 var frame = Backbone.$('<iframe src="javascript:0" tabindex="-1">');1405 this.iframe = frame.hide().appendTo('body')[0].contentWindow;1406 this.navigate(fragment);1407 }1408 1409 // Depending on whether we're using pushState or hashes, and whether1410 // 'onhashchange' is supported, determine how we check the URL state.1411 if (this._hasPushState) {1412 Backbone.$(window).on('popstate', this.checkUrl);1413 } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {1414 Backbone.$(window).on('hashchange', this.checkUrl);1415 } else if (this._wantsHashChange) {1416 this._checkUrlInterval = setInterval(this.checkUrl, this.interval);1417 }1418 1419 // Determine if we need to change the base url, for a pushState link1420 // opened by a non-pushState browser.1421 this.fragment = fragment;1422 var loc = this.location;1423 1424 1645 // Transition from hashChange to pushState or vice versa if both are 1425 1646 // requested. 1426 1647 if (this._wantsHashChange && this._wantsPushState) { … … 1428 1649 // If we've started off with a route from a `pushState`-enabled 1429 1650 // browser, but we're currently in a browser that doesn't support it... 1430 1651 if (!this._hasPushState && !this.atRoot()) { 1431 this.fragment = this.getFragment(null, true);1432 this.location.replace( this.root + '#' + this.fragment);1652 var root = this.root.slice(0, -1) || '/'; 1653 this.location.replace(root + '#' + this.getPath()); 1433 1654 // Return immediately as browser will do redirect to new url 1434 1655 return true; 1435 1656 1436 1657 // Or if we've started out with a hash-based route, but we're currently 1437 1658 // in a browser where it could be `pushState`-based instead... 1438 } else if (this._hasPushState && this.atRoot() && loc.hash) { 1439 this.fragment = this.getHash().replace(routeStripper, ''); 1440 this.history.replaceState({}, document.title, this.root + this.fragment); 1659 } else if (this._hasPushState && this.atRoot()) { 1660 this.navigate(this.getHash(), {replace: true}); 1441 1661 } 1442 1662 1443 1663 } 1444 1664 1665 // Proxy an iframe to handle location events if the browser doesn't 1666 // support the `hashchange` event, HTML5 history, or the user wants 1667 // `hashChange` but not `pushState`. 1668 if (!this._hasHashChange && this._wantsHashChange && !this._usePushState) { 1669 this.iframe = document.createElement('iframe'); 1670 this.iframe.src = 'javascript:0'; 1671 this.iframe.style.display = 'none'; 1672 this.iframe.tabIndex = -1; 1673 var body = document.body; 1674 // Using `appendChild` will throw on IE < 9 if the document is not ready. 1675 var iWindow = body.insertBefore(this.iframe, body.firstChild).contentWindow; 1676 iWindow.document.open(); 1677 iWindow.document.close(); 1678 iWindow.location.hash = '#' + this.fragment; 1679 } 1680 1681 // Add a cross-platform `addEventListener` shim for older browsers. 1682 var addEventListener = window.addEventListener || function (eventName, listener) { 1683 return attachEvent('on' + eventName, listener); 1684 }; 1685 1686 // Depending on whether we're using pushState or hashes, and whether 1687 // 'onhashchange' is supported, determine how we check the URL state. 1688 if (this._usePushState) { 1689 addEventListener('popstate', this.checkUrl, false); 1690 } else if (this._useHashChange && !this.iframe) { 1691 addEventListener('hashchange', this.checkUrl, false); 1692 } else if (this._wantsHashChange) { 1693 this._checkUrlInterval = setInterval(this.checkUrl, this.interval); 1694 } 1695 1445 1696 if (!this.options.silent) return this.loadUrl(); 1446 1697 }, 1447 1698 … … 1448 1699 // Disable Backbone.history, perhaps temporarily. Not useful in a real app, 1449 1700 // but possibly useful for unit testing Routers. 1450 1701 stop: function() { 1451 Backbone.$(window).off('popstate', this.checkUrl).off('hashchange', this.checkUrl); 1702 // Add a cross-platform `removeEventListener` shim for older browsers. 1703 var removeEventListener = window.removeEventListener || function (eventName, listener) { 1704 return detachEvent('on' + eventName, listener); 1705 }; 1706 1707 // Remove window listeners. 1708 if (this._usePushState) { 1709 removeEventListener('popstate', this.checkUrl, false); 1710 } else if (this._useHashChange && !this.iframe) { 1711 removeEventListener('hashchange', this.checkUrl, false); 1712 } 1713 1714 // Clean up the iframe if necessary. 1715 if (this.iframe) { 1716 document.body.removeChild(this.iframe); 1717 this.iframe = null; 1718 } 1719 1720 // Some environments will throw when clearing an undefined interval. 1452 1721 if (this._checkUrlInterval) clearInterval(this._checkUrlInterval); 1453 1722 History.started = false; 1454 1723 }, … … 1463 1732 // calls `loadUrl`, normalizing across the hidden iframe. 1464 1733 checkUrl: function(e) { 1465 1734 var current = this.getFragment(); 1735 1736 // If the user pressed the back button, the iframe's hash will have 1737 // changed and we should use that for comparison. 1466 1738 if (current === this.fragment && this.iframe) { 1467 current = this.get Fragment(this.getHash(this.iframe));1739 current = this.getHash(this.iframe.contentWindow); 1468 1740 } 1741 1469 1742 if (current === this.fragment) return false; 1470 1743 if (this.iframe) this.navigate(current); 1471 1744 this.loadUrl(); … … 1475 1748 // match, returns `true`. If no defined routes matches the fragment, 1476 1749 // returns `false`. 1477 1750 loadUrl: function(fragment) { 1751 // If the root doesn't match, no routes can match either. 1752 if (!this.matchRoot()) return false; 1478 1753 fragment = this.fragment = this.getFragment(fragment); 1479 return _. any(this.handlers, function(handler) {1754 return _.some(this.handlers, function(handler) { 1480 1755 if (handler.route.test(fragment)) { 1481 1756 handler.callback(fragment); 1482 1757 return true; … … 1495 1770 if (!History.started) return false; 1496 1771 if (!options || options === true) options = {trigger: !!options}; 1497 1772 1498 var url = this.root + (fragment = this.getFragment(fragment || '')); 1773 // Normalize the fragment. 1774 fragment = this.getFragment(fragment || ''); 1499 1775 1500 // Strip the hash for matching. 1501 fragment = fragment.replace(pathStripper, ''); 1776 // Don't include a trailing slash on the root. 1777 var root = this.root; 1778 if (fragment === '' || fragment.charAt(0) === '?') { 1779 root = root.slice(0, -1) || '/'; 1780 } 1781 var url = root + fragment; 1502 1782 1783 // Strip the hash and decode for matching. 1784 fragment = this.decodeFragment(fragment.replace(pathStripper, '')); 1785 1503 1786 if (this.fragment === fragment) return; 1504 1787 this.fragment = fragment; 1505 1788 1506 // Don't include a trailing slash on the root.1507 if (fragment === '' && url !== '/') url = url.slice(0, -1);1508 1509 1789 // If pushState is available, we use it to set the fragment as a real URL. 1510 if (this._ hasPushState) {1790 if (this._usePushState) { 1511 1791 this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url); 1512 1792 1513 1793 // If hash changes haven't been explicitly disabled, update the hash … … 1514 1794 // fragment to store history. 1515 1795 } else if (this._wantsHashChange) { 1516 1796 this._updateHash(this.location, fragment, options.replace); 1517 if (this.iframe && (fragment !== this.getFragment(this.getHash(this.iframe)))) { 1797 if (this.iframe && (fragment !== this.getHash(this.iframe.contentWindow))) { 1798 var iWindow = this.iframe.contentWindow; 1799 1518 1800 // Opening and closing the iframe tricks IE7 and earlier to push a 1519 1801 // history entry on hash-tag change. When replace is true, we don't 1520 1802 // want this. 1521 if(!options.replace) this.iframe.document.open().close(); 1522 this._updateHash(this.iframe.location, fragment, options.replace); 1803 if (!options.replace) { 1804 iWindow.document.open(); 1805 iWindow.document.close(); 1806 } 1807 1808 this._updateHash(iWindow.location, fragment, options.replace); 1523 1809 } 1524 1810 1525 1811 // If you've told us that you explicitly don't want fallback hashchange- … … 1550 1836 // Helpers 1551 1837 // ------- 1552 1838 1553 // Helper function to correctly set up the prototype chain ,for subclasses.1839 // Helper function to correctly set up the prototype chain for subclasses. 1554 1840 // Similar to `goog.inherits`, but uses a hash of prototype properties and 1555 1841 // class properties to be extended. 1556 1842 var extend = function(protoProps, staticProps) { … … 1559 1845 1560 1846 // The constructor function for the new subclass is either defined by you 1561 1847 // (the "constructor" property in your `extend` definition), or defaulted 1562 // by us to simply call the parent 'sconstructor.1848 // by us to simply call the parent constructor. 1563 1849 if (protoProps && _.has(protoProps, 'constructor')) { 1564 1850 child = protoProps.constructor; 1565 1851 } else { … … 1570 1856 _.extend(child, parent, staticProps); 1571 1857 1572 1858 // Set the prototype chain to inherit from `parent`, without calling 1573 // `parent` 'sconstructor function.1859 // `parent` constructor function. 1574 1860 var Surrogate = function(){ this.constructor = child; }; 1575 1861 Surrogate.prototype = parent.prototype; 1576 1862 child.prototype = new Surrogate; … … 1598 1884 var wrapError = function(model, options) { 1599 1885 var error = options.error; 1600 1886 options.error = function(resp) { 1601 if (error) error (model, resp, options);1887 if (error) error.call(options.context, model, resp, options); 1602 1888 model.trigger('error', model, resp, options); 1603 1889 }; 1604 1890 }; -
src/wp-includes/js/backbone.min.js
1 (function(t ,e){if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,s){t.Backbone=e(t,s,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore");e(t,exports,i)}else{t.Backbone=e(t,{},t._,t.jQuery||t.Zepto||t.ender||t.$)}})(this,function(t,e,i,r){var s=t.Backbone;var n=[];var a=n.push;var o=n.slice;var h=n.splice;e.VERSION="1.1.2";e.$=r;e.noConflict=function(){t.Backbone=s;return this};e.emulateHTTP=false;e.emulateJSON=false;var u=e.Events={on:function(t,e,i){if(!c(this,"on",t,[e,i])||!e)return this;this._events||(this._events={});var r=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});return this},once:function(t,e,r){if(!c(this,"once",t,[e,r])||!e)return this;var s=this;var n=i.once(function(){s.off(t,n);e.apply(this,arguments)});n._callback=e;return this.on(t,n,r)},off:function(t,e,r){var s,n,a,o,h,u,l,f;if(!this._events||!c(this,"off",t,[e,r]))return this;if(!t&&!e&&!r){this._events=void 0;return this}o=t?[t]:i.keys(this._events);for(h=0,u=o.length;h<u;h++){t=o[h];if(a=this._events[t]){this._events[t]=s=[];if(e||r){for(l=0,f=a.length;l<f;l++){n=a[l];if(e&&e!==n.callback&&e!==n.callback._callback||r&&r!==n.context){s.push(n)}}}if(!s.length)delete this._events[t]}}return this},trigger:function(t){if(!this._events)return this;var e=o.call(arguments,1);if(!c(this,"trigger",t,e))return this;var i=this._events[t];var r=this._events.all;if(i)f(i,e);if(r)f(r,arguments);return this},stopListening:function(t,e,r){var s=this._listeningTo;if(!s)return this;var n=!e&&!r;if(!r&&typeof e==="object")r=this;if(t)(s={})[t._listenId]=t;for(var a in s){t=s[a];t.off(e,r,this);if(n||i.isEmpty(t._events))delete this._listeningTo[a]}return this}};var l=/\s+/;var c=function(t,e,i,r){if(!i)return true;if(typeof i==="object"){for(var s in i){t[e].apply(t,[s,i[s]].concat(r))}return false}if(l.test(i)){var n=i.split(l);for(var a=0,o=n.length;a<o;a++){t[e].apply(t,[n[a]].concat(r))}return false}return true};var f=function(t,e){var i,r=-1,s=t.length,n=e[0],a=e[1],o=e[2];switch(e.length){case 0:while(++r<s)(i=t[r]).callback.call(i.ctx);return;case 1:while(++r<s)(i=t[r]).callback.call(i.ctx,n);return;case 2:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a);return;case 3:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a,o);return;default:while(++r<s)(i=t[r]).callback.apply(i.ctx,e);return}};var d={listenTo:"on",listenToOnce:"once"};i.each(d,function(t,e){u[e]=function(e,r,s){var n=this._listeningTo||(this._listeningTo={});var a=e._listenId||(e._listenId=i.uniqueId("l"));n[a]=e;if(!s&&typeof r==="object")s=this;e[t](r,s,this);return this}});u.bind=u.on;u.unbind=u.off;i.extend(e,u);var p=e.Model=function(t,e){var r=t||{};e||(e={});this.cid=i.uniqueId("c");this.attributes={};if(e.collection)this.collection=e.collection;if(e.parse)r=this.parse(r,e)||{};r=i.defaults({},r,i.result(this,"defaults"));this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};i.extend(p.prototype,u,{changed:null,validationError:null,idAttribute:"id",initialize:function(){},toJSON:function(t){return i.clone(this.attributes)},sync:function(){return e.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return i.escape(this.get(t))},has:function(t){return this.get(t)!=null},set:function(t,e,r){var s,n,a,o,h,u,l,c;if(t==null)return this;if(typeof t==="object"){n=t;r=e}else{(n={})[t]=e}r||(r={});if(!this._validate(n,r))return false;a=r.unset;h=r.silent;o=[];u=this._changing;this._changing=true;if(!u){this._previousAttributes=i.clone(this.attributes);this.changed={}}c=this.attributes,l=this._previousAttributes;if(this.idAttribute in n)this.id=n[this.idAttribute];for(s in n){e=n[s];if(!i.isEqual(c[s],e))o.push(s);if(!i.isEqual(l[s],e)){this.changed[s]=e}else{delete this.changed[s]}a?delete c[s]:c[s]=e}if(!h){if(o.length)this._pending=r;for(var f=0,d=o.length;f<d;f++){this.trigger("change:"+o[f],this,c[o[f]],r)}}if(u)return this;if(!h){while(this._pending){r=this._pending;this._pending=false;this.trigger("change",this,r)}}this._pending=false;this._changing=false;return this},unset:function(t,e){return this.set(t,void 0,i.extend({},e,{unset:true}))},clear:function(t){var e={};for(var r in this.attributes)e[r]=void 0;return this.set(e,i.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!i.isEmpty(this.changed);return i.has(this.changed,t)},changedAttributes:function(t){if(!t)return this.hasChanged()?i.clone(this.changed):false;var e,r=false;var s=this._changing?this._previousAttributes:this.attributes;for(var n in t){if(i.isEqual(s[n],e=t[n]))continue;(r||(r={}))[n]=e}return r},previous:function(t){if(t==null||!this._previousAttributes)return null;return this._previousAttributes[t]},previousAttributes:function(){return i.clone(this._previousAttributes)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=this;var r=t.success;t.success=function(i){if(!e.set(e.parse(i,t),t))return false;if(r)r(e,i,t);e.trigger("sync",e,i,t)};q(this,t);return this.sync("read",this,t)},save:function(t,e,r){var s,n,a,o=this.attributes;if(t==null||typeof t==="object"){s=t;r=e}else{(s={})[t]=e}r=i.extend({validate:true},r);if(s&&!r.wait){if(!this.set(s,r))return false}else{if(!this._validate(s,r))return false}if(s&&r.wait){this.attributes=i.extend({},o,s)}if(r.parse===void 0)r.parse=true;var h=this;var u=r.success;r.success=function(t){h.attributes=o;var e=h.parse(t,r);if(r.wait)e=i.extend(s||{},e);if(i.isObject(e)&&!h.set(e,r)){return false}if(u)u(h,t,r);h.trigger("sync",h,t,r)};q(this,r);n=this.isNew()?"create":r.patch?"patch":"update";if(n==="patch")r.attrs=s;a=this.sync(n,this,r);if(s&&r.wait)this.attributes=o;return a},destroy:function(t){t=t?i.clone(t):{};var e=this;var r=t.success;var s=function(){e.trigger("destroy",e,e.collection,t)};t.success=function(i){if(t.wait||e.isNew())s();if(r)r(e,i,t);if(!e.isNew())e.trigger("sync",e,i,t)};if(this.isNew()){t.success();return false}q(this,t);var n=this.sync("delete",this,t);if(!t.wait)s();return n},url:function(){var t=i.result(this,"urlRoot")||i.result(this.collection,"url")||M();if(this.isNew())return t;return t.replace(/([^\/])$/,"$1/")+encodeURIComponent(this.id)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(t){return this._validate({},i.extend(t||{},{validate:true}))},_validate:function(t,e){if(!e.validate||!this.validate)return true;t=i.extend({},this.attributes,t);var r=this.validationError=this.validate(t,e)||null;if(!r)return true;this.trigger("invalid",this,r,i.extend(e,{validationError:r}));return false}});var v=["keys","values","pairs","invert","pick","omit"];i.each(v,function(t){p.prototype[t]=function(){var e=o.call(arguments);e.unshift(this.attributes);return i[t].apply(i,e)}});var g=e.Collection=function(t,e){e||(e={});if(e.model)this.model=e.model;if(e.comparator!==void 0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,i.extend({silent:true},e))};var m={add:true,remove:true,merge:true};var y={add:true,remove:false};i.extend(g.prototype,u,{model:p,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return e.sync.apply(this,arguments)},add:function(t,e){return this.set(t,i.extend({merge:false},e,y))},remove:function(t,e){var r=!i.isArray(t);t=r?[t]:i.clone(t);e||(e={});var s,n,a,o;for(s=0,n=t.length;s<n;s++){o=t[s]=this.get(t[s]);if(!o)continue;delete this._byId[o.id];delete this._byId[o.cid];a=this.indexOf(o);this.models.splice(a,1);this.length--;if(!e.silent){e.index=a;o.trigger("remove",o,this,e)}this._removeReference(o,e)}return r?t[0]:t},set:function(t,e){e=i.defaults({},e,m);if(e.parse)t=this.parse(t,e);var r=!i.isArray(t);t=r?t?[t]:[]:i.clone(t);var s,n,a,o,h,u,l;var c=e.at;var f=this.model;var d=this.comparator&&c==null&&e.sort!==false;var v=i.isString(this.comparator)?this.comparator:null;var g=[],y=[],_={};var b=e.add,w=e.merge,x=e.remove;var E=!d&&b&&x?[]:false;for(s=0,n=t.length;s<n;s++){h=t[s]||{};if(h instanceof p){a=o=h}else{a=h[f.prototype.idAttribute||"id"]}if(u=this.get(a)){if(x)_[u.cid]=true;if(w){h=h===o?o.attributes:h;if(e.parse)h=u.parse(h,e);u.set(h,e);if(d&&!l&&u.hasChanged(v))l=true}t[s]=u}else if(b){o=t[s]=this._prepareModel(h,e);if(!o)continue;g.push(o);this._addReference(o,e)}o=u||o;if(E&&(o.isNew()||!_[o.id]))E.push(o);_[o.id]=true}if(x){for(s=0,n=this.length;s<n;++s){if(!_[(o=this.models[s]).cid])y.push(o)}if(y.length)this.remove(y,e)}if(g.length||E&&E.length){if(d)l=true;this.length+=g.length;if(c!=null){for(s=0,n=g.length;s<n;s++){this.models.splice(c+s,0,g[s])}}else{if(E)this.models.length=0;var k=E||g;for(s=0,n=k.length;s<n;s++){this.models.push(k[s])}}}if(l)this.sort({silent:true});if(!e.silent){for(s=0,n=g.length;s<n;s++){(o=g[s]).trigger("add",o,this,e)}if(l||E&&E.length)this.trigger("sort",this,e)}return r?t[0]:t},reset:function(t,e){e||(e={});for(var r=0,s=this.models.length;r<s;r++){this._removeReference(this.models[r],e)}e.previousModels=this.models;this._reset();t=this.add(t,i.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);return t},push:function(t,e){return this.add(t,i.extend({at:this.length},e))},pop:function(t){var e=this.at(this.length-1);this.remove(e,t);return e},unshift:function(t,e){return this.add(t,i.extend({at:0},e))},shift:function(t){var e=this.at(0);this.remove(e,t);return e},slice:function(){return o.apply(this.models,arguments)},get:function(t){if(t==null)return void 0;return this._byId[t]||this._byId[t.id]||this._byId[t.cid]},at:function(t){return this.models[t]},where:function(t,e){if(i.isEmpty(t))return e?void 0:[];return this[e?"find":"filter"](function(e){for(var i in t){if(t[i]!==e.get(i))return false}return true})},findWhere:function(t){return this.where(t,true)},sort:function(t){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");t||(t={});if(i.isString(this.comparator)||this.comparator.length===1){this.models=this.sortBy(this.comparator,this)}else{this.models.sort(i.bind(this.comparator,this))}if(!t.silent)this.trigger("sort",this,t);return this},pluck:function(t){return i.invoke(this.models,"get",t)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=t.success;var r=this;t.success=function(i){var s=t.reset?"reset":"set";r[s](i,t);if(e)e(r,i,t);r.trigger("sync",r,i,t)};q(this,t);return this.sync("read",this,t)},create:function(t,e){e=e?i.clone(e):{};if(!(t=this._prepareModel(t,e)))return false;if(!e.wait)this.add(t,e);var r=this;var s=e.success;e.success=function(t,i){if(e.wait)r.add(t,e);if(s)s(t,i,e)};t.save(null,e);return t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(t instanceof p)return t;e=e?i.clone(e):{};e.collection=this;var r=new this.model(t,e);if(!r.validationError)return r;this.trigger("invalid",this,r.validationError,e);return false},_addReference:function(t,e){this._byId[t.cid]=t;if(t.id!=null)this._byId[t.id]=t;if(!t.collection)t.collection=this;t.on("all",this._onModelEvent,this)},_removeReference:function(t,e){if(this===t.collection)delete t.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(e&&t==="change:"+e.idAttribute){delete this._byId[e.previous(e.idAttribute)];if(e.id!=null)this._byId[e.id]=e}this.trigger.apply(this,arguments)}});var _=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","difference","indexOf","shuffle","lastIndexOf","isEmpty","chain","sample"];i.each(_,function(t){g.prototype[t]=function(){var e=o.call(arguments);e.unshift(this.models);return i[t].apply(i,e)}});var b=["groupBy","countBy","sortBy","indexBy"];i.each(b,function(t){g.prototype[t]=function(e,r){var s=i.isFunction(e)?e:function(t){return t.get(e)};return i[t](this.models,s,r)}});var w=e.View=function(t){this.cid=i.uniqueId("view");t||(t={});i.extend(this,i.pick(t,E));this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()};var x=/^(\S+)\s*(.*)$/;var E=["model","collection","el","id","attributes","className","tagName","events"];i.extend(w.prototype,u,{tagName:"div",$:function(t){return this.$el.find(t)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();this.stopListening();return this},setElement:function(t,i){if(this.$el)this.undelegateEvents();this.$el=t instanceof e.$?t:e.$(t);this.el=this.$el[0];if(i!==false)this.delegateEvents();return this},delegateEvents:function(t){if(!(t||(t=i.result(this,"events"))))return this;this.undelegateEvents();for(var e in t){var r=t[e];if(!i.isFunction(r))r=this[t[e]];if(!r)continue;var s=e.match(x);var n=s[1],a=s[2];r=i.bind(r,this);n+=".delegateEvents"+this.cid;if(a===""){this.$el.on(n,r)}else{this.$el.on(n,a,r)}}return this},undelegateEvents:function(){this.$el.off(".delegateEvents"+this.cid);return this},_ensureElement:function(){if(!this.el){var t=i.extend({},i.result(this,"attributes"));if(this.id)t.id=i.result(this,"id");if(this.className)t["class"]=i.result(this,"className");var r=e.$("<"+i.result(this,"tagName")+">").attr(t);this.setElement(r,false)}else{this.setElement(i.result(this,"el"),false)}}});e.sync=function(t,r,s){var n=T[t];i.defaults(s||(s={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:n,dataType:"json"};if(!s.url){a.url=i.result(r,"url")||M()}if(s.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(s.attrs||r.toJSON(s))}if(s.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(s.emulateHTTP&&(n==="PUT"||n==="DELETE"||n==="PATCH")){a.type="POST";if(s.emulateJSON)a.data._method=n;var o=s.beforeSend;s.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",n);if(o)return o.apply(this,arguments)}}if(a.type!=="GET"&&!s.emulateJSON){a.processData=false}if(a.type==="PATCH"&&k){a.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var h=s.xhr=e.ajax(i.extend(a,s));r.trigger("request",r,h,s);return h};var k=typeof window!=="undefined"&&!!window.ActiveXObject&&!(window.XMLHttpRequest&&(new XMLHttpRequest).dispatchEvent);var T={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var $=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var S=/\((.*?)\)/g;var H=/(\(\?)?:\w+/g;var A=/\*\w+/g;var I=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend($.prototype,u,{initialize:function(){},route:function(t,r,s){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){s=r;r=""}if(!s)s=this[r];var n=this;e.history.route(t,function(i){var a=n._extractParameters(t,i);n.execute(s,a);n.trigger.apply(n,["route:"+r].concat(a));n.trigger("route",r,a);e.history.trigger("route",n,r,a)});return this},execute:function(t,e){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(I,"\\$&").replace(S,"(?:$1)?").replace(H,function(t,e){return e?t:"([^/?]+)"}).replace(A,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var N=e.History=function(){this.handlers=[];i.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var R=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var P=/msie [\w.]+/;var C=/\/$/;var j=/#.*$/;N.started=false;i.extend(N.prototype,u,{interval:50,atRoot:function(){return this.location.pathname.replace(/[^\/]$/,"$&/")===this.root},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=decodeURI(this.location.pathname+this.location.search);var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.slice(i.length)}else{t=this.getHash()}}return t.replace(R,"")},start:function(t){if(N.started)throw new Error("Backbone.history has already been started");N.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var r=this.getFragment();var s=document.documentMode;var n=P.exec(navigator.userAgent.toLowerCase())&&(!s||s<=7);this.root=("/"+this.root+"/").replace(O,"/");if(n&&this._wantsHashChange){var a=e.$('<iframe src="javascript:0" tabindex="-1">');this.iframe=a.hide().appendTo("body")[0].contentWindow;this.navigate(r)}if(this._hasPushState){e.$(window).on("popstate",this.checkUrl)}else if(this._wantsHashChange&&"onhashchange"in window&&!n){e.$(window).on("hashchange",this.checkUrl)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}this.fragment=r;var o=this.location;if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){this.fragment=this.getFragment(null,true);this.location.replace(this.root+"#"+this.fragment);return true}else if(this._hasPushState&&this.atRoot()&&o.hash){this.fragment=this.getHash().replace(R,"");this.history.replaceState({},document.title,this.root+this.fragment)}}if(!this.options.silent)return this.loadUrl()},stop:function(){e.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);if(this._checkUrlInterval)clearInterval(this._checkUrlInterval);N.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getFragment(this.getHash(this.iframe))}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){t=this.fragment=this.getFragment(t);return i.any(this.handlers,function(e){if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!N.started)return false;if(!e||e===true)e={trigger:!!e};var i=this.root+(t=this.getFragment(t||""));t=t.replace(j,"");if(this.fragment===t)return;this.fragment=t;if(t===""&&i!=="/")i=i.slice(0,-1);if(this._hasPushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,i)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getFragment(this.getHash(this.iframe))){if(!e.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,t,e.replace)}}else{return this.location.assign(i)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});e.history=new N;var U=function(t,e){var r=this;var s;if(t&&i.has(t,"constructor")){s=t.constructor}else{s=function(){return r.apply(this,arguments)}}i.extend(s,r,e);var n=function(){this.constructor=s};n.prototype=r.prototype;s.prototype=new n;if(t)i.extend(s.prototype,t);s.__super__=r.prototype;return s};p.extend=g.extend=$.extend=w.extend=N.extend=U;var M=function(){throw new Error('A "url" property or function must be specified')};var q=function(t,e){var i=e.error;e.error=function(r){if(i)i(t,r,e);t.trigger("error",t,r,e)}};return e});1 (function(t){var e=typeof self=="object"&&self.self==self&&self||typeof global=="object"&&global.global==global&&global;if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,n){e.Backbone=t(e,n,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore"),r;try{r=require("jquery")}catch(n){}t(e,exports,i,r)}else{e.Backbone=t(e,{},e._,e.jQuery||e.Zepto||e.ender||e.$)}})(function(t,e,i,r){var n=t.Backbone;var s=Array.prototype.slice;e.VERSION="1.2.3";e.$=r;e.noConflict=function(){t.Backbone=n;return this};e.emulateHTTP=false;e.emulateJSON=false;var a=function(t,e,r){switch(t){case 1:return function(){return i[e](this[r])};case 2:return function(t){return i[e](this[r],t)};case 3:return function(t,n){return i[e](this[r],h(t,this),n)};case 4:return function(t,n,s){return i[e](this[r],h(t,this),n,s)};default:return function(){var t=s.call(arguments);t.unshift(this[r]);return i[e].apply(i,t)}}};var o=function(t,e,r){i.each(e,function(e,n){if(i[n])t.prototype[n]=a(e,n,r)})};var h=function(t,e){if(i.isFunction(t))return t;if(i.isObject(t)&&!e._isModel(t))return u(t);if(i.isString(t))return function(e){return e.get(t)};return t};var u=function(t){var e=i.matches(t);return function(t){return e(t.attributes)}};var l=e.Events={};var c=/\s+/;var f=function(t,e,r,n,s){var a=0,o;if(r&&typeof r==="object"){if(n!==void 0&&"context"in s&&s.context===void 0)s.context=n;for(o=i.keys(r);a<o.length;a++){e=f(t,e,o[a],r[o[a]],s)}}else if(r&&c.test(r)){for(o=r.split(c);a<o.length;a++){e=t(e,o[a],n,s)}}else{e=t(e,r,n,s)}return e};l.on=function(t,e,i){return d(this,t,e,i)};var d=function(t,e,i,r,n){t._events=f(v,t._events||{},e,i,{context:r,ctx:t,listening:n});if(n){var s=t._listeners||(t._listeners={});s[n.id]=n}return t};l.listenTo=function(t,e,r){if(!t)return this;var n=t._listenId||(t._listenId=i.uniqueId("l"));var s=this._listeningTo||(this._listeningTo={});var a=s[n];if(!a){var o=this._listenId||(this._listenId=i.uniqueId("l"));a=s[n]={obj:t,objId:n,id:o,listeningTo:s,count:0}}d(t,e,r,this,a);return this};var v=function(t,e,i,r){if(i){var n=t[e]||(t[e]=[]);var s=r.context,a=r.ctx,o=r.listening;if(o)o.count++;n.push({callback:i,context:s,ctx:s||a,listening:o})}return t};l.off=function(t,e,i){if(!this._events)return this;this._events=f(g,this._events,t,e,{context:i,listeners:this._listeners});return this};l.stopListening=function(t,e,r){var n=this._listeningTo;if(!n)return this;var s=t?[t._listenId]:i.keys(n);for(var a=0;a<s.length;a++){var o=n[s[a]];if(!o)break;o.obj.off(e,r,this)}if(i.isEmpty(n))this._listeningTo=void 0;return this};var g=function(t,e,r,n){if(!t)return;var s=0,a;var o=n.context,h=n.listeners;if(!e&&!r&&!o){var u=i.keys(h);for(;s<u.length;s++){a=h[u[s]];delete h[a.id];delete a.listeningTo[a.objId]}return}var l=e?[e]:i.keys(t);for(;s<l.length;s++){e=l[s];var c=t[e];if(!c)break;var f=[];for(var d=0;d<c.length;d++){var v=c[d];if(r&&r!==v.callback&&r!==v.callback._callback||o&&o!==v.context){f.push(v)}else{a=v.listening;if(a&&--a.count===0){delete h[a.id];delete a.listeningTo[a.objId]}}}if(f.length){t[e]=f}else{delete t[e]}}if(i.size(t))return t};l.once=function(t,e,r){var n=f(p,{},t,e,i.bind(this.off,this));return this.on(n,void 0,r)};l.listenToOnce=function(t,e,r){var n=f(p,{},e,r,i.bind(this.stopListening,this,t));return this.listenTo(t,n)};var p=function(t,e,r,n){if(r){var s=t[e]=i.once(function(){n(e,s);r.apply(this,arguments)});s._callback=r}return t};l.trigger=function(t){if(!this._events)return this;var e=Math.max(0,arguments.length-1);var i=Array(e);for(var r=0;r<e;r++)i[r]=arguments[r+1];f(m,this._events,t,void 0,i);return this};var m=function(t,e,i,r){if(t){var n=t[e];var s=t.all;if(n&&s)s=s.slice();if(n)_(n,r);if(s)_(s,[e].concat(r))}return t};var _=function(t,e){var i,r=-1,n=t.length,s=e[0],a=e[1],o=e[2];switch(e.length){case 0:while(++r<n)(i=t[r]).callback.call(i.ctx);return;case 1:while(++r<n)(i=t[r]).callback.call(i.ctx,s);return;case 2:while(++r<n)(i=t[r]).callback.call(i.ctx,s,a);return;case 3:while(++r<n)(i=t[r]).callback.call(i.ctx,s,a,o);return;default:while(++r<n)(i=t[r]).callback.apply(i.ctx,e);return}};l.bind=l.on;l.unbind=l.off;i.extend(e,l);var y=e.Model=function(t,e){var r=t||{};e||(e={});this.cid=i.uniqueId(this.cidPrefix);this.attributes={};if(e.collection)this.collection=e.collection;if(e.parse)r=this.parse(r,e)||{};r=i.defaults({},r,i.result(this,"defaults"));this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};i.extend(y.prototype,l,{changed:null,validationError:null,idAttribute:"id",cidPrefix:"c",initialize:function(){},toJSON:function(t){return i.clone(this.attributes)},sync:function(){return e.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return i.escape(this.get(t))},has:function(t){return this.get(t)!=null},matches:function(t){return!!i.iteratee(t,this)(this.attributes)},set:function(t,e,r){if(t==null)return this;var n;if(typeof t==="object"){n=t;r=e}else{(n={})[t]=e}r||(r={});if(!this._validate(n,r))return false;var s=r.unset;var a=r.silent;var o=[];var h=this._changing;this._changing=true;if(!h){this._previousAttributes=i.clone(this.attributes);this.changed={}}var u=this.attributes;var l=this.changed;var c=this._previousAttributes;for(var f in n){e=n[f];if(!i.isEqual(u[f],e))o.push(f);if(!i.isEqual(c[f],e)){l[f]=e}else{delete l[f]}s?delete u[f]:u[f]=e}this.id=this.get(this.idAttribute);if(!a){if(o.length)this._pending=r;for(var d=0;d<o.length;d++){this.trigger("change:"+o[d],this,u[o[d]],r)}}if(h)return this;if(!a){while(this._pending){r=this._pending;this._pending=false;this.trigger("change",this,r)}}this._pending=false;this._changing=false;return this},unset:function(t,e){return this.set(t,void 0,i.extend({},e,{unset:true}))},clear:function(t){var e={};for(var r in this.attributes)e[r]=void 0;return this.set(e,i.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!i.isEmpty(this.changed);return i.has(this.changed,t)},changedAttributes:function(t){if(!t)return this.hasChanged()?i.clone(this.changed):false;var e=this._changing?this._previousAttributes:this.attributes;var r={};for(var n in t){var s=t[n];if(i.isEqual(e[n],s))continue;r[n]=s}return i.size(r)?r:false},previous:function(t){if(t==null||!this._previousAttributes)return null;return this._previousAttributes[t]},previousAttributes:function(){return i.clone(this._previousAttributes)},fetch:function(t){t=i.extend({parse:true},t);var e=this;var r=t.success;t.success=function(i){var n=t.parse?e.parse(i,t):i;if(!e.set(n,t))return false;if(r)r.call(t.context,e,i,t);e.trigger("sync",e,i,t)};z(this,t);return this.sync("read",this,t)},save:function(t,e,r){var n;if(t==null||typeof t==="object"){n=t;r=e}else{(n={})[t]=e}r=i.extend({validate:true,parse:true},r);var s=r.wait;if(n&&!s){if(!this.set(n,r))return false}else{if(!this._validate(n,r))return false}var a=this;var o=r.success;var h=this.attributes;r.success=function(t){a.attributes=h;var e=r.parse?a.parse(t,r):t;if(s)e=i.extend({},n,e);if(e&&!a.set(e,r))return false;if(o)o.call(r.context,a,t,r);a.trigger("sync",a,t,r)};z(this,r);if(n&&s)this.attributes=i.extend({},h,n);var u=this.isNew()?"create":r.patch?"patch":"update";if(u==="patch"&&!r.attrs)r.attrs=n;var l=this.sync(u,this,r);this.attributes=h;return l},destroy:function(t){t=t?i.clone(t):{};var e=this;var r=t.success;var n=t.wait;var s=function(){e.stopListening();e.trigger("destroy",e,e.collection,t)};t.success=function(i){if(n)s();if(r)r.call(t.context,e,i,t);if(!e.isNew())e.trigger("sync",e,i,t)};var a=false;if(this.isNew()){i.defer(t.success)}else{z(this,t);a=this.sync("delete",this,t)}if(!n)s();return a},url:function(){var t=i.result(this,"urlRoot")||i.result(this.collection,"url")||F();if(this.isNew())return t;var e=this.get(this.idAttribute);return t.replace(/[^\/]$/,"$&/")+encodeURIComponent(e)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(t){return this._validate({},i.defaults({validate:true},t))},_validate:function(t,e){if(!e.validate||!this.validate)return true;t=i.extend({},this.attributes,t);var r=this.validationError=this.validate(t,e)||null;if(!r)return true;this.trigger("invalid",this,r,i.extend(e,{validationError:r}));return false}});var b={keys:1,values:1,pairs:1,invert:1,pick:0,omit:0,chain:1,isEmpty:1};o(y,b,"attributes");var x=e.Collection=function(t,e){e||(e={});if(e.model)this.model=e.model;if(e.comparator!==void 0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,i.extend({silent:true},e))};var w={add:true,remove:true,merge:true};var E={add:true,remove:false};var k=function(t,e,i){i=Math.min(Math.max(i,0),t.length);var r=Array(t.length-i);var n=e.length;for(var s=0;s<r.length;s++)r[s]=t[s+i];for(s=0;s<n;s++)t[s+i]=e[s];for(s=0;s<r.length;s++)t[s+n+i]=r[s]};i.extend(x.prototype,l,{model:y,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return e.sync.apply(this,arguments)},add:function(t,e){return this.set(t,i.extend({merge:false},e,E))},remove:function(t,e){e=i.extend({},e);var r=!i.isArray(t);t=r?[t]:i.clone(t);var n=this._removeModels(t,e);if(!e.silent&&n)this.trigger("update",this,e);return r?n[0]:n},set:function(t,e){if(t==null)return;e=i.defaults({},e,w);if(e.parse&&!this._isModel(t))t=this.parse(t,e);var r=!i.isArray(t);t=r?[t]:t.slice();var n=e.at;if(n!=null)n=+n;if(n<0)n+=this.length+1;var s=[];var a=[];var o=[];var h={};var u=e.add;var l=e.merge;var c=e.remove;var f=false;var d=this.comparator&&n==null&&e.sort!==false;var v=i.isString(this.comparator)?this.comparator:null;var g;for(var p=0;p<t.length;p++){g=t[p];var m=this.get(g);if(m){if(l&&g!==m){var _=this._isModel(g)?g.attributes:g;if(e.parse)_=m.parse(_,e);m.set(_,e);if(d&&!f)f=m.hasChanged(v)}if(!h[m.cid]){h[m.cid]=true;s.push(m)}t[p]=m}else if(u){g=t[p]=this._prepareModel(g,e);if(g){a.push(g);this._addReference(g,e);h[g.cid]=true;s.push(g)}}}if(c){for(p=0;p<this.length;p++){g=this.models[p];if(!h[g.cid])o.push(g)}if(o.length)this._removeModels(o,e)}var y=false;var b=!d&&u&&c;if(s.length&&b){y=this.length!=s.length||i.some(this.models,function(t,e){return t!==s[e]});this.models.length=0;k(this.models,s,0);this.length=this.models.length}else if(a.length){if(d)f=true;k(this.models,a,n==null?this.length:n);this.length=this.models.length}if(f)this.sort({silent:true});if(!e.silent){for(p=0;p<a.length;p++){if(n!=null)e.index=n+p;g=a[p];g.trigger("add",g,this,e)}if(f||y)this.trigger("sort",this,e);if(a.length||o.length)this.trigger("update",this,e)}return r?t[0]:t},reset:function(t,e){e=e?i.clone(e):{};for(var r=0;r<this.models.length;r++){this._removeReference(this.models[r],e)}e.previousModels=this.models;this._reset();t=this.add(t,i.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);return t},push:function(t,e){return this.add(t,i.extend({at:this.length},e))},pop:function(t){var e=this.at(this.length-1);return this.remove(e,t)},unshift:function(t,e){return this.add(t,i.extend({at:0},e))},shift:function(t){var e=this.at(0);return this.remove(e,t)},slice:function(){return s.apply(this.models,arguments)},get:function(t){if(t==null)return void 0;var e=this.modelId(this._isModel(t)?t.attributes:t);return this._byId[t]||this._byId[e]||this._byId[t.cid]},at:function(t){if(t<0)t+=this.length;return this.models[t]},where:function(t,e){return this[e?"find":"filter"](t)},findWhere:function(t){return this.where(t,true)},sort:function(t){var e=this.comparator;if(!e)throw new Error("Cannot sort a set without a comparator");t||(t={});var r=e.length;if(i.isFunction(e))e=i.bind(e,this);if(r===1||i.isString(e)){this.models=this.sortBy(e)}else{this.models.sort(e)}if(!t.silent)this.trigger("sort",this,t);return this},pluck:function(t){return i.invoke(this.models,"get",t)},fetch:function(t){t=i.extend({parse:true},t);var e=t.success;var r=this;t.success=function(i){var n=t.reset?"reset":"set";r[n](i,t);if(e)e.call(t.context,r,i,t);r.trigger("sync",r,i,t)};z(this,t);return this.sync("read",this,t)},create:function(t,e){e=e?i.clone(e):{};var r=e.wait;t=this._prepareModel(t,e);if(!t)return false;if(!r)this.add(t,e);var n=this;var s=e.success;e.success=function(t,e,i){if(r)n.add(t,i);if(s)s.call(i.context,t,e,i)};t.save(null,e);return t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models,{model:this.model,comparator:this.comparator})},modelId:function(t){return t[this.model.prototype.idAttribute||"id"]},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(this._isModel(t)){if(!t.collection)t.collection=this;return t}e=e?i.clone(e):{};e.collection=this;var r=new this.model(t,e);if(!r.validationError)return r;this.trigger("invalid",this,r.validationError,e);return false},_removeModels:function(t,e){var i=[];for(var r=0;r<t.length;r++){var n=this.get(t[r]);if(!n)continue;var s=this.indexOf(n);this.models.splice(s,1);this.length--;if(!e.silent){e.index=s;n.trigger("remove",n,this,e)}i.push(n);this._removeReference(n,e)}return i.length?i:false},_isModel:function(t){return t instanceof y},_addReference:function(t,e){this._byId[t.cid]=t;var i=this.modelId(t.attributes);if(i!=null)this._byId[i]=t;t.on("all",this._onModelEvent,this)},_removeReference:function(t,e){delete this._byId[t.cid];var i=this.modelId(t.attributes);if(i!=null)delete this._byId[i];if(this===t.collection)delete t.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(t==="change"){var n=this.modelId(e.previousAttributes());var s=this.modelId(e.attributes);if(n!==s){if(n!=null)delete this._byId[n];if(s!=null)this._byId[s]=e}}this.trigger.apply(this,arguments)}});var S={forEach:3,each:3,map:3,collect:3,reduce:4,foldl:4,inject:4,reduceRight:4,foldr:4,find:3,detect:3,filter:3,select:3,reject:3,every:3,all:3,some:3,any:3,include:3,includes:3,contains:3,invoke:0,max:3,min:3,toArray:1,size:1,first:3,head:3,take:3,initial:3,rest:3,tail:3,drop:3,last:3,without:0,difference:0,indexOf:3,shuffle:1,lastIndexOf:3,isEmpty:1,chain:1,sample:3,partition:3,groupBy:3,countBy:3,sortBy:3,indexBy:3};o(x,S,"models");var I=e.View=function(t){this.cid=i.uniqueId("view");i.extend(this,i.pick(t,P));this._ensureElement();this.initialize.apply(this,arguments)};var T=/^(\S+)\s*(.*)$/;var P=["model","collection","el","id","attributes","className","tagName","events"];i.extend(I.prototype,l,{tagName:"div",$:function(t){return this.$el.find(t)},initialize:function(){},render:function(){return this},remove:function(){this._removeElement();this.stopListening();return this},_removeElement:function(){this.$el.remove()},setElement:function(t){this.undelegateEvents();this._setElement(t);this.delegateEvents();return this},_setElement:function(t){this.$el=t instanceof e.$?t:e.$(t);this.el=this.$el[0]},delegateEvents:function(t){t||(t=i.result(this,"events"));if(!t)return this;this.undelegateEvents();for(var e in t){var r=t[e];if(!i.isFunction(r))r=this[r];if(!r)continue;var n=e.match(T);this.delegate(n[1],n[2],i.bind(r,this))}return this},delegate:function(t,e,i){this.$el.on(t+".delegateEvents"+this.cid,e,i);return this},undelegateEvents:function(){if(this.$el)this.$el.off(".delegateEvents"+this.cid);return this},undelegate:function(t,e,i){this.$el.off(t+".delegateEvents"+this.cid,e,i);return this},_createElement:function(t){return document.createElement(t)},_ensureElement:function(){if(!this.el){var t=i.extend({},i.result(this,"attributes"));if(this.id)t.id=i.result(this,"id");if(this.className)t["class"]=i.result(this,"className");this.setElement(this._createElement(i.result(this,"tagName")));this._setAttributes(t)}else{this.setElement(i.result(this,"el"))}},_setAttributes:function(t){this.$el.attr(t)}});e.sync=function(t,r,n){var s=H[t];i.defaults(n||(n={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:s,dataType:"json"};if(!n.url){a.url=i.result(r,"url")||F()}if(n.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(n.attrs||r.toJSON(n))}if(n.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(n.emulateHTTP&&(s==="PUT"||s==="DELETE"||s==="PATCH")){a.type="POST";if(n.emulateJSON)a.data._method=s;var o=n.beforeSend;n.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",s);if(o)return o.apply(this,arguments)}}if(a.type!=="GET"&&!n.emulateJSON){a.processData=false}var h=n.error;n.error=function(t,e,i){n.textStatus=e;n.errorThrown=i;if(h)h.call(n.context,t,e,i)};var u=n.xhr=e.ajax(i.extend(a,n));r.trigger("request",r,u,n);return u};var H={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var $=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var A=/\((.*?)\)/g;var C=/(\(\?)?:\w+/g;var R=/\*\w+/g;var j=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend($.prototype,l,{initialize:function(){},route:function(t,r,n){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){n=r;r=""}if(!n)n=this[r];var s=this;e.history.route(t,function(i){var a=s._extractParameters(t,i);if(s.execute(n,a,r)!==false){s.trigger.apply(s,["route:"+r].concat(a));s.trigger("route",r,a);e.history.trigger("route",s,r,a)}});return this},execute:function(t,e,i){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(j,"\\$&").replace(A,"(?:$1)?").replace(C,function(t,e){return e?t:"([^/?]+)"}).replace(R,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var M=e.History=function(){this.handlers=[];this.checkUrl=i.bind(this.checkUrl,this);if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var N=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var U=/#.*$/;M.started=false;i.extend(M.prototype,l,{interval:50,atRoot:function(){var t=this.location.pathname.replace(/[^\/]$/,"$&/");return t===this.root&&!this.getSearch()},matchRoot:function(){var t=this.decodeFragment(this.location.pathname);var e=t.slice(0,this.root.length-1)+"/";return e===this.root},decodeFragment:function(t){return decodeURI(t.replace(/%25/g,"%2525"))},getSearch:function(){var t=this.location.href.replace(/#.*/,"").match(/\?.+/);return t?t[0]:""},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getPath:function(){var t=this.decodeFragment(this.location.pathname+this.getSearch()).slice(this.root.length-1);return t.charAt(0)==="/"?t.slice(1):t},getFragment:function(t){if(t==null){if(this._usePushState||!this._wantsHashChange){t=this.getPath()}else{t=this.getHash()}}return t.replace(N,"")},start:function(t){if(M.started)throw new Error("Backbone.history has already been started");M.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._hasHashChange="onhashchange"in window&&(document.documentMode===void 0||document.documentMode>7);this._useHashChange=this._wantsHashChange&&this._hasHashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.history&&this.history.pushState);this._usePushState=this._wantsPushState&&this._hasPushState;this.fragment=this.getFragment();this.root=("/"+this.root+"/").replace(O,"/");if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){var e=this.root.slice(0,-1)||"/";this.location.replace(e+"#"+this.getPath());return true}else if(this._hasPushState&&this.atRoot()){this.navigate(this.getHash(),{replace:true})}}if(!this._hasHashChange&&this._wantsHashChange&&!this._usePushState){this.iframe=document.createElement("iframe");this.iframe.src="javascript:0";this.iframe.style.display="none";this.iframe.tabIndex=-1;var r=document.body;var n=r.insertBefore(this.iframe,r.firstChild).contentWindow;n.document.open();n.document.close();n.location.hash="#"+this.fragment}var s=window.addEventListener||function(t,e){return attachEvent("on"+t,e)};if(this._usePushState){s("popstate",this.checkUrl,false)}else if(this._useHashChange&&!this.iframe){s("hashchange",this.checkUrl,false)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}if(!this.options.silent)return this.loadUrl()},stop:function(){var t=window.removeEventListener||function(t,e){return detachEvent("on"+t,e)};if(this._usePushState){t("popstate",this.checkUrl,false)}else if(this._useHashChange&&!this.iframe){t("hashchange",this.checkUrl,false)}if(this.iframe){document.body.removeChild(this.iframe);this.iframe=null}if(this._checkUrlInterval)clearInterval(this._checkUrlInterval);M.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getHash(this.iframe.contentWindow)}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){if(!this.matchRoot())return false;t=this.fragment=this.getFragment(t);return i.some(this.handlers,function(e){if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!M.started)return false;if(!e||e===true)e={trigger:!!e};t=this.getFragment(t||"");var i=this.root;if(t===""||t.charAt(0)==="?"){i=i.slice(0,-1)||"/"}var r=i+t;t=this.decodeFragment(t.replace(U,""));if(this.fragment===t)return;this.fragment=t;if(this._usePushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,r)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getHash(this.iframe.contentWindow)){var n=this.iframe.contentWindow;if(!e.replace){n.document.open();n.document.close()}this._updateHash(n.location,t,e.replace)}}else{return this.location.assign(r)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});e.history=new M;var q=function(t,e){var r=this;var n;if(t&&i.has(t,"constructor")){n=t.constructor}else{n=function(){return r.apply(this,arguments)}}i.extend(n,r,e);var s=function(){this.constructor=n};s.prototype=r.prototype;n.prototype=new s;if(t)i.extend(n.prototype,t);n.__super__=r.prototype;return n};y.extend=x.extend=$.extend=I.extend=M.extend=q;var F=function(){throw new Error('A "url" property or function must be specified')};var z=function(t,e){var i=e.error;e.error=function(r){if(i)i.call(e.context,t,r,e);t.trigger("error",t,r,e)}};return e}); -
src/wp-includes/js/media/views/media-details.js
23 23 this.on( 'media:setting:remove', wp.media.mixin.unsetPlayers, this ); 24 24 this.on( 'media:setting:remove', this.render ); 25 25 this.on( 'media:setting:remove', this.setPlayer ); 26 this.events = _.extend( this.events, {27 'click .remove-setting' : 'removeSetting',28 'change .content-track' : 'setTracks',29 'click .remove-track' : 'setTracks',30 'click .add-media-source' : 'addSource'31 } );32 26 33 27 AttachmentDisplay.prototype.initialize.apply( this, arguments ); 34 28 }, 35 29 30 events: function(){ 31 return _.extend( { 32 'click .remove-setting' : 'removeSetting', 33 'change .content-track' : 'setTracks', 34 'click .remove-track' : 'setTracks', 35 'click .add-media-source' : 'addSource' 36 }, AttachmentDisplay.prototype.events ); 37 }, 38 36 39 prepare: function() { 37 40 return _.defaults({ 38 41 model: this.model.toJSON() -
src/wp-includes/js/media-audiovideo.js
728 728 this.on( 'media:setting:remove', wp.media.mixin.unsetPlayers, this ); 729 729 this.on( 'media:setting:remove', this.render ); 730 730 this.on( 'media:setting:remove', this.setPlayer ); 731 this.events = _.extend( this.events, {732 'click .remove-setting' : 'removeSetting',733 'change .content-track' : 'setTracks',734 'click .remove-track' : 'setTracks',735 'click .add-media-source' : 'addSource'736 } );737 731 738 732 AttachmentDisplay.prototype.initialize.apply( this, arguments ); 739 733 }, 740 734 735 events: function(){ 736 return _.extend( { 737 'click .remove-setting' : 'removeSetting', 738 'change .content-track' : 'setTracks', 739 'click .remove-track' : 'setTracks', 740 'click .add-media-source' : 'addSource' 741 }, AttachmentDisplay.prototype.events ); 742 }, 743 741 744 prepare: function() { 742 745 return _.defaults({ 743 746 model: this.model.toJSON() … … 915 918 916 919 module.exports = VideoDetails; 917 920 918 },{}]},{},[1]); 921 },{}]},{},[1]) 922 //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9ncnVudC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvYXVkaW92aWRlby5tYW5pZmVzdC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9hdWRpby1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL2NvbnRyb2xsZXJzL3ZpZGVvLWRldGFpbHMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvbW9kZWxzL3Bvc3QtbWVkaWEuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXVkaW8tZGV0YWlscy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9mcmFtZS9hdWRpby1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2ZyYW1lL21lZGlhLWRldGFpbHMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZnJhbWUvdmlkZW8tZGV0YWlscy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9tZWRpYS1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3ZpZGVvLWRldGFpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdk5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJ2YXIgbWVkaWEgPSB3cC5tZWRpYSxcblx0YmFzZVNldHRpbmdzID0gd2luZG93Ll93cG1lanNTZXR0aW5ncyB8fCB7fSxcblx0bDEwbiA9IHdpbmRvdy5fd3BNZWRpYVZpZXdzTDEwbiB8fCB7fTtcblxuLyoqXG4gKiBAbWl4aW5cbiAqL1xud3AubWVkaWEubWl4aW4gPSB7XG5cdG1lanNTZXR0aW5nczogYmFzZVNldHRpbmdzLFxuXG5cdHJlbW92ZUFsbFBsYXllcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBwO1xuXG5cdFx0aWYgKCB3aW5kb3cubWVqcyAmJiB3aW5kb3cubWVqcy5wbGF5ZXJzICkge1xuXHRcdFx0Zm9yICggcCBpbiB3aW5kb3cubWVqcy5wbGF5ZXJzICkge1xuXHRcdFx0XHR3aW5kb3cubWVqcy5wbGF5ZXJzW3BdLnBhdXNlKCk7XG5cdFx0XHRcdHRoaXMucmVtb3ZlUGxheWVyKCB3aW5kb3cubWVqcy5wbGF5ZXJzW3BdICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBPdmVycmlkZSB0aGUgTWVkaWFFbGVtZW50IG1ldGhvZCBmb3IgcmVtb3ZpbmcgYSBwbGF5ZXIuXG5cdCAqXHRNZWRpYUVsZW1lbnQgdHJpZXMgdG8gcHVsbCB0aGUgYXVkaW8vdmlkZW8gdGFnIG91dCBvZlxuXHQgKlx0aXRzIGNvbnRhaW5lciBhbmQgcmUtYWRkIGl0IHRvIHRoZSBET00uXG5cdCAqL1xuXHRyZW1vdmVQbGF5ZXI6IGZ1bmN0aW9uKHQpIHtcblx0XHR2YXIgZmVhdHVyZUluZGV4LCBmZWF0dXJlO1xuXG5cdFx0aWYgKCAhIHQub3B0aW9ucyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBpbnZva2UgZmVhdHVyZXMgY2xlYW51cFxuXHRcdGZvciAoIGZlYXR1cmVJbmRleCBpbiB0Lm9wdGlvbnMuZmVhdHVyZXMgKSB7XG5cdFx0XHRmZWF0dXJlID0gdC5vcHRpb25zLmZlYXR1cmVzW2ZlYXR1cmVJbmRleF07XG5cdFx0XHRpZiAoIHRbJ2NsZWFuJyArIGZlYXR1cmVdICkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHRbJ2NsZWFuJyArIGZlYXR1cmVdKHQpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggISB0LmlzRHluYW1pYyApIHtcblx0XHRcdHQuJG5vZGUucmVtb3ZlKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCAnbmF0aXZlJyAhPT0gdC5tZWRpYS5wbHVnaW5UeXBlICkge1xuXHRcdFx0dC4kbWVkaWEucmVtb3ZlKCk7XG5cdFx0fVxuXG5cdFx0ZGVsZXRlIHdpbmRvdy5tZWpzLnBsYXllcnNbdC5pZF07XG5cblx0XHR0LmNvbnRhaW5lci5yZW1vdmUoKTtcblx0XHR0Lmdsb2JhbFVuYmluZCgpO1xuXHRcdGRlbGV0ZSB0Lm5vZGUucGxheWVyO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBbGxvd3MgYW55IGNsYXNzIHRoYXQgaGFzIHNldCAncGxheWVyJyB0byBhIE1lZGlhRWxlbWVudFBsYXllclxuXHQgKiAgaW5zdGFuY2UgdG8gcmVtb3ZlIHRoZSBwbGF5ZXIgd2hlbiBsaXN0ZW5pbmcgdG8gZXZlbnRzLlxuXHQgKlxuXHQgKiAgRXhhbXBsZXM6IG1vZGFsIGNsb3Nlcywgc2hvcnRjb2RlIHByb3BlcnRpZXMgYXJlIHJlbW92ZWQsIGV0Yy5cblx0ICovXG5cdHVuc2V0UGxheWVycyA6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy5wbGF5ZXJzICYmIHRoaXMucGxheWVycy5sZW5ndGggKSB7XG5cdFx0XHRfLmVhY2goIHRoaXMucGxheWVycywgZnVuY3Rpb24gKHBsYXllcikge1xuXHRcdFx0XHRwbGF5ZXIucGF1c2UoKTtcblx0XHRcdFx0d3AubWVkaWEubWl4aW4ucmVtb3ZlUGxheWVyKCBwbGF5ZXIgKTtcblx0XHRcdH0gKTtcblx0XHRcdHRoaXMucGxheWVycyA9IFtdO1xuXHRcdH1cblx0fVxufTtcblxuLyoqXG4gKiBBdXRvd2lyZSBcImNvbGxlY3Rpb25cIi10eXBlIHNob3J0Y29kZXNcbiAqL1xud3AubWVkaWEucGxheWxpc3QgPSBuZXcgd3AubWVkaWEuY29sbGVjdGlvbih7XG5cdHRhZzogJ3BsYXlsaXN0Jyxcblx0ZWRpdFRpdGxlIDogbDEwbi5lZGl0UGxheWxpc3RUaXRsZSxcblx0ZGVmYXVsdHMgOiB7XG5cdFx0aWQ6IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5pZCxcblx0XHRzdHlsZTogJ2xpZ2h0Jyxcblx0XHR0cmFja2xpc3Q6IHRydWUsXG5cdFx0dHJhY2tudW1iZXJzOiB0cnVlLFxuXHRcdGltYWdlczogdHJ1ZSxcblx0XHRhcnRpc3RzOiB0cnVlLFxuXHRcdHR5cGU6ICdhdWRpbydcblx0fVxufSk7XG5cbi8qKlxuICogU2hvcnRjb2RlIG1vZGVsaW5nIGZvciBhdWRpb1xuICogIGBlZGl0KClgIHByZXBhcmVzIHRoZSBzaG9ydGNvZGUgZm9yIHRoZSBtZWRpYSBtb2RhbFxuICogIGBzaG9ydGNvZGUoKWAgYnVpbGRzIHRoZSBuZXcgc2hvcnRjb2RlIGFmdGVyIHVwZGF0ZVxuICpcbiAqIEBuYW1lc3BhY2VcbiAqL1xud3AubWVkaWEuYXVkaW8gPSB7XG5cdGNvZXJjZSA6IHdwLm1lZGlhLmNvZXJjZSxcblxuXHRkZWZhdWx0cyA6IHtcblx0XHRpZCA6IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5pZCxcblx0XHRzcmMgOiAnJyxcblx0XHRsb29wIDogZmFsc2UsXG5cdFx0YXV0b3BsYXkgOiBmYWxzZSxcblx0XHRwcmVsb2FkIDogJ25vbmUnLFxuXHRcdHdpZHRoIDogNDAwXG5cdH0sXG5cblx0ZWRpdCA6IGZ1bmN0aW9uKCBkYXRhICkge1xuXHRcdHZhciBmcmFtZSwgc2hvcnRjb2RlID0gd3Auc2hvcnRjb2RlLm5leHQoICdhdWRpbycsIGRhdGEgKS5zaG9ydGNvZGU7XG5cblx0XHRmcmFtZSA9IHdwLm1lZGlhKHtcblx0XHRcdGZyYW1lOiAnYXVkaW8nLFxuXHRcdFx0c3RhdGU6ICdhdWRpby1kZXRhaWxzJyxcblx0XHRcdG1ldGFkYXRhOiBfLmRlZmF1bHRzKCBzaG9ydGNvZGUuYXR0cnMubmFtZWQsIHRoaXMuZGVmYXVsdHMgKVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGZyYW1lO1xuXHR9LFxuXG5cdHNob3J0Y29kZSA6IGZ1bmN0aW9uKCBtb2RlbCApIHtcblx0XHR2YXIgY29udGVudDtcblxuXHRcdF8uZWFjaCggdGhpcy5kZWZhdWx0cywgZnVuY3Rpb24oIHZhbHVlLCBrZXkgKSB7XG5cdFx0XHRtb2RlbFsga2V5IF0gPSB0aGlzLmNvZXJjZSggbW9kZWwsIGtleSApO1xuXG5cdFx0XHRpZiAoIHZhbHVlID09PSBtb2RlbFsga2V5IF0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBtb2RlbFsga2V5IF07XG5cdFx0XHR9XG5cdFx0fSwgdGhpcyApO1xuXG5cdFx0Y29udGVudCA9IG1vZGVsLmNvbnRlbnQ7XG5cdFx0ZGVsZXRlIG1vZGVsLmNvbnRlbnQ7XG5cblx0XHRyZXR1cm4gbmV3IHdwLnNob3J0Y29kZSh7XG5cdFx0XHR0YWc6ICdhdWRpbycsXG5cdFx0XHRhdHRyczogbW9kZWwsXG5cdFx0XHRjb250ZW50OiBjb250ZW50XG5cdFx0fSk7XG5cdH1cbn07XG5cbi8qKlxuICogU2hvcnRjb2RlIG1vZGVsaW5nIGZvciB2aWRlb1xuICogIGBlZGl0KClgIHByZXBhcmVzIHRoZSBzaG9ydGNvZGUgZm9yIHRoZSBtZWRpYSBtb2RhbFxuICogIGBzaG9ydGNvZGUoKWAgYnVpbGRzIHRoZSBuZXcgc2hvcnRjb2RlIGFmdGVyIHVwZGF0ZVxuICpcbiAqIEBuYW1lc3BhY2VcbiAqL1xud3AubWVkaWEudmlkZW8gPSB7XG5cdGNvZXJjZSA6IHdwLm1lZGlhLmNvZXJjZSxcblxuXHRkZWZhdWx0cyA6IHtcblx0XHRpZCA6IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5pZCxcblx0XHRzcmMgOiAnJyxcblx0XHRwb3N0ZXIgOiAnJyxcblx0XHRsb29wIDogZmFsc2UsXG5cdFx0YXV0b3BsYXkgOiBmYWxzZSxcblx0XHRwcmVsb2FkIDogJ21ldGFkYXRhJyxcblx0XHRjb250ZW50IDogJycsXG5cdFx0d2lkdGggOiA2NDAsXG5cdFx0aGVpZ2h0IDogMzYwXG5cdH0sXG5cblx0ZWRpdCA6IGZ1bmN0aW9uKCBkYXRhICkge1xuXHRcdHZhciBmcmFtZSxcblx0XHRcdHNob3J0Y29kZSA9IHdwLnNob3J0Y29kZS5uZXh0KCAndmlkZW8nLCBkYXRhICkuc2hvcnRjb2RlLFxuXHRcdFx0YXR0cnM7XG5cblx0XHRhdHRycyA9IHNob3J0Y29kZS5hdHRycy5uYW1lZDtcblx0XHRhdHRycy5jb250ZW50ID0gc2hvcnRjb2RlLmNvbnRlbnQ7XG5cblx0XHRmcmFtZSA9IHdwLm1lZGlhKHtcblx0XHRcdGZyYW1lOiAndmlkZW8nLFxuXHRcdFx0c3RhdGU6ICd2aWRlby1kZXRhaWxzJyxcblx0XHRcdG1ldGFkYXRhOiBfLmRlZmF1bHRzKCBhdHRycywgdGhpcy5kZWZhdWx0cyApXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gZnJhbWU7XG5cdH0sXG5cblx0c2hvcnRjb2RlIDogZnVuY3Rpb24oIG1vZGVsICkge1xuXHRcdHZhciBjb250ZW50O1xuXG5cdFx0Xy5lYWNoKCB0aGlzLmRlZmF1bHRzLCBmdW5jdGlvbiggdmFsdWUsIGtleSApIHtcblx0XHRcdG1vZGVsWyBrZXkgXSA9IHRoaXMuY29lcmNlKCBtb2RlbCwga2V5ICk7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IG1vZGVsWyBrZXkgXSApIHtcblx0XHRcdFx0ZGVsZXRlIG1vZGVsWyBrZXkgXTtcblx0XHRcdH1cblx0XHR9LCB0aGlzICk7XG5cblx0XHRjb250ZW50ID0gbW9kZWwuY29udGVudDtcblx0XHRkZWxldGUgbW9kZWwuY29udGVudDtcblxuXHRcdHJldHVybiBuZXcgd3Auc2hvcnRjb2RlKHtcblx0XHRcdHRhZzogJ3ZpZGVvJyxcblx0XHRcdGF0dHJzOiBtb2RlbCxcblx0XHRcdGNvbnRlbnQ6IGNvbnRlbnRcblx0XHR9KTtcblx0fVxufTtcblxubWVkaWEubW9kZWwuUG9zdE1lZGlhID0gcmVxdWlyZSggJy4vbW9kZWxzL3Bvc3QtbWVkaWEuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLkF1ZGlvRGV0YWlscyA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL2F1ZGlvLWRldGFpbHMuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLlZpZGVvRGV0YWlscyA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL3ZpZGVvLWRldGFpbHMuanMnICk7XG5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuTWVkaWFEZXRhaWxzID0gcmVxdWlyZSggJy4vdmlld3MvZnJhbWUvbWVkaWEtZGV0YWlscy5qcycgKTtcbm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5BdWRpb0RldGFpbHMgPSByZXF1aXJlKCAnLi92aWV3cy9mcmFtZS9hdWRpby1kZXRhaWxzLmpzJyApO1xubWVkaWEudmlldy5NZWRpYUZyYW1lLlZpZGVvRGV0YWlscyA9IHJlcXVpcmUoICcuL3ZpZXdzL2ZyYW1lL3ZpZGVvLWRldGFpbHMuanMnICk7XG5tZWRpYS52aWV3Lk1lZGlhRGV0YWlscyA9IHJlcXVpcmUoICcuL3ZpZXdzL21lZGlhLWRldGFpbHMuanMnICk7XG5tZWRpYS52aWV3LkF1ZGlvRGV0YWlscyA9IHJlcXVpcmUoICcuL3ZpZXdzL2F1ZGlvLWRldGFpbHMuanMnICk7XG5tZWRpYS52aWV3LlZpZGVvRGV0YWlscyA9IHJlcXVpcmUoICcuL3ZpZXdzL3ZpZGVvLWRldGFpbHMuanMnICk7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuQXVkaW9EZXRhaWxzXG4gKlxuICogVGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBBdWRpbyBEZXRhaWxzIHN0YXRlXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKi9cbnZhciBTdGF0ZSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUsXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEF1ZGlvRGV0YWlscztcblxuQXVkaW9EZXRhaWxzID0gU3RhdGUuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogJ2F1ZGlvLWRldGFpbHMnLFxuXHRcdHRvb2xiYXI6ICdhdWRpby1kZXRhaWxzJyxcblx0XHR0aXRsZTogbDEwbi5hdWRpb0RldGFpbHNUaXRsZSxcblx0XHRjb250ZW50OiAnYXVkaW8tZGV0YWlscycsXG5cdFx0bWVudTogJ2F1ZGlvLWRldGFpbHMnLFxuXHRcdHJvdXRlcjogZmFsc2UsXG5cdFx0cHJpb3JpdHk6IDYwXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dGhpcy5tZWRpYSA9IG9wdGlvbnMubWVkaWE7XG5cdFx0U3RhdGUucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBdWRpb0RldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuVmlkZW9EZXRhaWxzXG4gKlxuICogVGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBWaWRlbyBEZXRhaWxzIHN0YXRlXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKi9cbnZhciBTdGF0ZSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUsXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdFZpZGVvRGV0YWlscztcblxuVmlkZW9EZXRhaWxzID0gU3RhdGUuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogJ3ZpZGVvLWRldGFpbHMnLFxuXHRcdHRvb2xiYXI6ICd2aWRlby1kZXRhaWxzJyxcblx0XHR0aXRsZTogbDEwbi52aWRlb0RldGFpbHNUaXRsZSxcblx0XHRjb250ZW50OiAndmlkZW8tZGV0YWlscycsXG5cdFx0bWVudTogJ3ZpZGVvLWRldGFpbHMnLFxuXHRcdHJvdXRlcjogZmFsc2UsXG5cdFx0cHJpb3JpdHk6IDYwXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dGhpcy5tZWRpYSA9IG9wdGlvbnMubWVkaWE7XG5cdFx0U3RhdGUucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBWaWRlb0RldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLm1vZGVsLlBvc3RNZWRpYVxuICpcbiAqIFNoYXJlZCBtb2RlbCBjbGFzcyBmb3IgYXVkaW8gYW5kIHZpZGVvLiBVcGRhdGVzIHRoZSBtb2RlbCBhZnRlclxuICogICBcIkFkZCBBdWRpb3xWaWRlbyBTb3VyY2VcIiBhbmQgXCJSZXBsYWNlIEF1ZGlvfFZpZGVvXCIgc3RhdGVzIHJldHVyblxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKi9cbnZhciBQb3N0TWVkaWEgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmF0dGFjaG1lbnQgPSBmYWxzZTtcblx0fSxcblxuXHRzZXRTb3VyY2U6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdHRoaXMuYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7XG5cdFx0dGhpcy5leHRlbnNpb24gPSBhdHRhY2htZW50LmdldCggJ2ZpbGVuYW1lJyApLnNwbGl0KCcuJykucG9wKCk7XG5cblx0XHRpZiAoIHRoaXMuZ2V0KCAnc3JjJyApICYmIHRoaXMuZXh0ZW5zaW9uID09PSB0aGlzLmdldCggJ3NyYycgKS5zcGxpdCgnLicpLnBvcCgpICkge1xuXHRcdFx0dGhpcy51bnNldCggJ3NyYycgKTtcblx0XHR9XG5cblx0XHRpZiAoIF8uY29udGFpbnMoIHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MuZW1iZWRFeHRzLCB0aGlzLmV4dGVuc2lvbiApICkge1xuXHRcdFx0dGhpcy5zZXQoIHRoaXMuZXh0ZW5zaW9uLCB0aGlzLmF0dGFjaG1lbnQuZ2V0KCAndXJsJyApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudW5zZXQoIHRoaXMuZXh0ZW5zaW9uICk7XG5cdFx0fVxuXHR9LFxuXG5cdGNoYW5nZUF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdHRoaXMuc2V0U291cmNlKCBhdHRhY2htZW50ICk7XG5cblx0XHR0aGlzLnVuc2V0KCAnc3JjJyApO1xuXHRcdF8uZWFjaCggXy53aXRob3V0KCB3cC5tZWRpYS52aWV3LnNldHRpbmdzLmVtYmVkRXh0cywgdGhpcy5leHRlbnNpb24gKSwgZnVuY3Rpb24oIGV4dCApIHtcblx0XHRcdHRoaXMudW5zZXQoIGV4dCApO1xuXHRcdH0sIHRoaXMgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9zdE1lZGlhO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkF1ZGlvRGV0YWlsc1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFEZXRhaWxzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5TZXR0aW5ncy5BdHRhY2htZW50RGlzcGxheVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIE1lZGlhRGV0YWlscyA9IHdwLm1lZGlhLnZpZXcuTWVkaWFEZXRhaWxzLFxuXHRBdWRpb0RldGFpbHM7XG5cbkF1ZGlvRGV0YWlscyA9IE1lZGlhRGV0YWlscy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdhdWRpby1kZXRhaWxzJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgnYXVkaW8tZGV0YWlscycpLFxuXG5cdHNldE1lZGlhOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXVkaW8gPSB0aGlzLiQoJy53cC1hdWRpby1zaG9ydGNvZGUnKTtcblxuXHRcdGlmICggYXVkaW8uZmluZCggJ3NvdXJjZScgKS5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIGF1ZGlvLmlzKCc6aGlkZGVuJykgKSB7XG5cdFx0XHRcdGF1ZGlvLnNob3coKTtcblx0XHRcdH1cblx0XHRcdHRoaXMubWVkaWEgPSBNZWRpYURldGFpbHMucHJlcGFyZVNyYyggYXVkaW8uZ2V0KDApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGF1ZGlvLmhpZGUoKTtcblx0XHRcdHRoaXMubWVkaWEgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXVkaW9EZXRhaWxzO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuQXVkaW9EZXRhaWxzXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLk1lZGlhRGV0YWlsc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5TZWxlY3RcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWVcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKiBAbWl4ZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZU1hY2hpbmVcbiAqL1xudmFyIE1lZGlhRGV0YWlscyA9IHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5NZWRpYURldGFpbHMsXG5cdE1lZGlhTGlicmFyeSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuTWVkaWFMaWJyYXJ5LFxuXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEF1ZGlvRGV0YWlscztcblxuQXVkaW9EZXRhaWxzID0gTWVkaWFEZXRhaWxzLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0aWQ6ICAgICAgJ2F1ZGlvJyxcblx0XHR1cmw6ICAgICAnJyxcblx0XHRtZW51OiAgICAnYXVkaW8tZGV0YWlscycsXG5cdFx0Y29udGVudDogJ2F1ZGlvLWRldGFpbHMnLFxuXHRcdHRvb2xiYXI6ICdhdWRpby1kZXRhaWxzJyxcblx0XHR0eXBlOiAgICAnbGluaycsXG5cdFx0dGl0bGU6ICAgIGwxMG4uYXVkaW9EZXRhaWxzVGl0bGUsXG5cdFx0cHJpb3JpdHk6IDEyMFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdG9wdGlvbnMuRGV0YWlsc1ZpZXcgPSB3cC5tZWRpYS52aWV3LkF1ZGlvRGV0YWlscztcblx0XHRvcHRpb25zLmNhbmNlbFRleHQgPSBsMTBuLmF1ZGlvRGV0YWlsc0NhbmNlbDtcblx0XHRvcHRpb25zLmFkZFRleHQgPSBsMTBuLmF1ZGlvQWRkU291cmNlVGl0bGU7XG5cblx0XHRNZWRpYURldGFpbHMucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCggdGhpcywgb3B0aW9ucyApO1xuXHR9LFxuXG5cdGJpbmRIYW5kbGVyczogZnVuY3Rpb24oKSB7XG5cdFx0TWVkaWFEZXRhaWxzLnByb3RvdHlwZS5iaW5kSGFuZGxlcnMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0dGhpcy5vbiggJ3Rvb2xiYXI6cmVuZGVyOnJlcGxhY2UtYXVkaW8nLCB0aGlzLnJlbmRlclJlcGxhY2VUb29sYmFyLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ3Rvb2xiYXI6cmVuZGVyOmFkZC1hdWRpby1zb3VyY2UnLCB0aGlzLnJlbmRlckFkZFNvdXJjZVRvb2xiYXIsIHRoaXMgKTtcblx0fSxcblxuXHRjcmVhdGVTdGF0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RhdGVzLmFkZChbXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5BdWRpb0RldGFpbHMoIHtcblx0XHRcdFx0bWVkaWE6IHRoaXMubWVkaWFcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IE1lZGlhTGlicmFyeSgge1xuXHRcdFx0XHR0eXBlOiAnYXVkaW8nLFxuXHRcdFx0XHRpZDogJ3JlcGxhY2UtYXVkaW8nLFxuXHRcdFx0XHR0aXRsZTogbDEwbi5hdWRpb1JlcGxhY2VUaXRsZSxcblx0XHRcdFx0dG9vbGJhcjogJ3JlcGxhY2UtYXVkaW8nLFxuXHRcdFx0XHRtZWRpYTogdGhpcy5tZWRpYSxcblx0XHRcdFx0bWVudTogJ2F1ZGlvLWRldGFpbHMnXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBNZWRpYUxpYnJhcnkoIHtcblx0XHRcdFx0dHlwZTogJ2F1ZGlvJyxcblx0XHRcdFx0aWQ6ICdhZGQtYXVkaW8tc291cmNlJyxcblx0XHRcdFx0dGl0bGU6IGwxMG4uYXVkaW9BZGRTb3VyY2VUaXRsZSxcblx0XHRcdFx0dG9vbGJhcjogJ2FkZC1hdWRpby1zb3VyY2UnLFxuXHRcdFx0XHRtZWRpYTogdGhpcy5tZWRpYSxcblx0XHRcdFx0bWVudTogZmFsc2Vcblx0XHRcdH0gKVxuXHRcdF0pO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBdWRpb0RldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5NZWRpYURldGFpbHNcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuU2VsZWN0XG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5GcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICogQG1peGVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lXG4gKi9cbnZhciBTZWxlY3QgPSB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuU2VsZWN0LFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRNZWRpYURldGFpbHM7XG5cbk1lZGlhRGV0YWlscyA9IFNlbGVjdC5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdGlkOiAgICAgICdtZWRpYScsXG5cdFx0dXJsOiAgICAgJycsXG5cdFx0bWVudTogICAgJ21lZGlhLWRldGFpbHMnLFxuXHRcdGNvbnRlbnQ6ICdtZWRpYS1kZXRhaWxzJyxcblx0XHR0b29sYmFyOiAnbWVkaWEtZGV0YWlscycsXG5cdFx0dHlwZTogICAgJ2xpbmsnLFxuXHRcdHByaW9yaXR5OiAxMjBcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR0aGlzLkRldGFpbHNWaWV3ID0gb3B0aW9ucy5EZXRhaWxzVmlldztcblx0XHR0aGlzLmNhbmNlbFRleHQgPSBvcHRpb25zLmNhbmNlbFRleHQ7XG5cdFx0dGhpcy5hZGRUZXh0ID0gb3B0aW9ucy5hZGRUZXh0O1xuXG5cdFx0dGhpcy5tZWRpYSA9IG5ldyB3cC5tZWRpYS5tb2RlbC5Qb3N0TWVkaWEoIG9wdGlvbnMubWV0YWRhdGEgKTtcblx0XHR0aGlzLm9wdGlvbnMuc2VsZWN0aW9uID0gbmV3IHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbiggdGhpcy5tZWRpYS5hdHRhY2htZW50LCB7IG11bHRpcGxlOiBmYWxzZSB9ICk7XG5cdFx0U2VsZWN0LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHRiaW5kSGFuZGxlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZW51ID0gdGhpcy5kZWZhdWx0cy5tZW51O1xuXG5cdFx0U2VsZWN0LnByb3RvdHlwZS5iaW5kSGFuZGxlcnMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0dGhpcy5vbiggJ21lbnU6Y3JlYXRlOicgKyBtZW51LCB0aGlzLmNyZWF0ZU1lbnUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnY29udGVudDpyZW5kZXI6JyArIG1lbnUsIHRoaXMucmVuZGVyRGV0YWlsc0NvbnRlbnQsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnbWVudTpyZW5kZXI6JyArIG1lbnUsIHRoaXMucmVuZGVyTWVudSwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOnJlbmRlcjonICsgbWVudSwgdGhpcy5yZW5kZXJEZXRhaWxzVG9vbGJhciwgdGhpcyApO1xuXHR9LFxuXG5cdHJlbmRlckRldGFpbHNDb250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdmlldyA9IG5ldyB0aGlzLkRldGFpbHNWaWV3KHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRtb2RlbDogdGhpcy5zdGF0ZSgpLm1lZGlhLFxuXHRcdFx0YXR0YWNobWVudDogdGhpcy5zdGF0ZSgpLm1lZGlhLmF0dGFjaG1lbnRcblx0XHR9KS5yZW5kZXIoKTtcblxuXHRcdHRoaXMuY29udGVudC5zZXQoIHZpZXcgKTtcblx0fSxcblxuXHRyZW5kZXJNZW51OiBmdW5jdGlvbiggdmlldyApIHtcblx0XHR2YXIgbGFzdFN0YXRlID0gdGhpcy5sYXN0U3RhdGUoKSxcblx0XHRcdHByZXZpb3VzID0gbGFzdFN0YXRlICYmIGxhc3RTdGF0ZS5pZCxcblx0XHRcdGZyYW1lID0gdGhpcztcblxuXHRcdHZpZXcuc2V0KHtcblx0XHRcdGNhbmNlbDoge1xuXHRcdFx0XHR0ZXh0OiAgICAgdGhpcy5jYW5jZWxUZXh0LFxuXHRcdFx0XHRwcmlvcml0eTogMjAsXG5cdFx0XHRcdGNsaWNrOiAgICBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHByZXZpb3VzICkge1xuXHRcdFx0XHRcdFx0ZnJhbWUuc2V0U3RhdGUoIHByZXZpb3VzICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZyYW1lLmNsb3NlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c2VwYXJhdGVDYW5jZWw6IG5ldyB3cC5tZWRpYS5WaWV3KHtcblx0XHRcdFx0Y2xhc3NOYW1lOiAnc2VwYXJhdG9yJyxcblx0XHRcdFx0cHJpb3JpdHk6IDQwXG5cdFx0XHR9KVxuXHRcdH0pO1xuXG5cdH0sXG5cblx0c2V0UHJpbWFyeUJ1dHRvbjogZnVuY3Rpb24odGV4dCwgaGFuZGxlcikge1xuXHRcdHRoaXMudG9vbGJhci5zZXQoIG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdGJ1dHRvbjoge1xuXHRcdFx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHRcdFx0dGV4dDogICAgIHRleHQsXG5cdFx0XHRcdFx0cHJpb3JpdHk6IDgwLFxuXHRcdFx0XHRcdGNsaWNrOiAgICBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyO1xuXHRcdFx0XHRcdFx0aGFuZGxlci5jYWxsKCB0aGlzLCBjb250cm9sbGVyLCBjb250cm9sbGVyLnN0YXRlKCkgKTtcblx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgYW5kIHJlc2V0IHRoZSBkZWZhdWx0IHN0YXRlLlxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zZXRTdGF0ZSggY29udHJvbGxlci5vcHRpb25zLnN0YXRlICk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnJlc2V0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fSxcblxuXHRyZW5kZXJEZXRhaWxzVG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zZXRQcmltYXJ5QnV0dG9uKCBsMTBuLnVwZGF0ZSwgZnVuY3Rpb24oIGNvbnRyb2xsZXIsIHN0YXRlICkge1xuXHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0c3RhdGUudHJpZ2dlciggJ3VwZGF0ZScsIGNvbnRyb2xsZXIubWVkaWEudG9KU09OKCkgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0cmVuZGVyUmVwbGFjZVRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2V0UHJpbWFyeUJ1dHRvbiggbDEwbi5yZXBsYWNlLCBmdW5jdGlvbiggY29udHJvbGxlciwgc3RhdGUgKSB7XG5cdFx0XHR2YXIgYXR0YWNobWVudCA9IHN0YXRlLmdldCggJ3NlbGVjdGlvbicgKS5zaW5nbGUoKTtcblx0XHRcdGNvbnRyb2xsZXIubWVkaWEuY2hhbmdlQXR0YWNobWVudCggYXR0YWNobWVudCApO1xuXHRcdFx0c3RhdGUudHJpZ2dlciggJ3JlcGxhY2UnLCBjb250cm9sbGVyLm1lZGlhLnRvSlNPTigpICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHJlbmRlckFkZFNvdXJjZVRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2V0UHJpbWFyeUJ1dHRvbiggdGhpcy5hZGRUZXh0LCBmdW5jdGlvbiggY29udHJvbGxlciwgc3RhdGUgKSB7XG5cdFx0XHR2YXIgYXR0YWNobWVudCA9IHN0YXRlLmdldCggJ3NlbGVjdGlvbicgKS5zaW5nbGUoKTtcblx0XHRcdGNvbnRyb2xsZXIubWVkaWEuc2V0U291cmNlKCBhdHRhY2htZW50ICk7XG5cdFx0XHRzdGF0ZS50cmlnZ2VyKCAnYWRkLXNvdXJjZScsIGNvbnRyb2xsZXIubWVkaWEudG9KU09OKCkgKTtcblx0XHR9ICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1lZGlhRGV0YWlscztcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLlZpZGVvRGV0YWlsc1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5NZWRpYURldGFpbHNcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuU2VsZWN0XG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5GcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICogQG1peGVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lXG4gKi9cbnZhciBNZWRpYURldGFpbHMgPSB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuTWVkaWFEZXRhaWxzLFxuXHRNZWRpYUxpYnJhcnkgPSB3cC5tZWRpYS5jb250cm9sbGVyLk1lZGlhTGlicmFyeSxcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0VmlkZW9EZXRhaWxzO1xuXG5WaWRlb0RldGFpbHMgPSBNZWRpYURldGFpbHMuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogICAgICAndmlkZW8nLFxuXHRcdHVybDogICAgICcnLFxuXHRcdG1lbnU6ICAgICd2aWRlby1kZXRhaWxzJyxcblx0XHRjb250ZW50OiAndmlkZW8tZGV0YWlscycsXG5cdFx0dG9vbGJhcjogJ3ZpZGVvLWRldGFpbHMnLFxuXHRcdHR5cGU6ICAgICdsaW5rJyxcblx0XHR0aXRsZTogICAgbDEwbi52aWRlb0RldGFpbHNUaXRsZSxcblx0XHRwcmlvcml0eTogMTIwXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0b3B0aW9ucy5EZXRhaWxzVmlldyA9IHdwLm1lZGlhLnZpZXcuVmlkZW9EZXRhaWxzO1xuXHRcdG9wdGlvbnMuY2FuY2VsVGV4dCA9IGwxMG4udmlkZW9EZXRhaWxzQ2FuY2VsO1xuXHRcdG9wdGlvbnMuYWRkVGV4dCA9IGwxMG4udmlkZW9BZGRTb3VyY2VUaXRsZTtcblxuXHRcdE1lZGlhRGV0YWlscy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKCB0aGlzLCBvcHRpb25zICk7XG5cdH0sXG5cblx0YmluZEhhbmRsZXJzOiBmdW5jdGlvbigpIHtcblx0XHRNZWRpYURldGFpbHMucHJvdG90eXBlLmJpbmRIYW5kbGVycy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cblx0XHR0aGlzLm9uKCAndG9vbGJhcjpyZW5kZXI6cmVwbGFjZS12aWRlbycsIHRoaXMucmVuZGVyUmVwbGFjZVRvb2xiYXIsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpyZW5kZXI6YWRkLXZpZGVvLXNvdXJjZScsIHRoaXMucmVuZGVyQWRkU291cmNlVG9vbGJhciwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOnJlbmRlcjpzZWxlY3QtcG9zdGVyLWltYWdlJywgdGhpcy5yZW5kZXJTZWxlY3RQb3N0ZXJJbWFnZVRvb2xiYXIsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpyZW5kZXI6YWRkLXRyYWNrJywgdGhpcy5yZW5kZXJBZGRUcmFja1Rvb2xiYXIsIHRoaXMgKTtcblx0fSxcblxuXHRjcmVhdGVTdGF0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RhdGVzLmFkZChbXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5WaWRlb0RldGFpbHMoe1xuXHRcdFx0XHRtZWRpYTogdGhpcy5tZWRpYVxuXHRcdFx0fSksXG5cblx0XHRcdG5ldyBNZWRpYUxpYnJhcnkoIHtcblx0XHRcdFx0dHlwZTogJ3ZpZGVvJyxcblx0XHRcdFx0aWQ6ICdyZXBsYWNlLXZpZGVvJyxcblx0XHRcdFx0dGl0bGU6IGwxMG4udmlkZW9SZXBsYWNlVGl0bGUsXG5cdFx0XHRcdHRvb2xiYXI6ICdyZXBsYWNlLXZpZGVvJyxcblx0XHRcdFx0bWVkaWE6IHRoaXMubWVkaWEsXG5cdFx0XHRcdG1lbnU6ICd2aWRlby1kZXRhaWxzJ1xuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgTWVkaWFMaWJyYXJ5KCB7XG5cdFx0XHRcdHR5cGU6ICd2aWRlbycsXG5cdFx0XHRcdGlkOiAnYWRkLXZpZGVvLXNvdXJjZScsXG5cdFx0XHRcdHRpdGxlOiBsMTBuLnZpZGVvQWRkU291cmNlVGl0bGUsXG5cdFx0XHRcdHRvb2xiYXI6ICdhZGQtdmlkZW8tc291cmNlJyxcblx0XHRcdFx0bWVkaWE6IHRoaXMubWVkaWEsXG5cdFx0XHRcdG1lbnU6IGZhbHNlXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBNZWRpYUxpYnJhcnkoIHtcblx0XHRcdFx0dHlwZTogJ2ltYWdlJyxcblx0XHRcdFx0aWQ6ICdzZWxlY3QtcG9zdGVyLWltYWdlJyxcblx0XHRcdFx0dGl0bGU6IGwxMG4udmlkZW9TZWxlY3RQb3N0ZXJJbWFnZVRpdGxlLFxuXHRcdFx0XHR0b29sYmFyOiAnc2VsZWN0LXBvc3Rlci1pbWFnZScsXG5cdFx0XHRcdG1lZGlhOiB0aGlzLm1lZGlhLFxuXHRcdFx0XHRtZW51OiAndmlkZW8tZGV0YWlscydcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IE1lZGlhTGlicmFyeSgge1xuXHRcdFx0XHR0eXBlOiAndGV4dCcsXG5cdFx0XHRcdGlkOiAnYWRkLXRyYWNrJyxcblx0XHRcdFx0dGl0bGU6IGwxMG4udmlkZW9BZGRUcmFja1RpdGxlLFxuXHRcdFx0XHR0b29sYmFyOiAnYWRkLXRyYWNrJyxcblx0XHRcdFx0bWVkaWE6IHRoaXMubWVkaWEsXG5cdFx0XHRcdG1lbnU6ICd2aWRlby1kZXRhaWxzJ1xuXHRcdFx0fSApXG5cdFx0XSk7XG5cdH0sXG5cblx0cmVuZGVyU2VsZWN0UG9zdGVySW1hZ2VUb29sYmFyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNldFByaW1hcnlCdXR0b24oIGwxMG4udmlkZW9TZWxlY3RQb3N0ZXJJbWFnZVRpdGxlLCBmdW5jdGlvbiggY29udHJvbGxlciwgc3RhdGUgKSB7XG5cdFx0XHR2YXIgdXJscyA9IFtdLCBhdHRhY2htZW50ID0gc3RhdGUuZ2V0KCAnc2VsZWN0aW9uJyApLnNpbmdsZSgpO1xuXG5cdFx0XHRjb250cm9sbGVyLm1lZGlhLnNldCggJ3Bvc3RlcicsIGF0dGFjaG1lbnQuZ2V0KCAndXJsJyApICk7XG5cdFx0XHRzdGF0ZS50cmlnZ2VyKCAnc2V0LXBvc3Rlci1pbWFnZScsIGNvbnRyb2xsZXIubWVkaWEudG9KU09OKCkgKTtcblxuXHRcdFx0Xy5lYWNoKCB3cC5tZWRpYS52aWV3LnNldHRpbmdzLmVtYmVkRXh0cywgZnVuY3Rpb24gKGV4dCkge1xuXHRcdFx0XHRpZiAoIGNvbnRyb2xsZXIubWVkaWEuZ2V0KCBleHQgKSApIHtcblx0XHRcdFx0XHR1cmxzLnB1c2goIGNvbnRyb2xsZXIubWVkaWEuZ2V0KCBleHQgKSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHRcdHdwLmFqYXguc2VuZCggJ3NldC1hdHRhY2htZW50LXRodW1ibmFpbCcsIHtcblx0XHRcdFx0ZGF0YSA6IHtcblx0XHRcdFx0XHR1cmxzOiB1cmxzLFxuXHRcdFx0XHRcdHRodW1ibmFpbF9pZDogYXR0YWNobWVudC5nZXQoICdpZCcgKVxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHJlbmRlckFkZFRyYWNrVG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zZXRQcmltYXJ5QnV0dG9uKCBsMTBuLnZpZGVvQWRkVHJhY2tUaXRsZSwgZnVuY3Rpb24oIGNvbnRyb2xsZXIsIHN0YXRlICkge1xuXHRcdFx0dmFyIGF0dGFjaG1lbnQgPSBzdGF0ZS5nZXQoICdzZWxlY3Rpb24nICkuc2luZ2xlKCksXG5cdFx0XHRcdGNvbnRlbnQgPSBjb250cm9sbGVyLm1lZGlhLmdldCggJ2NvbnRlbnQnICk7XG5cblx0XHRcdGlmICggLTEgPT09IGNvbnRlbnQuaW5kZXhPZiggYXR0YWNobWVudC5nZXQoICd1cmwnICkgKSApIHtcblx0XHRcdFx0Y29udGVudCArPSBbXG5cdFx0XHRcdFx0Jzx0cmFjayBzcmNsYW5nPVwiZW5cIiBsYWJlbD1cIkVuZ2xpc2hcIiBraW5kPVwic3VidGl0bGVzXCIgc3JjPVwiJyxcblx0XHRcdFx0XHRhdHRhY2htZW50LmdldCggJ3VybCcgKSxcblx0XHRcdFx0XHQnXCIgLz4nXG5cdFx0XHRcdF0uam9pbignJyk7XG5cblx0XHRcdFx0Y29udHJvbGxlci5tZWRpYS5zZXQoICdjb250ZW50JywgY29udGVudCApO1xuXHRcdFx0fVxuXHRcdFx0c3RhdGUudHJpZ2dlciggJ2FkZC10cmFjaycsIGNvbnRyb2xsZXIubWVkaWEudG9KU09OKCkgKTtcblx0XHR9ICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpZGVvRGV0YWlscztcbiIsIi8qIGdsb2JhbCBNZWRpYUVsZW1lbnRQbGF5ZXIgKi9cblxuLyoqXG4gKiB3cC5tZWRpYS52aWV3Lk1lZGlhRGV0YWlsc1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuQXR0YWNobWVudERpc3BsYXlcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlNldHRpbmdzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBBdHRhY2htZW50RGlzcGxheSA9IHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuQXR0YWNobWVudERpc3BsYXksXG5cdCQgPSBqUXVlcnksXG5cdE1lZGlhRGV0YWlscztcblxuTWVkaWFEZXRhaWxzID0gQXR0YWNobWVudERpc3BsYXkuZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5iaW5kQWxsKHRoaXMsICdzdWNjZXNzJyk7XG5cdFx0dGhpcy5wbGF5ZXJzID0gW107XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5jb250cm9sbGVyLCAnY2xvc2UnLCB3cC5tZWRpYS5taXhpbi51bnNldFBsYXllcnMgKTtcblx0XHR0aGlzLm9uKCAncmVhZHknLCB0aGlzLnNldFBsYXllciApO1xuXHRcdHRoaXMub24oICdtZWRpYTpzZXR0aW5nOnJlbW92ZScsIHdwLm1lZGlhLm1peGluLnVuc2V0UGxheWVycywgdGhpcyApO1xuXHRcdHRoaXMub24oICdtZWRpYTpzZXR0aW5nOnJlbW92ZScsIHRoaXMucmVuZGVyICk7XG5cdFx0dGhpcy5vbiggJ21lZGlhOnNldHRpbmc6cmVtb3ZlJywgdGhpcy5zZXRQbGF5ZXIgKTtcblxuXHRcdEF0dGFjaG1lbnREaXNwbGF5LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHRldmVudHM6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIF8uZXh0ZW5kKCB7XG5cdFx0XHRcdCdjbGljayAucmVtb3ZlLXNldHRpbmcnIDogJ3JlbW92ZVNldHRpbmcnLFxuXHRcdFx0XHQnY2hhbmdlIC5jb250ZW50LXRyYWNrJyA6ICdzZXRUcmFja3MnLFxuXHRcdFx0XHQnY2xpY2sgLnJlbW92ZS10cmFjaycgOiAnc2V0VHJhY2tzJyxcblx0XHRcdFx0J2NsaWNrIC5hZGQtbWVkaWEtc291cmNlJyA6ICdhZGRTb3VyY2UnXG5cdFx0fSwgQXR0YWNobWVudERpc3BsYXkucHJvdG90eXBlLmV2ZW50cyApO1xuXHR9LFxuXG5cdHByZXBhcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBfLmRlZmF1bHRzKHtcblx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLnRvSlNPTigpXG5cdFx0fSwgdGhpcy5vcHRpb25zICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlbW92ZSBhIHNldHRpbmcncyBVSSB3aGVuIHRoZSBtb2RlbCB1bnNldHMgaXRcblx0ICpcblx0ICogQGZpcmVzIHdwLm1lZGlhLnZpZXcuTWVkaWFEZXRhaWxzI21lZGlhOnNldHRpbmc6cmVtb3ZlXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGVcblx0ICovXG5cdHJlbW92ZVNldHRpbmcgOiBmdW5jdGlvbihlKSB7XG5cdFx0dmFyIHdyYXAgPSAkKCBlLmN1cnJlbnRUYXJnZXQgKS5wYXJlbnQoKSwgc2V0dGluZztcblx0XHRzZXR0aW5nID0gd3JhcC5maW5kKCAnaW5wdXQnICkuZGF0YSggJ3NldHRpbmcnICk7XG5cblx0XHRpZiAoIHNldHRpbmcgKSB7XG5cdFx0XHR0aGlzLm1vZGVsLnVuc2V0KCBzZXR0aW5nICk7XG5cdFx0XHR0aGlzLnRyaWdnZXIoICdtZWRpYTpzZXR0aW5nOnJlbW92ZScsIHRoaXMgKTtcblx0XHR9XG5cblx0XHR3cmFwLnJlbW92ZSgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAZmlyZXMgd3AubWVkaWEudmlldy5NZWRpYURldGFpbHMjbWVkaWE6c2V0dGluZzpyZW1vdmVcblx0ICovXG5cdHNldFRyYWNrcyA6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB0cmFja3MgPSAnJztcblxuXHRcdF8uZWFjaCggdGhpcy4kKCcuY29udGVudC10cmFjaycpLCBmdW5jdGlvbih0cmFjaykge1xuXHRcdFx0dHJhY2tzICs9ICQoIHRyYWNrICkudmFsKCk7XG5cdFx0fSApO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoICdjb250ZW50JywgdHJhY2tzICk7XG5cdFx0dGhpcy50cmlnZ2VyKCAnbWVkaWE6c2V0dGluZzpyZW1vdmUnLCB0aGlzICk7XG5cdH0sXG5cblx0YWRkU291cmNlIDogZnVuY3Rpb24oIGUgKSB7XG5cdFx0dGhpcy5jb250cm9sbGVyLmxhc3RNaW1lID0gJCggZS5jdXJyZW50VGFyZ2V0ICkuZGF0YSggJ21pbWUnICk7XG5cdFx0dGhpcy5jb250cm9sbGVyLnNldFN0YXRlKCAnYWRkLScgKyB0aGlzLmNvbnRyb2xsZXIuZGVmYXVsdHMuaWQgKyAnLXNvdXJjZScgKTtcblx0fSxcblxuXHRsb2FkUGxheWVyOiBmdW5jdGlvbiAoKSB7XG5cdFx0dGhpcy5wbGF5ZXJzLnB1c2goIG5ldyBNZWRpYUVsZW1lbnRQbGF5ZXIoIHRoaXMubWVkaWEsIHRoaXMuc2V0dGluZ3MgKSApO1xuXHRcdHRoaXMuc2NyaXB0WGhyID0gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBnbG9iYWwgTWVkaWFFbGVtZW50UGxheWVyXG5cdCAqL1xuXHRzZXRQbGF5ZXIgOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYmFzZVNldHRpbmdzLCBzcmM7XG5cblx0XHRpZiAoIHRoaXMucGxheWVycy5sZW5ndGggfHwgISB0aGlzLm1lZGlhIHx8IHRoaXMuc2NyaXB0WGhyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHNyYyA9IHRoaXMubW9kZWwuZ2V0KCAnc3JjJyApO1xuXG5cdFx0aWYgKCBzcmMgJiYgc3JjLmluZGV4T2YoICd2aW1lbycgKSA+IC0xICYmICEgKCAnRnJvb2dhbG9vcCcgaW4gd2luZG93ICkgKSB7XG5cdFx0XHRiYXNlU2V0dGluZ3MgPSB3cC5tZWRpYS5taXhpbi5tZWpzU2V0dGluZ3M7XG5cdFx0XHR0aGlzLnNjcmlwdFhociA9ICQuZ2V0U2NyaXB0KCBiYXNlU2V0dGluZ3MucGx1Z2luUGF0aCArICdmcm9vZ2Fsb29wLm1pbi5qcycsIF8uYmluZCggdGhpcy5sb2FkUGxheWVyLCB0aGlzICkgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5sb2FkUGxheWVyKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBAYWJzdHJhY3Rcblx0ICovXG5cdHNldE1lZGlhIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0c3VjY2VzcyA6IGZ1bmN0aW9uKG1lanMpIHtcblx0XHR2YXIgYXV0b3BsYXkgPSBtZWpzLmF0dHJpYnV0ZXMuYXV0b3BsYXkgJiYgJ2ZhbHNlJyAhPT0gbWVqcy5hdHRyaWJ1dGVzLmF1dG9wbGF5O1xuXG5cdFx0aWYgKCAnZmxhc2gnID09PSBtZWpzLnBsdWdpblR5cGUgJiYgYXV0b3BsYXkgKSB7XG5cdFx0XHRtZWpzLmFkZEV2ZW50TGlzdGVuZXIoICdjYW5wbGF5JywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdG1lanMucGxheSgpO1xuXHRcdFx0fSwgZmFsc2UgKTtcblx0XHR9XG5cblx0XHR0aGlzLm1lanMgPSBtZWpzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7bWVkaWEudmlldy5NZWRpYURldGFpbHN9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdEF0dGFjaG1lbnREaXNwbGF5LnByb3RvdHlwZS5yZW5kZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0c2V0VGltZW91dCggXy5iaW5kKCBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMucmVzZXRGb2N1cygpO1xuXHRcdH0sIHRoaXMgKSwgMTAgKTtcblxuXHRcdHRoaXMuc2V0dGluZ3MgPSBfLmRlZmF1bHRzKCB7XG5cdFx0XHRzdWNjZXNzIDogdGhpcy5zdWNjZXNzXG5cdFx0fSwgd3AubWVkaWEubWl4aW4ubWVqc1NldHRpbmdzICk7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRNZWRpYSgpO1xuXHR9LFxuXG5cdHJlc2V0Rm9jdXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJCggJy5lbWJlZC1tZWRpYS1zZXR0aW5ncycgKS5zY3JvbGxUb3AoIDAgKTtcblx0fVxufSwge1xuXHRpbnN0YW5jZXMgOiAwLFxuXHQvKipcblx0ICogV2hlbiBtdWx0aXBsZSBwbGF5ZXJzIGluIHRoZSBET00gY29udGFpbiB0aGUgc2FtZSBzcmMsIHRoaW5ncyBnZXQgd2VpcmQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cblx0ICogQHJldHVybnMge0hUTUxFbGVtZW50fVxuXHQgKi9cblx0cHJlcGFyZVNyYyA6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBpID0gTWVkaWFEZXRhaWxzLmluc3RhbmNlcysrO1xuXHRcdF8uZWFjaCggJCggZWxlbSApLmZpbmQoICdzb3VyY2UnICksIGZ1bmN0aW9uKCBzb3VyY2UgKSB7XG5cdFx0XHRzb3VyY2Uuc3JjID0gW1xuXHRcdFx0XHRzb3VyY2Uuc3JjLFxuXHRcdFx0XHRzb3VyY2Uuc3JjLmluZGV4T2YoJz8nKSA+IC0xID8gJyYnIDogJz8nLFxuXHRcdFx0XHQnXz0nLFxuXHRcdFx0XHRpXG5cdFx0XHRdLmpvaW4oJycpO1xuXHRcdH0gKTtcblxuXHRcdHJldHVybiBlbGVtO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNZWRpYURldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuVmlkZW9EZXRhaWxzXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYURldGFpbHNcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlNldHRpbmdzLkF0dGFjaG1lbnREaXNwbGF5XG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5TZXR0aW5nc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgTWVkaWFEZXRhaWxzID0gd3AubWVkaWEudmlldy5NZWRpYURldGFpbHMsXG5cdFZpZGVvRGV0YWlscztcblxuVmlkZW9EZXRhaWxzID0gTWVkaWFEZXRhaWxzLmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogJ3ZpZGVvLWRldGFpbHMnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCd2aWRlby1kZXRhaWxzJyksXG5cblx0c2V0TWVkaWE6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB2aWRlbyA9IHRoaXMuJCgnLndwLXZpZGVvLXNob3J0Y29kZScpO1xuXG5cdFx0aWYgKCB2aWRlby5maW5kKCAnc291cmNlJyApLmxlbmd0aCApIHtcblx0XHRcdGlmICggdmlkZW8uaXMoJzpoaWRkZW4nKSApIHtcblx0XHRcdFx0dmlkZW8uc2hvdygpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgdmlkZW8uaGFzQ2xhc3MoICd5b3V0dWJlLXZpZGVvJyApICYmICEgdmlkZW8uaGFzQ2xhc3MoICd2aW1lby12aWRlbycgKSApIHtcblx0XHRcdFx0dGhpcy5tZWRpYSA9IE1lZGlhRGV0YWlscy5wcmVwYXJlU3JjKCB2aWRlby5nZXQoMCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMubWVkaWEgPSB2aWRlby5nZXQoMCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZpZGVvLmhpZGUoKTtcblx0XHRcdHRoaXMubWVkaWEgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmlkZW9EZXRhaWxzO1xuIl19 -
src/wp-includes/js/media-grid.js
850 850 851 851 module.exports = Manage; 852 852 853 },{}]},{},[2]); 853 },{}]},{},[2]) 854 //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9ncnVudC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvZWRpdC1hdHRhY2htZW50LW1ldGFkYXRhLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL2dyaWQubWFuaWZlc3QuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvcm91dGVycy9tYW5hZ2UuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC9kZXRhaWxzLXR3by1jb2x1bW4uanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYnV0dG9uL2RlbGV0ZS1zZWxlY3RlZC1wZXJtYW5lbnRseS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9idXR0b24vZGVsZXRlLXNlbGVjdGVkLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2J1dHRvbi9zZWxlY3QtbW9kZS10b2dnbGUuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZWRpdC1pbWFnZS1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2ZyYW1lL2VkaXQtYXR0YWNobWVudHMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZnJhbWUvbWFuYWdlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5FZGl0QXR0YWNobWVudE1ldGFkYXRhXG4gKlxuICogQSBzdGF0ZSBmb3IgZWRpdGluZyBhbiBhdHRhY2htZW50J3MgbWV0YWRhdGEuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKi9cbnZhciBsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRFZGl0QXR0YWNobWVudE1ldGFkYXRhO1xuXG5FZGl0QXR0YWNobWVudE1ldGFkYXRhID0gd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZS5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdGlkOiAgICAgICdlZGl0LWF0dGFjaG1lbnQnLFxuXHRcdC8vIFRpdGxlIHN0cmluZyBwYXNzZWQgdG8gdGhlIGZyYW1lJ3MgdGl0bGUgcmVnaW9uIHZpZXcuXG5cdFx0dGl0bGU6ICAgbDEwbi5hdHRhY2htZW50RGV0YWlscyxcblx0XHQvLyBSZWdpb24gbW9kZSBkZWZhdWx0cy5cblx0XHRjb250ZW50OiAnZWRpdC1tZXRhZGF0YScsXG5cdFx0bWVudTogICAgZmFsc2UsXG5cdFx0dG9vbGJhcjogZmFsc2UsXG5cdFx0cm91dGVyOiAgZmFsc2Vcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRWRpdEF0dGFjaG1lbnRNZXRhZGF0YTtcbiIsInZhciBtZWRpYSA9IHdwLm1lZGlhO1xuXG5tZWRpYS5jb250cm9sbGVyLkVkaXRBdHRhY2htZW50TWV0YWRhdGEgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9lZGl0LWF0dGFjaG1lbnQtbWV0YWRhdGEuanMnICk7XG5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuTWFuYWdlID0gcmVxdWlyZSggJy4vdmlld3MvZnJhbWUvbWFuYWdlLmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50LkRldGFpbHMuVHdvQ29sdW1uID0gcmVxdWlyZSggJy4vdmlld3MvYXR0YWNobWVudC9kZXRhaWxzLXR3by1jb2x1bW4uanMnICk7XG5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuTWFuYWdlLlJvdXRlciA9IHJlcXVpcmUoICcuL3JvdXRlcnMvbWFuYWdlLmpzJyApO1xubWVkaWEudmlldy5FZGl0SW1hZ2UuRGV0YWlscyA9IHJlcXVpcmUoICcuL3ZpZXdzL2VkaXQtaW1hZ2UtZGV0YWlscy5qcycgKTtcbm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5FZGl0QXR0YWNobWVudHMgPSByZXF1aXJlKCAnLi92aWV3cy9mcmFtZS9lZGl0LWF0dGFjaG1lbnRzLmpzJyApO1xubWVkaWEudmlldy5TZWxlY3RNb2RlVG9nZ2xlQnV0dG9uID0gcmVxdWlyZSggJy4vdmlld3MvYnV0dG9uL3NlbGVjdC1tb2RlLXRvZ2dsZS5qcycgKTtcbm1lZGlhLnZpZXcuRGVsZXRlU2VsZWN0ZWRCdXR0b24gPSByZXF1aXJlKCAnLi92aWV3cy9idXR0b24vZGVsZXRlLXNlbGVjdGVkLmpzJyApO1xubWVkaWEudmlldy5EZWxldGVTZWxlY3RlZFBlcm1hbmVudGx5QnV0dG9uID0gcmVxdWlyZSggJy4vdmlld3MvYnV0dG9uL2RlbGV0ZS1zZWxlY3RlZC1wZXJtYW5lbnRseS5qcycgKTtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLk1hbmFnZS5Sb3V0ZXJcbiAqXG4gKiBBIHJvdXRlciBmb3IgaGFuZGxpbmcgdGhlIGJyb3dzZXIgaGlzdG9yeSBhbmQgYXBwbGljYXRpb24gc3RhdGUuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuUm91dGVyXG4gKi9cbnZhciBSb3V0ZXIgPSBCYWNrYm9uZS5Sb3V0ZXIuZXh0ZW5kKHtcblx0cm91dGVzOiB7XG5cdFx0J3VwbG9hZC5waHA/aXRlbT06c2x1Zyc6ICAgICdzaG93SXRlbScsXG5cdFx0J3VwbG9hZC5waHA/c2VhcmNoPTpxdWVyeSc6ICdzZWFyY2gnXG5cdH0sXG5cblx0Ly8gTWFwIHJvdXRlcyBhZ2FpbnN0IHRoZSBwYWdlIFVSTFxuXHRiYXNlVXJsOiBmdW5jdGlvbiggdXJsICkge1xuXHRcdHJldHVybiAndXBsb2FkLnBocCcgKyB1cmw7XG5cdH0sXG5cblx0Ly8gUmVzcG9uZCB0byB0aGUgc2VhcmNoIHJvdXRlIGJ5IGZpbGxpbmcgdGhlIHNlYXJjaCBmaWVsZCBhbmQgdHJpZ2dnZXJpbmcgdGhlIGlucHV0IGV2ZW50XG5cdHNlYXJjaDogZnVuY3Rpb24oIHF1ZXJ5ICkge1xuXHRcdGpRdWVyeSggJyNtZWRpYS1zZWFyY2gtaW5wdXQnICkudmFsKCBxdWVyeSApLnRyaWdnZXIoICdpbnB1dCcgKTtcblx0fSxcblxuXHQvLyBTaG93IHRoZSBtb2RhbCB3aXRoIGEgc3BlY2lmaWMgaXRlbVxuXHRzaG93SXRlbTogZnVuY3Rpb24oIHF1ZXJ5ICkge1xuXHRcdHZhciBtZWRpYSA9IHdwLm1lZGlhLFxuXHRcdFx0bGlicmFyeSA9IG1lZGlhLmZyYW1lLnN0YXRlKCkuZ2V0KCdsaWJyYXJ5JyksXG5cdFx0XHRpdGVtO1xuXG5cdFx0Ly8gVHJpZ2dlciB0aGUgbWVkaWEgZnJhbWUgdG8gb3BlbiB0aGUgY29ycmVjdCBpdGVtXG5cdFx0aXRlbSA9IGxpYnJhcnkuZmluZFdoZXJlKCB7IGlkOiBwYXJzZUludCggcXVlcnksIDEwICkgfSApO1xuXHRcdGlmICggaXRlbSApIHtcblx0XHRcdG1lZGlhLmZyYW1lLnRyaWdnZXIoICdlZGl0OmF0dGFjaG1lbnQnLCBpdGVtICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGl0ZW0gPSBtZWRpYS5hdHRhY2htZW50KCBxdWVyeSApO1xuXHRcdFx0bWVkaWEuZnJhbWUubGlzdGVuVG8oIGl0ZW0sICdjaGFuZ2UnLCBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0XHRcdG1lZGlhLmZyYW1lLnN0b3BMaXN0ZW5pbmcoIGl0ZW0gKTtcblx0XHRcdFx0bWVkaWEuZnJhbWUudHJpZ2dlciggJ2VkaXQ6YXR0YWNobWVudCcsIG1vZGVsICk7XG5cdFx0XHR9ICk7XG5cdFx0XHRpdGVtLmZldGNoKCk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSb3V0ZXI7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5EZXRhaWxzLlR3b0NvbHVtblxuICpcbiAqIEEgc2ltaWxhciB2aWV3IHRvIG1lZGlhLnZpZXcuQXR0YWNobWVudC5EZXRhaWxzXG4gKiBmb3IgdXNlIGluIHRoZSBFZGl0IEF0dGFjaG1lbnQgbW9kYWwuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5BdHRhY2htZW50LkRldGFpbHNcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIERldGFpbHMgPSB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuRGV0YWlscyxcblx0VHdvQ29sdW1uO1xuXG5Ud29Db2x1bW4gPSBEZXRhaWxzLmV4dGVuZCh7XG5cdHRlbXBsYXRlOiB3cC50ZW1wbGF0ZSggJ2F0dGFjaG1lbnQtZGV0YWlscy10d28tY29sdW1uJyApLFxuXG5cdGVkaXRBdHRhY2htZW50OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR0aGlzLmNvbnRyb2xsZXIuY29udGVudC5tb2RlKCAnZWRpdC1pbWFnZScgKTtcblx0fSxcblxuXHQvKipcblx0ICogTm9vcCB0aGlzIGZyb20gcGFyZW50IGNsYXNzLCBkb2Vzbid0IGFwcGx5IGhlcmUuXG5cdCAqL1xuXHR0b2dnbGVTZWxlY3Rpb25IYW5kbGVyOiBmdW5jdGlvbigpIHt9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0RGV0YWlscy5wcm90b3R5cGUucmVuZGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdHdwLm1lZGlhLm1peGluLnJlbW92ZUFsbFBsYXllcnMoKTtcblx0XHR0aGlzLiQoICdhdWRpbywgdmlkZW8nICkuZWFjaCggZnVuY3Rpb24gKGksIGVsZW0pIHtcblx0XHRcdHZhciBlbCA9IHdwLm1lZGlhLnZpZXcuTWVkaWFEZXRhaWxzLnByZXBhcmVTcmMoIGVsZW0gKTtcblx0XHRcdG5ldyB3aW5kb3cuTWVkaWFFbGVtZW50UGxheWVyKCBlbCwgd3AubWVkaWEubWl4aW4ubWVqc1NldHRpbmdzICk7XG5cdFx0fSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBUd29Db2x1bW47XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuRGVsZXRlU2VsZWN0ZWRQZXJtYW5lbnRseUJ1dHRvblxuICpcbiAqIFdoZW4gTUVESUFfVFJBU0ggaXMgdHJ1ZSwgYSBidXR0b24gdGhhdCBoYW5kbGVzIGJ1bGsgRGVsZXRlIFBlcm1hbmVudGx5IGxvZ2ljXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5EZWxldGVTZWxlY3RlZEJ1dHRvblxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuQnV0dG9uXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBCdXR0b24gPSB3cC5tZWRpYS52aWV3LkJ1dHRvbixcblx0RGVsZXRlU2VsZWN0ZWQgPSB3cC5tZWRpYS52aWV3LkRlbGV0ZVNlbGVjdGVkQnV0dG9uLFxuXHREZWxldGVTZWxlY3RlZFBlcm1hbmVudGx5O1xuXG5EZWxldGVTZWxlY3RlZFBlcm1hbmVudGx5ID0gRGVsZXRlU2VsZWN0ZWQuZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0RGVsZXRlU2VsZWN0ZWQucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMuY29udHJvbGxlciwgJ3NlbGVjdDphY3RpdmF0ZScsIHRoaXMuc2VsZWN0QWN0aXZhdGUgKTtcblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLmNvbnRyb2xsZXIsICdzZWxlY3Q6ZGVhY3RpdmF0ZScsIHRoaXMuc2VsZWN0RGVhY3RpdmF0ZSApO1xuXHR9LFxuXG5cdGZpbHRlckNoYW5nZTogZnVuY3Rpb24oIG1vZGVsICkge1xuXHRcdHRoaXMuY2FuU2hvdyA9ICggJ3RyYXNoJyA9PT0gbW9kZWwuZ2V0KCAnc3RhdHVzJyApICk7XG5cdH0sXG5cblx0c2VsZWN0QWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudG9nZ2xlRGlzYWJsZWQoKTtcblx0XHR0aGlzLiRlbC50b2dnbGVDbGFzcyggJ2hpZGRlbicsICEgdGhpcy5jYW5TaG93ICk7XG5cdH0sXG5cblx0c2VsZWN0RGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50b2dnbGVEaXNhYmxlZCgpO1xuXHRcdHRoaXMuJGVsLmFkZENsYXNzKCAnaGlkZGVuJyApO1xuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0QnV0dG9uLnByb3RvdHlwZS5yZW5kZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdHRoaXMuc2VsZWN0QWN0aXZhdGUoKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGVsZXRlU2VsZWN0ZWRQZXJtYW5lbnRseTtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5EZWxldGVTZWxlY3RlZEJ1dHRvblxuICpcbiAqIEEgYnV0dG9uIHRoYXQgaGFuZGxlcyBidWxrIERlbGV0ZS9UcmFzaCBsb2dpY1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuQnV0dG9uXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBCdXR0b24gPSB3cC5tZWRpYS52aWV3LkJ1dHRvbixcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0RGVsZXRlU2VsZWN0ZWQ7XG5cbkRlbGV0ZVNlbGVjdGVkID0gQnV0dG9uLmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdEJ1dHRvbi5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZmlsdGVycyApIHtcblx0XHRcdHRoaXMubGlzdGVuVG8oIHRoaXMub3B0aW9ucy5maWx0ZXJzLm1vZGVsLCAnY2hhbmdlJywgdGhpcy5maWx0ZXJDaGFuZ2UgKTtcblx0XHR9XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5jb250cm9sbGVyLCAnc2VsZWN0aW9uOnRvZ2dsZScsIHRoaXMudG9nZ2xlRGlzYWJsZWQgKTtcblx0fSxcblxuXHRmaWx0ZXJDaGFuZ2U6IGZ1bmN0aW9uKCBtb2RlbCApIHtcblx0XHRpZiAoICd0cmFzaCcgPT09IG1vZGVsLmdldCggJ3N0YXR1cycgKSApIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KCAndGV4dCcsIGwxMG4udW50cmFzaFNlbGVjdGVkICk7XG5cdFx0fSBlbHNlIGlmICggd3AubWVkaWEudmlldy5zZXR0aW5ncy5tZWRpYVRyYXNoICkge1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoICd0ZXh0JywgbDEwbi50cmFzaFNlbGVjdGVkICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KCAndGV4dCcsIGwxMG4uZGVsZXRlU2VsZWN0ZWQgKTtcblx0XHR9XG5cdH0sXG5cblx0dG9nZ2xlRGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZWwuc2V0KCAnZGlzYWJsZWQnLCAhIHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCggJ3NlbGVjdGlvbicgKS5sZW5ndGggKTtcblx0fSxcblxuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdEJ1dHRvbi5wcm90b3R5cGUucmVuZGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRpZiAoIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdzZWxlY3QnICkgKSB7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyggJ2RlbGV0ZS1zZWxlY3RlZC1idXR0b24nICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKCAnZGVsZXRlLXNlbGVjdGVkLWJ1dHRvbiBoaWRkZW4nICk7XG5cdFx0fVxuXHRcdHRoaXMudG9nZ2xlRGlzYWJsZWQoKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGVsZXRlU2VsZWN0ZWQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuU2VsZWN0TW9kZVRvZ2dsZUJ1dHRvblxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuQnV0dG9uXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBCdXR0b24gPSB3cC5tZWRpYS52aWV3LkJ1dHRvbixcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0U2VsZWN0TW9kZVRvZ2dsZTtcblxuU2VsZWN0TW9kZVRvZ2dsZSA9IEJ1dHRvbi5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdHNpemUgOiAnJ1xuXHRcdH0gKTtcblxuXHRcdEJ1dHRvbi5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5jb250cm9sbGVyLCAnc2VsZWN0OmFjdGl2YXRlIHNlbGVjdDpkZWFjdGl2YXRlJywgdGhpcy50b2dnbGVCdWxrRWRpdEhhbmRsZXIgKTtcblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLmNvbnRyb2xsZXIsICdzZWxlY3Rpb246YWN0aW9uOmRvbmUnLCB0aGlzLmJhY2sgKTtcblx0fSxcblxuXHRiYWNrOiBmdW5jdGlvbiAoKSB7XG5cdFx0dGhpcy5jb250cm9sbGVyLmRlYWN0aXZhdGVNb2RlKCAnc2VsZWN0JyApLmFjdGl2YXRlTW9kZSggJ2VkaXQnICk7XG5cdH0sXG5cblx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdEJ1dHRvbi5wcm90b3R5cGUuY2xpY2suYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLmlzTW9kZUFjdGl2ZSggJ3NlbGVjdCcgKSApIHtcblx0XHRcdHRoaXMuYmFjaygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIuZGVhY3RpdmF0ZU1vZGUoICdlZGl0JyApLmFjdGl2YXRlTW9kZSggJ3NlbGVjdCcgKTtcblx0XHR9XG5cdH0sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRCdXR0b24ucHJvdG90eXBlLnJlbmRlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoICdzZWxlY3QtbW9kZS10b2dnbGUtYnV0dG9uJyApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUJ1bGtFZGl0SGFuZGxlcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHRvb2xiYXIgPSB0aGlzLmNvbnRyb2xsZXIuY29udGVudC5nZXQoKS50b29sYmFyLCBjaGlsZHJlbjtcblxuXHRcdGNoaWxkcmVuID0gdG9vbGJhci4kKCAnLm1lZGlhLXRvb2xiYXItc2Vjb25kYXJ5ID4gKiwgLm1lZGlhLXRvb2xiYXItcHJpbWFyeSA+IConICk7XG5cblx0XHQvLyBUT0RPOiB0aGUgRnJhbWUgc2hvdWxkIGJlIGRvaW5nIGFsbCBvZiB0aGlzLlxuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLmlzTW9kZUFjdGl2ZSggJ3NlbGVjdCcgKSApIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KCB7XG5cdFx0XHRcdHNpemU6ICdsYXJnZScsXG5cdFx0XHRcdHRleHQ6IGwxMG4uY2FuY2VsU2VsZWN0aW9uXG5cdFx0XHR9ICk7XG5cdFx0XHRjaGlsZHJlbi5ub3QoICcuc3Bpbm5lciwgLm1lZGlhLWJ1dHRvbicgKS5oaWRlKCk7XG5cdFx0XHR0aGlzLiRlbC5zaG93KCk7XG5cdFx0XHR0b29sYmFyLiQoICcuZGVsZXRlLXNlbGVjdGVkLWJ1dHRvbicgKS5yZW1vdmVDbGFzcyggJ2hpZGRlbicgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoIHtcblx0XHRcdFx0c2l6ZTogJycsXG5cdFx0XHRcdHRleHQ6IGwxMG4uYnVsa1NlbGVjdFxuXHRcdFx0fSApO1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLmNvbnRlbnQuZ2V0KCkuJGVsLnJlbW92ZUNsYXNzKCAnZml4ZWQnICk7XG5cdFx0XHR0b29sYmFyLiRlbC5jc3MoICd3aWR0aCcsICcnICk7XG5cdFx0XHR0b29sYmFyLiQoICcuZGVsZXRlLXNlbGVjdGVkLWJ1dHRvbicgKS5hZGRDbGFzcyggJ2hpZGRlbicgKTtcblx0XHRcdGNoaWxkcmVuLm5vdCggJy5tZWRpYS1idXR0b24nICkuc2hvdygpO1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLnN0YXRlKCkuZ2V0KCAnc2VsZWN0aW9uJyApLnJlc2V0KCk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3RNb2RlVG9nZ2xlO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkVkaXRJbWFnZS5EZXRhaWxzXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5FZGl0SW1hZ2VcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFZpZXcgPSB3cC5tZWRpYS5WaWV3LFxuXHRFZGl0SW1hZ2UgPSB3cC5tZWRpYS52aWV3LkVkaXRJbWFnZSxcblx0RGV0YWlscztcblxuRGV0YWlscyA9IEVkaXRJbWFnZS5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR0aGlzLmVkaXRvciA9IHdpbmRvdy5pbWFnZUVkaXQ7XG5cdFx0dGhpcy5mcmFtZSA9IG9wdGlvbnMuZnJhbWU7XG5cdFx0dGhpcy5jb250cm9sbGVyID0gb3B0aW9ucy5jb250cm9sbGVyO1xuXHRcdFZpZXcucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdGJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZnJhbWUuY29udGVudC5tb2RlKCAnZWRpdC1tZXRhZGF0YScgKTtcblx0fSxcblxuXHRzYXZlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLmZldGNoKCkuZG9uZSggXy5iaW5kKCBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuZnJhbWUuY29udGVudC5tb2RlKCAnZWRpdC1tZXRhZGF0YScgKTtcblx0XHR9LCB0aGlzICkgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGV0YWlscztcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLkVkaXRBdHRhY2htZW50c1xuICpcbiAqIEEgZnJhbWUgZm9yIGVkaXRpbmcgdGhlIGRldGFpbHMgb2YgYSBzcGVjaWZpYyBtZWRpYSBpdGVtLlxuICpcbiAqIE9wZW5zIGluIGEgbW9kYWwgYnkgZGVmYXVsdC5cbiAqXG4gKiBSZXF1aXJlcyBhbiBhdHRhY2htZW50IG1vZGVsIHRvIGJlIHBhc3NlZCBpbiB0aGUgb3B0aW9ucyBoYXNoIHVuZGVyIGBtb2RlbGAuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5GcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICogQG1peGVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lXG4gKi9cbnZhciBGcmFtZSA9IHdwLm1lZGlhLnZpZXcuRnJhbWUsXG5cdE1lZGlhRnJhbWUgPSB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUsXG5cblx0JCA9IGpRdWVyeSxcblx0RWRpdEF0dGFjaG1lbnRzO1xuXG5FZGl0QXR0YWNobWVudHMgPSBNZWRpYUZyYW1lLmV4dGVuZCh7XG5cblx0Y2xhc3NOYW1lOiAnZWRpdC1hdHRhY2htZW50LWZyYW1lJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSggJ2VkaXQtYXR0YWNobWVudC1mcmFtZScgKSxcblx0cmVnaW9uczogICBbICd0aXRsZScsICdjb250ZW50JyBdLFxuXG5cdGV2ZW50czoge1xuXHRcdCdjbGljayAubGVmdCc6ICAncHJldmlvdXNNZWRpYUl0ZW0nLFxuXHRcdCdjbGljayAucmlnaHQnOiAnbmV4dE1lZGlhSXRlbSdcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRGcmFtZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdG1vZGFsOiB0cnVlLFxuXHRcdFx0c3RhdGU6ICdlZGl0LWF0dGFjaG1lbnQnXG5cdFx0fSk7XG5cblx0XHR0aGlzLmNvbnRyb2xsZXIgPSB0aGlzLm9wdGlvbnMuY29udHJvbGxlcjtcblx0XHR0aGlzLmdyaWRSb3V0ZXIgPSB0aGlzLmNvbnRyb2xsZXIuZ3JpZFJvdXRlcjtcblx0XHR0aGlzLmxpYnJhcnkgPSB0aGlzLm9wdGlvbnMubGlicmFyeTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLm1vZGVsICkge1xuXHRcdFx0dGhpcy5tb2RlbCA9IHRoaXMub3B0aW9ucy5tb2RlbDtcblx0XHR9XG5cblx0XHR0aGlzLmJpbmRIYW5kbGVycygpO1xuXHRcdHRoaXMuY3JlYXRlU3RhdGVzKCk7XG5cdFx0dGhpcy5jcmVhdGVNb2RhbCgpO1xuXG5cdFx0dGhpcy50aXRsZS5tb2RlKCAnZGVmYXVsdCcgKTtcblx0XHR0aGlzLnRvZ2dsZU5hdigpO1xuXHR9LFxuXG5cdGJpbmRIYW5kbGVyczogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQmluZCBkZWZhdWx0IHRpdGxlIGNyZWF0aW9uLlxuXHRcdHRoaXMub24oICd0aXRsZTpjcmVhdGU6ZGVmYXVsdCcsIHRoaXMuY3JlYXRlVGl0bGUsIHRoaXMgKTtcblxuXHRcdC8vIENsb3NlIHRoZSBtb2RhbCBpZiB0aGUgYXR0YWNobWVudCBpcyBkZWxldGVkLlxuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6c3RhdHVzIGRlc3Ryb3knLCB0aGlzLmNsb3NlLCB0aGlzICk7XG5cblx0XHR0aGlzLm9uKCAnY29udGVudDpjcmVhdGU6ZWRpdC1tZXRhZGF0YScsIHRoaXMuZWRpdE1ldGFkYXRhTW9kZSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdjb250ZW50OmNyZWF0ZTplZGl0LWltYWdlJywgdGhpcy5lZGl0SW1hZ2VNb2RlLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2NvbnRlbnQ6cmVuZGVyOmVkaXQtaW1hZ2UnLCB0aGlzLmVkaXRJbWFnZU1vZGVSZW5kZXIsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnY2xvc2UnLCB0aGlzLmRldGFjaCApO1xuXHR9LFxuXG5cdGNyZWF0ZU1vZGFsOiBmdW5jdGlvbigpIHtcblx0XHQvLyBJbml0aWFsaXplIG1vZGFsIGNvbnRhaW5lciB2aWV3LlxuXHRcdGlmICggdGhpcy5vcHRpb25zLm1vZGFsICkge1xuXHRcdFx0dGhpcy5tb2RhbCA9IG5ldyB3cC5tZWRpYS52aWV3Lk1vZGFsKHtcblx0XHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdFx0dGl0bGU6ICAgICAgdGhpcy5vcHRpb25zLnRpdGxlXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5tb2RhbC5vbiggJ29wZW4nLCBfLmJpbmQoIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0JCggJ2JvZHknICkub24oICdrZXlkb3duLm1lZGlhLW1vZGFsJywgXy5iaW5kKCB0aGlzLmtleUV2ZW50LCB0aGlzICkgKTtcblx0XHRcdH0sIHRoaXMgKSApO1xuXG5cdFx0XHQvLyBDb21wbGV0ZWx5IGRlc3Ryb3kgdGhlIG1vZGFsIERPTSBlbGVtZW50IHdoZW4gY2xvc2luZyBpdC5cblx0XHRcdHRoaXMubW9kYWwub24oICdjbG9zZScsIF8uYmluZCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRoaXMubW9kYWwucmVtb3ZlKCk7XG5cdFx0XHRcdCQoICdib2R5JyApLm9mZiggJ2tleWRvd24ubWVkaWEtbW9kYWwnICk7IC8qIHJlbW92ZSB0aGUga2V5ZG93biBldmVudCAqL1xuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBmb2N1cyBpdGVtIGlmIHBvc3NpYmxlXG5cdFx0XHRcdCQoICdsaS5hdHRhY2htZW50W2RhdGEtaWQ9XCInICsgdGhpcy5tb2RlbC5nZXQoICdpZCcgKSArJ1wiXScgKS5mb2N1cygpO1xuXHRcdFx0XHR0aGlzLnJlc2V0Um91dGUoKTtcblx0XHRcdH0sIHRoaXMgKSApO1xuXG5cdFx0XHQvLyBTZXQgdGhpcyBmcmFtZSBhcyB0aGUgbW9kYWwncyBjb250ZW50LlxuXHRcdFx0dGhpcy5tb2RhbC5jb250ZW50KCB0aGlzICk7XG5cdFx0XHR0aGlzLm1vZGFsLm9wZW4oKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZCB0aGUgZGVmYXVsdCBzdGF0ZXMgdG8gdGhlIGZyYW1lLlxuXHQgKi9cblx0Y3JlYXRlU3RhdGVzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0YXRlcy5hZGQoW1xuXHRcdFx0bmV3IHdwLm1lZGlhLmNvbnRyb2xsZXIuRWRpdEF0dGFjaG1lbnRNZXRhZGF0YSggeyBtb2RlbDogdGhpcy5tb2RlbCB9IClcblx0XHRdKTtcblx0fSxcblxuXHQvKipcblx0ICogQ29udGVudCByZWdpb24gcmVuZGVyaW5nIGNhbGxiYWNrIGZvciB0aGUgYGVkaXQtbWV0YWRhdGFgIG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZW50UmVnaW9uIEJhc2ljIG9iamVjdCB3aXRoIGEgYHZpZXdgIHByb3BlcnR5LCB3aGljaFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2V0IHdpdGggdGhlIHByb3BlciByZWdpb24gdmlldy5cblx0ICovXG5cdGVkaXRNZXRhZGF0YU1vZGU6IGZ1bmN0aW9uKCBjb250ZW50UmVnaW9uICkge1xuXHRcdGNvbnRlbnRSZWdpb24udmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuRGV0YWlscy5Ud29Db2x1bW4oe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdG1vZGVsOiAgICAgIHRoaXMubW9kZWxcblx0XHR9KTtcblxuXHRcdC8qKlxuXHRcdCAqIEF0dGFjaCBhIHN1YnZpZXcgdG8gZGlzcGxheSBmaWVsZHMgYWRkZWQgdmlhIHRoZVxuXHRcdCAqIGBhdHRhY2htZW50X2ZpZWxkc190b19lZGl0YCBmaWx0ZXIuXG5cdFx0ICovXG5cdFx0Y29udGVudFJlZ2lvbi52aWV3LnZpZXdzLnNldCggJy5hdHRhY2htZW50LWNvbXBhdCcsIG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRDb21wYXQoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdG1vZGVsOiAgICAgIHRoaXMubW9kZWxcblx0XHR9KSApO1xuXG5cdFx0Ly8gVXBkYXRlIGJyb3dzZXIgdXJsIHdoZW4gbmF2aWdhdGluZyBtZWRpYSBkZXRhaWxzXG5cdFx0aWYgKCB0aGlzLm1vZGVsICkge1xuXHRcdFx0dGhpcy5ncmlkUm91dGVyLm5hdmlnYXRlKCB0aGlzLmdyaWRSb3V0ZXIuYmFzZVVybCggJz9pdGVtPScgKyB0aGlzLm1vZGVsLmlkICkgKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlbmRlciB0aGUgRWRpdEltYWdlIHZpZXcgaW50byB0aGUgZnJhbWUncyBjb250ZW50IHJlZ2lvbi5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IGNvbnRlbnRSZWdpb24gQmFzaWMgb2JqZWN0IHdpdGggYSBgdmlld2AgcHJvcGVydHksIHdoaWNoXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzZXQgd2l0aCB0aGUgcHJvcGVyIHJlZ2lvbiB2aWV3LlxuXHQgKi9cblx0ZWRpdEltYWdlTW9kZTogZnVuY3Rpb24oIGNvbnRlbnRSZWdpb24gKSB7XG5cdFx0dmFyIGVkaXRJbWFnZUNvbnRyb2xsZXIgPSBuZXcgd3AubWVkaWEuY29udHJvbGxlci5FZGl0SW1hZ2UoIHtcblx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLFxuXHRcdFx0ZnJhbWU6IHRoaXNcblx0XHR9ICk7XG5cdFx0Ly8gTm9vcCBzb21lIG1ldGhvZHMuXG5cdFx0ZWRpdEltYWdlQ29udHJvbGxlci5fdG9vbGJhciA9IGZ1bmN0aW9uKCkge307XG5cdFx0ZWRpdEltYWdlQ29udHJvbGxlci5fcm91dGVyID0gZnVuY3Rpb24oKSB7fTtcblx0XHRlZGl0SW1hZ2VDb250cm9sbGVyLl9tZW51ID0gZnVuY3Rpb24oKSB7fTtcblxuXHRcdGNvbnRlbnRSZWdpb24udmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LkVkaXRJbWFnZS5EZXRhaWxzKCB7XG5cdFx0XHRtb2RlbDogdGhpcy5tb2RlbCxcblx0XHRcdGZyYW1lOiB0aGlzLFxuXHRcdFx0Y29udHJvbGxlcjogZWRpdEltYWdlQ29udHJvbGxlclxuXHRcdH0gKTtcblx0fSxcblxuXHRlZGl0SW1hZ2VNb2RlUmVuZGVyOiBmdW5jdGlvbiggdmlldyApIHtcblx0XHR2aWV3Lm9uKCAncmVhZHknLCB2aWV3LmxvYWRFZGl0b3IgKTtcblx0fSxcblxuXHR0b2dnbGVOYXY6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJCgnLmxlZnQnKS50b2dnbGVDbGFzcyggJ2Rpc2FibGVkJywgISB0aGlzLmhhc1ByZXZpb3VzKCkgKTtcblx0XHR0aGlzLiQoJy5yaWdodCcpLnRvZ2dsZUNsYXNzKCAnZGlzYWJsZWQnLCAhIHRoaXMuaGFzTmV4dCgpICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcmVuZGVyIHRoZSB2aWV3LlxuXHQgKi9cblx0cmVyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIE9ubHkgcmVyZW5kZXIgdGhlIGBjb250ZW50YCByZWdpb24uXG5cdFx0aWYgKCB0aGlzLmNvbnRlbnQubW9kZSgpICE9PSAnZWRpdC1tZXRhZGF0YScgKSB7XG5cdFx0XHR0aGlzLmNvbnRlbnQubW9kZSggJ2VkaXQtbWV0YWRhdGEnICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY29udGVudC5yZW5kZXIoKTtcblx0XHR9XG5cblx0XHR0aGlzLnRvZ2dsZU5hdigpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDbGljayBoYW5kbGVyIHRvIHN3aXRjaCB0byB0aGUgcHJldmlvdXMgbWVkaWEgaXRlbS5cblx0ICovXG5cdHByZXZpb3VzTWVkaWFJdGVtOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICEgdGhpcy5oYXNQcmV2aW91cygpICkge1xuXHRcdFx0dGhpcy4kKCAnLmxlZnQnICkuYmx1cigpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLm1vZGVsID0gdGhpcy5saWJyYXJ5LmF0KCB0aGlzLmdldEN1cnJlbnRJbmRleCgpIC0gMSApO1xuXHRcdHRoaXMucmVyZW5kZXIoKTtcblx0XHR0aGlzLiQoICcubGVmdCcgKS5mb2N1cygpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDbGljayBoYW5kbGVyIHRvIHN3aXRjaCB0byB0aGUgbmV4dCBtZWRpYSBpdGVtLlxuXHQgKi9cblx0bmV4dE1lZGlhSXRlbTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhIHRoaXMuaGFzTmV4dCgpICkge1xuXHRcdFx0dGhpcy4kKCAnLnJpZ2h0JyApLmJsdXIoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5tb2RlbCA9IHRoaXMubGlicmFyeS5hdCggdGhpcy5nZXRDdXJyZW50SW5kZXgoKSArIDEgKTtcblx0XHR0aGlzLnJlcmVuZGVyKCk7XG5cdFx0dGhpcy4kKCAnLnJpZ2h0JyApLmZvY3VzKCk7XG5cdH0sXG5cblx0Z2V0Q3VycmVudEluZGV4OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5saWJyYXJ5LmluZGV4T2YoIHRoaXMubW9kZWwgKTtcblx0fSxcblxuXHRoYXNOZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gKCB0aGlzLmdldEN1cnJlbnRJbmRleCgpICsgMSApIDwgdGhpcy5saWJyYXJ5Lmxlbmd0aDtcblx0fSxcblxuXHRoYXNQcmV2aW91czogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICggdGhpcy5nZXRDdXJyZW50SW5kZXgoKSAtIDEgKSA+IC0xO1xuXHR9LFxuXHQvKipcblx0ICogUmVzcG9uZCB0byB0aGUga2V5Ym9hcmQgZXZlbnRzOiByaWdodCBhcnJvdywgbGVmdCBhcnJvdywgZXhjZXB0IHdoZW5cblx0ICogZm9jdXMgaXMgaW4gYSB0ZXh0YXJlYSBvciBpbnB1dCBmaWVsZC5cblx0ICovXG5cdGtleUV2ZW50OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0aWYgKCAoICdJTlBVVCcgPT09IGV2ZW50LnRhcmdldC5ub2RlTmFtZSB8fCAnVEVYVEFSRUEnID09PSBldmVudC50YXJnZXQubm9kZU5hbWUgKSAmJiAhICggZXZlbnQudGFyZ2V0LnJlYWRPbmx5IHx8IGV2ZW50LnRhcmdldC5kaXNhYmxlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFRoZSByaWdodCBhcnJvdyBrZXlcblx0XHRpZiAoIDM5ID09PSBldmVudC5rZXlDb2RlICkge1xuXHRcdFx0dGhpcy5uZXh0TWVkaWFJdGVtKCk7XG5cdFx0fVxuXHRcdC8vIFRoZSBsZWZ0IGFycm93IGtleVxuXHRcdGlmICggMzcgPT09IGV2ZW50LmtleUNvZGUgKSB7XG5cdFx0XHR0aGlzLnByZXZpb3VzTWVkaWFJdGVtKCk7XG5cdFx0fVxuXHR9LFxuXG5cdHJlc2V0Um91dGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZ3JpZFJvdXRlci5uYXZpZ2F0ZSggdGhpcy5ncmlkUm91dGVyLmJhc2VVcmwoICcnICkgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRWRpdEF0dGFjaG1lbnRzO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuTWFuYWdlXG4gKlxuICogQSBnZW5lcmljIG1hbmFnZW1lbnQgZnJhbWUgd29ya2Zsb3cuXG4gKlxuICogVXNlZCBpbiB0aGUgbWVkaWEgZ3JpZCB2aWV3LlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuRnJhbWVcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqIEBtaXhlcyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZVxuICovXG52YXIgTWVkaWFGcmFtZSA9IHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZSxcblx0TGlicmFyeSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeSxcblxuXHQkID0gQmFja2JvbmUuJCxcblx0TWFuYWdlO1xuXG5NYW5hZ2UgPSBNZWRpYUZyYW1lLmV4dGVuZCh7XG5cdC8qKlxuXHQgKiBAZ2xvYmFsIHdwLlVwbG9hZGVyXG5cdCAqL1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdHRpdGxlOiAgICAgJycsXG5cdFx0XHRtb2RhbDogICAgIGZhbHNlLFxuXHRcdFx0c2VsZWN0aW9uOiBbXSxcblx0XHRcdGxpYnJhcnk6ICAge30sIC8vIE9wdGlvbnMgaGFzaCBmb3IgdGhlIHF1ZXJ5IHRvIHRoZSBtZWRpYSBsaWJyYXJ5LlxuXHRcdFx0bXVsdGlwbGU6ICAnYWRkJyxcblx0XHRcdHN0YXRlOiAgICAgJ2xpYnJhcnknLFxuXHRcdFx0dXBsb2FkZXI6ICB0cnVlLFxuXHRcdFx0bW9kZTogICAgICBbICdncmlkJywgJ2VkaXQnIF1cblx0XHR9KTtcblxuXHRcdHRoaXMuJGJvZHkgPSAkKCBkb2N1bWVudC5ib2R5ICk7XG5cdFx0dGhpcy4kd2luZG93ID0gJCggd2luZG93ICk7XG5cdFx0dGhpcy4kYWRtaW5CYXIgPSAkKCAnI3dwYWRtaW5iYXInICk7XG5cdFx0dGhpcy4kd2luZG93Lm9uKCAnc2Nyb2xsIHJlc2l6ZScsIF8uZGVib3VuY2UoIF8uYmluZCggdGhpcy5maXhQb3NpdGlvbiwgdGhpcyApLCAxNSApICk7XG5cdFx0JCggZG9jdW1lbnQgKS5vbiggJ2NsaWNrJywgJy5wYWdlLXRpdGxlLWFjdGlvbicsIF8uYmluZCggdGhpcy5hZGROZXdDbGlja0hhbmRsZXIsIHRoaXMgKSApO1xuXG5cdFx0Ly8gRW5zdXJlIGNvcmUgYW5kIG1lZGlhIGdyaWQgdmlldyBVSSBpcyBlbmFibGVkLlxuXHRcdHRoaXMuJGVsLmFkZENsYXNzKCd3cC1jb3JlLXVpJyk7XG5cblx0XHQvLyBGb3JjZSB0aGUgdXBsb2FkZXIgb2ZmIGlmIHRoZSB1cGxvYWQgbGltaXQgaGFzIGJlZW4gZXhjZWVkZWQgb3Jcblx0XHQvLyBpZiB0aGUgYnJvd3NlciBpc24ndCBzdXBwb3J0ZWQuXG5cdFx0aWYgKCB3cC5VcGxvYWRlci5saW1pdEV4Y2VlZGVkIHx8ICEgd3AuVXBsb2FkZXIuYnJvd3Nlci5zdXBwb3J0ZWQgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMudXBsb2FkZXIgPSBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBJbml0aWFsaXplIGEgd2luZG93LXdpZGUgdXBsb2FkZXIuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMudXBsb2FkZXIgKSB7XG5cdFx0XHR0aGlzLnVwbG9hZGVyID0gbmV3IHdwLm1lZGlhLnZpZXcuVXBsb2FkZXJXaW5kb3coe1xuXHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0XHR1cGxvYWRlcjoge1xuXHRcdFx0XHRcdGRyb3B6b25lOiAgZG9jdW1lbnQuYm9keSxcblx0XHRcdFx0XHRjb250YWluZXI6IGRvY3VtZW50LmJvZHlcblx0XHRcdFx0fVxuXHRcdFx0fSkucmVuZGVyKCk7XG5cdFx0XHR0aGlzLnVwbG9hZGVyLnJlYWR5KCk7XG5cdFx0XHQkKCdib2R5JykuYXBwZW5kKCB0aGlzLnVwbG9hZGVyLmVsICk7XG5cblx0XHRcdHRoaXMub3B0aW9ucy51cGxvYWRlciA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuZ3JpZFJvdXRlciA9IG5ldyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuTWFuYWdlLlJvdXRlcigpO1xuXG5cdFx0Ly8gQ2FsbCAnaW5pdGlhbGl6ZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzcy5cblx0XHRNZWRpYUZyYW1lLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdC8vIEFwcGVuZCB0aGUgZnJhbWUgdmlldyBkaXJlY3RseSB0aGUgc3VwcGxpZWQgY29udGFpbmVyLlxuXHRcdHRoaXMuJGVsLmFwcGVuZFRvKCB0aGlzLm9wdGlvbnMuY29udGFpbmVyICk7XG5cblx0XHR0aGlzLmNyZWF0ZVN0YXRlcygpO1xuXHRcdHRoaXMuYmluZFJlZ2lvbk1vZGVIYW5kbGVycygpO1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0dGhpcy5iaW5kU2VhcmNoSGFuZGxlcigpO1xuXHR9LFxuXG5cdGJpbmRTZWFyY2hIYW5kbGVyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2VhcmNoID0gdGhpcy4kKCAnI21lZGlhLXNlYXJjaC1pbnB1dCcgKSxcblx0XHRcdGN1cnJlbnRTZWFyY2ggPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyLmRhdGEoICdzZWFyY2gnICksXG5cdFx0XHRzZWFyY2hWaWV3ID0gdGhpcy5icm93c2VyVmlldy50b29sYmFyLmdldCggJ3NlYXJjaCcgKS4kZWwsXG5cdFx0XHRsaXN0TW9kZSA9IHRoaXMuJCggJy52aWV3LWxpc3QnICksXG5cblx0XHRcdGlucHV0ICA9IF8uZGVib3VuY2UoIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdHZhciB2YWwgPSAkKCBlLmN1cnJlbnRUYXJnZXQgKS52YWwoKSxcblx0XHRcdFx0XHR1cmwgPSAnJztcblxuXHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHR1cmwgKz0gJz9zZWFyY2g9JyArIHZhbDtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdyaWRSb3V0ZXIubmF2aWdhdGUoIHRoaXMuZ3JpZFJvdXRlci5iYXNlVXJsKCB1cmwgKSApO1xuXHRcdFx0fSwgMTAwMCApO1xuXG5cdFx0Ly8gVXBkYXRlIHRoZSBVUkwgd2hlbiBlbnRlcmluZyBzZWFyY2ggc3RyaW5nIChhdCBtb3N0IG9uY2UgcGVyIHNlY29uZClcblx0XHRzZWFyY2gub24oICdpbnB1dCcsIF8uYmluZCggaW5wdXQsIHRoaXMgKSApO1xuXHRcdHNlYXJjaFZpZXcudmFsKCBjdXJyZW50U2VhcmNoICkudHJpZ2dlciggJ2lucHV0JyApO1xuXG5cdFx0dGhpcy5ncmlkUm91dGVyLm9uKCAncm91dGU6c2VhcmNoJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblx0XHRcdGlmICggaHJlZi5pbmRleE9mKCAnbW9kZT0nICkgPiAtMSApIHtcblx0XHRcdFx0aHJlZiA9IGhyZWYucmVwbGFjZSggL21vZGU9W14mXSsvZywgJ21vZGU9bGlzdCcgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhyZWYgKz0gaHJlZi5pbmRleE9mKCAnPycgKSA+IC0xID8gJyZtb2RlPWxpc3QnIDogJz9tb2RlPWxpc3QnO1xuXHRcdFx0fVxuXHRcdFx0aHJlZiA9IGhyZWYucmVwbGFjZSggJ3NlYXJjaD0nLCAncz0nICk7XG5cdFx0XHRsaXN0TW9kZS5wcm9wKCAnaHJlZicsIGhyZWYgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgZGVmYXVsdCBzdGF0ZXMgZm9yIHRoZSBmcmFtZS5cblx0ICovXG5cdGNyZWF0ZVN0YXRlczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGF0ZXMgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSBkZWZhdWx0IHN0YXRlcy5cblx0XHR0aGlzLnN0YXRlcy5hZGQoW1xuXHRcdFx0bmV3IExpYnJhcnkoe1xuXHRcdFx0XHRsaWJyYXJ5OiAgICAgICAgICAgIHdwLm1lZGlhLnF1ZXJ5KCBvcHRpb25zLmxpYnJhcnkgKSxcblx0XHRcdFx0bXVsdGlwbGU6ICAgICAgICAgICBvcHRpb25zLm11bHRpcGxlLFxuXHRcdFx0XHR0aXRsZTogICAgICAgICAgICAgIG9wdGlvbnMudGl0bGUsXG5cdFx0XHRcdGNvbnRlbnQ6ICAgICAgICAgICAgJ2Jyb3dzZScsXG5cdFx0XHRcdHRvb2xiYXI6ICAgICAgICAgICAgJ3NlbGVjdCcsXG5cdFx0XHRcdGNvbnRlbnRVc2VyU2V0dGluZzogZmFsc2UsXG5cdFx0XHRcdGZpbHRlcmFibGU6ICAgICAgICAgJ2FsbCcsXG5cdFx0XHRcdGF1dG9TZWxlY3Q6ICAgICAgICAgZmFsc2Vcblx0XHRcdH0pXG5cdFx0XSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEJpbmQgcmVnaW9uIG1vZGUgYWN0aXZhdGlvbiBldmVudHMgdG8gcHJvcGVyIGhhbmRsZXJzLlxuXHQgKi9cblx0YmluZFJlZ2lvbk1vZGVIYW5kbGVyczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5vbiggJ2NvbnRlbnQ6Y3JlYXRlOmJyb3dzZScsIHRoaXMuYnJvd3NlQ29udGVudCwgdGhpcyApO1xuXG5cdFx0Ly8gSGFuZGxlIGEgZnJhbWUtbGV2ZWwgZXZlbnQgZm9yIGVkaXRpbmcgYW4gYXR0YWNobWVudC5cblx0XHR0aGlzLm9uKCAnZWRpdDphdHRhY2htZW50JywgdGhpcy5vcGVuRWRpdEF0dGFjaG1lbnRNb2RhbCwgdGhpcyApO1xuXG5cdFx0dGhpcy5vbiggJ3NlbGVjdDphY3RpdmF0ZScsIHRoaXMuYmluZEtleWRvd24sIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnc2VsZWN0OmRlYWN0aXZhdGUnLCB0aGlzLnVuYmluZEtleWRvd24sIHRoaXMgKTtcblx0fSxcblxuXHRoYW5kbGVLZXlkb3duOiBmdW5jdGlvbiggZSApIHtcblx0XHRpZiAoIDI3ID09PSBlLndoaWNoICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0dGhpcy5kZWFjdGl2YXRlTW9kZSggJ3NlbGVjdCcgKS5hY3RpdmF0ZU1vZGUoICdlZGl0JyApO1xuXHRcdH1cblx0fSxcblxuXHRiaW5kS2V5ZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kYm9keS5vbiggJ2tleWRvd24uc2VsZWN0JywgXy5iaW5kKCB0aGlzLmhhbmRsZUtleWRvd24sIHRoaXMgKSApO1xuXHR9LFxuXG5cdHVuYmluZEtleWRvd246IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGJvZHkub2ZmKCAna2V5ZG93bi5zZWxlY3QnICk7XG5cdH0sXG5cblx0Zml4UG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciAkYnJvd3NlciwgJHRvb2xiYXI7XG5cdFx0aWYgKCAhIHRoaXMuaXNNb2RlQWN0aXZlKCAnc2VsZWN0JyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCRicm93c2VyID0gdGhpcy4kKCcuYXR0YWNobWVudHMtYnJvd3NlcicpO1xuXHRcdCR0b29sYmFyID0gJGJyb3dzZXIuZmluZCgnLm1lZGlhLXRvb2xiYXInKTtcblxuXHRcdC8vIE9mZnNldCBkb2Vzbid0IGFwcGVhciB0byB0YWtlIHRvcCBtYXJnaW4gaW50byBhY2NvdW50LCBoZW5jZSArMTZcblx0XHRpZiAoICggJGJyb3dzZXIub2Zmc2V0KCkudG9wICsgMTYgKSA8IHRoaXMuJHdpbmRvdy5zY3JvbGxUb3AoKSArIHRoaXMuJGFkbWluQmFyLmhlaWdodCgpICkge1xuXHRcdFx0JGJyb3dzZXIuYWRkQ2xhc3MoICdmaXhlZCcgKTtcblx0XHRcdCR0b29sYmFyLmNzcygnd2lkdGgnLCAkYnJvd3Nlci53aWR0aCgpICsgJ3B4Jyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRicm93c2VyLnJlbW92ZUNsYXNzKCAnZml4ZWQnICk7XG5cdFx0XHQkdG9vbGJhci5jc3MoJ3dpZHRoJywgJycpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2xpY2sgaGFuZGxlciBmb3IgdGhlIGBBZGQgTmV3YCBidXR0b24uXG5cdCAqL1xuXHRhZGROZXdDbGlja0hhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHRoaXMudHJpZ2dlciggJ3RvZ2dsZTp1cGxvYWQ6YXR0YWNobWVudCcgKTtcblx0fSxcblxuXHQvKipcblx0ICogT3BlbiB0aGUgRWRpdCBBdHRhY2htZW50IG1vZGFsLlxuXHQgKi9cblx0b3BlbkVkaXRBdHRhY2htZW50TW9kYWw6IGZ1bmN0aW9uKCBtb2RlbCApIHtcblx0XHQvLyBDcmVhdGUgYSBuZXcgRWRpdEF0dGFjaG1lbnQgZnJhbWUsIHBhc3NpbmcgYWxvbmcgdGhlIGxpYnJhcnkgYW5kIHRoZSBhdHRhY2htZW50IG1vZGVsLlxuXHRcdHdwLm1lZGlhKCB7XG5cdFx0XHRmcmFtZTogICAgICAgJ2VkaXQtYXR0YWNobWVudHMnLFxuXHRcdFx0Y29udHJvbGxlcjogIHRoaXMsXG5cdFx0XHRsaWJyYXJ5OiAgICAgdGhpcy5zdGF0ZSgpLmdldCgnbGlicmFyeScpLFxuXHRcdFx0bW9kZWw6ICAgICAgIG1vZGVsXG5cdFx0fSApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYW4gYXR0YWNobWVudHMgYnJvd3NlciB2aWV3IHdpdGhpbiB0aGUgY29udGVudCByZWdpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZW50UmVnaW9uIEJhc2ljIG9iamVjdCB3aXRoIGEgYHZpZXdgIHByb3BlcnR5LCB3aGljaFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2V0IHdpdGggdGhlIHByb3BlciByZWdpb24gdmlldy5cblx0ICogQHRoaXMgd3AubWVkaWEuY29udHJvbGxlci5SZWdpb25cblx0ICovXG5cdGJyb3dzZUNvbnRlbnQ6IGZ1bmN0aW9uKCBjb250ZW50UmVnaW9uICkge1xuXHRcdHZhciBzdGF0ZSA9IHRoaXMuc3RhdGUoKTtcblxuXHRcdC8vIEJyb3dzZSBvdXIgbGlicmFyeSBvZiBhdHRhY2htZW50cy5cblx0XHR0aGlzLmJyb3dzZXJWaWV3ID0gY29udGVudFJlZ2lvbi52aWV3ID0gbmV3IHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudHNCcm93c2VyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRjb2xsZWN0aW9uOiBzdGF0ZS5nZXQoJ2xpYnJhcnknKSxcblx0XHRcdHNlbGVjdGlvbjogIHN0YXRlLmdldCgnc2VsZWN0aW9uJyksXG5cdFx0XHRtb2RlbDogICAgICBzdGF0ZSxcblx0XHRcdHNvcnRhYmxlOiAgIHN0YXRlLmdldCgnc29ydGFibGUnKSxcblx0XHRcdHNlYXJjaDogICAgIHN0YXRlLmdldCgnc2VhcmNoYWJsZScpLFxuXHRcdFx0ZmlsdGVyczogICAgc3RhdGUuZ2V0KCdmaWx0ZXJhYmxlJyksXG5cdFx0XHRkYXRlOiAgICAgICBzdGF0ZS5nZXQoJ2RhdGUnKSxcblx0XHRcdGRpc3BsYXk6ICAgIHN0YXRlLmdldCgnZGlzcGxheVNldHRpbmdzJyksXG5cdFx0XHRkcmFnSW5mbzogICBzdGF0ZS5nZXQoJ2RyYWdJbmZvJyksXG5cdFx0XHRzaWRlYmFyOiAgICAnZXJyb3JzJyxcblxuXHRcdFx0c3VnZ2VzdGVkV2lkdGg6ICBzdGF0ZS5nZXQoJ3N1Z2dlc3RlZFdpZHRoJyksXG5cdFx0XHRzdWdnZXN0ZWRIZWlnaHQ6IHN0YXRlLmdldCgnc3VnZ2VzdGVkSGVpZ2h0JyksXG5cblx0XHRcdEF0dGFjaG1lbnRWaWV3OiBzdGF0ZS5nZXQoJ0F0dGFjaG1lbnRWaWV3JyksXG5cblx0XHRcdHNjcm9sbEVsZW1lbnQ6IGRvY3VtZW50XG5cdFx0fSk7XG5cdFx0dGhpcy5icm93c2VyVmlldy5vbiggJ3JlYWR5JywgXy5iaW5kKCB0aGlzLmJpbmREZWZlcnJlZCwgdGhpcyApICk7XG5cblx0XHR0aGlzLmVycm9ycyA9IHdwLlVwbG9hZGVyLmVycm9ycztcblx0XHR0aGlzLmVycm9ycy5vbiggJ2FkZCByZW1vdmUgcmVzZXQnLCB0aGlzLnNpZGViYXJWaXNpYmlsaXR5LCB0aGlzICk7XG5cdH0sXG5cblx0c2lkZWJhclZpc2liaWxpdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYnJvd3NlclZpZXcuJCggJy5tZWRpYS1zaWRlYmFyJyApLnRvZ2dsZSggISEgdGhpcy5lcnJvcnMubGVuZ3RoICk7XG5cdH0sXG5cblx0YmluZERlZmVycmVkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICEgdGhpcy5icm93c2VyVmlldy5kZmQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuYnJvd3NlclZpZXcuZGZkLmRvbmUoIF8uYmluZCggdGhpcy5zdGFydEhpc3RvcnksIHRoaXMgKSApO1xuXHR9LFxuXG5cdHN0YXJ0SGlzdG9yeTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gVmVyaWZ5IHB1c2hTdGF0ZSBzdXBwb3J0IGFuZCBhY3RpdmF0ZVxuXHRcdGlmICggd2luZG93Lmhpc3RvcnkgJiYgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlICkge1xuXHRcdFx0QmFja2JvbmUuaGlzdG9yeS5zdGFydCgge1xuXHRcdFx0XHRyb290OiB3aW5kb3cuX3dwTWVkaWFHcmlkU2V0dGluZ3MuYWRtaW5VcmwsXG5cdFx0XHRcdHB1c2hTdGF0ZTogdHJ1ZVxuXHRcdFx0fSApO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFuYWdlO1xuIl19 -
src/wp-includes/js/media-models.js
1503 1503 1504 1504 module.exports = Selection; 1505 1505 1506 },{}]},{},[1]); 1506 },{}]},{},[1]) 1507 //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9ncnVudC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvbW9kZWxzLm1hbmlmZXN0LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL21vZGVscy9hdHRhY2htZW50LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL21vZGVscy9hdHRhY2htZW50cy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9tb2RlbHMvcG9zdC1pbWFnZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9tb2RlbHMvcXVlcnkuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvbW9kZWxzL3NlbGVjdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDck9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbFRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJ2YXIgJCA9IGpRdWVyeSxcblx0QXR0YWNobWVudCwgQXR0YWNobWVudHMsIGwxMG4sIG1lZGlhO1xuXG53aW5kb3cud3AgPSB3aW5kb3cud3AgfHwge307XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBtZWRpYSBmcmFtZS5cbiAqXG4gKiBIYW5kbGVzIHRoZSBkZWZhdWx0IG1lZGlhIGV4cGVyaWVuY2UuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSBhdHRyaWJ1dGVzIFRoZSBwcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgbWFpbiBtZWRpYSBjb250cm9sbGVyLlxuICogQHJldHVybiB7d3AubWVkaWEudmlldy5NZWRpYUZyYW1lfSBBIG1lZGlhIHdvcmtmbG93LlxuICovXG5tZWRpYSA9IHdwLm1lZGlhID0gZnVuY3Rpb24oIGF0dHJpYnV0ZXMgKSB7XG5cdHZhciBNZWRpYUZyYW1lID0gbWVkaWEudmlldy5NZWRpYUZyYW1lLFxuXHRcdGZyYW1lO1xuXG5cdGlmICggISBNZWRpYUZyYW1lICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGF0dHJpYnV0ZXMgPSBfLmRlZmF1bHRzKCBhdHRyaWJ1dGVzIHx8IHt9LCB7XG5cdFx0ZnJhbWU6ICdzZWxlY3QnXG5cdH0pO1xuXG5cdGlmICggJ3NlbGVjdCcgPT09IGF0dHJpYnV0ZXMuZnJhbWUgJiYgTWVkaWFGcmFtZS5TZWxlY3QgKSB7XG5cdFx0ZnJhbWUgPSBuZXcgTWVkaWFGcmFtZS5TZWxlY3QoIGF0dHJpYnV0ZXMgKTtcblx0fSBlbHNlIGlmICggJ3Bvc3QnID09PSBhdHRyaWJ1dGVzLmZyYW1lICYmIE1lZGlhRnJhbWUuUG9zdCApIHtcblx0XHRmcmFtZSA9IG5ldyBNZWRpYUZyYW1lLlBvc3QoIGF0dHJpYnV0ZXMgKTtcblx0fSBlbHNlIGlmICggJ21hbmFnZScgPT09IGF0dHJpYnV0ZXMuZnJhbWUgJiYgTWVkaWFGcmFtZS5NYW5hZ2UgKSB7XG5cdFx0ZnJhbWUgPSBuZXcgTWVkaWFGcmFtZS5NYW5hZ2UoIGF0dHJpYnV0ZXMgKTtcblx0fSBlbHNlIGlmICggJ2ltYWdlJyA9PT0gYXR0cmlidXRlcy5mcmFtZSAmJiBNZWRpYUZyYW1lLkltYWdlRGV0YWlscyApIHtcblx0XHRmcmFtZSA9IG5ldyBNZWRpYUZyYW1lLkltYWdlRGV0YWlscyggYXR0cmlidXRlcyApO1xuXHR9IGVsc2UgaWYgKCAnYXVkaW8nID09PSBhdHRyaWJ1dGVzLmZyYW1lICYmIE1lZGlhRnJhbWUuQXVkaW9EZXRhaWxzICkge1xuXHRcdGZyYW1lID0gbmV3IE1lZGlhRnJhbWUuQXVkaW9EZXRhaWxzKCBhdHRyaWJ1dGVzICk7XG5cdH0gZWxzZSBpZiAoICd2aWRlbycgPT09IGF0dHJpYnV0ZXMuZnJhbWUgJiYgTWVkaWFGcmFtZS5WaWRlb0RldGFpbHMgKSB7XG5cdFx0ZnJhbWUgPSBuZXcgTWVkaWFGcmFtZS5WaWRlb0RldGFpbHMoIGF0dHJpYnV0ZXMgKTtcblx0fSBlbHNlIGlmICggJ2VkaXQtYXR0YWNobWVudHMnID09PSBhdHRyaWJ1dGVzLmZyYW1lICYmIE1lZGlhRnJhbWUuRWRpdEF0dGFjaG1lbnRzICkge1xuXHRcdGZyYW1lID0gbmV3IE1lZGlhRnJhbWUuRWRpdEF0dGFjaG1lbnRzKCBhdHRyaWJ1dGVzICk7XG5cdH1cblxuXHRkZWxldGUgYXR0cmlidXRlcy5mcmFtZTtcblxuXHRtZWRpYS5mcmFtZSA9IGZyYW1lO1xuXG5cdHJldHVybiBmcmFtZTtcbn07XG5cbl8uZXh0ZW5kKCBtZWRpYSwgeyBtb2RlbDoge30sIHZpZXc6IHt9LCBjb250cm9sbGVyOiB7fSwgZnJhbWVzOiB7fSB9KTtcblxuLy8gTGluayBhbnkgbG9jYWxpemVkIHN0cmluZ3MuXG5sMTBuID0gbWVkaWEubW9kZWwubDEwbiA9IHdpbmRvdy5fd3BNZWRpYU1vZGVsc0wxMG4gfHwge307XG5cbi8vIExpbmsgYW55IHNldHRpbmdzLlxubWVkaWEubW9kZWwuc2V0dGluZ3MgPSBsMTBuLnNldHRpbmdzIHx8IHt9O1xuZGVsZXRlIGwxMG4uc2V0dGluZ3M7XG5cbkF0dGFjaG1lbnQgPSBtZWRpYS5tb2RlbC5BdHRhY2htZW50ID0gcmVxdWlyZSggJy4vbW9kZWxzL2F0dGFjaG1lbnQuanMnICk7XG5BdHRhY2htZW50cyA9IG1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzID0gcmVxdWlyZSggJy4vbW9kZWxzL2F0dGFjaG1lbnRzLmpzJyApO1xuXG5tZWRpYS5tb2RlbC5RdWVyeSA9IHJlcXVpcmUoICcuL21vZGVscy9xdWVyeS5qcycgKTtcbm1lZGlhLm1vZGVsLlBvc3RJbWFnZSA9IHJlcXVpcmUoICcuL21vZGVscy9wb3N0LWltYWdlLmpzJyApO1xubWVkaWEubW9kZWwuU2VsZWN0aW9uID0gcmVxdWlyZSggJy4vbW9kZWxzL3NlbGVjdGlvbi5qcycgKTtcblxuLyoqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFVUSUxJVElFU1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBBIGJhc2ljIGVxdWFsaXR5IGNvbXBhcmF0b3IgZm9yIEJhY2tib25lIG1vZGVscy5cbiAqXG4gKiBVc2VkIHRvIG9yZGVyIG1vZGVscyB3aXRoaW4gYSBjb2xsZWN0aW9uIC0gQHNlZSB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50cy5jb21wYXJhdG9yKCkuXG4gKlxuICogQHBhcmFtICB7bWl4ZWR9ICBhICBUaGUgcHJpbWFyeSBwYXJhbWV0ZXIgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSAge21peGVkfSAgYiAgVGhlIHByaW1hcnkgcGFyYW1ldGVyIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGFjIFRoZSBmYWxsYmFjayBwYXJhbWV0ZXIgdG8gY29tcGFyZSwgYSdzIGNpZC5cbiAqIEBwYXJhbSAge3N0cmluZ30gYmMgVGhlIGZhbGxiYWNrIHBhcmFtZXRlciB0byBjb21wYXJlLCBiJ3MgY2lkLlxuICogQHJldHVybiB7bnVtYmVyfSAgICAtMTogYSBzaG91bGQgY29tZSBiZWZvcmUgYi5cbiAqICAgICAgICAgICAgICAgICAgICAgIDA6IGEgYW5kIGIgYXJlIG9mIHRoZSBzYW1lIHJhbmsuXG4gKiAgICAgICAgICAgICAgICAgICAgICAxOiBiIHNob3VsZCBjb21lIGJlZm9yZSBhLlxuICovXG5tZWRpYS5jb21wYXJlID0gZnVuY3Rpb24oIGEsIGIsIGFjLCBiYyApIHtcblx0aWYgKCBfLmlzRXF1YWwoIGEsIGIgKSApIHtcblx0XHRyZXR1cm4gYWMgPT09IGJjID8gMCA6IChhYyA+IGJjID8gLTEgOiAxKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gYSA+IGIgPyAtMSA6IDE7XG5cdH1cbn07XG5cbl8uZXh0ZW5kKCBtZWRpYSwge1xuXHQvKipcblx0ICogbWVkaWEudGVtcGxhdGUoIGlkIClcblx0ICpcblx0ICogRmV0Y2ggYSBKYXZhU2NyaXB0IHRlbXBsYXRlIGZvciBhbiBpZCwgYW5kIHJldHVybiBhIHRlbXBsYXRpbmcgZnVuY3Rpb24gZm9yIGl0LlxuXHQgKlxuXHQgKiBTZWUgd3AudGVtcGxhdGUoKSBpbiBgd3AtaW5jbHVkZXMvanMvd3AtdXRpbC5qc2AuXG5cdCAqXG5cdCAqIEBib3Jyb3dzIHdwLnRlbXBsYXRlIGFzIHRlbXBsYXRlXG5cdCAqL1xuXHR0ZW1wbGF0ZTogd3AudGVtcGxhdGUsXG5cblx0LyoqXG5cdCAqIG1lZGlhLnBvc3QoIFthY3Rpb25dLCBbZGF0YV0gKVxuXHQgKlxuXHQgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBXb3JkUHJlc3MuXG5cdCAqIFNlZSB3cC5hamF4LnBvc3QoKSBpbiBgd3AtaW5jbHVkZXMvanMvd3AtdXRpbC5qc2AuXG5cdCAqXG5cdCAqIEBib3Jyb3dzIHdwLmFqYXgucG9zdCBhcyBwb3N0XG5cdCAqL1xuXHRwb3N0OiB3cC5hamF4LnBvc3QsXG5cblx0LyoqXG5cdCAqIG1lZGlhLmFqYXgoIFthY3Rpb25dLCBbb3B0aW9uc10gKVxuXHQgKlxuXHQgKiBTZW5kcyBhbiBYSFIgcmVxdWVzdCB0byBXb3JkUHJlc3MuXG5cdCAqIFNlZSB3cC5hamF4LnNlbmQoKSBpbiBgd3AtaW5jbHVkZXMvanMvd3AtdXRpbC5qc2AuXG5cdCAqXG5cdCAqIEBib3Jyb3dzIHdwLmFqYXguc2VuZCBhcyBhamF4XG5cdCAqL1xuXHRhamF4OiB3cC5hamF4LnNlbmQsXG5cblx0LyoqXG5cdCAqIFNjYWxlcyBhIHNldCBvZiBkaW1lbnNpb25zIHRvIGZpdCB3aXRoaW4gYm91bmRpbmcgZGltZW5zaW9ucy5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IGRpbWVuc2lvbnNcblx0ICogQHJldHVybnMge09iamVjdH1cblx0ICovXG5cdGZpdDogZnVuY3Rpb24oIGRpbWVuc2lvbnMgKSB7XG5cdFx0dmFyIHdpZHRoICAgICA9IGRpbWVuc2lvbnMud2lkdGgsXG5cdFx0XHRoZWlnaHQgICAgPSBkaW1lbnNpb25zLmhlaWdodCxcblx0XHRcdG1heFdpZHRoICA9IGRpbWVuc2lvbnMubWF4V2lkdGgsXG5cdFx0XHRtYXhIZWlnaHQgPSBkaW1lbnNpb25zLm1heEhlaWdodCxcblx0XHRcdGNvbnN0cmFpbnQ7XG5cblx0XHQvLyBDb21wYXJlIHJhdGlvcyBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIHRvIGRldGVybWluZSB3aGljaFxuXHRcdC8vIG1heCB0byBjb25zdHJhaW4gYnkuIElmIGEgbWF4IHZhbHVlIGRvZXNuJ3QgZXhpc3QsIHRoZW4gdGhlXG5cdFx0Ly8gb3Bwb3NpdGUgc2lkZSBpcyB0aGUgY29uc3RyYWludC5cblx0XHRpZiAoICEgXy5pc1VuZGVmaW5lZCggbWF4V2lkdGggKSAmJiAhIF8uaXNVbmRlZmluZWQoIG1heEhlaWdodCApICkge1xuXHRcdFx0Y29uc3RyYWludCA9ICggd2lkdGggLyBoZWlnaHQgPiBtYXhXaWR0aCAvIG1heEhlaWdodCApID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXHRcdH0gZWxzZSBpZiAoIF8uaXNVbmRlZmluZWQoIG1heEhlaWdodCApICkge1xuXHRcdFx0Y29uc3RyYWludCA9ICd3aWR0aCc7XG5cdFx0fSBlbHNlIGlmICggIF8uaXNVbmRlZmluZWQoIG1heFdpZHRoICkgJiYgaGVpZ2h0ID4gbWF4SGVpZ2h0ICkge1xuXHRcdFx0Y29uc3RyYWludCA9ICdoZWlnaHQnO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RyYWluZWQgc2lkZSBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4LFxuXHRcdC8vIHRoZW4gc2NhbGUgdGhlIHZhbHVlcy4gT3RoZXJ3aXNlIHJldHVybiB0aGUgb3JpZ2luYWxzOyB0aGV5IGZpdC5cblx0XHRpZiAoICd3aWR0aCcgPT09IGNvbnN0cmFpbnQgJiYgd2lkdGggPiBtYXhXaWR0aCApIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHdpZHRoIDogbWF4V2lkdGgsXG5cdFx0XHRcdGhlaWdodDogTWF0aC5yb3VuZCggbWF4V2lkdGggKiBoZWlnaHQgLyB3aWR0aCApXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoICdoZWlnaHQnID09PSBjb25zdHJhaW50ICYmIGhlaWdodCA+IG1heEhlaWdodCApIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHdpZHRoIDogTWF0aC5yb3VuZCggbWF4SGVpZ2h0ICogd2lkdGggLyBoZWlnaHQgKSxcblx0XHRcdFx0aGVpZ2h0OiBtYXhIZWlnaHRcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHdpZHRoIDogd2lkdGgsXG5cdFx0XHRcdGhlaWdodDogaGVpZ2h0XG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFRydW5jYXRlcyBhIHN0cmluZyBieSBpbmplY3RpbmcgYW4gZWxsaXBzaXMgaW50byB0aGUgbWlkZGxlLlxuXHQgKiBVc2VmdWwgZm9yIGZpbGVuYW1lcy5cblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW2xlbmd0aD0zMF1cblx0ICogQHBhcmFtIHtTdHJpbmd9IFtyZXBsYWNlbWVudD0maGVsbGlwO11cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHN0cmluZywgdW5sZXNzIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gc3RyaW5nLmxlbmd0aC5cblx0ICovXG5cdHRydW5jYXRlOiBmdW5jdGlvbiggc3RyaW5nLCBsZW5ndGgsIHJlcGxhY2VtZW50ICkge1xuXHRcdGxlbmd0aCA9IGxlbmd0aCB8fCAzMDtcblx0XHRyZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50IHx8ICcmaGVsbGlwOyc7XG5cblx0XHRpZiAoIHN0cmluZy5sZW5ndGggPD0gbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHN0cmluZztcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyaW5nLnN1YnN0ciggMCwgbGVuZ3RoIC8gMiApICsgcmVwbGFjZW1lbnQgKyBzdHJpbmcuc3Vic3RyKCAtMSAqIGxlbmd0aCAvIDIgKTtcblx0fVxufSk7XG5cbi8qKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBNT0RFTFNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIHdwLm1lZGlhLmF0dGFjaG1lbnRcbiAqXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgQSBzdHJpbmcgdXNlZCB0byBpZGVudGlmeSBhIG1vZGVsLlxuICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9XG4gKi9cbm1lZGlhLmF0dGFjaG1lbnQgPSBmdW5jdGlvbiggaWQgKSB7XG5cdHJldHVybiBBdHRhY2htZW50LmdldCggaWQgKTtcbn07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRhY2htZW50cyB0aGF0IGhhdmUgYmVlbiBmZXRjaGVkIGZyb20gdGhlIHNlcnZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c31cbiAqL1xuQXR0YWNobWVudHMuYWxsID0gbmV3IEF0dGFjaG1lbnRzKCk7XG5cbi8qKlxuICogd3AubWVkaWEucXVlcnlcbiAqXG4gKiBTaG9ydGhhbmQgZm9yIGNyZWF0aW5nIGEgbmV3IEF0dGFjaG1lbnRzIFF1ZXJ5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG4gKiBAcmV0dXJucyB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9XG4gKi9cbm1lZGlhLnF1ZXJ5ID0gZnVuY3Rpb24oIHByb3BzICkge1xuXHRyZXR1cm4gbmV3IEF0dGFjaG1lbnRzKCBudWxsLCB7XG5cdFx0cHJvcHM6IF8uZXh0ZW5kKCBfLmRlZmF1bHRzKCBwcm9wcyB8fCB7fSwgeyBvcmRlcmJ5OiAnZGF0ZScgfSApLCB7IHF1ZXJ5OiB0cnVlIH0gKVxuXHR9KTtcbn07XG5cbi8vIENsZWFuIHVwLiBQcmV2ZW50cyBtb2JpbGUgYnJvd3NlcnMgY2FjaGluZ1xuJCh3aW5kb3cpLm9uKCd1bmxvYWQnLCBmdW5jdGlvbigpe1xuXHR3aW5kb3cud3AgPSBudWxsO1xufSk7XG4iLCIvKipcbiAqIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICovXG52YXIgJCA9IEJhY2tib25lLiQsXG5cdEF0dGFjaG1lbnQ7XG5cbkF0dGFjaG1lbnQgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHQvKipcblx0ICogVHJpZ2dlcmVkIHdoZW4gYXR0YWNobWVudCBkZXRhaWxzIGNoYW5nZVxuXHQgKiBPdmVycmlkZXMgQmFja2JvbmUuTW9kZWwuc3luY1xuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH0gbW9kZWxcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICovXG5cdHN5bmM6IGZ1bmN0aW9uKCBtZXRob2QsIG1vZGVsLCBvcHRpb25zICkge1xuXHRcdC8vIElmIHRoZSBhdHRhY2htZW50IGRvZXMgbm90IHlldCBoYXZlIGFuIGBpZGAsIHJldHVybiBhbiBpbnN0YW50bHlcblx0XHQvLyByZWplY3RlZCBwcm9taXNlLiBPdGhlcndpc2UsIGFsbCBvZiBvdXIgcmVxdWVzdHMgd2lsbCBmYWlsLlxuXHRcdGlmICggXy5pc1VuZGVmaW5lZCggdGhpcy5pZCApICkge1xuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3RXaXRoKCB0aGlzICkucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIE92ZXJsb2FkIHRoZSBgcmVhZGAgcmVxdWVzdCBzbyBBdHRhY2htZW50LmZldGNoKCkgZnVuY3Rpb25zIGNvcnJlY3RseS5cblx0XHRpZiAoICdyZWFkJyA9PT0gbWV0aG9kICkge1xuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0XHRvcHRpb25zLmNvbnRleHQgPSB0aGlzO1xuXHRcdFx0b3B0aW9ucy5kYXRhID0gXy5leHRlbmQoIG9wdGlvbnMuZGF0YSB8fCB7fSwge1xuXHRcdFx0XHRhY3Rpb246ICdnZXQtYXR0YWNobWVudCcsXG5cdFx0XHRcdGlkOiB0aGlzLmlkXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB3cC5tZWRpYS5hamF4KCBvcHRpb25zICk7XG5cblx0XHQvLyBPdmVybG9hZCB0aGUgYHVwZGF0ZWAgcmVxdWVzdCBzbyBwcm9wZXJ0aWVzIGNhbiBiZSBzYXZlZC5cblx0XHR9IGVsc2UgaWYgKCAndXBkYXRlJyA9PT0gbWV0aG9kICkge1xuXHRcdFx0Ly8gSWYgd2UgZG8gbm90IGhhdmUgdGhlIG5lY2Vzc2FyeSBub25jZSwgZmFpbCBpbW1lZGl0YXRlbHkuXG5cdFx0XHRpZiAoICEgdGhpcy5nZXQoJ25vbmNlcycpIHx8ICEgdGhpcy5nZXQoJ25vbmNlcycpLnVwZGF0ZSApIHtcblx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3RXaXRoKCB0aGlzICkucHJvbWlzZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0XHRcdG9wdGlvbnMuY29udGV4dCA9IHRoaXM7XG5cblx0XHRcdC8vIFNldCB0aGUgYWN0aW9uIGFuZCBJRC5cblx0XHRcdG9wdGlvbnMuZGF0YSA9IF8uZXh0ZW5kKCBvcHRpb25zLmRhdGEgfHwge30sIHtcblx0XHRcdFx0YWN0aW9uOiAgJ3NhdmUtYXR0YWNobWVudCcsXG5cdFx0XHRcdGlkOiAgICAgIHRoaXMuaWQsXG5cdFx0XHRcdG5vbmNlOiAgIHRoaXMuZ2V0KCdub25jZXMnKS51cGRhdGUsXG5cdFx0XHRcdHBvc3RfaWQ6IHdwLm1lZGlhLm1vZGVsLnNldHRpbmdzLnBvc3QuaWRcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBSZWNvcmQgdGhlIHZhbHVlcyBvZiB0aGUgY2hhbmdlZCBhdHRyaWJ1dGVzLlxuXHRcdFx0aWYgKCBtb2RlbC5oYXNDaGFuZ2VkKCkgKSB7XG5cdFx0XHRcdG9wdGlvbnMuZGF0YS5jaGFuZ2VzID0ge307XG5cblx0XHRcdFx0Xy5lYWNoKCBtb2RlbC5jaGFuZ2VkLCBmdW5jdGlvbiggdmFsdWUsIGtleSApIHtcblx0XHRcdFx0XHRvcHRpb25zLmRhdGEuY2hhbmdlc1sga2V5IF0gPSB0aGlzLmdldCgga2V5ICk7XG5cdFx0XHRcdH0sIHRoaXMgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHdwLm1lZGlhLmFqYXgoIG9wdGlvbnMgKTtcblxuXHRcdC8vIE92ZXJsb2FkIHRoZSBgZGVsZXRlYCByZXF1ZXN0IHNvIGF0dGFjaG1lbnRzIGNhbiBiZSByZW1vdmVkLlxuXHRcdC8vIFRoaXMgd2lsbCBwZXJtYW5lbnRseSBkZWxldGUgYW4gYXR0YWNobWVudC5cblx0XHR9IGVsc2UgaWYgKCAnZGVsZXRlJyA9PT0gbWV0aG9kICkge1xuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHRcdGlmICggISBvcHRpb25zLndhaXQgKSB7XG5cdFx0XHRcdHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0b3B0aW9ucy5jb250ZXh0ID0gdGhpcztcblx0XHRcdG9wdGlvbnMuZGF0YSA9IF8uZXh0ZW5kKCBvcHRpb25zLmRhdGEgfHwge30sIHtcblx0XHRcdFx0YWN0aW9uOiAgICdkZWxldGUtcG9zdCcsXG5cdFx0XHRcdGlkOiAgICAgICB0aGlzLmlkLFxuXHRcdFx0XHRfd3Bub25jZTogdGhpcy5nZXQoJ25vbmNlcycpWydkZWxldGUnXVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiB3cC5tZWRpYS5hamF4KCBvcHRpb25zICkuZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcblx0XHRcdH0pLmZhaWwoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBPdGhlcndpc2UsIGZhbGwgYmFjayB0byBgQmFja2JvbmUuc3luYygpYC5cblx0XHR9IGVsc2Uge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsIGBzeW5jYCBkaXJlY3RseSBvbiBCYWNrYm9uZS5Nb2RlbFxuXHRcdFx0ICovXG5cdFx0XHRyZXR1cm4gQmFja2JvbmUuTW9kZWwucHJvdG90eXBlLnN5bmMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIENvbnZlcnQgZGF0ZSBzdHJpbmdzIGludG8gRGF0ZSBvYmplY3RzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gcmVzcCBUaGUgcmF3IHJlc3BvbnNlIG9iamVjdCwgdHlwaWNhbGx5IHJldHVybmVkIGJ5IGZldGNoKClcblx0ICogQHJldHVybnMge09iamVjdH0gVGhlIG1vZGlmaWVkIHJlc3BvbnNlIG9iamVjdCwgd2hpY2ggaXMgdGhlIGF0dHJpYnV0ZXMgaGFzaFxuXHQgKiAgICB0byBiZSBzZXQgb24gdGhlIG1vZGVsLlxuXHQgKi9cblx0cGFyc2U6IGZ1bmN0aW9uKCByZXNwICkge1xuXHRcdGlmICggISByZXNwICkge1xuXHRcdFx0cmV0dXJuIHJlc3A7XG5cdFx0fVxuXG5cdFx0cmVzcC5kYXRlID0gbmV3IERhdGUoIHJlc3AuZGF0ZSApO1xuXHRcdHJlc3AubW9kaWZpZWQgPSBuZXcgRGF0ZSggcmVzcC5tb2RpZmllZCApO1xuXHRcdHJldHVybiByZXNwO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgVGhlIHByb3BlcnRpZXMgdG8gYmUgc2F2ZWQuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFN5bmMgb3B0aW9ucy4gZS5nLiBwYXRjaCwgd2FpdCwgc3VjY2VzcywgZXJyb3IuXG5cdCAqXG5cdCAqIEB0aGlzIEJhY2tib25lLk1vZGVsXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHQgKi9cblx0c2F2ZUNvbXBhdDogZnVuY3Rpb24oIGRhdGEsIG9wdGlvbnMgKSB7XG5cdFx0dmFyIG1vZGVsID0gdGhpcztcblxuXHRcdC8vIElmIHdlIGRvIG5vdCBoYXZlIHRoZSBuZWNlc3Nhcnkgbm9uY2UsIGZhaWwgaW1tZWRpdGF0ZWx5LlxuXHRcdGlmICggISB0aGlzLmdldCgnbm9uY2VzJykgfHwgISB0aGlzLmdldCgnbm9uY2VzJykudXBkYXRlICkge1xuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3RXaXRoKCB0aGlzICkucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB3cC5tZWRpYS5wb3N0KCAnc2F2ZS1hdHRhY2htZW50LWNvbXBhdCcsIF8uZGVmYXVsdHMoe1xuXHRcdFx0aWQ6ICAgICAgdGhpcy5pZCxcblx0XHRcdG5vbmNlOiAgIHRoaXMuZ2V0KCdub25jZXMnKS51cGRhdGUsXG5cdFx0XHRwb3N0X2lkOiB3cC5tZWRpYS5tb2RlbC5zZXR0aW5ncy5wb3N0LmlkXG5cdFx0fSwgZGF0YSApICkuZG9uZSggZnVuY3Rpb24oIHJlc3AsIHN0YXR1cywgeGhyICkge1xuXHRcdFx0bW9kZWwuc2V0KCBtb2RlbC5wYXJzZSggcmVzcCwgeGhyICksIG9wdGlvbnMgKTtcblx0XHR9KTtcblx0fVxufSwge1xuXHQvKipcblx0ICogQ3JlYXRlIGEgbmV3IG1vZGVsIG9uIHRoZSBzdGF0aWMgJ2FsbCcgYXR0YWNobWVudHMgY29sbGVjdGlvbiBhbmQgcmV0dXJuIGl0LlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBhdHRyc1xuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH1cblx0ICovXG5cdGNyZWF0ZTogZnVuY3Rpb24oIGF0dHJzICkge1xuXHRcdHZhciBBdHRhY2htZW50cyA9IHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzO1xuXHRcdHJldHVybiBBdHRhY2htZW50cy5hbGwucHVzaCggYXR0cnMgKTtcblx0fSxcblx0LyoqXG5cdCAqIENyZWF0ZSBhIG5ldyBtb2RlbCBvbiB0aGUgc3RhdGljICdhbGwnIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gYW5kIHJldHVybiBpdC5cblx0ICpcblx0ICogSWYgdGhpcyBmdW5jdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhlIGlkLFxuXHQgKiBpdCByZXR1cm5zIHRoZSBzcGVjaWZpZWQgYXR0YWNobWVudC5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgQSBzdHJpbmcgdXNlZCB0byBpZGVudGlmeSBhIG1vZGVsLlxuXHQgKiBAcGFyYW0ge0JhY2tib25lLk1vZGVsfHVuZGVmaW5lZH0gYXR0YWNobWVudFxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH1cblx0ICovXG5cdGdldDogXy5tZW1vaXplKCBmdW5jdGlvbiggaWQsIGF0dGFjaG1lbnQgKSB7XG5cdFx0dmFyIEF0dGFjaG1lbnRzID0gd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHM7XG5cdFx0cmV0dXJuIEF0dGFjaG1lbnRzLmFsbC5wdXNoKCBhdHRhY2htZW50IHx8IHsgaWQ6IGlkIH0gKTtcblx0fSlcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF0dGFjaG1lbnQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzXG4gKlxuICogQSBjb2xsZWN0aW9uIG9mIGF0dGFjaG1lbnRzLlxuICpcbiAqIFRoaXMgY29sbGVjdGlvbiBoYXMgbm8gcGVyc2lzdGVuY2Ugd2l0aCB0aGUgc2VydmVyIHdpdGhvdXQgc3VwcGx5aW5nXG4gKiAnb3B0aW9ucy5wcm9wcy5xdWVyeSA9IHRydWUnLCB3aGljaCB3aWxsIG1pcnJvciB0aGUgY29sbGVjdGlvblxuICogdG8gYW4gQXR0YWNobWVudHMgUXVlcnkgY29sbGVjdGlvbiAtIEBzZWUgd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHMubWlycm9yKCkuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuQ29sbGVjdGlvblxuICpcbiAqIEBwYXJhbSB7YXJyYXl9ICBbbW9kZWxzXSAgICAgICAgICAgICAgICBNb2RlbHMgdG8gaW5pdGlhbGl6ZSB3aXRoIHRoZSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAgICAgICAgICAgICAgIE9wdGlvbnMgaGFzaCBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucHJvcHNdICAgICAgICAgT3B0aW9ucyBoYXNoIGZvciB0aGUgaW5pdGlhbCBxdWVyeSBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnByb3BzLm9yZGVyXSAgIEluaXRpYWwgb3JkZXIgKEFTQyBvciBERVNDKSBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucHJvcHMub3JkZXJieV0gSW5pdGlhbCBhdHRyaWJ1dGUga2V5IHRvIG9yZGVyIHRoZSBjb2xsZWN0aW9uIGJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnByb3BzLnF1ZXJ5XSAgIFdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gaXMgbGlua2VkIHRvIGFuIGF0dGFjaG1lbnRzIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9ic2VydmVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZmlsdGVyc11cbiAqXG4gKi9cbnZhciBBdHRhY2htZW50cyA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0LyoqXG5cdCAqIEB0eXBlIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fVxuXHQgKi9cblx0bW9kZWw6IHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnQsXG5cdC8qKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBbbW9kZWxzPVtdXSBBcnJheSBvZiBtb2RlbHMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgY29sbGVjdGlvbi5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG1vZGVscywgb3B0aW9ucyApIHtcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHRoaXMucHJvcHMgICA9IG5ldyBCYWNrYm9uZS5Nb2RlbCgpO1xuXHRcdHRoaXMuZmlsdGVycyA9IG9wdGlvbnMuZmlsdGVycyB8fCB7fTtcblxuXHRcdC8vIEJpbmQgZGVmYXVsdCBgY2hhbmdlYCBldmVudHMgdG8gdGhlIGBwcm9wc2AgbW9kZWwuXG5cdFx0dGhpcy5wcm9wcy5vbiggJ2NoYW5nZScsIHRoaXMuX2NoYW5nZUZpbHRlcmVkUHJvcHMsIHRoaXMgKTtcblxuXHRcdHRoaXMucHJvcHMub24oICdjaGFuZ2U6b3JkZXInLCAgIHRoaXMuX2NoYW5nZU9yZGVyLCAgIHRoaXMgKTtcblx0XHR0aGlzLnByb3BzLm9uKCAnY2hhbmdlOm9yZGVyYnknLCB0aGlzLl9jaGFuZ2VPcmRlcmJ5LCB0aGlzICk7XG5cdFx0dGhpcy5wcm9wcy5vbiggJ2NoYW5nZTpxdWVyeScsICAgdGhpcy5fY2hhbmdlUXVlcnksICAgdGhpcyApO1xuXG5cdFx0dGhpcy5wcm9wcy5zZXQoIF8uZGVmYXVsdHMoIG9wdGlvbnMucHJvcHMgfHwge30gKSApO1xuXG5cdFx0aWYgKCBvcHRpb25zLm9ic2VydmUgKSB7XG5cdFx0XHR0aGlzLm9ic2VydmUoIG9wdGlvbnMub2JzZXJ2ZSApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFNvcnQgdGhlIGNvbGxlY3Rpb24gd2hlbiB0aGUgb3JkZXIgYXR0cmlidXRlIGNoYW5nZXMuXG5cdCAqXG5cdCAqIEBhY2Nlc3MgcHJpdmF0ZVxuXHQgKi9cblx0X2NoYW5nZU9yZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIHRoaXMuY29tcGFyYXRvciApIHtcblx0XHRcdHRoaXMuc29ydCgpO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFNldCB0aGUgZGVmYXVsdCBjb21wYXJhdG9yIG9ubHkgd2hlbiB0aGUgYG9yZGVyYnlgIHByb3BlcnR5IGlzIHNldC5cblx0ICpcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuTW9kZWx9IG1vZGVsXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvcmRlcmJ5XG5cdCAqL1xuXHRfY2hhbmdlT3JkZXJieTogZnVuY3Rpb24oIG1vZGVsLCBvcmRlcmJ5ICkge1xuXHRcdC8vIElmIGEgZGlmZmVyZW50IGNvbXBhcmF0b3IgaXMgZGVmaW5lZCwgYmFpbC5cblx0XHRpZiAoIHRoaXMuY29tcGFyYXRvciAmJiB0aGlzLmNvbXBhcmF0b3IgIT09IEF0dGFjaG1lbnRzLmNvbXBhcmF0b3IgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBvcmRlcmJ5ICYmICdwb3N0X19pbicgIT09IG9yZGVyYnkgKSB7XG5cdFx0XHR0aGlzLmNvbXBhcmF0b3IgPSBBdHRhY2htZW50cy5jb21wYXJhdG9yO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgdGhpcy5jb21wYXJhdG9yO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIElmIHRoZSBgcXVlcnlgIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLCBxdWVyeSB0aGUgc2VydmVyIHVzaW5nXG5cdCAqIHRoZSBgcHJvcHNgIHZhbHVlcywgYW5kIHN5bmMgdGhlIHJlc3VsdHMgdG8gdGhpcyBjb2xsZWN0aW9uLlxuXHQgKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICpcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gbW9kZWxcblx0ICogQHBhcmFtIHtCb29sZWFufSBxdWVyeVxuXHQgKi9cblx0X2NoYW5nZVF1ZXJ5OiBmdW5jdGlvbiggbW9kZWwsIHF1ZXJ5ICkge1xuXHRcdGlmICggcXVlcnkgKSB7XG5cdFx0XHR0aGlzLnByb3BzLm9uKCAnY2hhbmdlJywgdGhpcy5fcmVxdWVyeSwgdGhpcyApO1xuXHRcdFx0dGhpcy5fcmVxdWVyeSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnByb3BzLm9mZiggJ2NoYW5nZScsIHRoaXMuX3JlcXVlcnksIHRoaXMgKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICpcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gbW9kZWxcblx0ICovXG5cdF9jaGFuZ2VGaWx0ZXJlZFByb3BzOiBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0Ly8gSWYgdGhpcyBpcyBhIHF1ZXJ5LCB1cGRhdGluZyB0aGUgY29sbGVjdGlvbiB3aWxsIGJlIGhhbmRsZWQgYnlcblx0XHQvLyBgdGhpcy5fcmVxdWVyeSgpYC5cblx0XHRpZiAoIHRoaXMucHJvcHMuZ2V0KCdxdWVyeScpICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjaGFuZ2VkID0gXy5jaGFpbiggbW9kZWwuY2hhbmdlZCApLm1hcCggZnVuY3Rpb24oIHQsIHByb3AgKSB7XG5cdFx0XHR2YXIgZmlsdGVyID0gQXR0YWNobWVudHMuZmlsdGVyc1sgcHJvcCBdLFxuXHRcdFx0XHR0ZXJtID0gbW9kZWwuZ2V0KCBwcm9wICk7XG5cblx0XHRcdGlmICggISBmaWx0ZXIgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXJtICYmICEgdGhpcy5maWx0ZXJzWyBwcm9wIF0gKSB7XG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgcHJvcCBdID0gZmlsdGVyO1xuXHRcdFx0fSBlbHNlIGlmICggISB0ZXJtICYmIHRoaXMuZmlsdGVyc1sgcHJvcCBdID09PSBmaWx0ZXIgKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmZpbHRlcnNbIHByb3AgXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVjb3JkIHRoZSBjaGFuZ2UuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LCB0aGlzICkuYW55KCkudmFsdWUoKTtcblxuXHRcdGlmICggISBjaGFuZ2VkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIG5vIGBBdHRhY2htZW50c2AgbW9kZWwgaXMgcHJvdmlkZWQgdG8gc291cmNlIHRoZSBzZWFyY2hlc1xuXHRcdC8vIGZyb20sIHRoZW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIHNvdXJjZSBmcm9tIHRoZSBleGlzdGluZ1xuXHRcdC8vIG1vZGVscy5cblx0XHRpZiAoICEgdGhpcy5fc291cmNlICkge1xuXHRcdFx0dGhpcy5fc291cmNlID0gbmV3IEF0dGFjaG1lbnRzKCB0aGlzLm1vZGVscyApO1xuXHRcdH1cblxuXHRcdHRoaXMucmVzZXQoIHRoaXMuX3NvdXJjZS5maWx0ZXIoIHRoaXMudmFsaWRhdG9yLCB0aGlzICkgKTtcblx0fSxcblxuXHR2YWxpZGF0ZURlc3Ryb3llZDogZmFsc2UsXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciBhbiBhdHRhY2htZW50IGlzIHZhbGlkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dGFjaG1lbnRcblx0ICogQHJldHVybnMge0Jvb2xlYW59XG5cdCAqL1xuXHR2YWxpZGF0b3I6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdGlmICggISB0aGlzLnZhbGlkYXRlRGVzdHJveWVkICYmIGF0dGFjaG1lbnQuZGVzdHJveWVkICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gXy5hbGwoIHRoaXMuZmlsdGVycywgZnVuY3Rpb24oIGZpbHRlciApIHtcblx0XHRcdHJldHVybiAhISBmaWx0ZXIuY2FsbCggdGhpcywgYXR0YWNobWVudCApO1xuXHRcdH0sIHRoaXMgKTtcblx0fSxcblx0LyoqXG5cdCAqIEFkZCBvciByZW1vdmUgYW4gYXR0YWNobWVudCB0byB0aGUgY29sbGVjdGlvbiBkZXBlbmRpbmcgb24gaXRzIHZhbGlkaXR5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dGFjaG1lbnRcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0ICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKCBhdHRhY2htZW50LCBvcHRpb25zICkge1xuXHRcdHZhciB2YWxpZCA9IHRoaXMudmFsaWRhdG9yKCBhdHRhY2htZW50ICksXG5cdFx0XHRoYXNBdHRhY2htZW50ID0gISEgdGhpcy5nZXQoIGF0dGFjaG1lbnQuY2lkICk7XG5cblx0XHRpZiAoICEgdmFsaWQgJiYgaGFzQXR0YWNobWVudCApIHtcblx0XHRcdHRoaXMucmVtb3ZlKCBhdHRhY2htZW50LCBvcHRpb25zICk7XG5cdFx0fSBlbHNlIGlmICggdmFsaWQgJiYgISBoYXNBdHRhY2htZW50ICkge1xuXHRcdFx0dGhpcy5hZGQoIGF0dGFjaG1lbnQsIG9wdGlvbnMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHQvKipcblx0ICogQWRkIG9yIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSBhbm90aGVyIGNvbGxlY3Rpb24gZGVwZW5kaW5nIG9uIGVhY2ggb25lJ3MgdmFsaWRpdHkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IGF0dGFjaG1lbnRzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucz17fV1cblx0ICpcblx0ICogQGZpcmVzIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzI3Jlc2V0XG5cdCAqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHZhbGlkYXRlQWxsOiBmdW5jdGlvbiggYXR0YWNobWVudHMsIG9wdGlvbnMgKSB7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHRfLmVhY2goIGF0dGFjaG1lbnRzLm1vZGVscywgZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHR0aGlzLnZhbGlkYXRlKCBhdHRhY2htZW50LCB7IHNpbGVudDogdHJ1ZSB9KTtcblx0XHR9LCB0aGlzICk7XG5cblx0XHRpZiAoICEgb3B0aW9ucy5zaWxlbnQgKSB7XG5cdFx0XHR0aGlzLnRyaWdnZXIoICdyZXNldCcsIHRoaXMsIG9wdGlvbnMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBTdGFydCBvYnNlcnZpbmcgYW5vdGhlciBhdHRhY2htZW50cyBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHNcblx0ICogYW5kIHJlcGxpY2F0ZSB0aGVtIG9uIHRoaXMgY29sbGVjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gVGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gdG8gb2JzZXJ2ZS5cblx0ICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZy5cblx0ICovXG5cdG9ic2VydmU6IGZ1bmN0aW9uKCBhdHRhY2htZW50cyApIHtcblx0XHR0aGlzLm9ic2VydmVycyA9IHRoaXMub2JzZXJ2ZXJzIHx8IFtdO1xuXHRcdHRoaXMub2JzZXJ2ZXJzLnB1c2goIGF0dGFjaG1lbnRzICk7XG5cblx0XHRhdHRhY2htZW50cy5vbiggJ2FkZCBjaGFuZ2UgcmVtb3ZlJywgdGhpcy5fdmFsaWRhdGVIYW5kbGVyLCB0aGlzICk7XG5cdFx0YXR0YWNobWVudHMub24oICdyZXNldCcsIHRoaXMuX3ZhbGlkYXRlQWxsSGFuZGxlciwgdGhpcyApO1xuXHRcdHRoaXMudmFsaWRhdGVBbGwoIGF0dGFjaG1lbnRzICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBTdG9wIHJlcGxpY2F0aW5nIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cyBmcm9tIGFub3RoZXIgYXR0YWNobWVudHMgY29sbGVjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gVGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmcuXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHVub2JzZXJ2ZTogZnVuY3Rpb24oIGF0dGFjaG1lbnRzICkge1xuXHRcdGlmICggYXR0YWNobWVudHMgKSB7XG5cdFx0XHRhdHRhY2htZW50cy5vZmYoIG51bGwsIG51bGwsIHRoaXMgKTtcblx0XHRcdHRoaXMub2JzZXJ2ZXJzID0gXy53aXRob3V0KCB0aGlzLm9ic2VydmVycywgYXR0YWNobWVudHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRfLmVhY2goIHRoaXMub2JzZXJ2ZXJzLCBmdW5jdGlvbiggYXR0YWNobWVudHMgKSB7XG5cdFx0XHRcdGF0dGFjaG1lbnRzLm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHRcdFx0fSwgdGhpcyApO1xuXHRcdFx0ZGVsZXRlIHRoaXMub2JzZXJ2ZXJzO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IGF0dGFjaG1lbnRcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gYXR0YWNobWVudHNcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0ICpcblx0ICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0X3ZhbGlkYXRlSGFuZGxlcjogZnVuY3Rpb24oIGF0dGFjaG1lbnQsIGF0dGFjaG1lbnRzLCBvcHRpb25zICkge1xuXHRcdC8vIElmIHdlJ3JlIG5vdCBtaXJyb3JpbmcgdGhpcyBgYXR0YWNobWVudHNgIGNvbGxlY3Rpb24sXG5cdFx0Ly8gb25seSByZXRhaW4gdGhlIGBzaWxlbnRgIG9wdGlvbi5cblx0XHRvcHRpb25zID0gYXR0YWNobWVudHMgPT09IHRoaXMubWlycm9yaW5nID8gb3B0aW9ucyA6IHtcblx0XHRcdHNpbGVudDogb3B0aW9ucyAmJiBvcHRpb25zLnNpbGVudFxuXHRcdH07XG5cblx0XHRyZXR1cm4gdGhpcy52YWxpZGF0ZSggYXR0YWNobWVudCwgb3B0aW9ucyApO1xuXHR9LFxuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IGF0dGFjaG1lbnRzXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdF92YWxpZGF0ZUFsbEhhbmRsZXI6IGZ1bmN0aW9uKCBhdHRhY2htZW50cywgb3B0aW9ucyApIHtcblx0XHRyZXR1cm4gdGhpcy52YWxpZGF0ZUFsbCggYXR0YWNobWVudHMsIG9wdGlvbnMgKTtcblx0fSxcblx0LyoqXG5cdCAqIFN0YXJ0IG1pcnJvcmluZyBhbm90aGVyIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24sIGNsZWFyaW5nIG91dCBhbnkgbW9kZWxzIGFscmVhZHlcblx0ICogaW4gdGhlIGNvbGxlY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IFRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uIHRvIG1pcnJvci5cblx0ICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0bWlycm9yOiBmdW5jdGlvbiggYXR0YWNobWVudHMgKSB7XG5cdFx0aWYgKCB0aGlzLm1pcnJvcmluZyAmJiB0aGlzLm1pcnJvcmluZyA9PT0gYXR0YWNobWVudHMgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHR0aGlzLnVubWlycm9yKCk7XG5cdFx0dGhpcy5taXJyb3JpbmcgPSBhdHRhY2htZW50cztcblxuXHRcdC8vIENsZWFyIHRoZSBjb2xsZWN0aW9uIHNpbGVudGx5LiBBIGByZXNldGAgZXZlbnQgd2lsbCBiZSBmaXJlZFxuXHRcdC8vIHdoZW4gYG9ic2VydmUoKWAgY2FsbHMgYHZhbGlkYXRlQWxsKClgLlxuXHRcdHRoaXMucmVzZXQoIFtdLCB7IHNpbGVudDogdHJ1ZSB9ICk7XG5cdFx0dGhpcy5vYnNlcnZlKCBhdHRhY2htZW50cyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBTdG9wIG1pcnJvcmluZyBhbm90aGVyIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24uXG5cdCAqL1xuXHR1bm1pcnJvcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhIHRoaXMubWlycm9yaW5nICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMudW5vYnNlcnZlKCB0aGlzLm1pcnJvcmluZyApO1xuXHRcdGRlbGV0ZSB0aGlzLm1pcnJvcmluZztcblx0fSxcblx0LyoqXG5cdCAqIFJldHJpdmUgbW9yZSBhdHRhY2htZW50cyBmcm9tIHRoZSBzZXJ2ZXIgZm9yIHRoZSBjb2xsZWN0aW9uLlxuXHQgKlxuXHQgKiBPbmx5IHdvcmtzIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG1pcnJvcmluZyBhIFF1ZXJ5IEF0dGFjaG1lbnRzIGNvbGxlY3Rpb24sXG5cdCAqIGFuZCBmb3J3YXJkcyB0byBpdHMgYG1vcmVgIG1ldGhvZC4gVGhpcyBjb2xsZWN0aW9uIGNsYXNzIGRvZXNuJ3QgaGF2ZVxuXHQgKiBzZXJ2ZXIgcGVyc2lzdGVuY2UgYnkgaXRzZWxmLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICovXG5cdG1vcmU6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0bWlycm9yaW5nID0gdGhpcy5taXJyb3JpbmcsXG5cdFx0XHRhdHRhY2htZW50cyA9IHRoaXM7XG5cblx0XHRpZiAoICEgbWlycm9yaW5nIHx8ICEgbWlycm9yaW5nLm1vcmUgKSB7XG5cdFx0XHRyZXR1cm4gZGVmZXJyZWQucmVzb2x2ZVdpdGgoIHRoaXMgKS5wcm9taXNlKCk7XG5cdFx0fVxuXHRcdC8vIElmIHdlJ3JlIG1pcnJvcmluZyBhbm90aGVyIGNvbGxlY3Rpb24sIGZvcndhcmQgYG1vcmVgIHRvXG5cdFx0Ly8gdGhlIG1pcnJvcmVkIGNvbGxlY3Rpb24uIEFjY291bnQgZm9yIGEgcmFjZSBjb25kaXRpb24gYnlcblx0XHQvLyBjaGVja2luZyBpZiB3ZSdyZSBzdGlsbCBtaXJyb3JpbmcgdGhhdCBjb2xsZWN0aW9uIHdoZW5cblx0XHQvLyB0aGUgcmVxdWVzdCByZXNvbHZlcy5cblx0XHRtaXJyb3JpbmcubW9yZSggb3B0aW9ucyApLmRvbmUoIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCB0aGlzID09PSBhdHRhY2htZW50cy5taXJyb3JpbmcgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9LFxuXHQvKipcblx0ICogV2hldGhlciB0aGVyZSBhcmUgbW9yZSBhdHRhY2htZW50cyB0aGF0IGhhdmVuJ3QgYmVlbiBzeW5jJ2QgZnJvbSB0aGUgc2VydmVyXG5cdCAqIHRoYXQgbWF0Y2ggdGhlIGNvbGxlY3Rpb24ncyBxdWVyeS5cblx0ICpcblx0ICogT25seSB3b3JrcyBpZiB0aGUgY29sbGVjdGlvbiBpcyBtaXJyb3JpbmcgYSBRdWVyeSBBdHRhY2htZW50cyBjb2xsZWN0aW9uLFxuXHQgKiBhbmQgZm9yd2FyZHMgdG8gaXRzIGBoYXNNb3JlYCBtZXRob2QuIFRoaXMgY29sbGVjdGlvbiBjbGFzcyBkb2Vzbid0IGhhdmVcblx0ICogc2VydmVyIHBlcnNpc3RlbmNlIGJ5IGl0c2VsZi5cblx0ICpcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRoYXNNb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5taXJyb3JpbmcgPyB0aGlzLm1pcnJvcmluZy5oYXNNb3JlKCkgOiBmYWxzZTtcblx0fSxcblx0LyoqXG5cdCAqIEEgY3VzdG9tIEFKQVgtcmVzcG9uc2UgcGFyc2VyLlxuXHQgKlxuXHQgKiBTZWUgdHJhYyB0aWNrZXQgIzI0NzUzXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSByZXNwIFRoZSByYXcgcmVzcG9uc2UgT2JqZWN0L0FycmF5LlxuXHQgKiBAcGFyYW0ge09iamVjdH0geGhyXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIGFycmF5IG9mIG1vZGVsIGF0dHJpYnV0ZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb25cblx0ICovXG5cdHBhcnNlOiBmdW5jdGlvbiggcmVzcCwgeGhyICkge1xuXHRcdGlmICggISBfLmlzQXJyYXkoIHJlc3AgKSApIHtcblx0XHRcdHJlc3AgPSBbcmVzcF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIF8ubWFwKCByZXNwLCBmdW5jdGlvbiggYXR0cnMgKSB7XG5cdFx0XHR2YXIgaWQsIGF0dGFjaG1lbnQsIG5ld0F0dHJpYnV0ZXM7XG5cblx0XHRcdGlmICggYXR0cnMgaW5zdGFuY2VvZiBCYWNrYm9uZS5Nb2RlbCApIHtcblx0XHRcdFx0aWQgPSBhdHRycy5nZXQoICdpZCcgKTtcblx0XHRcdFx0YXR0cnMgPSBhdHRycy5hdHRyaWJ1dGVzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWQgPSBhdHRycy5pZDtcblx0XHRcdH1cblxuXHRcdFx0YXR0YWNobWVudCA9IHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnQuZ2V0KCBpZCApO1xuXHRcdFx0bmV3QXR0cmlidXRlcyA9IGF0dGFjaG1lbnQucGFyc2UoIGF0dHJzLCB4aHIgKTtcblxuXHRcdFx0aWYgKCAhIF8uaXNFcXVhbCggYXR0YWNobWVudC5hdHRyaWJ1dGVzLCBuZXdBdHRyaWJ1dGVzICkgKSB7XG5cdFx0XHRcdGF0dGFjaG1lbnQuc2V0KCBuZXdBdHRyaWJ1dGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhdHRhY2htZW50O1xuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogSWYgdGhlIGNvbGxlY3Rpb24gaXMgYSBxdWVyeSwgY3JlYXRlIGFuZCBtaXJyb3IgYW4gQXR0YWNobWVudHMgUXVlcnkgY29sbGVjdGlvbi5cblx0ICpcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqL1xuXHRfcmVxdWVyeTogZnVuY3Rpb24oIHJlZnJlc2ggKSB7XG5cdFx0dmFyIHByb3BzO1xuXHRcdGlmICggdGhpcy5wcm9wcy5nZXQoJ3F1ZXJ5JykgKSB7XG5cdFx0XHRwcm9wcyA9IHRoaXMucHJvcHMudG9KU09OKCk7XG5cdFx0XHRwcm9wcy5jYWNoZSA9ICggdHJ1ZSAhPT0gcmVmcmVzaCApO1xuXHRcdFx0dGhpcy5taXJyb3IoIHdwLm1lZGlhLm1vZGVsLlF1ZXJ5LmdldCggcHJvcHMgKSApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIElmIHRoaXMgY29sbGVjdGlvbiBpcyBzb3J0ZWQgYnkgYG1lbnVPcmRlcmAsIHJlY2FsY3VsYXRlcyBhbmQgc2F2ZXNcblx0ICogdGhlIG1lbnUgb3JkZXIgdG8gdGhlIGRhdGFiYXNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7dW5kZWZpbmVkfFByb21pc2V9XG5cdCAqL1xuXHRzYXZlTWVudU9yZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICdtZW51T3JkZXInICE9PSB0aGlzLnByb3BzLmdldCgnb3JkZXJieScpICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbW92ZXMgYW55IHVwbG9hZGluZyBhdHRhY2htZW50cywgdXBkYXRlcyBlYWNoIGF0dGFjaG1lbnQnc1xuXHRcdC8vIG1lbnUgb3JkZXIsIGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGFuIHsgaWQ6IG1lbnVPcmRlciB9XG5cdFx0Ly8gbWFwcGluZyB0byBwYXNzIHRvIHRoZSByZXF1ZXN0LlxuXHRcdHZhciBhdHRhY2htZW50cyA9IHRoaXMuY2hhaW4oKS5maWx0ZXIoIGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdFx0cmV0dXJuICEgXy5pc1VuZGVmaW5lZCggYXR0YWNobWVudC5pZCApO1xuXHRcdH0pLm1hcCggZnVuY3Rpb24oIGF0dGFjaG1lbnQsIGluZGV4ICkge1xuXHRcdFx0Ly8gSW5kaWNlcyBzdGFydCBhdCAxLlxuXHRcdFx0aW5kZXggPSBpbmRleCArIDE7XG5cdFx0XHRhdHRhY2htZW50LnNldCggJ21lbnVPcmRlcicsIGluZGV4ICk7XG5cdFx0XHRyZXR1cm4gWyBhdHRhY2htZW50LmlkLCBpbmRleCBdO1xuXHRcdH0pLm9iamVjdCgpLnZhbHVlKCk7XG5cblx0XHRpZiAoIF8uaXNFbXB0eSggYXR0YWNobWVudHMgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXR1cm4gd3AubWVkaWEucG9zdCggJ3NhdmUtYXR0YWNobWVudC1vcmRlcicsIHtcblx0XHRcdG5vbmNlOiAgICAgICB3cC5tZWRpYS5tb2RlbC5zZXR0aW5ncy5wb3N0Lm5vbmNlLFxuXHRcdFx0cG9zdF9pZDogICAgIHdwLm1lZGlhLm1vZGVsLnNldHRpbmdzLnBvc3QuaWQsXG5cdFx0XHRhdHRhY2htZW50czogYXR0YWNobWVudHNcblx0XHR9KTtcblx0fVxufSwge1xuXHQvKipcblx0ICogQSBmdW5jdGlvbiB0byBjb21wYXJlIHR3byBhdHRhY2htZW50IG1vZGVscyBpbiBhbiBhdHRhY2htZW50cyBjb2xsZWN0aW9uLlxuXHQgKlxuXHQgKiBVc2VkIGFzIHRoZSBkZWZhdWx0IGNvbXBhcmF0b3IgZm9yIGluc3RhbmNlcyBvZiB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c1xuXHQgKiBhbmQgaXRzIHN1YmNsYXNzZXMuIEBzZWUgd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHMuX2NoYW5nZU9yZGVyYnkoKS5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKlxuXHQgKiBAcGFyYW0ge0JhY2tib25lLk1vZGVsfSBhXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuTW9kZWx9IGJcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0ICogQHJldHVybnMge051bWJlcn0gLTEgaWYgdGhlIGZpcnN0IG1vZGVsIHNob3VsZCBjb21lIGJlZm9yZSB0aGUgc2Vjb25kLFxuXHQgKiAgICAwIGlmIHRoZXkgYXJlIG9mIHRoZSBzYW1lIHJhbmsgYW5kXG5cdCAqICAgIDEgaWYgdGhlIGZpcnN0IG1vZGVsIHNob3VsZCBjb21lIGFmdGVyLlxuXHQgKi9cblx0Y29tcGFyYXRvcjogZnVuY3Rpb24oIGEsIGIsIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGtleSAgID0gdGhpcy5wcm9wcy5nZXQoJ29yZGVyYnknKSxcblx0XHRcdG9yZGVyID0gdGhpcy5wcm9wcy5nZXQoJ29yZGVyJykgfHwgJ0RFU0MnLFxuXHRcdFx0YWMgICAgPSBhLmNpZCxcblx0XHRcdGJjICAgID0gYi5jaWQ7XG5cblx0XHRhID0gYS5nZXQoIGtleSApO1xuXHRcdGIgPSBiLmdldCgga2V5ICk7XG5cblx0XHRpZiAoICdkYXRlJyA9PT0ga2V5IHx8ICdtb2RpZmllZCcgPT09IGtleSApIHtcblx0XHRcdGEgPSBhIHx8IG5ldyBEYXRlKCk7XG5cdFx0XHRiID0gYiB8fCBuZXcgRGF0ZSgpO1xuXHRcdH1cblxuXHRcdC8vIElmIGBvcHRpb25zLnRpZXNgIGlzIHNldCwgZG9uJ3QgZW5mb3JjZSB0aGUgYGNpZGAgdGllYnJlYWtlci5cblx0XHRpZiAoIG9wdGlvbnMgJiYgb3B0aW9ucy50aWVzICkge1xuXHRcdFx0YWMgPSBiYyA9IG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICggJ0RFU0MnID09PSBvcmRlciApID8gd3AubWVkaWEuY29tcGFyZSggYSwgYiwgYWMsIGJjICkgOiB3cC5tZWRpYS5jb21wYXJlKCBiLCBhLCBiYywgYWMgKTtcblx0fSxcblx0LyoqXG5cdCAqIEBuYW1lc3BhY2Vcblx0ICovXG5cdGZpbHRlcnM6IHtcblx0XHQvKipcblx0XHQgKiBAc3RhdGljXG5cdFx0ICogTm90ZSB0aGF0IHRoaXMgY2xpZW50LXNpZGUgc2VhcmNoaW5nIGlzICpub3QqIGVxdWl2YWxlbnRcblx0XHQgKiB0byBvdXIgc2VydmVyLXNpZGUgc2VhcmNoaW5nLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRhY2htZW50XG5cdFx0ICpcblx0XHQgKiBAdGhpcyB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c1xuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0c2VhcmNoOiBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRcdGlmICggISB0aGlzLnByb3BzLmdldCgnc2VhcmNoJykgKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gXy5hbnkoWyd0aXRsZScsJ2ZpbGVuYW1lJywnZGVzY3JpcHRpb24nLCdjYXB0aW9uJywnbmFtZSddLCBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHR2YXIgdmFsdWUgPSBhdHRhY2htZW50LmdldCgga2V5ICk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZSAmJiAtMSAhPT0gdmFsdWUuc2VhcmNoKCB0aGlzLnByb3BzLmdldCgnc2VhcmNoJykgKTtcblx0XHRcdH0sIHRoaXMgKTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIEBzdGF0aWNcblx0XHQgKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dGFjaG1lbnRcblx0XHQgKlxuXHRcdCAqIEB0aGlzIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR0eXBlOiBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy5wcm9wcy5nZXQoJ3R5cGUnKSwgYXR0cyA9IGF0dGFjaG1lbnQudG9KU09OKCksIG1pbWUsIGZvdW5kO1xuXG5cdFx0XHRpZiAoICEgdHlwZSB8fCAoIF8uaXNBcnJheSggdHlwZSApICYmICEgdHlwZS5sZW5ndGggKSApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdG1pbWUgPSBhdHRzLm1pbWUgfHwgKCBhdHRzLmZpbGUgJiYgYXR0cy5maWxlLnR5cGUgKSB8fCAnJztcblxuXHRcdFx0aWYgKCBfLmlzQXJyYXkoIHR5cGUgKSApIHtcblx0XHRcdFx0Zm91bmQgPSBfLmZpbmQoIHR5cGUsIGZ1bmN0aW9uICh0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIC0xICE9PSBtaW1lLmluZGV4T2YoIHQgKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm91bmQgPSAtMSAhPT0gbWltZS5pbmRleE9mKCB0eXBlICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmb3VuZDtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIEBzdGF0aWNcblx0XHQgKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dGFjaG1lbnRcblx0XHQgKlxuXHRcdCAqIEB0aGlzIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR1cGxvYWRlZFRvOiBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRcdHZhciB1cGxvYWRlZFRvID0gdGhpcy5wcm9wcy5nZXQoJ3VwbG9hZGVkVG8nKTtcblx0XHRcdGlmICggXy5pc1VuZGVmaW5lZCggdXBsb2FkZWRUbyApICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVwbG9hZGVkVG8gPT09IGF0dGFjaG1lbnQuZ2V0KCd1cGxvYWRlZFRvJyk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBAc3RhdGljXG5cdFx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRhY2htZW50XG5cdFx0ICpcblx0XHQgKiBAdGhpcyB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c1xuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0c3RhdHVzOiBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRcdHZhciBzdGF0dXMgPSB0aGlzLnByb3BzLmdldCgnc3RhdHVzJyk7XG5cdFx0XHRpZiAoIF8uaXNVbmRlZmluZWQoIHN0YXR1cyApICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHN0YXR1cyA9PT0gYXR0YWNobWVudC5nZXQoJ3N0YXR1cycpO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXR0YWNobWVudHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLm1vZGVsLlBvc3RJbWFnZVxuICpcbiAqIEFuIGluc3RhbmNlIG9mIGFuIGltYWdlIHRoYXQncyBiZWVuIGVtYmVkZGVkIGludG8gYSBwb3N0LlxuICpcbiAqIFVzZWQgaW4gdGhlIGVtYmVkZGVkIGltYWdlIGF0dGFjaG1lbnQgZGlzcGxheSBzZXR0aW5ncyBtb2RhbCAtIEBzZWUgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLkltYWdlRGV0YWlscy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICpcbiAqIEBwYXJhbSB7aW50fSBbYXR0cmlidXRlc10gICAgICAgICAgICAgICBJbml0aWFsIG1vZGVsIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge2ludH0gW2F0dHJpYnV0ZXMuYXR0YWNobWVudF9pZF0gSUQgb2YgdGhlIGF0dGFjaG1lbnQuXG4gKiovXG52YXIgUG9zdEltYWdlID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbiggYXR0cmlidXRlcyApIHtcblx0XHR2YXIgQXR0YWNobWVudCA9IHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnQ7XG5cdFx0dGhpcy5hdHRhY2htZW50ID0gZmFsc2U7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZXMuYXR0YWNobWVudF9pZCApIHtcblx0XHRcdHRoaXMuYXR0YWNobWVudCA9IEF0dGFjaG1lbnQuZ2V0KCBhdHRyaWJ1dGVzLmF0dGFjaG1lbnRfaWQgKTtcblx0XHRcdGlmICggdGhpcy5hdHRhY2htZW50LmdldCggJ3VybCcgKSApIHtcblx0XHRcdFx0dGhpcy5kZmQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblx0XHRcdFx0dGhpcy5kZmQucmVzb2x2ZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5kZmQgPSB0aGlzLmF0dGFjaG1lbnQuZmV0Y2goKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYmluZEF0dGFjaG1lbnRMaXN0ZW5lcnMoKTtcblx0XHR9XG5cblx0XHQvLyBrZWVwIHVybCBpbiBzeW5jIHdpdGggY2hhbmdlcyB0byB0aGUgdHlwZSBvZiBsaW5rXG5cdFx0dGhpcy5vbiggJ2NoYW5nZTpsaW5rJywgdGhpcy51cGRhdGVMaW5rVXJsLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2NoYW5nZTpzaXplJywgdGhpcy51cGRhdGVTaXplLCB0aGlzICk7XG5cblx0XHR0aGlzLnNldExpbmtUeXBlRnJvbVVybCgpO1xuXHRcdHRoaXMuc2V0QXNwZWN0UmF0aW8oKTtcblxuXHRcdHRoaXMuc2V0KCAnb3JpZ2luYWxVcmwnLCBhdHRyaWJ1dGVzLnVybCApO1xuXHR9LFxuXG5cdGJpbmRBdHRhY2htZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLmF0dGFjaG1lbnQsICdzeW5jJywgdGhpcy5zZXRMaW5rVHlwZUZyb21VcmwgKTtcblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLmF0dGFjaG1lbnQsICdzeW5jJywgdGhpcy5zZXRBc3BlY3RSYXRpbyApO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMuYXR0YWNobWVudCwgJ2NoYW5nZScsIHRoaXMudXBkYXRlU2l6ZSApO1xuXHR9LFxuXG5cdGNoYW5nZUF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCBhdHRhY2htZW50LCBwcm9wcyApIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcoIHRoaXMuYXR0YWNobWVudCApO1xuXHRcdHRoaXMuYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7XG5cdFx0dGhpcy5iaW5kQXR0YWNobWVudExpc3RlbmVycygpO1xuXG5cdFx0dGhpcy5zZXQoICdhdHRhY2htZW50X2lkJywgdGhpcy5hdHRhY2htZW50LmdldCggJ2lkJyApICk7XG5cdFx0dGhpcy5zZXQoICdjYXB0aW9uJywgdGhpcy5hdHRhY2htZW50LmdldCggJ2NhcHRpb24nICkgKTtcblx0XHR0aGlzLnNldCggJ2FsdCcsIHRoaXMuYXR0YWNobWVudC5nZXQoICdhbHQnICkgKTtcblx0XHR0aGlzLnNldCggJ3NpemUnLCBwcm9wcy5nZXQoICdzaXplJyApICk7XG5cdFx0dGhpcy5zZXQoICdhbGlnbicsIHByb3BzLmdldCggJ2FsaWduJyApICk7XG5cdFx0dGhpcy5zZXQoICdsaW5rJywgcHJvcHMuZ2V0KCAnbGluaycgKSApO1xuXHRcdHRoaXMudXBkYXRlTGlua1VybCgpO1xuXHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xuXHR9LFxuXG5cdHNldExpbmtUeXBlRnJvbVVybDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGxpbmtVcmwgPSB0aGlzLmdldCggJ2xpbmtVcmwnICksXG5cdFx0XHR0eXBlO1xuXG5cdFx0aWYgKCAhIGxpbmtVcmwgKSB7XG5cdFx0XHR0aGlzLnNldCggJ2xpbmsnLCAnbm9uZScgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBkZWZhdWx0IHRvIGN1c3RvbSBpZiB0aGVyZSBpcyBhIGxpbmtVcmxcblx0XHR0eXBlID0gJ2N1c3RvbSc7XG5cblx0XHRpZiAoIHRoaXMuYXR0YWNobWVudCApIHtcblx0XHRcdGlmICggdGhpcy5hdHRhY2htZW50LmdldCggJ3VybCcgKSA9PT0gbGlua1VybCApIHtcblx0XHRcdFx0dHlwZSA9ICdmaWxlJztcblx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuYXR0YWNobWVudC5nZXQoICdsaW5rJyApID09PSBsaW5rVXJsICkge1xuXHRcdFx0XHR0eXBlID0gJ3Bvc3QnO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIHRoaXMuZ2V0KCAndXJsJyApID09PSBsaW5rVXJsICkge1xuXHRcdFx0XHR0eXBlID0gJ2ZpbGUnO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuc2V0KCAnbGluaycsIHR5cGUgKTtcblx0fSxcblxuXHR1cGRhdGVMaW5rVXJsOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbGluayA9IHRoaXMuZ2V0KCAnbGluaycgKSxcblx0XHRcdHVybDtcblxuXHRcdHN3aXRjaCggbGluayApIHtcblx0XHRcdGNhc2UgJ2ZpbGUnOlxuXHRcdFx0XHRpZiAoIHRoaXMuYXR0YWNobWVudCApIHtcblx0XHRcdFx0XHR1cmwgPSB0aGlzLmF0dGFjaG1lbnQuZ2V0KCAndXJsJyApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHVybCA9IHRoaXMuZ2V0KCAndXJsJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuc2V0KCAnbGlua1VybCcsIHVybCApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3Bvc3QnOlxuXHRcdFx0XHR0aGlzLnNldCggJ2xpbmtVcmwnLCB0aGlzLmF0dGFjaG1lbnQuZ2V0KCAnbGluaycgKSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ25vbmUnOlxuXHRcdFx0XHR0aGlzLnNldCggJ2xpbmtVcmwnLCAnJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0sXG5cblx0dXBkYXRlU2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNpemU7XG5cblx0XHRpZiAoICEgdGhpcy5hdHRhY2htZW50ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5nZXQoICdzaXplJyApID09PSAnY3VzdG9tJyApIHtcblx0XHRcdHRoaXMuc2V0KCAnd2lkdGgnLCB0aGlzLmdldCggJ2N1c3RvbVdpZHRoJyApICk7XG5cdFx0XHR0aGlzLnNldCggJ2hlaWdodCcsIHRoaXMuZ2V0KCAnY3VzdG9tSGVpZ2h0JyApICk7XG5cdFx0XHR0aGlzLnNldCggJ3VybCcsIHRoaXMuZ2V0KCAnb3JpZ2luYWxVcmwnICkgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzaXplID0gdGhpcy5hdHRhY2htZW50LmdldCggJ3NpemVzJyApWyB0aGlzLmdldCggJ3NpemUnICkgXTtcblxuXHRcdGlmICggISBzaXplICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0KCAndXJsJywgc2l6ZS51cmwgKTtcblx0XHR0aGlzLnNldCggJ3dpZHRoJywgc2l6ZS53aWR0aCApO1xuXHRcdHRoaXMuc2V0KCAnaGVpZ2h0Jywgc2l6ZS5oZWlnaHQgKTtcblx0fSxcblxuXHRzZXRBc3BlY3RSYXRpbzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGZ1bGw7XG5cblx0XHRpZiAoIHRoaXMuYXR0YWNobWVudCAmJiB0aGlzLmF0dGFjaG1lbnQuZ2V0KCAnc2l6ZXMnICkgKSB7XG5cdFx0XHRmdWxsID0gdGhpcy5hdHRhY2htZW50LmdldCggJ3NpemVzJyApLmZ1bGw7XG5cblx0XHRcdGlmICggZnVsbCApIHtcblx0XHRcdFx0dGhpcy5zZXQoICdhc3BlY3RSYXRpbycsIGZ1bGwud2lkdGggLyBmdWxsLmhlaWdodCApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5zZXQoICdhc3BlY3RSYXRpbycsIHRoaXMuZ2V0KCAnY3VzdG9tV2lkdGgnICkgLyB0aGlzLmdldCggJ2N1c3RvbUhlaWdodCcgKSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBQb3N0SW1hZ2U7XG4iLCIvKipcbiAqIHdwLm1lZGlhLm1vZGVsLlF1ZXJ5XG4gKlxuICogQSBjb2xsZWN0aW9uIG9mIGF0dGFjaG1lbnRzIHRoYXQgbWF0Y2ggdGhlIHN1cHBsaWVkIHF1ZXJ5IGFyZ3VtZW50cy5cbiAqXG4gKiBOb3RlOiBEbyBOT1QgY2hhbmdlIHRoaXMuYXJncyBhZnRlciB0aGUgcXVlcnkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gKiAgICAgICBUaGluZ3Mgd2lsbCBicmVhay5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c1xuICogQGF1Z21lbnRzIEJhY2tib25lLkNvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSAgW21vZGVsc10gICAgICAgICAgICAgICAgICAgICAgTW9kZWxzIHRvIGluaXRpYWxpemUgd2l0aCB0aGUgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gICAgICAgICAgICAgICAgICAgICBPcHRpb25zIGhhc2guXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuYXJnc10gICAgICAgICAgICAgICAgQXR0YWNobWVudHMgcXVlcnkgYXJndW1lbnRzLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmFyZ3MucG9zdHNfcGVyX3BhZ2VdXG4gKi9cbnZhciBBdHRhY2htZW50cyA9IHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzLFxuXHRRdWVyeTtcblxuUXVlcnkgPSBBdHRhY2htZW50cy5leHRlbmQoe1xuXHQvKipcblx0ICogQGdsb2JhbCB3cC5VcGxvYWRlclxuXHQgKlxuXHQgKiBAcGFyYW0ge2FycmF5fSAgW21vZGVscz1bXV0gIEFycmF5IG9mIGluaXRpYWwgbW9kZWxzIHRvIHBvcHVsYXRlIHRoZSBjb2xsZWN0aW9uLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnM9e31dXG5cdCAqL1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbiggbW9kZWxzLCBvcHRpb25zICkge1xuXHRcdHZhciBhbGxvd2VkO1xuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0QXR0YWNobWVudHMucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0dGhpcy5hcmdzICAgICA9IG9wdGlvbnMuYXJncztcblx0XHR0aGlzLl9oYXNNb3JlID0gdHJ1ZTtcblx0XHR0aGlzLmNyZWF0ZWQgID0gbmV3IERhdGUoKTtcblxuXHRcdHRoaXMuZmlsdGVycy5vcmRlciA9IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdFx0dmFyIG9yZGVyYnkgPSB0aGlzLnByb3BzLmdldCgnb3JkZXJieScpLFxuXHRcdFx0XHRvcmRlciA9IHRoaXMucHJvcHMuZ2V0KCdvcmRlcicpO1xuXG5cdFx0XHRpZiAoICEgdGhpcy5jb21wYXJhdG9yICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2Ugd2FudCBhbnkgaXRlbXMgdGhhdCBjYW4gYmUgcGxhY2VkIGJlZm9yZSB0aGUgbGFzdFxuXHRcdFx0Ly8gaXRlbSBpbiB0aGUgc2V0LiBJZiB3ZSBhZGQgYW55IGl0ZW1zIGFmdGVyIHRoZSBsYXN0XG5cdFx0XHQvLyBpdGVtLCB0aGVuIHdlIGNhbid0IGd1YXJhbnRlZSB0aGUgc2V0IGlzIGNvbXBsZXRlLlxuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIDEgIT09IHRoaXMuY29tcGFyYXRvciggYXR0YWNobWVudCwgdGhpcy5sYXN0KCksIHsgdGllczogdHJ1ZSB9KTtcblxuXHRcdFx0Ly8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGFyZSBubyBpdGVtcyB5ZXQgYW5kXG5cdFx0XHQvLyB3ZSdyZSBzb3J0aW5nIGZvciByZWNlbnQgaXRlbXMuIEluIHRoYXQgY2FzZSwgd2Ugd2FudFxuXHRcdFx0Ly8gY2hhbmdlcyB0aGF0IG9jY3VycmVkIGFmdGVyIHdlIGNyZWF0ZWQgdGhlIHF1ZXJ5LlxuXHRcdFx0fSBlbHNlIGlmICggJ0RFU0MnID09PSBvcmRlciAmJiAoICdkYXRlJyA9PT0gb3JkZXJieSB8fCAnbW9kaWZpZWQnID09PSBvcmRlcmJ5ICkgKSB7XG5cdFx0XHRcdHJldHVybiBhdHRhY2htZW50LmdldCggb3JkZXJieSApID49IHRoaXMuY3JlYXRlZDtcblxuXHRcdFx0Ly8gSWYgd2UncmUgc29ydGluZyBieSBtZW51IG9yZGVyIGFuZCB3ZSBoYXZlIG5vIGl0ZW1zLFxuXHRcdFx0Ly8gYWNjZXB0IGFueSBpdGVtcyB0aGF0IGhhdmUgdGhlIGRlZmF1bHQgbWVudSBvcmRlciAoMCkuXG5cdFx0XHR9IGVsc2UgaWYgKCAnQVNDJyA9PT0gb3JkZXIgJiYgJ21lbnVPcmRlcicgPT09IG9yZGVyYnkgKSB7XG5cdFx0XHRcdHJldHVybiBhdHRhY2htZW50LmdldCggb3JkZXJieSApID09PSAwO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIHdlIGRvbid0IHdhbnQgYW55IGl0ZW1zIHlldC5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0Ly8gT2JzZXJ2ZSB0aGUgY2VudHJhbCBgd3AuVXBsb2FkZXIucXVldWVgIGNvbGxlY3Rpb24gdG8gd2F0Y2ggZm9yXG5cdFx0Ly8gbmV3IG1hdGNoZXMgZm9yIHRoZSBxdWVyeS5cblx0XHQvL1xuXHRcdC8vIE9ubHkgb2JzZXJ2ZSB3aGVuIGEgbGltaXRlZCBudW1iZXIgb2YgcXVlcnkgYXJncyBhcmUgc2V0LiBUaGVyZVxuXHRcdC8vIGFyZSBubyBmaWx0ZXJzIGZvciBvdGhlciBwcm9wZXJ0aWVzLCBzbyBvYnNlcnZpbmcgd2lsbCByZXN1bHQgaW5cblx0XHQvLyBmYWxzZSBwb3NpdGl2ZXMgaW4gdGhvc2UgcXVlcmllcy5cblx0XHRhbGxvd2VkID0gWyAncycsICdvcmRlcicsICdvcmRlcmJ5JywgJ3Bvc3RzX3Blcl9wYWdlJywgJ3Bvc3RfbWltZV90eXBlJywgJ3Bvc3RfcGFyZW50JyBdO1xuXHRcdGlmICggd3AuVXBsb2FkZXIgJiYgXyggdGhpcy5hcmdzICkuY2hhaW4oKS5rZXlzKCkuZGlmZmVyZW5jZSggYWxsb3dlZCApLmlzRW1wdHkoKS52YWx1ZSgpICkge1xuXHRcdFx0dGhpcy5vYnNlcnZlKCB3cC5VcGxvYWRlci5xdWV1ZSApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgYXR0YWNobWVudHMgdGhhdCBoYXZlbid0IGJlZW4gc3luYydkIGZyb20gdGhlIHNlcnZlclxuXHQgKiB0aGF0IG1hdGNoIHRoZSBjb2xsZWN0aW9uJ3MgcXVlcnkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0aGFzTW9yZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2hhc01vcmU7XG5cdH0sXG5cdC8qKlxuXHQgKiBGZXRjaCBtb3JlIGF0dGFjaG1lbnRzIGZyb20gdGhlIHNlcnZlciBmb3IgdGhlIGNvbGxlY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSAgIHtvYmplY3R9ICBbb3B0aW9ucz17fV1cblx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdCAqL1xuXHRtb3JlOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIgcXVlcnkgPSB0aGlzO1xuXG5cdFx0Ly8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlcXVlc3QgcGVuZGluZywgcmV0dXJuIGVhcmx5IHdpdGggdGhlIERlZmVycmVkIG9iamVjdC5cblx0XHRpZiAoIHRoaXMuX21vcmUgJiYgJ3BlbmRpbmcnID09PSB0aGlzLl9tb3JlLnN0YXRlKCkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fbW9yZTtcblx0XHR9XG5cblx0XHRpZiAoICEgdGhpcy5oYXNNb3JlKCkgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCkucmVzb2x2ZVdpdGgoIHRoaXMgKS5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0b3B0aW9ucy5yZW1vdmUgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzLl9tb3JlID0gdGhpcy5mZXRjaCggb3B0aW9ucyApLmRvbmUoIGZ1bmN0aW9uKCByZXNwICkge1xuXHRcdFx0aWYgKCBfLmlzRW1wdHkoIHJlc3AgKSB8fCAtMSA9PT0gdGhpcy5hcmdzLnBvc3RzX3Blcl9wYWdlIHx8IHJlc3AubGVuZ3RoIDwgdGhpcy5hcmdzLnBvc3RzX3Blcl9wYWdlICkge1xuXHRcdFx0XHRxdWVyeS5faGFzTW9yZSA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogT3ZlcnJpZGVzIEJhY2tib25lLkNvbGxlY3Rpb24uc3luY1xuXHQgKiBPdmVycmlkZXMgd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHMuc3luY1xuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuTW9kZWx9IG1vZGVsXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cblx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdCAqL1xuXHRzeW5jOiBmdW5jdGlvbiggbWV0aG9kLCBtb2RlbCwgb3B0aW9ucyApIHtcblx0XHR2YXIgYXJncywgZmFsbGJhY2s7XG5cblx0XHQvLyBPdmVybG9hZCB0aGUgcmVhZCBtZXRob2Qgc28gQXR0YWNobWVudC5mZXRjaCgpIGZ1bmN0aW9ucyBjb3JyZWN0bHkuXG5cdFx0aWYgKCAncmVhZCcgPT09IG1ldGhvZCApIHtcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRcdFx0b3B0aW9ucy5jb250ZXh0ID0gdGhpcztcblx0XHRcdG9wdGlvbnMuZGF0YSA9IF8uZXh0ZW5kKCBvcHRpb25zLmRhdGEgfHwge30sIHtcblx0XHRcdFx0YWN0aW9uOiAgJ3F1ZXJ5LWF0dGFjaG1lbnRzJyxcblx0XHRcdFx0cG9zdF9pZDogd3AubWVkaWEubW9kZWwuc2V0dGluZ3MucG9zdC5pZFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENsb25lIHRoZSBhcmdzIHNvIG1hbmlwdWxhdGlvbiBpcyBub24tZGVzdHJ1Y3RpdmUuXG5cdFx0XHRhcmdzID0gXy5jbG9uZSggdGhpcy5hcmdzICk7XG5cblx0XHRcdC8vIERldGVybWluZSB3aGljaCBwYWdlIHRvIHF1ZXJ5LlxuXHRcdFx0aWYgKCAtMSAhPT0gYXJncy5wb3N0c19wZXJfcGFnZSApIHtcblx0XHRcdFx0YXJncy5wYWdlZCA9IE1hdGgucm91bmQoIHRoaXMubGVuZ3RoIC8gYXJncy5wb3N0c19wZXJfcGFnZSApICsgMTtcblx0XHRcdH1cblxuXHRcdFx0b3B0aW9ucy5kYXRhLnF1ZXJ5ID0gYXJncztcblx0XHRcdHJldHVybiB3cC5tZWRpYS5hamF4KCBvcHRpb25zICk7XG5cblx0XHQvLyBPdGhlcndpc2UsIGZhbGwgYmFjayB0byBCYWNrYm9uZS5zeW5jKClcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzLnN5bmMgb3IgQmFja2JvbmUuc3luY1xuXHRcdFx0ICovXG5cdFx0XHRmYWxsYmFjayA9IEF0dGFjaG1lbnRzLnByb3RvdHlwZS5zeW5jID8gQXR0YWNobWVudHMucHJvdG90eXBlIDogQmFja2JvbmU7XG5cdFx0XHRyZXR1cm4gZmFsbGJhY2suc3luYy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fVxuXHR9XG59LCB7XG5cdC8qKlxuXHQgKiBAcmVhZG9ubHlcblx0ICovXG5cdGRlZmF1bHRQcm9wczoge1xuXHRcdG9yZGVyYnk6ICdkYXRlJyxcblx0XHRvcmRlcjogICAnREVTQydcblx0fSxcblx0LyoqXG5cdCAqIEByZWFkb25seVxuXHQgKi9cblx0ZGVmYXVsdEFyZ3M6IHtcblx0XHRwb3N0c19wZXJfcGFnZTogNDBcblx0fSxcblx0LyoqXG5cdCAqIEByZWFkb25seVxuXHQgKi9cblx0b3JkZXJieToge1xuXHRcdGFsbG93ZWQ6ICBbICduYW1lJywgJ2F1dGhvcicsICdkYXRlJywgJ3RpdGxlJywgJ21vZGlmaWVkJywgJ3VwbG9hZGVkVG8nLCAnaWQnLCAncG9zdF9faW4nLCAnbWVudU9yZGVyJyBdLFxuXHRcdC8qKlxuXHRcdCAqIEEgbWFwIG9mIEphdmFTY3JpcHQgb3JkZXJieSB2YWx1ZXMgdG8gdGhlaXIgV1BfUXVlcnkgZXF1aXZhbGVudHMuXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR2YWx1ZW1hcDoge1xuXHRcdFx0J2lkJzogICAgICAgICAnSUQnLFxuXHRcdFx0J3VwbG9hZGVkVG8nOiAncGFyZW50Jyxcblx0XHRcdCdtZW51T3JkZXInOiAgJ21lbnVfb3JkZXIgSUQnXG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQSBtYXAgb2YgSmF2YVNjcmlwdCBxdWVyeSBwcm9wZXJ0aWVzIHRvIHRoZWlyIFdQX1F1ZXJ5IGVxdWl2YWxlbnRzLlxuXHQgKlxuXHQgKiBAcmVhZG9ubHlcblx0ICovXG5cdHByb3BtYXA6IHtcblx0XHQnc2VhcmNoJzogICAgJ3MnLFxuXHRcdCd0eXBlJzogICAgICAncG9zdF9taW1lX3R5cGUnLFxuXHRcdCdwZXJQYWdlJzogICAncG9zdHNfcGVyX3BhZ2UnLFxuXHRcdCdtZW51T3JkZXInOiAnbWVudV9vcmRlcicsXG5cdFx0J3VwbG9hZGVkVG8nOiAncG9zdF9wYXJlbnQnLFxuXHRcdCdzdGF0dXMnOiAgICAgJ3Bvc3Rfc3RhdHVzJyxcblx0XHQnaW5jbHVkZSc6ICAgICdwb3N0X19pbicsXG5cdFx0J2V4Y2x1ZGUnOiAgICAncG9zdF9fbm90X2luJ1xuXHR9LFxuXHQvKipcblx0ICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBBdHRhY2htZW50cyBRdWVyeSBjb2xsZWN0aW9uIGdpdmVuIHRoZSBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBDYWNoZXMgcXVlcnkgb2JqZWN0cyBhbmQgcmV1c2VzIHdoZXJlIHBvc3NpYmxlLlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBtZXRob2Rcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IFtwcm9wc11cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwcm9wcy5jYWNoZT10cnVlXSAgIFdoZXRoZXIgdG8gdXNlIHRoZSBxdWVyeSBjYWNoZSBvciBub3QuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHMub3JkZXJdXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHMub3JkZXJieV1cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwcm9wcy5pbmNsdWRlXVxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzLmV4Y2x1ZGVdXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHMuc11cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwcm9wcy5wb3N0X21pbWVfdHlwZV1cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwcm9wcy5wb3N0c19wZXJfcGFnZV1cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwcm9wcy5tZW51X29yZGVyXVxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzLnBvc3RfcGFyZW50XVxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzLnBvc3Rfc3RhdHVzXVxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG5cdCAqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5tb2RlbC5RdWVyeX0gQSBuZXcgQXR0YWNobWVudHMgUXVlcnkgY29sbGVjdGlvbi5cblx0ICovXG5cdGdldDogKGZ1bmN0aW9uKCl7XG5cdFx0LyoqXG5cdFx0ICogQHN0YXRpY1xuXHRcdCAqIEB0eXBlIEFycmF5XG5cdFx0ICovXG5cdFx0dmFyIHF1ZXJpZXMgPSBbXTtcblxuXHRcdC8qKlxuXHRcdCAqIEByZXR1cm5zIHtRdWVyeX1cblx0XHQgKi9cblx0XHRyZXR1cm4gZnVuY3Rpb24oIHByb3BzLCBvcHRpb25zICkge1xuXHRcdFx0dmFyIGFyZ3MgICAgID0ge30sXG5cdFx0XHRcdG9yZGVyYnkgID0gUXVlcnkub3JkZXJieSxcblx0XHRcdFx0ZGVmYXVsdHMgPSBRdWVyeS5kZWZhdWx0UHJvcHMsXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRjYWNoZSAgICA9ICEhIHByb3BzLmNhY2hlIHx8IF8uaXNVbmRlZmluZWQoIHByb3BzLmNhY2hlICk7XG5cblx0XHRcdC8vIFJlbW92ZSB0aGUgYHF1ZXJ5YCBwcm9wZXJ0eS4gVGhpcyBpc24ndCBsaW5rZWQgdG8gYSBxdWVyeSxcblx0XHRcdC8vIHRoaXMgKmlzKiB0aGUgcXVlcnkuXG5cdFx0XHRkZWxldGUgcHJvcHMucXVlcnk7XG5cdFx0XHRkZWxldGUgcHJvcHMuY2FjaGU7XG5cblx0XHRcdC8vIEZpbGwgZGVmYXVsdCBhcmdzLlxuXHRcdFx0Xy5kZWZhdWx0cyggcHJvcHMsIGRlZmF1bHRzICk7XG5cblx0XHRcdC8vIE5vcm1hbGl6ZSB0aGUgb3JkZXIuXG5cdFx0XHRwcm9wcy5vcmRlciA9IHByb3BzLm9yZGVyLnRvVXBwZXJDYXNlKCk7XG5cdFx0XHRpZiAoICdERVNDJyAhPT0gcHJvcHMub3JkZXIgJiYgJ0FTQycgIT09IHByb3BzLm9yZGVyICkge1xuXHRcdFx0XHRwcm9wcy5vcmRlciA9IGRlZmF1bHRzLm9yZGVyLnRvVXBwZXJDYXNlKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEVuc3VyZSB3ZSBoYXZlIGEgdmFsaWQgb3JkZXJieSB2YWx1ZS5cblx0XHRcdGlmICggISBfLmNvbnRhaW5zKCBvcmRlcmJ5LmFsbG93ZWQsIHByb3BzLm9yZGVyYnkgKSApIHtcblx0XHRcdFx0cHJvcHMub3JkZXJieSA9IGRlZmF1bHRzLm9yZGVyYnk7XG5cdFx0XHR9XG5cblx0XHRcdF8uZWFjaCggWyAnaW5jbHVkZScsICdleGNsdWRlJyBdLCBmdW5jdGlvbiggcHJvcCApIHtcblx0XHRcdFx0aWYgKCBwcm9wc1sgcHJvcCBdICYmICEgXy5pc0FycmF5KCBwcm9wc1sgcHJvcCBdICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIHByb3AgXSA9IFsgcHJvcHNbIHByb3AgXSBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHRcdC8vIEdlbmVyYXRlIHRoZSBxdWVyeSBgYXJnc2Agb2JqZWN0LlxuXHRcdFx0Ly8gQ29ycmVjdCBhbnkgZGlmZmVyaW5nIHByb3BlcnR5IG5hbWVzLlxuXHRcdFx0Xy5lYWNoKCBwcm9wcywgZnVuY3Rpb24oIHZhbHVlLCBwcm9wICkge1xuXHRcdFx0XHRpZiAoIF8uaXNOdWxsKCB2YWx1ZSApICkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFyZ3NbIFF1ZXJ5LnByb3BtYXBbIHByb3AgXSB8fCBwcm9wIF0gPSB2YWx1ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBGaWxsIGFueSBvdGhlciBkZWZhdWx0IHF1ZXJ5IGFyZ3MuXG5cdFx0XHRfLmRlZmF1bHRzKCBhcmdzLCBRdWVyeS5kZWZhdWx0QXJncyApO1xuXG5cdFx0XHQvLyBgcHJvcHMub3JkZXJieWAgZG9lcyBub3QgYWx3YXlzIG1hcCBkaXJlY3RseSB0byBgYXJncy5vcmRlcmJ5YC5cblx0XHRcdC8vIFN1YnN0aXR1dGUgZXhjZXB0aW9ucyBzcGVjaWZpZWQgaW4gb3JkZXJieS5rZXltYXAuXG5cdFx0XHRhcmdzLm9yZGVyYnkgPSBvcmRlcmJ5LnZhbHVlbWFwWyBwcm9wcy5vcmRlcmJ5IF0gfHwgcHJvcHMub3JkZXJieTtcblxuXHRcdFx0Ly8gU2VhcmNoIHRoZSBxdWVyeSBjYWNoZSBmb3IgYSBtYXRjaGluZyBxdWVyeS5cblx0XHRcdGlmICggY2FjaGUgKSB7XG5cdFx0XHRcdHF1ZXJ5ID0gXy5maW5kKCBxdWVyaWVzLCBmdW5jdGlvbiggcXVlcnkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIF8uaXNFcXVhbCggcXVlcnkuYXJncywgYXJncyApO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHF1ZXJpZXMgPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgcXVlcnkgYW5kIGFkZCBpdCB0byB0aGUgY2FjaGUuXG5cdFx0XHRpZiAoICEgcXVlcnkgKSB7XG5cdFx0XHRcdHF1ZXJ5ID0gbmV3IFF1ZXJ5KCBbXSwgXy5leHRlbmQoIG9wdGlvbnMgfHwge30sIHtcblx0XHRcdFx0XHRwcm9wczogcHJvcHMsXG5cdFx0XHRcdFx0YXJnczogIGFyZ3Ncblx0XHRcdFx0fSApICk7XG5cdFx0XHRcdHF1ZXJpZXMucHVzaCggcXVlcnkgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHF1ZXJ5O1xuXHRcdH07XG5cdH0oKSlcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFF1ZXJ5O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb25cbiAqXG4gKiBBIHNlbGVjdGlvbiBvZiBhdHRhY2htZW50cy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c1xuICogQGF1Z21lbnRzIEJhY2tib25lLkNvbGxlY3Rpb25cbiAqL1xudmFyIEF0dGFjaG1lbnRzID0gd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHMsXG5cdFNlbGVjdGlvbjtcblxuU2VsZWN0aW9uID0gQXR0YWNobWVudHMuZXh0ZW5kKHtcblx0LyoqXG5cdCAqIFJlZnJlc2ggdGhlIGBzaW5nbGVgIG1vZGVsIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy5cblx0ICogQmluZHMgYHNpbmdsZWAgaW5zdGVhZCBvZiB1c2luZyB0aGUgY29udGV4dCBhcmd1bWVudCB0byBlbnN1cmVcblx0ICogaXQgcmVjZWl2ZXMgbm8gcGFyYW1ldGVycy5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gW21vZGVscz1bXV0gQXJyYXkgb2YgbW9kZWxzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGNvbGxlY3Rpb24uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCBtb2RlbHMsIG9wdGlvbnMgKSB7XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAnaW5pdGlhbGl6ZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzc1xuXHRcdCAqL1xuXHRcdEF0dGFjaG1lbnRzLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR0aGlzLm11bHRpcGxlID0gb3B0aW9ucyAmJiBvcHRpb25zLm11bHRpcGxlO1xuXG5cdFx0dGhpcy5vbiggJ2FkZCByZW1vdmUgcmVzZXQnLCBfLmJpbmQoIHRoaXMuc2luZ2xlLCB0aGlzLCBmYWxzZSApICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIElmIHRoZSB3b3JrZmxvdyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpLXNlbGVjdCwgY2xlYXIgb3V0IHRoZSBzZWxlY3Rpb25cblx0ICogYmVmb3JlIGFkZGluZyBhIG5ldyBhdHRhY2htZW50IHRvIGl0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBtb2RlbHNcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0ICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRbXX1cblx0ICovXG5cdGFkZDogZnVuY3Rpb24oIG1vZGVscywgb3B0aW9ucyApIHtcblx0XHRpZiAoICEgdGhpcy5tdWx0aXBsZSApIHtcblx0XHRcdHRoaXMucmVtb3ZlKCB0aGlzLm1vZGVscyApO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBjYWxsICdhZGQnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRyZXR1cm4gQXR0YWNobWVudHMucHJvdG90eXBlLmFkZC5jYWxsKCB0aGlzLCBtb2RlbHMsIG9wdGlvbnMgKTtcblx0fSxcblxuXHQvKipcblx0ICogRmlyZWQgd2hlbiB0b2dnbGluZyAoY2xpY2tpbmcgb24pIGFuIGF0dGFjaG1lbnQgaW4gdGhlIG1vZGFsLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3VuZGVmaW5lZHxib29sZWFufHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IG1vZGVsXG5cdCAqXG5cdCAqIEBmaXJlcyB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb24jc2VsZWN0aW9uOnNpbmdsZVxuXHQgKiBAZmlyZXMgd3AubWVkaWEubW9kZWwuU2VsZWN0aW9uI3NlbGVjdGlvbjp1bnNpbmdsZVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7QmFja2JvbmUuTW9kZWx9XG5cdCAqL1xuXHRzaW5nbGU6IGZ1bmN0aW9uKCBtb2RlbCApIHtcblx0XHR2YXIgcHJldmlvdXMgPSB0aGlzLl9zaW5nbGU7XG5cblx0XHQvLyBJZiBhIGBtb2RlbGAgaXMgcHJvdmlkZWQsIHVzZSBpdCBhcyB0aGUgc2luZ2xlIG1vZGVsLlxuXHRcdGlmICggbW9kZWwgKSB7XG5cdFx0XHR0aGlzLl9zaW5nbGUgPSBtb2RlbDtcblx0XHR9XG5cdFx0Ly8gSWYgdGhlIHNpbmdsZSBtb2RlbCBpc24ndCBpbiB0aGUgc2VsZWN0aW9uLCByZW1vdmUgaXQuXG5cdFx0aWYgKCB0aGlzLl9zaW5nbGUgJiYgISB0aGlzLmdldCggdGhpcy5fc2luZ2xlLmNpZCApICkge1xuXHRcdFx0ZGVsZXRlIHRoaXMuX3NpbmdsZTtcblx0XHR9XG5cblx0XHR0aGlzLl9zaW5nbGUgPSB0aGlzLl9zaW5nbGUgfHwgdGhpcy5sYXN0KCk7XG5cblx0XHQvLyBJZiBzaW5nbGUgaGFzIGNoYW5nZWQsIGZpcmUgYW4gZXZlbnQuXG5cdFx0aWYgKCB0aGlzLl9zaW5nbGUgIT09IHByZXZpb3VzICkge1xuXHRcdFx0aWYgKCBwcmV2aW91cyApIHtcblx0XHRcdFx0cHJldmlvdXMudHJpZ2dlciggJ3NlbGVjdGlvbjp1bnNpbmdsZScsIHByZXZpb3VzLCB0aGlzICk7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIG1vZGVsIHdhcyBhbHJlYWR5IHJlbW92ZWQsIHRyaWdnZXIgdGhlIGNvbGxlY3Rpb25cblx0XHRcdFx0Ly8gZXZlbnQgbWFudWFsbHkuXG5cdFx0XHRcdGlmICggISB0aGlzLmdldCggcHJldmlvdXMuY2lkICkgKSB7XG5cdFx0XHRcdFx0dGhpcy50cmlnZ2VyKCAnc2VsZWN0aW9uOnVuc2luZ2xlJywgcHJldmlvdXMsIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCB0aGlzLl9zaW5nbGUgKSB7XG5cdFx0XHRcdHRoaXMuX3NpbmdsZS50cmlnZ2VyKCAnc2VsZWN0aW9uOnNpbmdsZScsIHRoaXMuX3NpbmdsZSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgc2luZ2xlIG1vZGVsLCBvciB0aGUgbGFzdCBtb2RlbCBhcyBhIGZhbGxiYWNrLlxuXHRcdHJldHVybiB0aGlzLl9zaW5nbGU7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbGVjdGlvbjtcbiJdfQ== -
src/wp-includes/js/media-views.js
3754 3754 AttachmentView: wp.media.view.Attachment.Library 3755 3755 }); 3756 3756 3757 this. listenTo( this.controller,'toggle:upload:attachment', _.bind( this.toggleUploader, this ) );3757 this.controller.on( 'toggle:upload:attachment', _.bind( this.toggleUploader, this ) ); 3758 3758 this.controller.on( 'edit:selection', this.editSelection ); 3759 3759 this.createToolbar(); 3760 3760 if ( this.options.sidebar ) { … … 8511 8511 8512 8512 module.exports = View; 8513 8513 8514 },{}]},{},[19]); 8514 },{}]},{},[19]) 8515 //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9ncnVudC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvY29sbGVjdGlvbi1hZGQuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvY29sbGVjdGlvbi1lZGl0LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL2NvbnRyb2xsZXJzL2Nyb3BwZXIuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvY3VzdG9taXplLWltYWdlLWNyb3BwZXIuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvZWRpdC1pbWFnZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9lbWJlZC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9mZWF0dXJlZC1pbWFnZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9nYWxsZXJ5LWFkZC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9nYWxsZXJ5LWVkaXQuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvaW1hZ2UtZGV0YWlscy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9saWJyYXJ5LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL2NvbnRyb2xsZXJzL21lZGlhLWxpYnJhcnkuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvcmVnaW9uLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL2NvbnRyb2xsZXJzL3JlcGxhY2UtaW1hZ2UuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvc2l0ZS1pY29uLWNyb3BwZXIuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvc3RhdGUtbWFjaGluZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9zdGF0ZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS91dGlscy9zZWxlY3Rpb24tc3luYy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy5tYW5pZmVzdC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50LWNvbXBhdC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50LWZpbHRlcnMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC1maWx0ZXJzL2FsbC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50LWZpbHRlcnMvZGF0ZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50LWZpbHRlcnMvdXBsb2FkZWQuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50L2RldGFpbHMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC9lZGl0LWxpYnJhcnkuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC9lZGl0LXNlbGVjdGlvbi5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50L2xpYnJhcnkuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC9zZWxlY3Rpb24uanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudHMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudHMvYnJvd3Nlci5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50cy9zZWxlY3Rpb24uanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYnV0dG9uLWdyb3VwLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2J1dHRvbi5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9jcm9wcGVyLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2VkaXQtaW1hZ2UuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZW1iZWQuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZW1iZWQvaW1hZ2UuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZW1iZWQvbGluay5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9lbWJlZC91cmwuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZm9jdXMtbWFuYWdlci5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9mcmFtZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9mcmFtZS9pbWFnZS1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2ZyYW1lL3Bvc3QuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZnJhbWUvc2VsZWN0LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2lmcmFtZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9pbWFnZS1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2xhYmVsLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL21lZGlhLWZyYW1lLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL21lbnUtaXRlbS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9tZW51LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL21vZGFsLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3ByaW9yaXR5LWxpc3QuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvcm91dGVyLWl0ZW0uanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvcm91dGVyLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3NlYXJjaC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9zZWxlY3Rpb24uanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvc2V0dGluZ3MuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvc2V0dGluZ3MvYXR0YWNobWVudC1kaXNwbGF5LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3NldHRpbmdzL2dhbGxlcnkuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvc2V0dGluZ3MvcGxheWxpc3QuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvc2lkZWJhci5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9zaXRlLWljb24tY3JvcHBlci5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9zaXRlLWljb24tcHJldmlldy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9zcGlubmVyLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3Rvb2xiYXIuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvdG9vbGJhci9lbWJlZC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy90b29sYmFyL3NlbGVjdC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy91cGxvYWRlci9lZGl0b3IuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvdXBsb2FkZXIvaW5saW5lLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3VwbG9hZGVyL3N0YXR1cy1lcnJvci5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy91cGxvYWRlci9zdGF0dXMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvdXBsb2FkZXIvd2luZG93LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3ZpZXcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25TQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzd0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLkNvbGxlY3Rpb25BZGRcbiAqXG4gKiBBIHN0YXRlIGZvciBhZGRpbmcgYXR0YWNobWVudHMgdG8gYSBjb2xsZWN0aW9uIChlLmcuIHZpZGVvIHBsYXlsaXN0KS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnlcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlc10gICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZXMgaGFzaCBwYXNzZWQgdG8gdGhlIHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuaWQ9bGlicmFyeV0gICAgICBVbmlxdWUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudGl0bGUgICAgICAgICAgICAgICAgICAgIFRpdGxlIGZvciB0aGUgc3RhdGUuIERpc3BsYXlzIGluIHRoZSBmcmFtZSdzIHRpdGxlIHJlZ2lvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLm11bHRpcGxlPWFkZF0gICAgICAgICAgICBXaGV0aGVyIG11bHRpLXNlbGVjdCBpcyBlbmFibGVkLiBAdG9kbyAnYWRkJyBkb2Vzbid0IHNlZW0gZG8gYW55dGhpbmcgc3BlY2lhbCwgYW5kIGdldHMgdXNlZCBhcyBhIGJvb2xlYW4uXG4gKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBbYXR0cmlidXRlcy5saWJyYXJ5XSAgICAgICAgICAgICAgICAgVGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gdG8gYnJvd3NlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9uZSBpcyBub3Qgc3VwcGxpZWQsIGEgY29sbGVjdGlvbiBvZiBhdHRhY2htZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2lsbCBiZSBjcmVhdGVkLlxuICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZmlsdGVyYWJsZT11cGxvYWRlZF0gICAgIFdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgZmlsdGVyYWJsZSwgYW5kIGlmIHNvIHdoYXQgZmlsdGVycyBzaG91bGQgYmUgc2hvd24uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0cyAnYWxsJywgJ3VwbG9hZGVkJywgb3IgJ3VuYXR0YWNoZWQnLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMubWVudT1nYWxsZXJ5XSAgICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIG1lbnUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuY29udGVudD11cGxvYWRdICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIGNvbnRlbnQgcmVnaW9uLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJyaWRkZW4gYnkgcGVyc2lzdGVudCB1c2VyIHNldHRpbmcgaWYgJ2NvbnRlbnRVc2VyU2V0dGluZycgaXMgdHJ1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnJvdXRlcj1icm93c2VdICAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSByb3V0ZXIgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMudG9vbGJhcj1nYWxsZXJ5LWFkZF0gICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIHRvb2xiYXIgcmVnaW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc2VhcmNoYWJsZT10cnVlXSAgICAgICAgIFdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgc2VhcmNoYWJsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnNvcnRhYmxlPXRydWVdICAgICAgICAgICBXaGV0aGVyIHRoZSBBdHRhY2htZW50cyBzaG91bGQgYmUgc29ydGFibGUuIERlcGVuZHMgb24gdGhlIG9yZGVyYnkgcHJvcGVydHkgYmVpbmcgc2V0IHRvIG1lbnVPcmRlciBvbiB0aGUgYXR0YWNobWVudHMgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmF1dG9TZWxlY3Q9dHJ1ZV0gICAgICAgICBXaGV0aGVyIGFuIHVwbG9hZGVkIGF0dGFjaG1lbnQgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmNvbnRlbnRVc2VyU2V0dGluZz10cnVlXSBXaGV0aGVyIHRoZSBjb250ZW50IHJlZ2lvbidzIG1vZGUgc2hvdWxkIGJlIHNldCBhbmQgcGVyc2lzdGVkIHBlciB1c2VyLlxuICogQHBhcmFtIHtpbnR9ICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMucHJpb3JpdHk9MTAwXSAgICAgICAgICAgIFRoZSBwcmlvcml0eSBmb3IgdGhlIHN0YXRlIGxpbmsgaW4gdGhlIG1lZGlhIG1lbnUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zeW5jU2VsZWN0aW9uPWZhbHNlXSAgICAgV2hldGhlciB0aGUgQXR0YWNobWVudHMgc2VsZWN0aW9uIHNob3VsZCBiZSBwZXJzaXN0ZWQgZnJvbSB0aGUgbGFzdCBzdGF0ZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBmYWxzZSBiZWNhdXNlIGZvciB0aGlzIHN0YXRlLCBiZWNhdXNlIHRoZSBsaWJyYXJ5IG9mIHRoZSBFZGl0IEdhbGxlcnkgc3RhdGUgaXMgdGhlIHNlbGVjdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudHlwZSAgICAgICAgICAgICAgICAgICBUaGUgY29sbGVjdGlvbidzIG1lZGlhIHR5cGUuIChlLmcuICd2aWRlbycpLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5jb2xsZWN0aW9uVHlwZSAgICAgICAgIFRoZSBjb2xsZWN0aW9uIHR5cGUuIChlLmcuICdwbGF5bGlzdCcpLlxuICovXG52YXIgU2VsZWN0aW9uID0gd3AubWVkaWEubW9kZWwuU2VsZWN0aW9uLFxuXHRMaWJyYXJ5ID0gd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5LFxuXHRDb2xsZWN0aW9uQWRkO1xuXG5Db2xsZWN0aW9uQWRkID0gTGlicmFyeS5leHRlbmQoe1xuXHRkZWZhdWx0czogXy5kZWZhdWx0cygge1xuXHRcdC8vIFNlbGVjdGlvbiBkZWZhdWx0cy4gQHNlZSBtZWRpYS5tb2RlbC5TZWxlY3Rpb25cblx0XHRtdWx0aXBsZTogICAgICAnYWRkJyxcblx0XHQvLyBBdHRhY2htZW50cyBicm93c2VyIGRlZmF1bHRzLiBAc2VlIG1lZGlhLnZpZXcuQXR0YWNobWVudHNCcm93c2VyXG5cdFx0ZmlsdGVyYWJsZTogICAgJ3VwbG9hZGVkJyxcblxuXHRcdHByaW9yaXR5OiAgICAgIDEwMCxcblx0XHRzeW5jU2VsZWN0aW9uOiBmYWxzZVxuXHR9LCBMaWJyYXJ5LnByb3RvdHlwZS5kZWZhdWx0cyApLFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjb2xsZWN0aW9uVHlwZSA9IHRoaXMuZ2V0KCdjb2xsZWN0aW9uVHlwZScpO1xuXG5cdFx0aWYgKCAndmlkZW8nID09PSB0aGlzLmdldCggJ3R5cGUnICkgKSB7XG5cdFx0XHRjb2xsZWN0aW9uVHlwZSA9ICd2aWRlby0nICsgY29sbGVjdGlvblR5cGU7XG5cdFx0fVxuXG5cdFx0dGhpcy5zZXQoICdpZCcsIGNvbGxlY3Rpb25UeXBlICsgJy1saWJyYXJ5JyApO1xuXHRcdHRoaXMuc2V0KCAndG9vbGJhcicsIGNvbGxlY3Rpb25UeXBlICsgJy1hZGQnICk7XG5cdFx0dGhpcy5zZXQoICdtZW51JywgY29sbGVjdGlvblR5cGUgKTtcblxuXHRcdC8vIElmIHdlIGhhdmVuJ3QgYmVlbiBwcm92aWRlZCBhIGBsaWJyYXJ5YCwgY3JlYXRlIGEgYFNlbGVjdGlvbmAuXG5cdFx0aWYgKCAhIHRoaXMuZ2V0KCdsaWJyYXJ5JykgKSB7XG5cdFx0XHR0aGlzLnNldCggJ2xpYnJhcnknLCB3cC5tZWRpYS5xdWVyeSh7IHR5cGU6IHRoaXMuZ2V0KCd0eXBlJykgfSkgKTtcblx0XHR9XG5cdFx0TGlicmFyeS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsaWJyYXJ5ID0gdGhpcy5nZXQoJ2xpYnJhcnknKSxcblx0XHRcdGVkaXRMaWJyYXJ5ID0gdGhpcy5nZXQoJ2VkaXRMaWJyYXJ5JyksXG5cdFx0XHRlZGl0ID0gdGhpcy5mcmFtZS5zdGF0ZSggdGhpcy5nZXQoJ2NvbGxlY3Rpb25UeXBlJykgKyAnLWVkaXQnICkuZ2V0KCdsaWJyYXJ5Jyk7XG5cblx0XHRpZiAoIGVkaXRMaWJyYXJ5ICYmIGVkaXRMaWJyYXJ5ICE9PSBlZGl0ICkge1xuXHRcdFx0bGlicmFyeS51bm9ic2VydmUoIGVkaXRMaWJyYXJ5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWNjZXB0cyBhdHRhY2htZW50cyB0aGF0IGV4aXN0IGluIHRoZSBvcmlnaW5hbCBsaWJyYXJ5IGFuZFxuXHRcdC8vIHRoYXQgZG8gbm90IGV4aXN0IGluIGdhbGxlcnkncyBsaWJyYXJ5LlxuXHRcdGxpYnJhcnkudmFsaWRhdG9yID0gZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gISEgdGhpcy5taXJyb3JpbmcuZ2V0KCBhdHRhY2htZW50LmNpZCApICYmICEgZWRpdC5nZXQoIGF0dGFjaG1lbnQuY2lkICkgJiYgU2VsZWN0aW9uLnByb3RvdHlwZS52YWxpZGF0b3IuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH07XG5cblx0XHQvLyBSZXNldCB0aGUgbGlicmFyeSB0byBlbnN1cmUgdGhhdCBhbGwgYXR0YWNobWVudHMgYXJlIHJlLWFkZGVkXG5cdFx0Ly8gdG8gdGhlIGNvbGxlY3Rpb24uIERvIHNvIHNpbGVudGx5LCBhcyBjYWxsaW5nIGBvYnNlcnZlYCB3aWxsXG5cdFx0Ly8gdHJpZ2dlciB0aGUgYHJlc2V0YCBldmVudC5cblx0XHRsaWJyYXJ5LnJlc2V0KCBsaWJyYXJ5Lm1pcnJvcmluZy5tb2RlbHMsIHsgc2lsZW50OiB0cnVlIH0pO1xuXHRcdGxpYnJhcnkub2JzZXJ2ZSggZWRpdCApO1xuXHRcdHRoaXMuc2V0KCdlZGl0TGlicmFyeScsIGVkaXQpO1xuXG5cdFx0TGlicmFyeS5wcm90b3R5cGUuYWN0aXZhdGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb2xsZWN0aW9uQWRkO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLkNvbGxlY3Rpb25FZGl0XG4gKlxuICogQSBzdGF0ZSBmb3IgZWRpdGluZyBhIGNvbGxlY3Rpb24sIHdoaWNoIGlzIHVzZWQgYnkgYXVkaW8gYW5kIHZpZGVvIHBsYXlsaXN0cyxcbiAqIGFuZCBjYW4gYmUgdXNlZCBmb3Igb3RoZXIgY29sbGVjdGlvbnMuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXNdICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIGhhc2ggcGFzc2VkIHRvIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudGl0bGUgICAgICAgICAgICAgICAgICBUaXRsZSBmb3IgdGhlIHN0YXRlLiBEaXNwbGF5cyBpbiB0aGUgbWVkaWEgbWVudSBhbmQgdGhlIGZyYW1lJ3MgdGl0bGUgcmVnaW9uLlxuICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gW2F0dHJpYnV0ZXMubGlicmFyeV0gICAgICAgICAgICAgIFRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uIHRvIGVkaXQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb25lIGlzIG5vdCBzdXBwbGllZCwgYW4gZW1wdHkgbWVkaWEubW9kZWwuU2VsZWN0aW9uIGNvbGxlY3Rpb24gaXMgY3JlYXRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLm11bHRpcGxlPWZhbHNlXSAgICAgICBXaGV0aGVyIG11bHRpLXNlbGVjdCBpcyBlbmFibGVkLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuY29udGVudD1icm93c2VdICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIGNvbnRlbnQgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5tZW51ICAgICAgICAgICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIG1lbnUgcmVnaW9uLiBAdG9kbyB0aGlzIG5lZWRzIGEgYmV0dGVyIGV4cGxhbmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc2VhcmNoYWJsZT1mYWxzZV0gICAgIFdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgc2VhcmNoYWJsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnNvcnRhYmxlPXRydWVdICAgICAgICBXaGV0aGVyIHRoZSBBdHRhY2htZW50cyBzaG91bGQgYmUgc29ydGFibGUuIERlcGVuZHMgb24gdGhlIG9yZGVyYnkgcHJvcGVydHkgYmVpbmcgc2V0IHRvIG1lbnVPcmRlciBvbiB0aGUgYXR0YWNobWVudHMgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmRhdGU9dHJ1ZV0gICAgICAgICAgICBXaGV0aGVyIHRvIHNob3cgdGhlIGRhdGUgZmlsdGVyIGluIHRoZSBicm93c2VyJ3MgdG9vbGJhci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmRlc2NyaWJlPXRydWVdICAgICAgICBXaGV0aGVyIHRvIG9mZmVyIFVJIHRvIGRlc2NyaWJlIHRoZSBhdHRhY2htZW50cyAtIGUuZy4gY2FwdGlvbmluZyBpbWFnZXMgaW4gYSBnYWxsZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZHJhZ0luZm89dHJ1ZV0gICAgICAgIFdoZXRoZXIgdG8gc2hvdyBpbnN0cnVjdGlvbmFsIHRleHQgYWJvdXQgdGhlIGF0dGFjaG1lbnRzIGJlaW5nIHNvcnRhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZHJhZ0luZm9UZXh0XSAgICAgICAgIEluc3RydWN0aW9uYWwgdGV4dCBhYm91dCB0aGUgYXR0YWNobWVudHMgYmVpbmcgc29ydGFibGUuXG4gKiBAcGFyYW0ge2ludH0gICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5pZGVhbENvbHVtbldpZHRoPTE3MF0gVGhlIGlkZWFsIGNvbHVtbiB3aWR0aCBpbiBwaXhlbHMgZm9yIGF0dGFjaG1lbnRzLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZWRpdGluZz1mYWxzZV0gICAgICAgIFdoZXRoZXIgdGhlIGdhbGxlcnkgaXMgYmVpbmcgY3JlYXRlZCwgb3IgZWRpdGluZyBhbiBleGlzdGluZyBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7aW50fSAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnByaW9yaXR5PTYwXSAgICAgICAgICBUaGUgcHJpb3JpdHkgZm9yIHRoZSBzdGF0ZSBsaW5rIGluIHRoZSBtZWRpYSBtZW51LlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc3luY1NlbGVjdGlvbj1mYWxzZV0gIFdoZXRoZXIgdGhlIEF0dGFjaG1lbnRzIHNlbGVjdGlvbiBzaG91bGQgYmUgcGVyc2lzdGVkIGZyb20gdGhlIGxhc3Qgc3RhdGUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gZmFsc2UgZm9yIHRoaXMgc3RhdGUsIGJlY2F1c2UgdGhlIGxpYnJhcnkgcGFzc2VkIGluICAqaXMqIHRoZSBzZWxlY3Rpb24uXG4gKiBAcGFyYW0ge3ZpZXd9ICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5TZXR0aW5nc1ZpZXddICAgICAgICAgVGhlIHZpZXcgdG8gZWRpdCB0aGUgY29sbGVjdGlvbiBpbnN0YW5jZSBzZXR0aW5ncyAoZS5nLiBQbGF5bGlzdCBzZXR0aW5ncyB3aXRoIFwiU2hvdyB0cmFja2xpc3RcIiBjaGVja2JveCkuXG4gKiBAcGFyYW0ge3ZpZXd9ICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5BdHRhY2htZW50Vmlld10gICAgICAgVGhlIHNpbmdsZSBgQXR0YWNobWVudGAgdmlldyB0byBiZSB1c2VkIGluIHRoZSBgQXR0YWNobWVudHNgLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vbmUgc3VwcGxpZWQsIGRlZmF1bHRzIHRvIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5FZGl0TGlicmFyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudHlwZSAgICAgICAgICAgICAgICAgICBUaGUgY29sbGVjdGlvbidzIG1lZGlhIHR5cGUuIChlLmcuICd2aWRlbycpLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5jb2xsZWN0aW9uVHlwZSAgICAgICAgIFRoZSBjb2xsZWN0aW9uIHR5cGUuIChlLmcuICdwbGF5bGlzdCcpLlxuICovXG52YXIgTGlicmFyeSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeSxcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0JCA9IGpRdWVyeSxcblx0Q29sbGVjdGlvbkVkaXQ7XG5cbkNvbGxlY3Rpb25FZGl0ID0gTGlicmFyeS5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdG11bHRpcGxlOiAgICAgICAgIGZhbHNlLFxuXHRcdHNvcnRhYmxlOiAgICAgICAgIHRydWUsXG5cdFx0ZGF0ZTogICAgICAgICAgICAgZmFsc2UsXG5cdFx0c2VhcmNoYWJsZTogICAgICAgZmFsc2UsXG5cdFx0Y29udGVudDogICAgICAgICAgJ2Jyb3dzZScsXG5cdFx0ZGVzY3JpYmU6ICAgICAgICAgdHJ1ZSxcblx0XHRkcmFnSW5mbzogICAgICAgICB0cnVlLFxuXHRcdGlkZWFsQ29sdW1uV2lkdGg6IDE3MCxcblx0XHRlZGl0aW5nOiAgICAgICAgICBmYWxzZSxcblx0XHRwcmlvcml0eTogICAgICAgICA2MCxcblx0XHRTZXR0aW5nc1ZpZXc6ICAgICBmYWxzZSxcblx0XHRzeW5jU2VsZWN0aW9uOiAgICBmYWxzZVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjb2xsZWN0aW9uVHlwZSA9IHRoaXMuZ2V0KCdjb2xsZWN0aW9uVHlwZScpO1xuXG5cdFx0aWYgKCAndmlkZW8nID09PSB0aGlzLmdldCggJ3R5cGUnICkgKSB7XG5cdFx0XHRjb2xsZWN0aW9uVHlwZSA9ICd2aWRlby0nICsgY29sbGVjdGlvblR5cGU7XG5cdFx0fVxuXG5cdFx0dGhpcy5zZXQoICdpZCcsIGNvbGxlY3Rpb25UeXBlICsgJy1lZGl0JyApO1xuXHRcdHRoaXMuc2V0KCAndG9vbGJhcicsIGNvbGxlY3Rpb25UeXBlICsgJy1lZGl0JyApO1xuXG5cdFx0Ly8gSWYgd2UgaGF2ZW4ndCBiZWVuIHByb3ZpZGVkIGEgYGxpYnJhcnlgLCBjcmVhdGUgYSBgU2VsZWN0aW9uYC5cblx0XHRpZiAoICEgdGhpcy5nZXQoJ2xpYnJhcnknKSApIHtcblx0XHRcdHRoaXMuc2V0KCAnbGlicmFyeScsIG5ldyB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb24oKSApO1xuXHRcdH1cblx0XHQvLyBUaGUgc2luZ2xlIGBBdHRhY2htZW50YCB2aWV3IHRvIGJlIHVzZWQgaW4gdGhlIGBBdHRhY2htZW50c2Agdmlldy5cblx0XHRpZiAoICEgdGhpcy5nZXQoJ0F0dGFjaG1lbnRWaWV3JykgKSB7XG5cdFx0XHR0aGlzLnNldCggJ0F0dGFjaG1lbnRWaWV3Jywgd3AubWVkaWEudmlldy5BdHRhY2htZW50LkVkaXRMaWJyYXJ5ICk7XG5cdFx0fVxuXHRcdExpYnJhcnkucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICovXG5cdGFjdGl2YXRlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbGlicmFyeSA9IHRoaXMuZ2V0KCdsaWJyYXJ5Jyk7XG5cblx0XHQvLyBMaW1pdCB0aGUgbGlicmFyeSB0byBpbWFnZXMgb25seS5cblx0XHRsaWJyYXJ5LnByb3BzLnNldCggJ3R5cGUnLCB0aGlzLmdldCggJ3R5cGUnICkgKTtcblxuXHRcdC8vIFdhdGNoIGZvciB1cGxvYWRlZCBhdHRhY2htZW50cy5cblx0XHR0aGlzLmdldCgnbGlicmFyeScpLm9ic2VydmUoIHdwLlVwbG9hZGVyLnF1ZXVlICk7XG5cblx0XHR0aGlzLmZyYW1lLm9uKCAnY29udGVudDpyZW5kZXI6YnJvd3NlJywgdGhpcy5yZW5kZXJTZXR0aW5ncywgdGhpcyApO1xuXG5cdFx0TGlicmFyeS5wcm90b3R5cGUuYWN0aXZhdGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICovXG5cdGRlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFN0b3Agd2F0Y2hpbmcgZm9yIHVwbG9hZGVkIGF0dGFjaG1lbnRzLlxuXHRcdHRoaXMuZ2V0KCdsaWJyYXJ5JykudW5vYnNlcnZlKCB3cC5VcGxvYWRlci5xdWV1ZSApO1xuXG5cdFx0dGhpcy5mcmFtZS5vZmYoICdjb250ZW50OnJlbmRlcjpicm93c2UnLCB0aGlzLnJlbmRlclNldHRpbmdzLCB0aGlzICk7XG5cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5kZWFjdGl2YXRlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHQvKipcblx0ICogUmVuZGVyIHRoZSBjb2xsZWN0aW9uIGVtYmVkIHNldHRpbmdzIHZpZXcgaW4gdGhlIGJyb3dzZXIgc2lkZWJhci5cblx0ICpcblx0ICogQHRvZG8gVGhpcyBpcyBhZ2FpbnN0IHRoZSBwYXR0ZXJuIGVsc2V3aGVyZSBpbiBtZWRpYS4gVHlwaWNhbGx5IHRoZSBmcmFtZVxuXHQgKiAgICAgICBpcyByZXNwb25zaWJsZSBmb3IgYWRkaW5nIHJlZ2lvbiBtb2RlIGNhbGxiYWNrcy4gRXhwbGFpbi5cblx0ICpcblx0ICogQHNpbmNlIDMuOS4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEudmlldy5hdHRhY2htZW50c0Jyb3dzZXJ9IFRoZSBhdHRhY2htZW50cyBicm93c2VyIHZpZXcuXG5cdCAqL1xuXHRyZW5kZXJTZXR0aW5nczogZnVuY3Rpb24oIGF0dGFjaG1lbnRzQnJvd3NlclZpZXcgKSB7XG5cdFx0dmFyIGxpYnJhcnkgPSB0aGlzLmdldCgnbGlicmFyeScpLFxuXHRcdFx0Y29sbGVjdGlvblR5cGUgPSB0aGlzLmdldCgnY29sbGVjdGlvblR5cGUnKSxcblx0XHRcdGRyYWdJbmZvVGV4dCA9IHRoaXMuZ2V0KCdkcmFnSW5mb1RleHQnKSxcblx0XHRcdFNldHRpbmdzVmlldyA9IHRoaXMuZ2V0KCdTZXR0aW5nc1ZpZXcnKSxcblx0XHRcdG9iaiA9IHt9O1xuXG5cdFx0aWYgKCAhIGxpYnJhcnkgfHwgISBhdHRhY2htZW50c0Jyb3dzZXJWaWV3ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGxpYnJhcnlbIGNvbGxlY3Rpb25UeXBlIF0gPSBsaWJyYXJ5WyBjb2xsZWN0aW9uVHlwZSBdIHx8IG5ldyBCYWNrYm9uZS5Nb2RlbCgpO1xuXG5cdFx0b2JqWyBjb2xsZWN0aW9uVHlwZSBdID0gbmV3IFNldHRpbmdzVmlldyh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0bW9kZWw6ICAgICAgbGlicmFyeVsgY29sbGVjdGlvblR5cGUgXSxcblx0XHRcdHByaW9yaXR5OiAgIDQwXG5cdFx0fSk7XG5cblx0XHRhdHRhY2htZW50c0Jyb3dzZXJWaWV3LnNpZGViYXIuc2V0KCBvYmogKTtcblxuXHRcdGlmICggZHJhZ0luZm9UZXh0ICkge1xuXHRcdFx0YXR0YWNobWVudHNCcm93c2VyVmlldy50b29sYmFyLnNldCggJ2RyYWdJbmZvJywgbmV3IHdwLm1lZGlhLlZpZXcoe1xuXHRcdFx0XHRlbDogJCggJzxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbnNcIj4nICsgZHJhZ0luZm9UZXh0ICsgJzwvZGl2PicgKVswXSxcblx0XHRcdFx0cHJpb3JpdHk6IC00MFxuXHRcdFx0fSkgKTtcblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlICdSZXZlcnNlIG9yZGVyJyBidXR0b24gdG8gdGhlIHRvb2xiYXIuXG5cdFx0YXR0YWNobWVudHNCcm93c2VyVmlldy50b29sYmFyLnNldCggJ3JldmVyc2UnLCB7XG5cdFx0XHR0ZXh0OiAgICAgbDEwbi5yZXZlcnNlT3JkZXIsXG5cdFx0XHRwcmlvcml0eTogODAsXG5cblx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bGlicmFyeS5yZXNldCggbGlicmFyeS50b0FycmF5KCkucmV2ZXJzZSgpICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxlY3Rpb25FZGl0O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLkNyb3BwZXJcbiAqXG4gKiBBIHN0YXRlIGZvciBjcm9wcGluZyBhbiBpbWFnZS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqL1xudmFyIGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdENyb3BwZXI7XG5cbkNyb3BwZXIgPSB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0aWQ6ICAgICAgICAgICdjcm9wcGVyJyxcblx0XHR0aXRsZTogICAgICAgbDEwbi5jcm9wSW1hZ2UsXG5cdFx0Ly8gUmVnaW9uIG1vZGUgZGVmYXVsdHMuXG5cdFx0dG9vbGJhcjogICAgICdjcm9wJyxcblx0XHRjb250ZW50OiAgICAgJ2Nyb3AnLFxuXHRcdHJvdXRlcjogICAgICBmYWxzZSxcblxuXHRcdGNhblNraXBDcm9wOiBmYWxzZVxuXHR9LFxuXG5cdGFjdGl2YXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmZyYW1lLm9uKCAnY29udGVudDpjcmVhdGU6Y3JvcCcsIHRoaXMuY3JlYXRlQ3JvcENvbnRlbnQsIHRoaXMgKTtcblx0XHR0aGlzLmZyYW1lLm9uKCAnY2xvc2UnLCB0aGlzLnJlbW92ZUNyb3BwZXIsIHRoaXMgKTtcblx0XHR0aGlzLnNldCgnc2VsZWN0aW9uJywgbmV3IEJhY2tib25lLkNvbGxlY3Rpb24odGhpcy5mcmFtZS5fc2VsZWN0aW9uLnNpbmdsZSkpO1xuXHR9LFxuXG5cdGRlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZnJhbWUudG9vbGJhci5tb2RlKCdicm93c2UnKTtcblx0fSxcblxuXHRjcmVhdGVDcm9wQ29udGVudDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jcm9wcGVyVmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LkNyb3BwZXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGF0dGFjaG1lbnQ6IHRoaXMuZ2V0KCdzZWxlY3Rpb24nKS5maXJzdCgpXG5cdFx0fSk7XG5cdFx0dGhpcy5jcm9wcGVyVmlldy5vbignaW1hZ2UtbG9hZGVkJywgdGhpcy5jcmVhdGVDcm9wVG9vbGJhciwgdGhpcyk7XG5cdFx0dGhpcy5mcmFtZS5jb250ZW50LnNldCh0aGlzLmNyb3BwZXJWaWV3KTtcblxuXHR9LFxuXHRyZW1vdmVDcm9wcGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmltZ1NlbGVjdC5jYW5jZWxTZWxlY3Rpb24oKTtcblx0XHR0aGlzLmltZ1NlbGVjdC5zZXRPcHRpb25zKHtyZW1vdmU6IHRydWV9KTtcblx0XHR0aGlzLmltZ1NlbGVjdC51cGRhdGUoKTtcblx0XHR0aGlzLmNyb3BwZXJWaWV3LnJlbW92ZSgpO1xuXHR9LFxuXHRjcmVhdGVDcm9wVG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNhblNraXBDcm9wLCB0b29sYmFyT3B0aW9ucztcblxuXHRcdGNhblNraXBDcm9wID0gdGhpcy5nZXQoJ2NhblNraXBDcm9wJykgfHwgZmFsc2U7XG5cblx0XHR0b29sYmFyT3B0aW9ucyA9IHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuZnJhbWUsXG5cdFx0XHRpdGVtczoge1xuXHRcdFx0XHRpbnNlcnQ6IHtcblx0XHRcdFx0XHRzdHlsZTogICAgJ3ByaW1hcnknLFxuXHRcdFx0XHRcdHRleHQ6ICAgICBsMTBuLmNyb3BJbWFnZSxcblx0XHRcdFx0XHRwcmlvcml0eTogODAsXG5cdFx0XHRcdFx0cmVxdWlyZXM6IHsgbGlicmFyeTogZmFsc2UsIHNlbGVjdGlvbjogZmFsc2UgfSxcblxuXHRcdFx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRzZWxlY3Rpb247XG5cblx0XHRcdFx0XHRcdHNlbGVjdGlvbiA9IGNvbnRyb2xsZXIuc3RhdGUoKS5nZXQoJ3NlbGVjdGlvbicpLmZpcnN0KCk7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb24uc2V0KHtjcm9wRGV0YWlsczogY29udHJvbGxlci5zdGF0ZSgpLmltZ1NlbGVjdC5nZXRTZWxlY3Rpb24oKX0pO1xuXG5cdFx0XHRcdFx0XHR0aGlzLiRlbC50ZXh0KGwxMG4uY3JvcHBpbmcpO1xuXHRcdFx0XHRcdFx0dGhpcy4kZWwuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zdGF0ZSgpLmRvQ3JvcCggc2VsZWN0aW9uICkuZG9uZSggZnVuY3Rpb24oIGNyb3BwZWRJbWFnZSApIHtcblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci50cmlnZ2VyKCdjcm9wcGVkJywgY3JvcHBlZEltYWdlICk7XG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuY2xvc2UoKTtcblx0XHRcdFx0XHRcdH0pLmZhaWwoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLnRyaWdnZXIoJ2NvbnRlbnQ6ZXJyb3I6Y3JvcCcpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmICggY2FuU2tpcENyb3AgKSB7XG5cdFx0XHRfLmV4dGVuZCggdG9vbGJhck9wdGlvbnMuaXRlbXMsIHtcblx0XHRcdFx0c2tpcDoge1xuXHRcdFx0XHRcdHN0eWxlOiAgICAgICdzZWNvbmRhcnknLFxuXHRcdFx0XHRcdHRleHQ6ICAgICAgIGwxMG4uc2tpcENyb3BwaW5nLFxuXHRcdFx0XHRcdHByaW9yaXR5OiAgIDcwLFxuXHRcdFx0XHRcdHJlcXVpcmVzOiAgIHsgbGlicmFyeTogZmFsc2UsIHNlbGVjdGlvbjogZmFsc2UgfSxcblx0XHRcdFx0XHRjbGljazogICAgICBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBzZWxlY3Rpb24gPSB0aGlzLmNvbnRyb2xsZXIuc3RhdGUoKS5nZXQoJ3NlbGVjdGlvbicpLmZpcnN0KCk7XG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRyb2xsZXIuc3RhdGUoKS5jcm9wcGVyVmlldy5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCdza2lwcGVkY3JvcCcsIHNlbGVjdGlvbik7XG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRyb2xsZXIuY2xvc2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuZnJhbWUudG9vbGJhci5zZXQoIG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIodG9vbGJhck9wdGlvbnMpICk7XG5cdH0sXG5cblx0ZG9Dcm9wOiBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRyZXR1cm4gd3AuYWpheC5wb3N0KCAnY3VzdG9tLWhlYWRlci1jcm9wJywge1xuXHRcdFx0bm9uY2U6IGF0dGFjaG1lbnQuZ2V0KCdub25jZXMnKS5lZGl0LFxuXHRcdFx0aWQ6IGF0dGFjaG1lbnQuZ2V0KCdpZCcpLFxuXHRcdFx0Y3JvcERldGFpbHM6IGF0dGFjaG1lbnQuZ2V0KCdjcm9wRGV0YWlscycpXG5cdFx0fSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBDcm9wcGVyO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLkN1c3RvbWl6ZUltYWdlQ3JvcHBlclxuICpcbiAqIEEgc3RhdGUgZm9yIGNyb3BwaW5nIGFuIGltYWdlLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuQ3JvcHBlclxuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICovXG52YXIgQ29udHJvbGxlciA9IHdwLm1lZGlhLmNvbnRyb2xsZXIsXG5cdEN1c3RvbWl6ZUltYWdlQ3JvcHBlcjtcblxuQ3VzdG9taXplSW1hZ2VDcm9wcGVyID0gQ29udHJvbGxlci5Dcm9wcGVyLmV4dGVuZCh7XG5cdGRvQ3JvcDogZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0dmFyIGNyb3BEZXRhaWxzID0gYXR0YWNobWVudC5nZXQoICdjcm9wRGV0YWlscycgKSxcblx0XHRcdGNvbnRyb2wgPSB0aGlzLmdldCggJ2NvbnRyb2wnICk7XG5cblx0XHRjcm9wRGV0YWlscy5kc3Rfd2lkdGggID0gY29udHJvbC5wYXJhbXMud2lkdGg7XG5cdFx0Y3JvcERldGFpbHMuZHN0X2hlaWdodCA9IGNvbnRyb2wucGFyYW1zLmhlaWdodDtcblxuXHRcdHJldHVybiB3cC5hamF4LnBvc3QoICdjcm9wLWltYWdlJywge1xuXHRcdFx0d3BfY3VzdG9taXplOiAnb24nLFxuXHRcdFx0bm9uY2U6IGF0dGFjaG1lbnQuZ2V0KCAnbm9uY2VzJyApLmVkaXQsXG5cdFx0XHRpZDogYXR0YWNobWVudC5nZXQoICdpZCcgKSxcblx0XHRcdGNvbnRleHQ6IGNvbnRyb2wuaWQsXG5cdFx0XHRjcm9wRGV0YWlsczogY3JvcERldGFpbHNcblx0XHR9ICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEN1c3RvbWl6ZUltYWdlQ3JvcHBlcjtcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5FZGl0SW1hZ2VcbiAqXG4gKiBBIHN0YXRlIGZvciBlZGl0aW5nIChjcm9wcGluZywgZXRjLikgYW4gaW1hZ2UuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIGhhc2ggcGFzc2VkIHRvIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH0gYXR0cmlidXRlcy5tb2RlbCAgICAgICAgICAgICAgICBUaGUgYXR0YWNobWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuaWQ9ZWRpdC1pbWFnZV0gICAgICBVbmlxdWUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMudGl0bGU9RWRpdCBJbWFnZV0gICBUaXRsZSBmb3IgdGhlIHN0YXRlLiBEaXNwbGF5cyBpbiB0aGUgbWVkaWEgbWVudSBhbmQgdGhlIGZyYW1lJ3MgdGl0bGUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5jb250ZW50PWVkaXQtaW1hZ2VdIEluaXRpYWwgbW9kZSBmb3IgdGhlIGNvbnRlbnQgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy50b29sYmFyPWVkaXQtaW1hZ2VdIEluaXRpYWwgbW9kZSBmb3IgdGhlIHRvb2xiYXIgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tZW51PWZhbHNlXSAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIG1lbnUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy51cmxdICAgICAgICAgICAgICAgIFVudXNlZC4gQHRvZG8gQ29uc2lkZXIgcmVtb3ZhbC5cbiAqL1xudmFyIGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEVkaXRJbWFnZTtcblxuRWRpdEltYWdlID0gd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZS5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdGlkOiAgICAgICdlZGl0LWltYWdlJyxcblx0XHR0aXRsZTogICBsMTBuLmVkaXRJbWFnZSxcblx0XHRtZW51OiAgICBmYWxzZSxcblx0XHR0b29sYmFyOiAnZWRpdC1pbWFnZScsXG5cdFx0Y29udGVudDogJ2VkaXQtaW1hZ2UnLFxuXHRcdHVybDogICAgICcnXG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMuZnJhbWUsICd0b29sYmFyOnJlbmRlcjplZGl0LWltYWdlJywgdGhpcy50b29sYmFyICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0ZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKCB0aGlzLmZyYW1lICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0dG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGZyYW1lID0gdGhpcy5mcmFtZSxcblx0XHRcdGxhc3RTdGF0ZSA9IGZyYW1lLmxhc3RTdGF0ZSgpLFxuXHRcdFx0cHJldmlvdXMgPSBsYXN0U3RhdGUgJiYgbGFzdFN0YXRlLmlkO1xuXG5cdFx0ZnJhbWUudG9vbGJhci5zZXQoIG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIoe1xuXHRcdFx0Y29udHJvbGxlcjogZnJhbWUsXG5cdFx0XHRpdGVtczoge1xuXHRcdFx0XHRiYWNrOiB7XG5cdFx0XHRcdFx0c3R5bGU6ICdwcmltYXJ5Jyxcblx0XHRcdFx0XHR0ZXh0OiAgICAgbDEwbi5iYWNrLFxuXHRcdFx0XHRcdHByaW9yaXR5OiAyMCxcblx0XHRcdFx0XHRjbGljazogICAgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHByZXZpb3VzICkge1xuXHRcdFx0XHRcdFx0XHRmcmFtZS5zZXRTdGF0ZSggcHJldmlvdXMgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGZyYW1lLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRWRpdEltYWdlO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLkVtYmVkXG4gKlxuICogQSBzdGF0ZSBmb3IgZW1iZWRkaW5nIG1lZGlhIGZyb20gYSBVUkwuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZXMgaGFzaCBwYXNzZWQgdG8gdGhlIHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IFthdHRyaWJ1dGVzLmlkPWVtYmVkXSAgICAgICAgICAgICAgVW5pcXVlIGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2F0dHJpYnV0ZXMudGl0bGU9SW5zZXJ0IEZyb20gVVJMXSBUaXRsZSBmb3IgdGhlIHN0YXRlLiBEaXNwbGF5cyBpbiB0aGUgbWVkaWEgbWVudSBhbmQgdGhlIGZyYW1lJ3MgdGl0bGUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IFthdHRyaWJ1dGVzLmNvbnRlbnQ9ZW1iZWRdICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgY29udGVudCByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2F0dHJpYnV0ZXMubWVudT1kZWZhdWx0XSAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSBtZW51IHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXR0cmlidXRlcy50b29sYmFyPW1haW4tZW1iZWRdICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIHRvb2xiYXIgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IFthdHRyaWJ1dGVzLm1lbnU9ZmFsc2VdICAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgbWVudSByZWdpb24uXG4gKiBAcGFyYW0ge2ludH0gICAgW2F0dHJpYnV0ZXMucHJpb3JpdHk9MTIwXSAgICAgICAgICBUaGUgcHJpb3JpdHkgZm9yIHRoZSBzdGF0ZSBsaW5rIGluIHRoZSBtZWRpYSBtZW51LlxuICogQHBhcmFtIHtzdHJpbmd9IFthdHRyaWJ1dGVzLnR5cGU9bGlua10gICAgICAgICAgICAgVGhlIHR5cGUgb2YgZW1iZWQuIEN1cnJlbnRseSBvbmx5IGxpbmsgaXMgc3VwcG9ydGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IFthdHRyaWJ1dGVzLnVybF0gICAgICAgICAgICAgICAgICAgVGhlIGVtYmVkIFVSTC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXR0cmlidXRlcy5tZXRhZGF0YT17fV0gICAgICAgICAgIFByb3BlcnRpZXMgb2YgdGhlIGVtYmVkLCB3aGljaCB3aWxsIG92ZXJyaWRlIGF0dHJpYnV0ZXMudXJsIGlmIHNldC5cbiAqL1xudmFyIGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdCQgPSBCYWNrYm9uZS4kLFxuXHRFbWJlZDtcblxuRW1iZWQgPSB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0aWQ6ICAgICAgICdlbWJlZCcsXG5cdFx0dGl0bGU6ICAgIGwxMG4uaW5zZXJ0RnJvbVVybFRpdGxlLFxuXHRcdGNvbnRlbnQ6ICAnZW1iZWQnLFxuXHRcdG1lbnU6ICAgICAnZGVmYXVsdCcsXG5cdFx0dG9vbGJhcjogICdtYWluLWVtYmVkJyxcblx0XHRwcmlvcml0eTogMTIwLFxuXHRcdHR5cGU6ICAgICAnbGluaycsXG5cdFx0dXJsOiAgICAgICcnLFxuXHRcdG1ldGFkYXRhOiB7fVxuXHR9LFxuXG5cdC8vIFRoZSBhbW91bnQgb2YgdGltZSB1c2VkIHdoZW4gZGVib3VuY2luZyB0aGUgc2Nhbi5cblx0c2Vuc2l0aXZpdHk6IDQwMCxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG5cdFx0dGhpcy5kZWJvdW5jZWRTY2FuID0gXy5kZWJvdW5jZSggXy5iaW5kKCB0aGlzLnNjYW4sIHRoaXMgKSwgdGhpcy5zZW5zaXRpdml0eSApO1xuXHRcdHRoaXMucHJvcHMgPSBuZXcgQmFja2JvbmUuTW9kZWwoIHRoaXMubWV0YWRhdGEgfHwgeyB1cmw6ICcnIH0pO1xuXHRcdHRoaXMucHJvcHMub24oICdjaGFuZ2U6dXJsJywgdGhpcy5kZWJvdW5jZWRTY2FuLCB0aGlzICk7XG5cdFx0dGhpcy5wcm9wcy5vbiggJ2NoYW5nZTp1cmwnLCB0aGlzLnJlZnJlc2gsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnc2NhbicsIHRoaXMuc2NhbkltYWdlLCB0aGlzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRyaWdnZXIgYSBzY2FuIG9mIHRoZSBlbWJlZGRlZCBVUkwncyBjb250ZW50IGZvciBtZXRhZGF0YSByZXF1aXJlZCB0byBlbWJlZC5cblx0ICpcblx0ICogQGZpcmVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuRW1iZWQjc2NhblxuXHQgKi9cblx0c2NhbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNjYW5uZXJzLFxuXHRcdFx0ZW1iZWQgPSB0aGlzLFxuXHRcdFx0YXR0cmlidXRlcyA9IHtcblx0XHRcdFx0dHlwZTogJ2xpbmsnLFxuXHRcdFx0XHRzY2FubmVyczogW11cblx0XHRcdH07XG5cblx0XHQvLyBTY2FuIGlzIHRyaWdnZXJlZCB3aXRoIHRoZSBsaXN0IG9mIGBhdHRyaWJ1dGVzYCB0byBzZXQgb24gdGhlXG5cdFx0Ly8gc3RhdGUsIHVzZWZ1bCBmb3IgdGhlICd0eXBlJyBhdHRyaWJ1dGUgYW5kICdzY2FubmVycycgYXR0cmlidXRlLFxuXHRcdC8vIGFuIGFycmF5IG9mIHByb21pc2Ugb2JqZWN0cyBmb3IgYXN5bmNocm9ub3VzIHNjYW4gb3BlcmF0aW9ucy5cblx0XHRpZiAoIHRoaXMucHJvcHMuZ2V0KCd1cmwnKSApIHtcblx0XHRcdHRoaXMudHJpZ2dlciggJ3NjYW4nLCBhdHRyaWJ1dGVzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnNjYW5uZXJzLmxlbmd0aCApIHtcblx0XHRcdHNjYW5uZXJzID0gYXR0cmlidXRlcy5zY2FubmVycyA9ICQud2hlbi5hcHBseSggJCwgYXR0cmlidXRlcy5zY2FubmVycyApO1xuXHRcdFx0c2Nhbm5lcnMuYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBlbWJlZC5nZXQoJ3NjYW5uZXJzJykgPT09IHNjYW5uZXJzICkge1xuXHRcdFx0XHRcdGVtYmVkLnNldCggJ2xvYWRpbmcnLCBmYWxzZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YXR0cmlidXRlcy5zY2FubmVycyA9IG51bGw7XG5cdFx0fVxuXG5cdFx0YXR0cmlidXRlcy5sb2FkaW5nID0gISEgYXR0cmlidXRlcy5zY2FubmVycztcblx0XHR0aGlzLnNldCggYXR0cmlidXRlcyApO1xuXHR9LFxuXHQvKipcblx0ICogVHJ5IHNjYW5uaW5nIHRoZSBlbWJlZCBhcyBhbiBpbWFnZSB0byBkaXNjb3ZlciBpdHMgZGltZW5zaW9ucy5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IGF0dHJpYnV0ZXNcblx0ICovXG5cdHNjYW5JbWFnZTogZnVuY3Rpb24oIGF0dHJpYnV0ZXMgKSB7XG5cdFx0dmFyIGZyYW1lID0gdGhpcy5mcmFtZSxcblx0XHRcdHN0YXRlID0gdGhpcyxcblx0XHRcdHVybCA9IHRoaXMucHJvcHMuZ2V0KCd1cmwnKSxcblx0XHRcdGltYWdlID0gbmV3IEltYWdlKCksXG5cdFx0XHRkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuXHRcdGF0dHJpYnV0ZXMuc2Nhbm5lcnMucHVzaCggZGVmZXJyZWQucHJvbWlzZSgpICk7XG5cblx0XHQvLyBUcnkgdG8gbG9hZCB0aGUgaW1hZ2UgYW5kIGZpbmQgaXRzIHdpZHRoL2hlaWdodC5cblx0XHRpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcblx0XHRcdGRlZmVycmVkLnJlc29sdmUoKTtcblxuXHRcdFx0aWYgKCBzdGF0ZSAhPT0gZnJhbWUuc3RhdGUoKSB8fCB1cmwgIT09IHN0YXRlLnByb3BzLmdldCgndXJsJykgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuc2V0KHtcblx0XHRcdFx0dHlwZTogJ2ltYWdlJ1xuXHRcdFx0fSk7XG5cblx0XHRcdHN0YXRlLnByb3BzLnNldCh7XG5cdFx0XHRcdHdpZHRoOiAgaW1hZ2Uud2lkdGgsXG5cdFx0XHRcdGhlaWdodDogaW1hZ2UuaGVpZ2h0XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0aW1hZ2Uub25lcnJvciA9IGRlZmVycmVkLnJlamVjdDtcblx0XHRpbWFnZS5zcmMgPSB1cmw7XG5cdH0sXG5cblx0cmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5mcmFtZS50b29sYmFyLmdldCgpLnJlZnJlc2goKTtcblx0fSxcblxuXHRyZXNldDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5wcm9wcy5jbGVhcigpLnNldCh7IHVybDogJycgfSk7XG5cblx0XHRpZiAoIHRoaXMuYWN0aXZlICkge1xuXHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbWJlZDtcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5GZWF0dXJlZEltYWdlXG4gKlxuICogQSBzdGF0ZSBmb3Igc2VsZWN0aW5nIGEgZmVhdHVyZWQgaW1hZ2UgZm9yIGEgcG9zdC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnlcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlc10gICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIGhhc2ggcGFzc2VkIHRvIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmlkPWZlYXR1cmVkLWltYWdlXSAgICAgICAgVW5pcXVlIGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy50aXRsZT1TZXQgRmVhdHVyZWQgSW1hZ2VdIFRpdGxlIGZvciB0aGUgc3RhdGUuIERpc3BsYXlzIGluIHRoZSBtZWRpYSBtZW51IGFuZCB0aGUgZnJhbWUncyB0aXRsZSByZWdpb24uXG4gKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBbYXR0cmlidXRlcy5saWJyYXJ5XSAgICAgICAgICAgICAgICAgIFRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uIHRvIGJyb3dzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb25lIGlzIG5vdCBzdXBwbGllZCwgYSBjb2xsZWN0aW9uIG9mIGFsbCBpbWFnZXMgd2lsbCBiZSBjcmVhdGVkLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMubXVsdGlwbGU9ZmFsc2VdICAgICAgICAgICBXaGV0aGVyIG11bHRpLXNlbGVjdCBpcyBlbmFibGVkLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuY29udGVudD11cGxvYWRdICAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSBjb250ZW50IHJlZ2lvbi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGRlbiBieSBwZXJzaXN0ZW50IHVzZXIgc2V0dGluZyBpZiAnY29udGVudFVzZXJTZXR0aW5nJyBpcyB0cnVlLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMubWVudT1kZWZhdWx0XSAgICAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSBtZW51IHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnJvdXRlcj1icm93c2VdICAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgcm91dGVyIHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnRvb2xiYXI9ZmVhdHVyZWQtaW1hZ2VdICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgdG9vbGJhciByZWdpb24uXG4gKiBAcGFyYW0ge2ludH0gICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5wcmlvcml0eT02MF0gICAgICAgICAgICAgIFRoZSBwcmlvcml0eSBmb3IgdGhlIHN0YXRlIGxpbmsgaW4gdGhlIG1lZGlhIG1lbnUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zZWFyY2hhYmxlPXRydWVdICAgICAgICAgIFdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgc2VhcmNoYWJsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9ICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmZpbHRlcmFibGU9ZmFsc2VdICAgICAgICAgV2hldGhlciB0aGUgbGlicmFyeSBpcyBmaWx0ZXJhYmxlLCBhbmQgaWYgc28gd2hhdCBmaWx0ZXJzIHNob3VsZCBiZSBzaG93bi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0cyAnYWxsJywgJ3VwbG9hZGVkJywgb3IgJ3VuYXR0YWNoZWQnLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc29ydGFibGU9dHJ1ZV0gICAgICAgICAgICBXaGV0aGVyIHRoZSBBdHRhY2htZW50cyBzaG91bGQgYmUgc29ydGFibGUuIERlcGVuZHMgb24gdGhlIG9yZGVyYnkgcHJvcGVydHkgYmVpbmcgc2V0IHRvIG1lbnVPcmRlciBvbiB0aGUgYXR0YWNobWVudHMgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmF1dG9TZWxlY3Q9dHJ1ZV0gICAgICAgICAgV2hldGhlciBhbiB1cGxvYWRlZCBhdHRhY2htZW50IHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5kZXNjcmliZT1mYWxzZV0gICAgICAgICAgIFdoZXRoZXIgdG8gb2ZmZXIgVUkgdG8gZGVzY3JpYmUgYXR0YWNobWVudHMgLSBlLmcuIGNhcHRpb25pbmcgaW1hZ2VzIGluIGEgZ2FsbGVyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmNvbnRlbnRVc2VyU2V0dGluZz10cnVlXSAgV2hldGhlciB0aGUgY29udGVudCByZWdpb24ncyBtb2RlIHNob3VsZCBiZSBzZXQgYW5kIHBlcnNpc3RlZCBwZXIgdXNlci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnN5bmNTZWxlY3Rpb249dHJ1ZV0gICAgICAgV2hldGhlciB0aGUgQXR0YWNobWVudHMgc2VsZWN0aW9uIHNob3VsZCBiZSBwZXJzaXN0ZWQgZnJvbSB0aGUgbGFzdCBzdGF0ZS5cbiAqL1xudmFyIEF0dGFjaG1lbnQgPSB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50LFxuXHRMaWJyYXJ5ID0gd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5LFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRGZWF0dXJlZEltYWdlO1xuXG5GZWF0dXJlZEltYWdlID0gTGlicmFyeS5leHRlbmQoe1xuXHRkZWZhdWx0czogXy5kZWZhdWx0cyh7XG5cdFx0aWQ6ICAgICAgICAgICAgJ2ZlYXR1cmVkLWltYWdlJyxcblx0XHR0aXRsZTogICAgICAgICBsMTBuLnNldEZlYXR1cmVkSW1hZ2VUaXRsZSxcblx0XHRtdWx0aXBsZTogICAgICBmYWxzZSxcblx0XHRmaWx0ZXJhYmxlOiAgICAndXBsb2FkZWQnLFxuXHRcdHRvb2xiYXI6ICAgICAgICdmZWF0dXJlZC1pbWFnZScsXG5cdFx0cHJpb3JpdHk6ICAgICAgNjAsXG5cdFx0c3luY1NlbGVjdGlvbjogdHJ1ZVxuXHR9LCBMaWJyYXJ5LnByb3RvdHlwZS5kZWZhdWx0cyApLFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsaWJyYXJ5LCBjb21wYXJhdG9yO1xuXG5cdFx0Ly8gSWYgd2UgaGF2ZW4ndCBiZWVuIHByb3ZpZGVkIGEgYGxpYnJhcnlgLCBjcmVhdGUgYSBgU2VsZWN0aW9uYC5cblx0XHRpZiAoICEgdGhpcy5nZXQoJ2xpYnJhcnknKSApIHtcblx0XHRcdHRoaXMuc2V0KCAnbGlicmFyeScsIHdwLm1lZGlhLnF1ZXJ5KHsgdHlwZTogJ2ltYWdlJyB9KSApO1xuXHRcdH1cblxuXHRcdExpYnJhcnkucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0bGlicmFyeSAgICA9IHRoaXMuZ2V0KCdsaWJyYXJ5Jyk7XG5cdFx0Y29tcGFyYXRvciA9IGxpYnJhcnkuY29tcGFyYXRvcjtcblxuXHRcdC8vIE92ZXJsb2FkIHRoZSBsaWJyYXJ5J3MgY29tcGFyYXRvciB0byBwdXNoIGl0ZW1zIHRoYXQgYXJlIG5vdCBpblxuXHRcdC8vIHRoZSBtaXJyb3JlZCBxdWVyeSB0byB0aGUgZnJvbnQgb2YgdGhlIGFnZ3JlZ2F0ZSBjb2xsZWN0aW9uLlxuXHRcdGxpYnJhcnkuY29tcGFyYXRvciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0dmFyIGFJblF1ZXJ5ID0gISEgdGhpcy5taXJyb3JpbmcuZ2V0KCBhLmNpZCApLFxuXHRcdFx0XHRiSW5RdWVyeSA9ICEhIHRoaXMubWlycm9yaW5nLmdldCggYi5jaWQgKTtcblxuXHRcdFx0aWYgKCAhIGFJblF1ZXJ5ICYmIGJJblF1ZXJ5ICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9IGVsc2UgaWYgKCBhSW5RdWVyeSAmJiAhIGJJblF1ZXJ5ICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBjb21wYXJhdG9yLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gQWRkIGFsbCBpdGVtcyBpbiB0aGUgc2VsZWN0aW9uIHRvIHRoZSBsaWJyYXJ5LCBzbyBhbnkgZmVhdHVyZWRcblx0XHQvLyBpbWFnZXMgdGhhdCBhcmUgbm90IGluaXRpYWxseSBsb2FkZWQgc3RpbGwgYXBwZWFyLlxuXHRcdGxpYnJhcnkub2JzZXJ2ZSggdGhpcy5nZXQoJ3NlbGVjdGlvbicpICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudXBkYXRlU2VsZWN0aW9uKCk7XG5cdFx0dGhpcy5mcmFtZS5vbiggJ29wZW4nLCB0aGlzLnVwZGF0ZVNlbGVjdGlvbiwgdGhpcyApO1xuXG5cdFx0TGlicmFyeS5wcm90b3R5cGUuYWN0aXZhdGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdGRlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZnJhbWUub2ZmKCAnb3BlbicsIHRoaXMudXBkYXRlU2VsZWN0aW9uLCB0aGlzICk7XG5cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5kZWFjdGl2YXRlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHR1cGRhdGVTZWxlY3Rpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzZWxlY3Rpb24gPSB0aGlzLmdldCgnc2VsZWN0aW9uJyksXG5cdFx0XHRpZCA9IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5mZWF0dXJlZEltYWdlSWQsXG5cdFx0XHRhdHRhY2htZW50O1xuXG5cdFx0aWYgKCAnJyAhPT0gaWQgJiYgLTEgIT09IGlkICkge1xuXHRcdFx0YXR0YWNobWVudCA9IEF0dGFjaG1lbnQuZ2V0KCBpZCApO1xuXHRcdFx0YXR0YWNobWVudC5mZXRjaCgpO1xuXHRcdH1cblxuXHRcdHNlbGVjdGlvbi5yZXNldCggYXR0YWNobWVudCA/IFsgYXR0YWNobWVudCBdIDogW10gKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmVhdHVyZWRJbWFnZTtcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5HYWxsZXJ5QWRkXG4gKlxuICogQSBzdGF0ZSBmb3Igc2VsZWN0aW5nIG1vcmUgaW1hZ2VzIHRvIGFkZCB0byBhIGdhbGxlcnkuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXNdICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIGhhc2ggcGFzc2VkIHRvIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmlkPWdhbGxlcnktbGlicmFyeV0gICAgICBVbmlxdWUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnRpdGxlPUFkZCB0byBHYWxsZXJ5XSAgICBUaXRsZSBmb3IgdGhlIHN0YXRlLiBEaXNwbGF5cyBpbiB0aGUgZnJhbWUncyB0aXRsZSByZWdpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tdWx0aXBsZT1hZGRdICAgICAgICAgICAgV2hldGhlciBtdWx0aS1zZWxlY3QgaXMgZW5hYmxlZC4gQHRvZG8gJ2FkZCcgZG9lc24ndCBzZWVtIGRvIGFueXRoaW5nIHNwZWNpYWwsIGFuZCBnZXRzIHVzZWQgYXMgYSBib29sZWFuLlxuICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gW2F0dHJpYnV0ZXMubGlicmFyeV0gICAgICAgICAgICAgICAgIFRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uIHRvIGJyb3dzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbmUgaXMgbm90IHN1cHBsaWVkLCBhIGNvbGxlY3Rpb24gb2YgYWxsIGltYWdlcyB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSAgICAgICAgICAgICBbYXR0cmlidXRlcy5maWx0ZXJhYmxlPXVwbG9hZGVkXSAgICAgV2hldGhlciB0aGUgbGlicmFyeSBpcyBmaWx0ZXJhYmxlLCBhbmQgaWYgc28gd2hhdCBmaWx0ZXJzIHNob3VsZCBiZSBzaG93bi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRzICdhbGwnLCAndXBsb2FkZWQnLCBvciAndW5hdHRhY2hlZCcuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tZW51PWdhbGxlcnldICAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgbWVudSByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5jb250ZW50PXVwbG9hZF0gICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgY29udGVudCByZWdpb24uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGRlbiBieSBwZXJzaXN0ZW50IHVzZXIgc2V0dGluZyBpZiAnY29udGVudFVzZXJTZXR0aW5nJyBpcyB0cnVlLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMucm91dGVyPWJyb3dzZV0gICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIHJvdXRlciByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy50b29sYmFyPWdhbGxlcnktYWRkXSAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgdG9vbGJhciByZWdpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zZWFyY2hhYmxlPXRydWVdICAgICAgICAgV2hldGhlciB0aGUgbGlicmFyeSBpcyBzZWFyY2hhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc29ydGFibGU9dHJ1ZV0gICAgICAgICAgIFdoZXRoZXIgdGhlIEF0dGFjaG1lbnRzIHNob3VsZCBiZSBzb3J0YWJsZS4gRGVwZW5kcyBvbiB0aGUgb3JkZXJieSBwcm9wZXJ0eSBiZWluZyBzZXQgdG8gbWVudU9yZGVyIG9uIHRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuYXV0b1NlbGVjdD10cnVlXSAgICAgICAgIFdoZXRoZXIgYW4gdXBsb2FkZWQgYXR0YWNobWVudCBzaG91bGQgYmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgc2VsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuY29udGVudFVzZXJTZXR0aW5nPXRydWVdIFdoZXRoZXIgdGhlIGNvbnRlbnQgcmVnaW9uJ3MgbW9kZSBzaG91bGQgYmUgc2V0IGFuZCBwZXJzaXN0ZWQgcGVyIHVzZXIuXG4gKiBAcGFyYW0ge2ludH0gICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5wcmlvcml0eT0xMDBdICAgICAgICAgICAgVGhlIHByaW9yaXR5IGZvciB0aGUgc3RhdGUgbGluayBpbiB0aGUgbWVkaWEgbWVudS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnN5bmNTZWxlY3Rpb249ZmFsc2VdICAgICBXaGV0aGVyIHRoZSBBdHRhY2htZW50cyBzZWxlY3Rpb24gc2hvdWxkIGJlIHBlcnNpc3RlZCBmcm9tIHRoZSBsYXN0IHN0YXRlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGZhbHNlIGJlY2F1c2UgZm9yIHRoaXMgc3RhdGUsIGJlY2F1c2UgdGhlIGxpYnJhcnkgb2YgdGhlIEVkaXQgR2FsbGVyeSBzdGF0ZSBpcyB0aGUgc2VsZWN0aW9uLlxuICovXG52YXIgU2VsZWN0aW9uID0gd3AubWVkaWEubW9kZWwuU2VsZWN0aW9uLFxuXHRMaWJyYXJ5ID0gd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5LFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRHYWxsZXJ5QWRkO1xuXG5HYWxsZXJ5QWRkID0gTGlicmFyeS5leHRlbmQoe1xuXHRkZWZhdWx0czogXy5kZWZhdWx0cyh7XG5cdFx0aWQ6ICAgICAgICAgICAgJ2dhbGxlcnktbGlicmFyeScsXG5cdFx0dGl0bGU6ICAgICAgICAgbDEwbi5hZGRUb0dhbGxlcnlUaXRsZSxcblx0XHRtdWx0aXBsZTogICAgICAnYWRkJyxcblx0XHRmaWx0ZXJhYmxlOiAgICAndXBsb2FkZWQnLFxuXHRcdG1lbnU6ICAgICAgICAgICdnYWxsZXJ5Jyxcblx0XHR0b29sYmFyOiAgICAgICAnZ2FsbGVyeS1hZGQnLFxuXHRcdHByaW9yaXR5OiAgICAgIDEwMCxcblx0XHRzeW5jU2VsZWN0aW9uOiBmYWxzZVxuXHR9LCBMaWJyYXJ5LnByb3RvdHlwZS5kZWZhdWx0cyApLFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIElmIGEgbGlicmFyeSB3YXNuJ3Qgc3VwcGxpZWQsIGNyZWF0ZSBhIGxpYnJhcnkgb2YgaW1hZ2VzLlxuXHRcdGlmICggISB0aGlzLmdldCgnbGlicmFyeScpICkge1xuXHRcdFx0dGhpcy5zZXQoICdsaWJyYXJ5Jywgd3AubWVkaWEucXVlcnkoeyB0eXBlOiAnaW1hZ2UnIH0pICk7XG5cdFx0fVxuXG5cdFx0TGlicmFyeS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsaWJyYXJ5ID0gdGhpcy5nZXQoJ2xpYnJhcnknKSxcblx0XHRcdGVkaXQgICAgPSB0aGlzLmZyYW1lLnN0YXRlKCdnYWxsZXJ5LWVkaXQnKS5nZXQoJ2xpYnJhcnknKTtcblxuXHRcdGlmICggdGhpcy5lZGl0TGlicmFyeSAmJiB0aGlzLmVkaXRMaWJyYXJ5ICE9PSBlZGl0ICkge1xuXHRcdFx0bGlicmFyeS51bm9ic2VydmUoIHRoaXMuZWRpdExpYnJhcnkgKTtcblx0XHR9XG5cblx0XHQvLyBBY2NlcHRzIGF0dGFjaG1lbnRzIHRoYXQgZXhpc3QgaW4gdGhlIG9yaWdpbmFsIGxpYnJhcnkgYW5kXG5cdFx0Ly8gdGhhdCBkbyBub3QgZXhpc3QgaW4gZ2FsbGVyeSdzIGxpYnJhcnkuXG5cdFx0bGlicmFyeS52YWxpZGF0b3IgPSBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRcdHJldHVybiAhISB0aGlzLm1pcnJvcmluZy5nZXQoIGF0dGFjaG1lbnQuY2lkICkgJiYgISBlZGl0LmdldCggYXR0YWNobWVudC5jaWQgKSAmJiBTZWxlY3Rpb24ucHJvdG90eXBlLnZhbGlkYXRvci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fTtcblxuXHRcdC8vIFJlc2V0IHRoZSBsaWJyYXJ5IHRvIGVuc3VyZSB0aGF0IGFsbCBhdHRhY2htZW50cyBhcmUgcmUtYWRkZWRcblx0XHQvLyB0byB0aGUgY29sbGVjdGlvbi4gRG8gc28gc2lsZW50bHksIGFzIGNhbGxpbmcgYG9ic2VydmVgIHdpbGxcblx0XHQvLyB0cmlnZ2VyIHRoZSBgcmVzZXRgIGV2ZW50LlxuXHRcdGxpYnJhcnkucmVzZXQoIGxpYnJhcnkubWlycm9yaW5nLm1vZGVscywgeyBzaWxlbnQ6IHRydWUgfSk7XG5cdFx0bGlicmFyeS5vYnNlcnZlKCBlZGl0ICk7XG5cdFx0dGhpcy5lZGl0TGlicmFyeSA9IGVkaXQ7XG5cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdhbGxlcnlBZGQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuR2FsbGVyeUVkaXRcbiAqXG4gKiBBIHN0YXRlIGZvciBlZGl0aW5nIGEgZ2FsbGVyeSdzIGltYWdlcyBhbmQgc2V0dGluZ3MuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXNdICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXR0cmlidXRlcyBoYXNoIHBhc3NlZCB0byB0aGUgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5pZD1nYWxsZXJ5LWVkaXRdICAgICAgIFVuaXF1ZSBpZGVudGlmaWVyLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMudGl0bGU9RWRpdCBHYWxsZXJ5XSAgICBUaXRsZSBmb3IgdGhlIHN0YXRlLiBEaXNwbGF5cyBpbiB0aGUgZnJhbWUncyB0aXRsZSByZWdpb24uXG4gKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBbYXR0cmlidXRlcy5saWJyYXJ5XSAgICAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uIG9mIGF0dGFjaG1lbnRzIGluIHRoZSBnYWxsZXJ5LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbmUgaXMgbm90IHN1cHBsaWVkLCBhbiBlbXB0eSBtZWRpYS5tb2RlbC5TZWxlY3Rpb24gY29sbGVjdGlvbiBpcyBjcmVhdGVkLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMubXVsdGlwbGU9ZmFsc2VdICAgICAgICBXaGV0aGVyIG11bHRpLXNlbGVjdCBpcyBlbmFibGVkLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc2VhcmNoYWJsZT1mYWxzZV0gICAgICBXaGV0aGVyIHRoZSBsaWJyYXJ5IGlzIHNlYXJjaGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zb3J0YWJsZT10cnVlXSAgICAgICAgIFdoZXRoZXIgdGhlIEF0dGFjaG1lbnRzIHNob3VsZCBiZSBzb3J0YWJsZS4gRGVwZW5kcyBvbiB0aGUgb3JkZXJieSBwcm9wZXJ0eSBiZWluZyBzZXQgdG8gbWVudU9yZGVyIG9uIHRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZGF0ZT10cnVlXSAgICAgICAgICAgICBXaGV0aGVyIHRvIHNob3cgdGhlIGRhdGUgZmlsdGVyIGluIHRoZSBicm93c2VyJ3MgdG9vbGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfGZhbHNlfSAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmNvbnRlbnQ9YnJvd3NlXSAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgY29udGVudCByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ3xmYWxzZX0gICAgICAgICAgICAgICBbYXR0cmlidXRlcy50b29sYmFyPWltYWdlLWRldGFpbHNdIEluaXRpYWwgbW9kZSBmb3IgdGhlIHRvb2xiYXIgcmVnaW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZGVzY3JpYmU9dHJ1ZV0gICAgICAgICBXaGV0aGVyIHRvIG9mZmVyIFVJIHRvIGRlc2NyaWJlIGF0dGFjaG1lbnRzIC0gZS5nLiBjYXB0aW9uaW5nIGltYWdlcyBpbiBhIGdhbGxlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5kaXNwbGF5U2V0dGluZ3M9dHJ1ZV0gIFdoZXRoZXIgdG8gc2hvdyB0aGUgYXR0YWNobWVudCBkaXNwbGF5IHNldHRpbmdzIGludGVyZmFjZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmRyYWdJbmZvPXRydWVdICAgICAgICAgV2hldGhlciB0byBzaG93IGluc3RydWN0aW9uYWwgdGV4dCBhYm91dCB0aGUgYXR0YWNobWVudHMgYmVpbmcgc29ydGFibGUuXG4gKiBAcGFyYW0ge2ludH0gICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5pZGVhbENvbHVtbldpZHRoPTE3MF0gIFRoZSBpZGVhbCBjb2x1bW4gd2lkdGggaW4gcGl4ZWxzIGZvciBhdHRhY2htZW50cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmVkaXRpbmc9ZmFsc2VdICAgICAgICAgV2hldGhlciB0aGUgZ2FsbGVyeSBpcyBiZWluZyBjcmVhdGVkLCBvciBlZGl0aW5nIGFuIGV4aXN0aW5nIGluc3RhbmNlLlxuICogQHBhcmFtIHtpbnR9ICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMucHJpb3JpdHk9NjBdICAgICAgICAgICBUaGUgcHJpb3JpdHkgZm9yIHRoZSBzdGF0ZSBsaW5rIGluIHRoZSBtZWRpYSBtZW51LlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc3luY1NlbGVjdGlvbj1mYWxzZV0gICBXaGV0aGVyIHRoZSBBdHRhY2htZW50cyBzZWxlY3Rpb24gc2hvdWxkIGJlIHBlcnNpc3RlZCBmcm9tIHRoZSBsYXN0IHN0YXRlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBmYWxzZSBmb3IgdGhpcyBzdGF0ZSwgYmVjYXVzZSB0aGUgbGlicmFyeSBwYXNzZWQgaW4gICppcyogdGhlIHNlbGVjdGlvbi5cbiAqIEBwYXJhbSB7dmlld30gICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLkF0dGFjaG1lbnRWaWV3XSAgICAgICAgVGhlIHNpbmdsZSBgQXR0YWNobWVudGAgdmlldyB0byBiZSB1c2VkIGluIHRoZSBgQXR0YWNobWVudHNgLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBub25lIHN1cHBsaWVkLCBkZWZhdWx0cyB0byB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuRWRpdExpYnJhcnkuXG4gKi9cbnZhciBMaWJyYXJ5ID0gd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5LFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRHYWxsZXJ5RWRpdDtcblxuR2FsbGVyeUVkaXQgPSBMaWJyYXJ5LmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0aWQ6ICAgICAgICAgICAgICAgJ2dhbGxlcnktZWRpdCcsXG5cdFx0dGl0bGU6ICAgICAgICAgICAgbDEwbi5lZGl0R2FsbGVyeVRpdGxlLFxuXHRcdG11bHRpcGxlOiAgICAgICAgIGZhbHNlLFxuXHRcdHNlYXJjaGFibGU6ICAgICAgIGZhbHNlLFxuXHRcdHNvcnRhYmxlOiAgICAgICAgIHRydWUsXG5cdFx0ZGF0ZTogICAgICAgICAgICAgZmFsc2UsXG5cdFx0ZGlzcGxheTogICAgICAgICAgZmFsc2UsXG5cdFx0Y29udGVudDogICAgICAgICAgJ2Jyb3dzZScsXG5cdFx0dG9vbGJhcjogICAgICAgICAgJ2dhbGxlcnktZWRpdCcsXG5cdFx0ZGVzY3JpYmU6ICAgICAgICAgdHJ1ZSxcblx0XHRkaXNwbGF5U2V0dGluZ3M6ICB0cnVlLFxuXHRcdGRyYWdJbmZvOiAgICAgICAgIHRydWUsXG5cdFx0aWRlYWxDb2x1bW5XaWR0aDogMTcwLFxuXHRcdGVkaXRpbmc6ICAgICAgICAgIGZhbHNlLFxuXHRcdHByaW9yaXR5OiAgICAgICAgIDYwLFxuXHRcdHN5bmNTZWxlY3Rpb246ICAgIGZhbHNlXG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gSWYgd2UgaGF2ZW4ndCBiZWVuIHByb3ZpZGVkIGEgYGxpYnJhcnlgLCBjcmVhdGUgYSBgU2VsZWN0aW9uYC5cblx0XHRpZiAoICEgdGhpcy5nZXQoJ2xpYnJhcnknKSApIHtcblx0XHRcdHRoaXMuc2V0KCAnbGlicmFyeScsIG5ldyB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb24oKSApO1xuXHRcdH1cblxuXHRcdC8vIFRoZSBzaW5nbGUgYEF0dGFjaG1lbnRgIHZpZXcgdG8gYmUgdXNlZCBpbiB0aGUgYEF0dGFjaG1lbnRzYCB2aWV3LlxuXHRcdGlmICggISB0aGlzLmdldCgnQXR0YWNobWVudFZpZXcnKSApIHtcblx0XHRcdHRoaXMuc2V0KCAnQXR0YWNobWVudFZpZXcnLCB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuRWRpdExpYnJhcnkgKTtcblx0XHR9XG5cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGxpYnJhcnkgPSB0aGlzLmdldCgnbGlicmFyeScpO1xuXG5cdFx0Ly8gTGltaXQgdGhlIGxpYnJhcnkgdG8gaW1hZ2VzIG9ubHkuXG5cdFx0bGlicmFyeS5wcm9wcy5zZXQoICd0eXBlJywgJ2ltYWdlJyApO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIHVwbG9hZGVkIGF0dGFjaG1lbnRzLlxuXHRcdHRoaXMuZ2V0KCdsaWJyYXJ5Jykub2JzZXJ2ZSggd3AuVXBsb2FkZXIucXVldWUgKTtcblxuXHRcdHRoaXMuZnJhbWUub24oICdjb250ZW50OnJlbmRlcjpicm93c2UnLCB0aGlzLmdhbGxlcnlTZXR0aW5ncywgdGhpcyApO1xuXG5cdFx0TGlicmFyeS5wcm90b3R5cGUuYWN0aXZhdGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdGRlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFN0b3Agd2F0Y2hpbmcgZm9yIHVwbG9hZGVkIGF0dGFjaG1lbnRzLlxuXHRcdHRoaXMuZ2V0KCdsaWJyYXJ5JykudW5vYnNlcnZlKCB3cC5VcGxvYWRlci5xdWV1ZSApO1xuXG5cdFx0dGhpcy5mcmFtZS5vZmYoICdjb250ZW50OnJlbmRlcjpicm93c2UnLCB0aGlzLmdhbGxlcnlTZXR0aW5ncywgdGhpcyApO1xuXG5cdFx0TGlicmFyeS5wcm90b3R5cGUuZGVhY3RpdmF0ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKlxuXHQgKiBAcGFyYW0gYnJvd3NlclxuXHQgKi9cblx0Z2FsbGVyeVNldHRpbmdzOiBmdW5jdGlvbiggYnJvd3NlciApIHtcblx0XHRpZiAoICEgdGhpcy5nZXQoJ2Rpc3BsYXlTZXR0aW5ncycpICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBsaWJyYXJ5ID0gdGhpcy5nZXQoJ2xpYnJhcnknKTtcblxuXHRcdGlmICggISBsaWJyYXJ5IHx8ICEgYnJvd3NlciApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsaWJyYXJ5LmdhbGxlcnkgPSBsaWJyYXJ5LmdhbGxlcnkgfHwgbmV3IEJhY2tib25lLk1vZGVsKCk7XG5cblx0XHRicm93c2VyLnNpZGViYXIuc2V0KHtcblx0XHRcdGdhbGxlcnk6IG5ldyB3cC5tZWRpYS52aWV3LlNldHRpbmdzLkdhbGxlcnkoe1xuXHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0XHRtb2RlbDogICAgICBsaWJyYXJ5LmdhbGxlcnksXG5cdFx0XHRcdHByaW9yaXR5OiAgIDQwXG5cdFx0XHR9KVxuXHRcdH0pO1xuXG5cdFx0YnJvd3Nlci50b29sYmFyLnNldCggJ3JldmVyc2UnLCB7XG5cdFx0XHR0ZXh0OiAgICAgbDEwbi5yZXZlcnNlT3JkZXIsXG5cdFx0XHRwcmlvcml0eTogODAsXG5cblx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bGlicmFyeS5yZXNldCggbGlicmFyeS50b0FycmF5KCkucmV2ZXJzZSgpICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdhbGxlcnlFZGl0O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLkltYWdlRGV0YWlsc1xuICpcbiAqIEEgc3RhdGUgZm9yIGVkaXRpbmcgdGhlIGF0dGFjaG1lbnQgZGlzcGxheSBzZXR0aW5ncyBvZiBhbiBpbWFnZSB0aGF0J3MgYmVlblxuICogaW5zZXJ0ZWQgaW50byB0aGUgZWRpdG9yLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXNdICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXR0cmlidXRlcyBoYXNoIHBhc3NlZCB0byB0aGUgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmlkPWltYWdlLWRldGFpbHNdICAgICAgVW5pcXVlIGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnRpdGxlPUltYWdlIERldGFpbHNdICAgVGl0bGUgZm9yIHRoZSBzdGF0ZS4gRGlzcGxheXMgaW4gdGhlIGZyYW1lJ3MgdGl0bGUgcmVnaW9uLlxuICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRyaWJ1dGVzLmltYWdlICAgICAgICAgICAgICAgICAgIFRoZSBpbWFnZSdzIG1vZGVsLlxuICogQHBhcmFtIHtzdHJpbmd8ZmFsc2V9ICAgICAgICAgICAgICBbYXR0cmlidXRlcy5jb250ZW50PWltYWdlLWRldGFpbHNdIEluaXRpYWwgbW9kZSBmb3IgdGhlIGNvbnRlbnQgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd8ZmFsc2V9ICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tZW51PWZhbHNlXSAgICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIG1lbnUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd8ZmFsc2V9ICAgICAgICAgICAgICBbYXR0cmlidXRlcy5yb3V0ZXI9ZmFsc2VdICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIHJvdXRlciByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ3xmYWxzZX0gICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnRvb2xiYXI9aW1hZ2UtZGV0YWlsc10gSW5pdGlhbCBtb2RlIGZvciB0aGUgdG9vbGJhciByZWdpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmVkaXRpbmc9ZmFsc2VdICAgICAgICAgVW51c2VkLlxuICogQHBhcmFtIHtpbnR9ICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5wcmlvcml0eT02MF0gICAgICAgICAgIFVudXNlZC5cbiAqXG4gKiBAdG9kbyBUaGlzIHN0YXRlIGluaGVyaXRzIHNvbWUgZGVmYXVsdHMgZnJvbSBtZWRpYS5jb250cm9sbGVyLkxpYnJhcnkucHJvdG90eXBlLmRlZmF1bHRzLFxuICogICAgICAgaG93ZXZlciB0aGlzIG1heSBub3QgZG8gYW55dGhpbmcuXG4gKi9cbnZhciBTdGF0ZSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUsXG5cdExpYnJhcnkgPSB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnksXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEltYWdlRGV0YWlscztcblxuSW1hZ2VEZXRhaWxzID0gU3RhdGUuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IF8uZGVmYXVsdHMoe1xuXHRcdGlkOiAgICAgICAnaW1hZ2UtZGV0YWlscycsXG5cdFx0dGl0bGU6ICAgIGwxMG4uaW1hZ2VEZXRhaWxzVGl0bGUsXG5cdFx0Y29udGVudDogICdpbWFnZS1kZXRhaWxzJyxcblx0XHRtZW51OiAgICAgZmFsc2UsXG5cdFx0cm91dGVyOiAgIGZhbHNlLFxuXHRcdHRvb2xiYXI6ICAnaW1hZ2UtZGV0YWlscycsXG5cdFx0ZWRpdGluZzogIGZhbHNlLFxuXHRcdHByaW9yaXR5OiA2MFxuXHR9LCBMaWJyYXJ5LnByb3RvdHlwZS5kZWZhdWx0cyApLFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICpcblx0ICogQHBhcmFtIG9wdGlvbnMgQXR0cmlidXRlc1xuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dGhpcy5pbWFnZSA9IG9wdGlvbnMuaW1hZ2U7XG5cdFx0U3RhdGUucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICovXG5cdGFjdGl2YXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmZyYW1lLm1vZGFsLiRlbC5hZGRDbGFzcygnaW1hZ2UtZGV0YWlscycpO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbWFnZURldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeVxuICpcbiAqIEEgc3RhdGUgZm9yIGNob29zaW5nIGFuIGF0dGFjaG1lbnQgb3IgZ3JvdXAgb2YgYXR0YWNobWVudHMgZnJvbSB0aGUgbWVkaWEgbGlicmFyeS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqIEBtaXhlcyBtZWRpYS5zZWxlY3Rpb25TeW5jXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlc10gICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZXMgaGFzaCBwYXNzZWQgdG8gdGhlIHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5pZD1saWJyYXJ5XSAgICAgICAgICAgICAgVW5pcXVlIGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnRpdGxlPU1lZGlhIGxpYnJhcnldICAgICBUaXRsZSBmb3IgdGhlIHN0YXRlLiBEaXNwbGF5cyBpbiB0aGUgbWVkaWEgbWVudSBhbmQgdGhlIGZyYW1lJ3MgdGl0bGUgcmVnaW9uLlxuICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gICAgICBbYXR0cmlidXRlcy5saWJyYXJ5XSAgICAgICAgICAgICAgICAgVGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gdG8gYnJvd3NlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb25lIGlzIG5vdCBzdXBwbGllZCwgYSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRhY2htZW50cyB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbnxvYmplY3R9IFthdHRyaWJ1dGVzLnNlbGVjdGlvbl0gICAgICAgICAgICAgICBBIGNvbGxlY3Rpb24gdG8gY29udGFpbiBhdHRhY2htZW50IHNlbGVjdGlvbnMgd2l0aGluIHRoZSBzdGF0ZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSAnc2VsZWN0aW9uJyBhdHRyaWJ1dGUgaXMgYSBwbGFpbiBKUyBvYmplY3QsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIFNlbGVjdGlvbiB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgaXRzIHZhbHVlcyBhcyB0aGUgc2VsZWN0aW9uIGluc3RhbmNlJ3MgYHByb3BzYCBtb2RlbC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgaXQgd2lsbCBjb3B5IHRoZSBsaWJyYXJ5J3MgYHByb3BzYCBtb2RlbC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMubXVsdGlwbGU9ZmFsc2VdICAgICAgICAgIFdoZXRoZXIgbXVsdGktc2VsZWN0IGlzIGVuYWJsZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmNvbnRlbnQ9dXBsb2FkXSAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSBjb250ZW50IHJlZ2lvbi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJyaWRkZW4gYnkgcGVyc2lzdGVudCB1c2VyIHNldHRpbmcgaWYgJ2NvbnRlbnRVc2VyU2V0dGluZycgaXMgdHJ1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMubWVudT1kZWZhdWx0XSAgICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIG1lbnUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5yb3V0ZXI9YnJvd3NlXSAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgcm91dGVyIHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMudG9vbGJhcj1zZWxlY3RdICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIHRvb2xiYXIgcmVnaW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zZWFyY2hhYmxlPXRydWVdICAgICAgICAgV2hldGhlciB0aGUgbGlicmFyeSBpcyBzZWFyY2hhYmxlLlxuICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5maWx0ZXJhYmxlPWZhbHNlXSAgICAgICAgV2hldGhlciB0aGUgbGlicmFyeSBpcyBmaWx0ZXJhYmxlLCBhbmQgaWYgc28gd2hhdCBmaWx0ZXJzIHNob3VsZCBiZSBzaG93bi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdHMgJ2FsbCcsICd1cGxvYWRlZCcsIG9yICd1bmF0dGFjaGVkJy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc29ydGFibGU9dHJ1ZV0gICAgICAgICAgIFdoZXRoZXIgdGhlIEF0dGFjaG1lbnRzIHNob3VsZCBiZSBzb3J0YWJsZS4gRGVwZW5kcyBvbiB0aGUgb3JkZXJieSBwcm9wZXJ0eSBiZWluZyBzZXQgdG8gbWVudU9yZGVyIG9uIHRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5hdXRvU2VsZWN0PXRydWVdICAgICAgICAgV2hldGhlciBhbiB1cGxvYWRlZCBhdHRhY2htZW50IHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmRlc2NyaWJlPWZhbHNlXSAgICAgICAgICBXaGV0aGVyIHRvIG9mZmVyIFVJIHRvIGRlc2NyaWJlIGF0dGFjaG1lbnRzIC0gZS5nLiBjYXB0aW9uaW5nIGltYWdlcyBpbiBhIGdhbGxlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmNvbnRlbnRVc2VyU2V0dGluZz10cnVlXSBXaGV0aGVyIHRoZSBjb250ZW50IHJlZ2lvbidzIG1vZGUgc2hvdWxkIGJlIHNldCBhbmQgcGVyc2lzdGVkIHBlciB1c2VyLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zeW5jU2VsZWN0aW9uPXRydWVdICAgICAgV2hldGhlciB0aGUgQXR0YWNobWVudHMgc2VsZWN0aW9uIHNob3VsZCBiZSBwZXJzaXN0ZWQgZnJvbSB0aGUgbGFzdCBzdGF0ZS5cbiAqL1xudmFyIGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdGdldFVzZXJTZXR0aW5nID0gd2luZG93LmdldFVzZXJTZXR0aW5nLFxuXHRzZXRVc2VyU2V0dGluZyA9IHdpbmRvdy5zZXRVc2VyU2V0dGluZyxcblx0TGlicmFyeTtcblxuTGlicmFyeSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogICAgICAgICAgICAgICAgICdsaWJyYXJ5Jyxcblx0XHR0aXRsZTogICAgICAgICAgICAgIGwxMG4ubWVkaWFMaWJyYXJ5VGl0bGUsXG5cdFx0bXVsdGlwbGU6ICAgICAgICAgICBmYWxzZSxcblx0XHRjb250ZW50OiAgICAgICAgICAgICd1cGxvYWQnLFxuXHRcdG1lbnU6ICAgICAgICAgICAgICAgJ2RlZmF1bHQnLFxuXHRcdHJvdXRlcjogICAgICAgICAgICAgJ2Jyb3dzZScsXG5cdFx0dG9vbGJhcjogICAgICAgICAgICAnc2VsZWN0Jyxcblx0XHRzZWFyY2hhYmxlOiAgICAgICAgIHRydWUsXG5cdFx0ZmlsdGVyYWJsZTogICAgICAgICBmYWxzZSxcblx0XHRzb3J0YWJsZTogICAgICAgICAgIHRydWUsXG5cdFx0YXV0b1NlbGVjdDogICAgICAgICB0cnVlLFxuXHRcdGRlc2NyaWJlOiAgICAgICAgICAgZmFsc2UsXG5cdFx0Y29udGVudFVzZXJTZXR0aW5nOiB0cnVlLFxuXHRcdHN5bmNTZWxlY3Rpb246ICAgICAgdHJ1ZVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBJZiBhIGxpYnJhcnkgaXNuJ3QgcHJvdmlkZWQsIHF1ZXJ5IGFsbCBtZWRpYSBpdGVtcy5cblx0ICogSWYgYSBzZWxlY3Rpb24gaW5zdGFuY2UgaXNuJ3QgcHJvdmlkZWQsIGNyZWF0ZSBvbmUuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMuZ2V0KCdzZWxlY3Rpb24nKSxcblx0XHRcdHByb3BzO1xuXG5cdFx0aWYgKCAhIHRoaXMuZ2V0KCdsaWJyYXJ5JykgKSB7XG5cdFx0XHR0aGlzLnNldCggJ2xpYnJhcnknLCB3cC5tZWRpYS5xdWVyeSgpICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhICggc2VsZWN0aW9uIGluc3RhbmNlb2Ygd3AubWVkaWEubW9kZWwuU2VsZWN0aW9uICkgKSB7XG5cdFx0XHRwcm9wcyA9IHNlbGVjdGlvbjtcblxuXHRcdFx0aWYgKCAhIHByb3BzICkge1xuXHRcdFx0XHRwcm9wcyA9IHRoaXMuZ2V0KCdsaWJyYXJ5JykucHJvcHMudG9KU09OKCk7XG5cdFx0XHRcdHByb3BzID0gXy5vbWl0KCBwcm9wcywgJ29yZGVyYnknLCAncXVlcnknICk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc2V0KCAnc2VsZWN0aW9uJywgbmV3IHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbiggbnVsbCwge1xuXHRcdFx0XHRtdWx0aXBsZTogdGhpcy5nZXQoJ211bHRpcGxlJyksXG5cdFx0XHRcdHByb3BzOiBwcm9wc1xuXHRcdFx0fSkgKTtcblx0XHR9XG5cblx0XHR0aGlzLnJlc2V0RGlzcGxheXMoKTtcblx0fSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zeW5jU2VsZWN0aW9uKCk7XG5cblx0XHR3cC5VcGxvYWRlci5xdWV1ZS5vbiggJ2FkZCcsIHRoaXMudXBsb2FkaW5nLCB0aGlzICk7XG5cblx0XHR0aGlzLmdldCgnc2VsZWN0aW9uJykub24oICdhZGQgcmVtb3ZlIHJlc2V0JywgdGhpcy5yZWZyZXNoQ29udGVudCwgdGhpcyApO1xuXG5cdFx0aWYgKCB0aGlzLmdldCggJ3JvdXRlcicgKSAmJiB0aGlzLmdldCgnY29udGVudFVzZXJTZXR0aW5nJykgKSB7XG5cdFx0XHR0aGlzLmZyYW1lLm9uKCAnY29udGVudDphY3RpdmF0ZScsIHRoaXMuc2F2ZUNvbnRlbnRNb2RlLCB0aGlzICk7XG5cdFx0XHR0aGlzLnNldCggJ2NvbnRlbnQnLCBnZXRVc2VyU2V0dGluZyggJ2xpYnJhcnlDb250ZW50JywgdGhpcy5nZXQoJ2NvbnRlbnQnKSApICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdGRlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVjb3JkU2VsZWN0aW9uKCk7XG5cblx0XHR0aGlzLmZyYW1lLm9mZiggJ2NvbnRlbnQ6YWN0aXZhdGUnLCB0aGlzLnNhdmVDb250ZW50TW9kZSwgdGhpcyApO1xuXG5cdFx0Ly8gVW5iaW5kIGFsbCBldmVudCBoYW5kbGVycyB0aGF0IHVzZSB0aGlzIHN0YXRlIGFzIHRoZSBjb250ZXh0XG5cdFx0Ly8gZnJvbSB0aGUgc2VsZWN0aW9uLlxuXHRcdHRoaXMuZ2V0KCdzZWxlY3Rpb24nKS5vZmYoIG51bGwsIG51bGwsIHRoaXMgKTtcblxuXHRcdHdwLlVwbG9hZGVyLnF1ZXVlLm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXNldCB0aGUgbGlicmFyeSB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRyZXNldDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5nZXQoJ3NlbGVjdGlvbicpLnJlc2V0KCk7XG5cdFx0dGhpcy5yZXNldERpc3BsYXlzKCk7XG5cdFx0dGhpcy5yZWZyZXNoQ29udGVudCgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXNldCB0aGUgYXR0YWNobWVudCBkaXNwbGF5IHNldHRpbmdzIGRlZmF1bHRzIHRvIHRoZSBzaXRlIG9wdGlvbnMuXG5cdCAqXG5cdCAqIElmIHNpdGUgb3B0aW9ucyBkb24ndCBkZWZpbmUgdGhlbSwgZmFsbCBiYWNrIHRvIGEgcGVyc2lzdGVudCB1c2VyIHNldHRpbmcuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0cmVzZXREaXNwbGF5czogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGRlZmF1bHRQcm9wcyA9IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MuZGVmYXVsdFByb3BzO1xuXHRcdHRoaXMuX2Rpc3BsYXlzID0gW107XG5cdFx0dGhpcy5fZGVmYXVsdERpc3BsYXlTZXR0aW5ncyA9IHtcblx0XHRcdGFsaWduOiBnZXRVc2VyU2V0dGluZyggJ2FsaWduJywgZGVmYXVsdFByb3BzLmFsaWduICkgfHwgJ25vbmUnLFxuXHRcdFx0c2l6ZTogIGdldFVzZXJTZXR0aW5nKCAnaW1nc2l6ZScsIGRlZmF1bHRQcm9wcy5zaXplICkgfHwgJ21lZGl1bScsXG5cdFx0XHRsaW5rOiAgZ2V0VXNlclNldHRpbmcoICd1cmxidXR0b24nLCBkZWZhdWx0UHJvcHMubGluayApIHx8ICdub25lJ1xuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIG1vZGVsIHRvIHJlcHJlc2VudCBkaXNwbGF5IHNldHRpbmdzIChhbGlnbm1lbnQsIGV0Yy4pIGZvciBhbiBhdHRhY2htZW50LlxuXHQgKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRhY2htZW50XG5cdCAqIEByZXR1cm5zIHtCYWNrYm9uZS5Nb2RlbH1cblx0ICovXG5cdGRpc3BsYXk6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdHZhciBkaXNwbGF5cyA9IHRoaXMuX2Rpc3BsYXlzO1xuXG5cdFx0aWYgKCAhIGRpc3BsYXlzWyBhdHRhY2htZW50LmNpZCBdICkge1xuXHRcdFx0ZGlzcGxheXNbIGF0dGFjaG1lbnQuY2lkIF0gPSBuZXcgQmFja2JvbmUuTW9kZWwoIHRoaXMuZGVmYXVsdERpc3BsYXlTZXR0aW5ncyggYXR0YWNobWVudCApICk7XG5cdFx0fVxuXHRcdHJldHVybiBkaXNwbGF5c1sgYXR0YWNobWVudC5jaWQgXTtcblx0fSxcblxuXHQvKipcblx0ICogR2l2ZW4gYW4gYXR0YWNobWVudCwgY3JlYXRlIGF0dGFjaG1lbnQgZGlzcGxheSBzZXR0aW5ncyBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAc2luY2UgMy42LjBcblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRhY2htZW50XG5cdCAqIEByZXR1cm5zIHtPYmplY3R9XG5cdCAqL1xuXHRkZWZhdWx0RGlzcGxheVNldHRpbmdzOiBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHR2YXIgc2V0dGluZ3MgPSBfLmNsb25lKCB0aGlzLl9kZWZhdWx0RGlzcGxheVNldHRpbmdzICk7XG5cblx0XHRpZiAoIHNldHRpbmdzLmNhbkVtYmVkID0gdGhpcy5jYW5FbWJlZCggYXR0YWNobWVudCApICkge1xuXHRcdFx0c2V0dGluZ3MubGluayA9ICdlbWJlZCc7XG5cdFx0fSBlbHNlIGlmICggISB0aGlzLmlzSW1hZ2VBdHRhY2htZW50KCBhdHRhY2htZW50ICkgJiYgc2V0dGluZ3MubGluayA9PT0gJ25vbmUnICkge1xuXHRcdFx0c2V0dGluZ3MubGluayA9ICdmaWxlJztcblx0XHR9XG5cblx0XHRyZXR1cm4gc2V0dGluZ3M7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFdoZXRoZXIgYW4gYXR0YWNobWVudCBpcyBpbWFnZS5cblx0ICpcblx0ICogQHNpbmNlIDQuNC4xXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH0gYXR0YWNobWVudFxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cblx0ICovXG5cdGlzSW1hZ2VBdHRhY2htZW50OiBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHQvLyBJZiB1cGxvYWRpbmcsIHdlIGtub3cgdGhlIGZpbGVuYW1lIGJ1dCBub3QgdGhlIG1pbWUgdHlwZS5cblx0XHRpZiAoIGF0dGFjaG1lbnQuZ2V0KCd1cGxvYWRpbmcnKSApIHtcblx0XHRcdHJldHVybiAvXFwuKGpwZT9nfHBuZ3xnaWYpJC9pLnRlc3QoIGF0dGFjaG1lbnQuZ2V0KCdmaWxlbmFtZScpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGF0dGFjaG1lbnQuZ2V0KCd0eXBlJykgPT09ICdpbWFnZSc7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFdoZXRoZXIgYW4gYXR0YWNobWVudCBjYW4gYmUgZW1iZWRkZWQgKGF1ZGlvIG9yIHZpZGVvKS5cblx0ICpcblx0ICogQHNpbmNlIDMuNi4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH0gYXR0YWNobWVudFxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cblx0ICovXG5cdGNhbkVtYmVkOiBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHQvLyBJZiB1cGxvYWRpbmcsIHdlIGtub3cgdGhlIGZpbGVuYW1lIGJ1dCBub3QgdGhlIG1pbWUgdHlwZS5cblx0XHRpZiAoICEgYXR0YWNobWVudC5nZXQoJ3VwbG9hZGluZycpICkge1xuXHRcdFx0dmFyIHR5cGUgPSBhdHRhY2htZW50LmdldCgndHlwZScpO1xuXHRcdFx0aWYgKCB0eXBlICE9PSAnYXVkaW8nICYmIHR5cGUgIT09ICd2aWRlbycgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gXy5jb250YWlucyggd3AubWVkaWEudmlldy5zZXR0aW5ncy5lbWJlZEV4dHMsIGF0dGFjaG1lbnQuZ2V0KCdmaWxlbmFtZScpLnNwbGl0KCcuJykucG9wKCkgKTtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBJZiB0aGUgc3RhdGUgaXMgYWN0aXZlLCBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIGFuZCB0aGUgY3VycmVudFxuXHQgKiBjb250ZW50IG1vZGUgaXMgbm90IGFuIG9wdGlvbiBpbiB0aGUgc3RhdGUncyByb3V0ZXIgKHByb3ZpZGVkXG5cdCAqIHRoZSBzdGF0ZSBoYXMgYSByb3V0ZXIpLCByZXNldCB0aGUgY29udGVudCBtb2RlIHRvIHRoZSBkZWZhdWx0LlxuXHQgKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdHJlZnJlc2hDb250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2VsZWN0aW9uID0gdGhpcy5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0ZnJhbWUgPSB0aGlzLmZyYW1lLFxuXHRcdFx0cm91dGVyID0gZnJhbWUucm91dGVyLmdldCgpLFxuXHRcdFx0bW9kZSA9IGZyYW1lLmNvbnRlbnQubW9kZSgpO1xuXG5cdFx0aWYgKCB0aGlzLmFjdGl2ZSAmJiAhIHNlbGVjdGlvbi5sZW5ndGggJiYgcm91dGVyICYmICEgcm91dGVyLmdldCggbW9kZSApICkge1xuXHRcdFx0dGhpcy5mcmFtZS5jb250ZW50LnJlbmRlciggdGhpcy5nZXQoJ2NvbnRlbnQnKSApO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2FsbGJhY2sgaGFuZGxlciB3aGVuIGFuIGF0dGFjaG1lbnQgaXMgdXBsb2FkZWQuXG5cdCAqXG5cdCAqIFN3aXRjaCB0byB0aGUgTWVkaWEgTGlicmFyeSBpZiB1cGxvYWRlZCBmcm9tIHRoZSAnVXBsb2FkIEZpbGVzJyB0YWIuXG5cdCAqXG5cdCAqIEFkZHMgYW55IHVwbG9hZGluZyBhdHRhY2htZW50cyB0byB0aGUgc2VsZWN0aW9uLlxuXHQgKlxuXHQgKiBJZiB0aGUgc3RhdGUgb25seSBzdXBwb3J0cyBvbmUgYXR0YWNobWVudCB0byBiZSBzZWxlY3RlZCBhbmQgbXVsdGlwbGVcblx0ICogYXR0YWNobWVudHMgYXJlIHVwbG9hZGVkLCB0aGUgbGFzdCBhdHRhY2htZW50IGluIHRoZSB1cGxvYWQgcXVldWUgd2lsbFxuXHQgKiBiZSBzZWxlY3RlZC5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH0gYXR0YWNobWVudFxuXHQgKi9cblx0dXBsb2FkaW5nOiBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHR2YXIgY29udGVudCA9IHRoaXMuZnJhbWUuY29udGVudDtcblxuXHRcdGlmICggJ3VwbG9hZCcgPT09IGNvbnRlbnQubW9kZSgpICkge1xuXHRcdFx0dGhpcy5mcmFtZS5jb250ZW50Lm1vZGUoJ2Jyb3dzZScpO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5nZXQoICdhdXRvU2VsZWN0JyApICkge1xuXHRcdFx0dGhpcy5nZXQoJ3NlbGVjdGlvbicpLmFkZCggYXR0YWNobWVudCApO1xuXHRcdFx0dGhpcy5mcmFtZS50cmlnZ2VyKCAnbGlicmFyeTpzZWxlY3Rpb246YWRkJyApO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUGVyc2lzdCB0aGUgbW9kZSBvZiB0aGUgY29udGVudCByZWdpb24gYXMgYSB1c2VyIHNldHRpbmcuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0c2F2ZUNvbnRlbnRNb2RlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICdicm93c2UnICE9PSB0aGlzLmdldCgncm91dGVyJykgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIG1vZGUgPSB0aGlzLmZyYW1lLmNvbnRlbnQubW9kZSgpLFxuXHRcdFx0dmlldyA9IHRoaXMuZnJhbWUucm91dGVyLmdldCgpO1xuXG5cdFx0aWYgKCB2aWV3ICYmIHZpZXcuZ2V0KCBtb2RlICkgKSB7XG5cdFx0XHRzZXRVc2VyU2V0dGluZyggJ2xpYnJhcnlDb250ZW50JywgbW9kZSApO1xuXHRcdH1cblx0fVxufSk7XG5cbi8vIE1ha2Ugc2VsZWN0aW9uU3luYyBhdmFpbGFibGUgb24gYW55IE1lZGlhIExpYnJhcnkgc3RhdGUuXG5fLmV4dGVuZCggTGlicmFyeS5wcm90b3R5cGUsIHdwLm1lZGlhLnNlbGVjdGlvblN5bmMgKTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaWJyYXJ5O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLk1lZGlhTGlicmFyeVxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICovXG52YXIgTGlicmFyeSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeSxcblx0TWVkaWFMaWJyYXJ5O1xuXG5NZWRpYUxpYnJhcnkgPSBMaWJyYXJ5LmV4dGVuZCh7XG5cdGRlZmF1bHRzOiBfLmRlZmF1bHRzKHtcblx0XHQvLyBBdHRhY2htZW50cyBicm93c2VyIGRlZmF1bHRzLiBAc2VlIG1lZGlhLnZpZXcuQXR0YWNobWVudHNCcm93c2VyXG5cdFx0ZmlsdGVyYWJsZTogICAgICAndXBsb2FkZWQnLFxuXG5cdFx0ZGlzcGxheVNldHRpbmdzOiBmYWxzZSxcblx0XHRwcmlvcml0eTogICAgICAgIDgwLFxuXHRcdHN5bmNTZWxlY3Rpb246ICAgZmFsc2Vcblx0fSwgTGlicmFyeS5wcm90b3R5cGUuZGVmYXVsdHMgKSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuOS4wXG5cdCAqXG5cdCAqIEBwYXJhbSBvcHRpb25zXG5cdCAqL1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR0aGlzLm1lZGlhID0gb3B0aW9ucy5tZWRpYTtcblx0XHR0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG5cdFx0dGhpcy5zZXQoICdsaWJyYXJ5Jywgd3AubWVkaWEucXVlcnkoeyB0eXBlOiB0aGlzLnR5cGUgfSkgKTtcblxuXHRcdExpYnJhcnkucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICovXG5cdGFjdGl2YXRlOiBmdW5jdGlvbigpIHtcblx0XHQvLyBAdG9kbyB0aGlzIHNob3VsZCB1c2UgdGhpcy5mcmFtZS5cblx0XHRpZiAoIHdwLm1lZGlhLmZyYW1lLmxhc3RNaW1lICkge1xuXHRcdFx0dGhpcy5zZXQoICdsaWJyYXJ5Jywgd3AubWVkaWEucXVlcnkoeyB0eXBlOiB3cC5tZWRpYS5mcmFtZS5sYXN0TWltZSB9KSApO1xuXHRcdFx0ZGVsZXRlIHdwLm1lZGlhLmZyYW1lLmxhc3RNaW1lO1xuXHRcdH1cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1lZGlhTGlicmFyeTtcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5SZWdpb25cbiAqXG4gKiBBIHJlZ2lvbiBpcyBhIHBlcnNpc3RlbnQgYXBwbGljYXRpb24gbGF5b3V0IGFyZWEuXG4gKlxuICogQSByZWdpb24gYXNzdW1lcyBvbmUgbW9kZSBhdCBhbnkgdGltZSwgYW5kIGNhbiBiZSBzd2l0Y2hlZCB0byBhbm90aGVyLlxuICpcbiAqIFdoZW4gbW9kZSBjaGFuZ2VzLCBldmVudHMgYXJlIHRyaWdnZXJlZCBvbiB0aGUgcmVnaW9uJ3MgcGFyZW50IHZpZXcuXG4gKiBUaGUgcGFyZW50IHZpZXcgd2lsbCBsaXN0ZW4gdG8gc3BlY2lmaWMgZXZlbnRzIGFuZCBmaWxsIHRoZSByZWdpb24gd2l0aCBhblxuICogYXBwcm9wcmlhdGUgdmlldyBkZXBlbmRpbmcgb24gbW9kZS4gRm9yIGV4YW1wbGUsIGEgZnJhbWUgbGlzdGVucyBmb3IgdGhlXG4gKiAnYnJvd3NlJyBtb2RlIHQgYmUgYWN0aXZhdGVkIG9uIHRoZSAnY29udGVudCcgdmlldyBhbmQgdGhlbiBmaWxscyB0aGUgcmVnaW9uXG4gKiB3aXRoIGFuIEF0dGFjaG1lbnRzQnJvd3NlciB2aWV3LlxuICpcbiAqIEBjbGFzc1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICAgb3B0aW9ucyAgICAgICAgICBPcHRpb25zIGhhc2ggZm9yIHRoZSByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgIG9wdGlvbnMuaWQgICAgICAgVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZWdpb24uXG4gKiBAcGFyYW0ge0JhY2tib25lLlZpZXd9IG9wdGlvbnMudmlldyAgICAgQSBwYXJlbnQgdmlldyB0aGUgcmVnaW9uIGV4aXN0cyB3aXRoaW4uXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgIG9wdGlvbnMuc2VsZWN0b3IgalF1ZXJ5IHNlbGVjdG9yIGZvciB0aGUgcmVnaW9uIHdpdGhpbiB0aGUgcGFyZW50IHZpZXcuXG4gKi9cbnZhciBSZWdpb24gPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0Xy5leHRlbmQoIHRoaXMsIF8ucGljayggb3B0aW9ucyB8fCB7fSwgJ2lkJywgJ3ZpZXcnLCAnc2VsZWN0b3InICkgKTtcbn07XG5cbi8vIFVzZSBCYWNrYm9uZSdzIHNlbGYtcHJvcGFnYXRpbmcgYGV4dGVuZGAgaW5oZXJpdGFuY2UgbWV0aG9kLlxuUmVnaW9uLmV4dGVuZCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZDtcblxuXy5leHRlbmQoIFJlZ2lvbi5wcm90b3R5cGUsIHtcblx0LyoqXG5cdCAqIEFjdGl2YXRlIGEgbW9kZS5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlXG5cdCAqXG5cdCAqIEBmaXJlcyB0aGlzLnZpZXcje3RoaXMuaWR9OmFjdGl2YXRlOnt0aGlzLl9tb2RlfVxuXHQgKiBAZmlyZXMgdGhpcy52aWV3I3t0aGlzLmlkfTphY3RpdmF0ZVxuXHQgKiBAZmlyZXMgdGhpcy52aWV3I3t0aGlzLmlkfTpkZWFjdGl2YXRlOnt0aGlzLl9tb2RlfVxuXHQgKiBAZmlyZXMgdGhpcy52aWV3I3t0aGlzLmlkfTpkZWFjdGl2YXRlXG5cdCAqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5jb250cm9sbGVyLlJlZ2lvbn0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmcuXG5cdCAqL1xuXHRtb2RlOiBmdW5jdGlvbiggbW9kZSApIHtcblx0XHRpZiAoICEgbW9kZSApIHtcblx0XHRcdHJldHVybiB0aGlzLl9tb2RlO1xuXHRcdH1cblx0XHQvLyBCYWlsIGlmIHdlJ3JlIHRyeWluZyB0byBjaGFuZ2UgdG8gdGhlIGN1cnJlbnQgbW9kZS5cblx0XHRpZiAoIG1vZGUgPT09IHRoaXMuX21vZGUgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBSZWdpb24gbW9kZSBkZWFjdGl2YXRpb24gZXZlbnQuXG5cdFx0ICpcblx0XHQgKiBAZXZlbnQgdGhpcy52aWV3I3t0aGlzLmlkfTpkZWFjdGl2YXRlOnt0aGlzLl9tb2RlfVxuXHRcdCAqIEBldmVudCB0aGlzLnZpZXcje3RoaXMuaWR9OmRlYWN0aXZhdGVcblx0XHQgKi9cblx0XHR0aGlzLnRyaWdnZXIoJ2RlYWN0aXZhdGUnKTtcblxuXHRcdHRoaXMuX21vZGUgPSBtb2RlO1xuXHRcdHRoaXMucmVuZGVyKCBtb2RlICk7XG5cblx0XHQvKipcblx0XHQgKiBSZWdpb24gbW9kZSBhY3RpdmF0aW9uIGV2ZW50LlxuXHRcdCAqXG5cdFx0ICogQGV2ZW50IHRoaXMudmlldyN7dGhpcy5pZH06YWN0aXZhdGU6e3RoaXMuX21vZGV9XG5cdFx0ICogQGV2ZW50IHRoaXMudmlldyN7dGhpcy5pZH06YWN0aXZhdGVcblx0XHQgKi9cblx0XHR0aGlzLnRyaWdnZXIoJ2FjdGl2YXRlJyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZW5kZXIgYSBtb2RlLlxuXHQgKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1vZGVcblx0ICpcblx0ICogQGZpcmVzIHRoaXMudmlldyN7dGhpcy5pZH06Y3JlYXRlOnt0aGlzLl9tb2RlfVxuXHQgKiBAZmlyZXMgdGhpcy52aWV3I3t0aGlzLmlkfTpjcmVhdGVcblx0ICogQGZpcmVzIHRoaXMudmlldyN7dGhpcy5pZH06cmVuZGVyOnt0aGlzLl9tb2RlfVxuXHQgKiBAZmlyZXMgdGhpcy52aWV3I3t0aGlzLmlkfTpyZW5kZXJcblx0ICpcblx0ICogQHJldHVybnMge3dwLm1lZGlhLmNvbnRyb2xsZXIuUmVnaW9ufSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cmVuZGVyOiBmdW5jdGlvbiggbW9kZSApIHtcblx0XHQvLyBJZiB0aGUgbW9kZSBpc24ndCBhY3RpdmUsIGFjdGl2YXRlIGl0LlxuXHRcdGlmICggbW9kZSAmJiBtb2RlICE9PSB0aGlzLl9tb2RlICkge1xuXHRcdFx0cmV0dXJuIHRoaXMubW9kZSggbW9kZSApO1xuXHRcdH1cblxuXHRcdHZhciBzZXQgPSB7IHZpZXc6IG51bGwgfSxcblx0XHRcdHZpZXc7XG5cblx0XHQvKipcblx0XHQgKiBDcmVhdGUgcmVnaW9uIHZpZXcgZXZlbnQuXG5cdFx0ICpcblx0XHQgKiBSZWdpb24gdmlldyBjcmVhdGlvbiB0YWtlcyBwbGFjZSBpbiBhbiBldmVudCBjYWxsYmFjayBvbiB0aGUgZnJhbWUuXG5cdFx0ICpcblx0XHQgKiBAZXZlbnQgdGhpcy52aWV3I3t0aGlzLmlkfTpjcmVhdGU6e3RoaXMuX21vZGV9XG5cdFx0ICogQGV2ZW50IHRoaXMudmlldyN7dGhpcy5pZH06Y3JlYXRlXG5cdFx0ICovXG5cdFx0dGhpcy50cmlnZ2VyKCAnY3JlYXRlJywgc2V0ICk7XG5cdFx0dmlldyA9IHNldC52aWV3O1xuXG5cdFx0LyoqXG5cdFx0ICogUmVuZGVyIHJlZ2lvbiB2aWV3IGV2ZW50LlxuXHRcdCAqXG5cdFx0ICogUmVnaW9uIHZpZXcgY3JlYXRpb24gdGFrZXMgcGxhY2UgaW4gYW4gZXZlbnQgY2FsbGJhY2sgb24gdGhlIGZyYW1lLlxuXHRcdCAqXG5cdFx0ICogQGV2ZW50IHRoaXMudmlldyN7dGhpcy5pZH06Y3JlYXRlOnt0aGlzLl9tb2RlfVxuXHRcdCAqIEBldmVudCB0aGlzLnZpZXcje3RoaXMuaWR9OmNyZWF0ZVxuXHRcdCAqL1xuXHRcdHRoaXMudHJpZ2dlciggJ3JlbmRlcicsIHZpZXcgKTtcblx0XHRpZiAoIHZpZXcgKSB7XG5cdFx0XHR0aGlzLnNldCggdmlldyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSByZWdpb24ncyB2aWV3LlxuXHQgKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICpcblx0ICogQHJldHVybnMge3dwLm1lZGlhLlZpZXd9XG5cdCAqL1xuXHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnZpZXcudmlld3MuZmlyc3QoIHRoaXMuc2VsZWN0b3IgKTtcblx0fSxcblxuXHQvKipcblx0ICogU2V0IHRoZSByZWdpb24ncyB2aWV3IGFzIGEgc3VidmlldyBvZiB0aGUgZnJhbWUuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gdmlld3Ncblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuXHQgKiBAcmV0dXJucyB7d3AuQmFja2JvbmUuU3Vidmlld3N9IFN1YnZpZXdzIGlzIHJldHVybmVkIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRzZXQ6IGZ1bmN0aW9uKCB2aWV3cywgb3B0aW9ucyApIHtcblx0XHRpZiAoIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLmFkZCA9IGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy52aWV3LnZpZXdzLnNldCggdGhpcy5zZWxlY3Rvciwgdmlld3MsIG9wdGlvbnMgKTtcblx0fSxcblxuXHQvKipcblx0ICogVHJpZ2dlciByZWdpb25hbCB2aWV3IGV2ZW50cyBvbiB0aGUgZnJhbWUuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcblx0ICogQHJldHVybnMge3VuZGVmaW5lZHx3cC5tZWRpYS5jb250cm9sbGVyLlJlZ2lvbn0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmcuXG5cdCAqL1xuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyIGJhc2UsIGFyZ3M7XG5cblx0XHRpZiAoICEgdGhpcy5fbW9kZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRhcmdzID0gXy50b0FycmF5KCBhcmd1bWVudHMgKTtcblx0XHRiYXNlID0gdGhpcy5pZCArICc6JyArIGV2ZW50O1xuXG5cdFx0Ly8gVHJpZ2dlciBge3RoaXMuaWR9OntldmVudH06e3RoaXMuX21vZGV9YCBldmVudCBvbiB0aGUgZnJhbWUuXG5cdFx0YXJnc1swXSA9IGJhc2UgKyAnOicgKyB0aGlzLl9tb2RlO1xuXHRcdHRoaXMudmlldy50cmlnZ2VyLmFwcGx5KCB0aGlzLnZpZXcsIGFyZ3MgKTtcblxuXHRcdC8vIFRyaWdnZXIgYHt0aGlzLmlkfTp7ZXZlbnR9YCBldmVudCBvbiB0aGUgZnJhbWUuXG5cdFx0YXJnc1swXSA9IGJhc2U7XG5cdFx0dGhpcy52aWV3LnRyaWdnZXIuYXBwbHkoIHRoaXMudmlldywgYXJncyApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWdpb247XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuUmVwbGFjZUltYWdlXG4gKlxuICogQSBzdGF0ZSBmb3IgcmVwbGFjaW5nIGFuIGltYWdlLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzXSAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXR0cmlidXRlcyBoYXNoIHBhc3NlZCB0byB0aGUgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5pZD1yZXBsYWNlLWltYWdlXSAgICAgICAgVW5pcXVlIGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy50aXRsZT1SZXBsYWNlIEltYWdlXSAgICAgVGl0bGUgZm9yIHRoZSBzdGF0ZS4gRGlzcGxheXMgaW4gdGhlIG1lZGlhIG1lbnUgYW5kIHRoZSBmcmFtZSdzIHRpdGxlIHJlZ2lvbi5cbiAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IFthdHRyaWJ1dGVzLmxpYnJhcnldICAgICAgICAgICAgICAgICBUaGUgYXR0YWNobWVudHMgY29sbGVjdGlvbiB0byBicm93c2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb25lIGlzIG5vdCBzdXBwbGllZCwgYSBjb2xsZWN0aW9uIG9mIGFsbCBpbWFnZXMgd2lsbCBiZSBjcmVhdGVkLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMubXVsdGlwbGU9ZmFsc2VdICAgICAgICAgIFdoZXRoZXIgbXVsdGktc2VsZWN0IGlzIGVuYWJsZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5jb250ZW50PXVwbG9hZF0gICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgY29udGVudCByZWdpb24uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGRlbiBieSBwZXJzaXN0ZW50IHVzZXIgc2V0dGluZyBpZiAnY29udGVudFVzZXJTZXR0aW5nJyBpcyB0cnVlLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMubWVudT1kZWZhdWx0XSAgICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIG1lbnUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMucm91dGVyPWJyb3dzZV0gICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIHJvdXRlciByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy50b29sYmFyPXJlcGxhY2VdICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgdG9vbGJhciByZWdpb24uXG4gKiBAcGFyYW0ge2ludH0gICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5wcmlvcml0eT02MF0gICAgICAgICAgICAgVGhlIHByaW9yaXR5IGZvciB0aGUgc3RhdGUgbGluayBpbiB0aGUgbWVkaWEgbWVudS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnNlYXJjaGFibGU9dHJ1ZV0gICAgICAgICBXaGV0aGVyIHRoZSBsaWJyYXJ5IGlzIHNlYXJjaGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSAgICAgICAgICAgICBbYXR0cmlidXRlcy5maWx0ZXJhYmxlPXVwbG9hZGVkXSAgICAgV2hldGhlciB0aGUgbGlicmFyeSBpcyBmaWx0ZXJhYmxlLCBhbmQgaWYgc28gd2hhdCBmaWx0ZXJzIHNob3VsZCBiZSBzaG93bi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRzICdhbGwnLCAndXBsb2FkZWQnLCBvciAndW5hdHRhY2hlZCcuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zb3J0YWJsZT10cnVlXSAgICAgICAgICAgV2hldGhlciB0aGUgQXR0YWNobWVudHMgc2hvdWxkIGJlIHNvcnRhYmxlLiBEZXBlbmRzIG9uIHRoZSBvcmRlcmJ5IHByb3BlcnR5IGJlaW5nIHNldCB0byBtZW51T3JkZXIgb24gdGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5hdXRvU2VsZWN0PXRydWVdICAgICAgICAgV2hldGhlciBhbiB1cGxvYWRlZCBhdHRhY2htZW50IHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5kZXNjcmliZT1mYWxzZV0gICAgICAgICAgV2hldGhlciB0byBvZmZlciBVSSB0byBkZXNjcmliZSBhdHRhY2htZW50cyAtIGUuZy4gY2FwdGlvbmluZyBpbWFnZXMgaW4gYSBnYWxsZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuY29udGVudFVzZXJTZXR0aW5nPXRydWVdIFdoZXRoZXIgdGhlIGNvbnRlbnQgcmVnaW9uJ3MgbW9kZSBzaG91bGQgYmUgc2V0IGFuZCBwZXJzaXN0ZWQgcGVyIHVzZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zeW5jU2VsZWN0aW9uPXRydWVdICAgICAgV2hldGhlciB0aGUgQXR0YWNobWVudHMgc2VsZWN0aW9uIHNob3VsZCBiZSBwZXJzaXN0ZWQgZnJvbSB0aGUgbGFzdCBzdGF0ZS5cbiAqL1xudmFyIExpYnJhcnkgPSB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnksXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdFJlcGxhY2VJbWFnZTtcblxuUmVwbGFjZUltYWdlID0gTGlicmFyeS5leHRlbmQoe1xuXHRkZWZhdWx0czogXy5kZWZhdWx0cyh7XG5cdFx0aWQ6ICAgICAgICAgICAgJ3JlcGxhY2UtaW1hZ2UnLFxuXHRcdHRpdGxlOiAgICAgICAgIGwxMG4ucmVwbGFjZUltYWdlVGl0bGUsXG5cdFx0bXVsdGlwbGU6ICAgICAgZmFsc2UsXG5cdFx0ZmlsdGVyYWJsZTogICAgJ3VwbG9hZGVkJyxcblx0XHR0b29sYmFyOiAgICAgICAncmVwbGFjZScsXG5cdFx0bWVudTogICAgICAgICAgZmFsc2UsXG5cdFx0cHJpb3JpdHk6ICAgICAgNjAsXG5cdFx0c3luY1NlbGVjdGlvbjogdHJ1ZVxuXHR9LCBMaWJyYXJ5LnByb3RvdHlwZS5kZWZhdWx0cyApLFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICpcblx0ICogQHBhcmFtIG9wdGlvbnNcblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBsaWJyYXJ5LCBjb21wYXJhdG9yO1xuXG5cdFx0dGhpcy5pbWFnZSA9IG9wdGlvbnMuaW1hZ2U7XG5cdFx0Ly8gSWYgd2UgaGF2ZW4ndCBiZWVuIHByb3ZpZGVkIGEgYGxpYnJhcnlgLCBjcmVhdGUgYSBgU2VsZWN0aW9uYC5cblx0XHRpZiAoICEgdGhpcy5nZXQoJ2xpYnJhcnknKSApIHtcblx0XHRcdHRoaXMuc2V0KCAnbGlicmFyeScsIHdwLm1lZGlhLnF1ZXJ5KHsgdHlwZTogJ2ltYWdlJyB9KSApO1xuXHRcdH1cblxuXHRcdExpYnJhcnkucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0bGlicmFyeSAgICA9IHRoaXMuZ2V0KCdsaWJyYXJ5Jyk7XG5cdFx0Y29tcGFyYXRvciA9IGxpYnJhcnkuY29tcGFyYXRvcjtcblxuXHRcdC8vIE92ZXJsb2FkIHRoZSBsaWJyYXJ5J3MgY29tcGFyYXRvciB0byBwdXNoIGl0ZW1zIHRoYXQgYXJlIG5vdCBpblxuXHRcdC8vIHRoZSBtaXJyb3JlZCBxdWVyeSB0byB0aGUgZnJvbnQgb2YgdGhlIGFnZ3JlZ2F0ZSBjb2xsZWN0aW9uLlxuXHRcdGxpYnJhcnkuY29tcGFyYXRvciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0dmFyIGFJblF1ZXJ5ID0gISEgdGhpcy5taXJyb3JpbmcuZ2V0KCBhLmNpZCApLFxuXHRcdFx0XHRiSW5RdWVyeSA9ICEhIHRoaXMubWlycm9yaW5nLmdldCggYi5jaWQgKTtcblxuXHRcdFx0aWYgKCAhIGFJblF1ZXJ5ICYmIGJJblF1ZXJ5ICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9IGVsc2UgaWYgKCBhSW5RdWVyeSAmJiAhIGJJblF1ZXJ5ICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBjb21wYXJhdG9yLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gQWRkIGFsbCBpdGVtcyBpbiB0aGUgc2VsZWN0aW9uIHRvIHRoZSBsaWJyYXJ5LCBzbyBhbnkgZmVhdHVyZWRcblx0XHQvLyBpbWFnZXMgdGhhdCBhcmUgbm90IGluaXRpYWxseSBsb2FkZWQgc3RpbGwgYXBwZWFyLlxuXHRcdGxpYnJhcnkub2JzZXJ2ZSggdGhpcy5nZXQoJ3NlbGVjdGlvbicpICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudXBkYXRlU2VsZWN0aW9uKCk7XG5cdFx0TGlicmFyeS5wcm90b3R5cGUuYWN0aXZhdGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICovXG5cdHVwZGF0ZVNlbGVjdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMuZ2V0KCdzZWxlY3Rpb24nKSxcblx0XHRcdGF0dGFjaG1lbnQgPSB0aGlzLmltYWdlLmF0dGFjaG1lbnQ7XG5cblx0XHRzZWxlY3Rpb24ucmVzZXQoIGF0dGFjaG1lbnQgPyBbIGF0dGFjaG1lbnQgXSA6IFtdICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlcGxhY2VJbWFnZTtcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5TaXRlSWNvbkNyb3BwZXJcbiAqXG4gKiBBIHN0YXRlIGZvciBjcm9wcGluZyBhIFNpdGUgSWNvbi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLkNyb3BwZXJcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqL1xudmFyIENvbnRyb2xsZXIgPSB3cC5tZWRpYS5jb250cm9sbGVyLFxuXHRTaXRlSWNvbkNyb3BwZXI7XG5cblNpdGVJY29uQ3JvcHBlciA9IENvbnRyb2xsZXIuQ3JvcHBlci5leHRlbmQoe1xuXHRhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5mcmFtZS5vbiggJ2NvbnRlbnQ6Y3JlYXRlOmNyb3AnLCB0aGlzLmNyZWF0ZUNyb3BDb250ZW50LCB0aGlzICk7XG5cdFx0dGhpcy5mcmFtZS5vbiggJ2Nsb3NlJywgdGhpcy5yZW1vdmVDcm9wcGVyLCB0aGlzICk7XG5cdFx0dGhpcy5zZXQoJ3NlbGVjdGlvbicsIG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKHRoaXMuZnJhbWUuX3NlbGVjdGlvbi5zaW5nbGUpKTtcblx0fSxcblxuXHRjcmVhdGVDcm9wQ29udGVudDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jcm9wcGVyVmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LlNpdGVJY29uQ3JvcHBlcih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0YXR0YWNobWVudDogdGhpcy5nZXQoJ3NlbGVjdGlvbicpLmZpcnN0KClcblx0XHR9KTtcblx0XHR0aGlzLmNyb3BwZXJWaWV3Lm9uKCdpbWFnZS1sb2FkZWQnLCB0aGlzLmNyZWF0ZUNyb3BUb29sYmFyLCB0aGlzKTtcblx0XHR0aGlzLmZyYW1lLmNvbnRlbnQuc2V0KHRoaXMuY3JvcHBlclZpZXcpO1xuXG5cdH0sXG5cblx0ZG9Dcm9wOiBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHR2YXIgY3JvcERldGFpbHMgPSBhdHRhY2htZW50LmdldCggJ2Nyb3BEZXRhaWxzJyApLFxuXHRcdFx0Y29udHJvbCA9IHRoaXMuZ2V0KCAnY29udHJvbCcgKTtcblxuXHRcdGNyb3BEZXRhaWxzLmRzdF93aWR0aCAgPSBjb250cm9sLnBhcmFtcy53aWR0aDtcblx0XHRjcm9wRGV0YWlscy5kc3RfaGVpZ2h0ID0gY29udHJvbC5wYXJhbXMuaGVpZ2h0O1xuXG5cdFx0cmV0dXJuIHdwLmFqYXgucG9zdCggJ2Nyb3AtaW1hZ2UnLCB7XG5cdFx0XHRub25jZTogYXR0YWNobWVudC5nZXQoICdub25jZXMnICkuZWRpdCxcblx0XHRcdGlkOiBhdHRhY2htZW50LmdldCggJ2lkJyApLFxuXHRcdFx0Y29udGV4dDogJ3NpdGUtaWNvbicsXG5cdFx0XHRjcm9wRGV0YWlsczogY3JvcERldGFpbHNcblx0XHR9ICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNpdGVJY29uQ3JvcHBlcjtcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZU1hY2hpbmVcbiAqXG4gKiBBIHN0YXRlIG1hY2hpbmUga2VlcHMgdHJhY2sgb2Ygc3RhdGUuIEl0IGlzIGluIG9uZSBzdGF0ZSBhdCBhIHRpbWUsXG4gKiBhbmQgY2FuIGNoYW5nZSBmcm9tIG9uZSBzdGF0ZSB0byBhbm90aGVyLlxuICpcbiAqIFN0YXRlcyBhcmUgc3RvcmVkIGFzIG1vZGVscyBpbiBhIEJhY2tib25lIGNvbGxlY3Rpb24uXG4gKlxuICogQHNpbmNlIDMuNS4wXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqIEBtaXhpblxuICogQG1peGVzIEJhY2tib25lLkV2ZW50c1xuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHN0YXRlc1xuICovXG52YXIgU3RhdGVNYWNoaW5lID0gZnVuY3Rpb24oIHN0YXRlcyApIHtcblx0Ly8gQHRvZG8gVGhpcyBpcyBkZWFkIGNvZGUuIFRoZSBzdGF0ZXMgY29sbGVjdGlvbiBnZXRzIGNyZWF0ZWQgaW4gbWVkaWEudmlldy5GcmFtZS5fY3JlYXRlU3RhdGVzLlxuXHR0aGlzLnN0YXRlcyA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKCBzdGF0ZXMgKTtcbn07XG5cbi8vIFVzZSBCYWNrYm9uZSdzIHNlbGYtcHJvcGFnYXRpbmcgYGV4dGVuZGAgaW5oZXJpdGFuY2UgbWV0aG9kLlxuU3RhdGVNYWNoaW5lLmV4dGVuZCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZDtcblxuXy5leHRlbmQoIFN0YXRlTWFjaGluZS5wcm90b3R5cGUsIEJhY2tib25lLkV2ZW50cywge1xuXHQvKipcblx0ICogRmV0Y2ggYSBzdGF0ZS5cblx0ICpcblx0ICogSWYgbm8gYGlkYCBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgYWN0aXZlIHN0YXRlLlxuXHQgKlxuXHQgKiBJbXBsaWNpdGx5IGNyZWF0ZXMgc3RhdGVzLlxuXHQgKlxuXHQgKiBFbnN1cmUgdGhhdCB0aGUgYHN0YXRlc2AgY29sbGVjdGlvbiBleGlzdHMgc28gdGhlIGBTdGF0ZU1hY2hpbmVgXG5cdCAqICAgY2FuIGJlIHVzZWQgYXMgYSBtaXhpbi5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEuY29udHJvbGxlci5TdGF0ZX0gUmV0dXJucyBhIFN0YXRlIG1vZGVsXG5cdCAqICAgZnJvbSB0aGUgU3RhdGVNYWNoaW5lIGNvbGxlY3Rpb25cblx0ICovXG5cdHN0YXRlOiBmdW5jdGlvbiggaWQgKSB7XG5cdFx0dGhpcy5zdGF0ZXMgPSB0aGlzLnN0YXRlcyB8fCBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbigpO1xuXG5cdFx0Ly8gRGVmYXVsdCB0byB0aGUgYWN0aXZlIHN0YXRlLlxuXHRcdGlkID0gaWQgfHwgdGhpcy5fc3RhdGU7XG5cblx0XHRpZiAoIGlkICYmICEgdGhpcy5zdGF0ZXMuZ2V0KCBpZCApICkge1xuXHRcdFx0dGhpcy5zdGF0ZXMuYWRkKHsgaWQ6IGlkIH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5zdGF0ZXMuZ2V0KCBpZCApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhY3RpdmUgc3RhdGUuXG5cdCAqXG5cdCAqIEJhaWwgaWYgd2UncmUgdHJ5aW5nIHRvIHNlbGVjdCB0aGUgY3VycmVudCBzdGF0ZSwgaWYgd2UgaGF2ZW4ndFxuXHQgKiBjcmVhdGVkIHRoZSBgc3RhdGVzYCBjb2xsZWN0aW9uLCBvciBhcmUgdHJ5aW5nIHRvIHNlbGVjdCBhIHN0YXRlXG5cdCAqIHRoYXQgZG9lcyBub3QgZXhpc3QuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWRcblx0ICpcblx0ICogQGZpcmVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUjZGVhY3RpdmF0ZVxuXHQgKiBAZmlyZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZSNhY3RpdmF0ZVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEuY29udHJvbGxlci5TdGF0ZU1hY2hpbmV9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRzZXRTdGF0ZTogZnVuY3Rpb24oIGlkICkge1xuXHRcdHZhciBwcmV2aW91cyA9IHRoaXMuc3RhdGUoKTtcblxuXHRcdGlmICggKCBwcmV2aW91cyAmJiBpZCA9PT0gcHJldmlvdXMuaWQgKSB8fCAhIHRoaXMuc3RhdGVzIHx8ICEgdGhpcy5zdGF0ZXMuZ2V0KCBpZCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKCBwcmV2aW91cyApIHtcblx0XHRcdHByZXZpb3VzLnRyaWdnZXIoJ2RlYWN0aXZhdGUnKTtcblx0XHRcdHRoaXMuX2xhc3RTdGF0ZSA9IHByZXZpb3VzLmlkO1xuXHRcdH1cblxuXHRcdHRoaXMuX3N0YXRlID0gaWQ7XG5cdFx0dGhpcy5zdGF0ZSgpLnRyaWdnZXIoJ2FjdGl2YXRlJyk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcHJldmlvdXMgYWN0aXZlIHN0YXRlLlxuXHQgKlxuXHQgKiBDYWxsIHRoZSBgc3RhdGUoKWAgbWV0aG9kIHdpdGggbm8gcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgY3VycmVudFxuXHQgKiBhY3RpdmUgc3RhdGUuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEuY29udHJvbGxlci5TdGF0ZX0gUmV0dXJucyBhIFN0YXRlIG1vZGVsXG5cdCAqICAgIGZyb20gdGhlIFN0YXRlTWFjaGluZSBjb2xsZWN0aW9uXG5cdCAqL1xuXHRsYXN0U3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy5fbGFzdFN0YXRlICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuc3RhdGUoIHRoaXMuX2xhc3RTdGF0ZSApO1xuXHRcdH1cblx0fVxufSk7XG5cbi8vIE1hcCBhbGwgZXZlbnQgYmluZGluZyBhbmQgdHJpZ2dlcmluZyBvbiBhIFN0YXRlTWFjaGluZSB0byBpdHMgYHN0YXRlc2AgY29sbGVjdGlvbi5cbl8uZWFjaChbICdvbicsICdvZmYnLCAndHJpZ2dlcicgXSwgZnVuY3Rpb24oIG1ldGhvZCApIHtcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmcuXG5cdCAqL1xuXHRTdGF0ZU1hY2hpbmUucHJvdG90eXBlWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEVuc3VyZSB0aGF0IHRoZSBgc3RhdGVzYCBjb2xsZWN0aW9uIGV4aXN0cyBzbyB0aGUgYFN0YXRlTWFjaGluZWBcblx0XHQvLyBjYW4gYmUgdXNlZCBhcyBhIG1peGluLlxuXHRcdHRoaXMuc3RhdGVzID0gdGhpcy5zdGF0ZXMgfHwgbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oKTtcblx0XHQvLyBGb3J3YXJkIHRoZSBtZXRob2QgdG8gdGhlIGBzdGF0ZXNgIGNvbGxlY3Rpb24uXG5cdFx0dGhpcy5zdGF0ZXNbIG1ldGhvZCBdLmFwcGx5KCB0aGlzLnN0YXRlcywgYXJndW1lbnRzICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdGF0ZU1hY2hpbmU7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqXG4gKiBBIHN0YXRlIGlzIGEgc3RlcCBpbiBhIHdvcmtmbG93IHRoYXQgd2hlbiBzZXQgd2lsbCB0cmlnZ2VyIHRoZSBjb250cm9sbGVyc1xuICogZm9yIHRoZSByZWdpb25zIHRvIGJlIHVwZGF0ZWQgYXMgc3BlY2lmaWVkIGluIHRoZSBmcmFtZS5cbiAqXG4gKiBBIHN0YXRlIGhhcyBhbiBldmVudC1kcml2ZW4gbGlmZWN5Y2xlOlxuICpcbiAqICAgICAncmVhZHknICAgICAgdHJpZ2dlcnMgd2hlbiBhIHN0YXRlIGlzIGFkZGVkIHRvIGEgc3RhdGUgbWFjaGluZSdzIGNvbGxlY3Rpb24uXG4gKiAgICAgJ2FjdGl2YXRlJyAgIHRyaWdnZXJzIHdoZW4gYSBzdGF0ZSBpcyBhY3RpdmF0ZWQgYnkgYSBzdGF0ZSBtYWNoaW5lLlxuICogICAgICdkZWFjdGl2YXRlJyB0cmlnZ2VycyB3aGVuIGEgc3RhdGUgaXMgZGVhY3RpdmF0ZWQgYnkgYSBzdGF0ZSBtYWNoaW5lLlxuICogICAgICdyZXNldCcgICAgICBpcyBub3QgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkuIEl0IHNob3VsZCBiZSBpbnZva2VkIGJ5IHRoZVxuICogICAgICAgICAgICAgICAgICBwcm9wZXIgY29udHJvbGxlciB0byByZXNldCB0aGUgc3RhdGUgdG8gaXRzIGRlZmF1bHQuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqL1xudmFyIFN0YXRlID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0LyoqXG5cdCAqIENvbnN0cnVjdG9yLlxuXHQgKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdGNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm9uKCAnYWN0aXZhdGUnLCB0aGlzLl9wcmVBY3RpdmF0ZSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdhY3RpdmF0ZScsIHRoaXMuYWN0aXZhdGUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnYWN0aXZhdGUnLCB0aGlzLl9wb3N0QWN0aXZhdGUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnZGVhY3RpdmF0ZScsIHRoaXMuX2RlYWN0aXZhdGUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnZGVhY3RpdmF0ZScsIHRoaXMuZGVhY3RpdmF0ZSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdyZXNldCcsIHRoaXMucmVzZXQsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAncmVhZHknLCB0aGlzLl9yZWFkeSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdyZWFkeScsIHRoaXMucmVhZHksIHRoaXMgKTtcblx0XHQvKipcblx0XHQgKiBDYWxsIHBhcmVudCBjb25zdHJ1Y3RvciB3aXRoIHBhc3NlZCBhcmd1bWVudHNcblx0XHQgKi9cblx0XHRCYWNrYm9uZS5Nb2RlbC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0dGhpcy5vbiggJ2NoYW5nZTptZW51JywgdGhpcy5fdXBkYXRlTWVudSwgdGhpcyApO1xuXHR9LFxuXHQvKipcblx0ICogUmVhZHkgZXZlbnQgY2FsbGJhY2suXG5cdCAqXG5cdCAqIEBhYnN0cmFjdFxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdHJlYWR5OiBmdW5jdGlvbigpIHt9LFxuXG5cdC8qKlxuXHQgKiBBY3RpdmF0ZSBldmVudCBjYWxsYmFjay5cblx0ICpcblx0ICogQGFic3RyYWN0XG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge30sXG5cblx0LyoqXG5cdCAqIERlYWN0aXZhdGUgZXZlbnQgY2FsbGJhY2suXG5cdCAqXG5cdCAqIEBhYnN0cmFjdFxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdGRlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge30sXG5cblx0LyoqXG5cdCAqIFJlc2V0IGV2ZW50IGNhbGxiYWNrLlxuXHQgKlxuXHQgKiBAYWJzdHJhY3Rcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRyZXNldDogZnVuY3Rpb24oKSB7fSxcblxuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0X3JlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLl91cGRhdGVNZW51KCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBhY2Nlc3MgcHJpdmF0ZVxuXHQgKiBAc2luY2UgMy41LjBcblx0Ki9cblx0X3ByZUFjdGl2YXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBhY2Nlc3MgcHJpdmF0ZVxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdF9wb3N0QWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub24oICdjaGFuZ2U6bWVudScsIHRoaXMuX21lbnUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnY2hhbmdlOnRpdGxlTW9kZScsIHRoaXMuX3RpdGxlLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2NoYW5nZTpjb250ZW50JywgdGhpcy5fY29udGVudCwgdGhpcyApO1xuXHRcdHRoaXMub24oICdjaGFuZ2U6dG9vbGJhcicsIHRoaXMuX3Rvb2xiYXIsIHRoaXMgKTtcblxuXHRcdHRoaXMuZnJhbWUub24oICd0aXRsZTpyZW5kZXI6ZGVmYXVsdCcsIHRoaXMuX3JlbmRlclRpdGxlLCB0aGlzICk7XG5cblx0XHR0aGlzLl90aXRsZSgpO1xuXHRcdHRoaXMuX21lbnUoKTtcblx0XHR0aGlzLl90b29sYmFyKCk7XG5cdFx0dGhpcy5fY29udGVudCgpO1xuXHRcdHRoaXMuX3JvdXRlcigpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRfZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcblxuXHRcdHRoaXMuZnJhbWUub2ZmKCAndGl0bGU6cmVuZGVyOmRlZmF1bHQnLCB0aGlzLl9yZW5kZXJUaXRsZSwgdGhpcyApO1xuXG5cdFx0dGhpcy5vZmYoICdjaGFuZ2U6bWVudScsIHRoaXMuX21lbnUsIHRoaXMgKTtcblx0XHR0aGlzLm9mZiggJ2NoYW5nZTp0aXRsZU1vZGUnLCB0aGlzLl90aXRsZSwgdGhpcyApO1xuXHRcdHRoaXMub2ZmKCAnY2hhbmdlOmNvbnRlbnQnLCB0aGlzLl9jb250ZW50LCB0aGlzICk7XG5cdFx0dGhpcy5vZmYoICdjaGFuZ2U6dG9vbGJhcicsIHRoaXMuX3Rvb2xiYXIsIHRoaXMgKTtcblx0fSxcblxuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0X3RpdGxlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmZyYW1lLnRpdGxlLnJlbmRlciggdGhpcy5nZXQoJ3RpdGxlTW9kZScpIHx8ICdkZWZhdWx0JyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRfcmVuZGVyVGl0bGU6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZpZXcuJGVsLnRleHQoIHRoaXMuZ2V0KCd0aXRsZScpIHx8ICcnICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBhY2Nlc3MgcHJpdmF0ZVxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdF9yb3V0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciByb3V0ZXIgPSB0aGlzLmZyYW1lLnJvdXRlcixcblx0XHRcdG1vZGUgPSB0aGlzLmdldCgncm91dGVyJyksXG5cdFx0XHR2aWV3O1xuXG5cdFx0dGhpcy5mcmFtZS4kZWwudG9nZ2xlQ2xhc3MoICdoaWRlLXJvdXRlcicsICEgbW9kZSApO1xuXHRcdGlmICggISBtb2RlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuZnJhbWUucm91dGVyLnJlbmRlciggbW9kZSApO1xuXG5cdFx0dmlldyA9IHJvdXRlci5nZXQoKTtcblx0XHRpZiAoIHZpZXcgJiYgdmlldy5zZWxlY3QgKSB7XG5cdFx0XHR2aWV3LnNlbGVjdCggdGhpcy5mcmFtZS5jb250ZW50Lm1vZGUoKSApO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0X21lbnU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZW51ID0gdGhpcy5mcmFtZS5tZW51LFxuXHRcdFx0bW9kZSA9IHRoaXMuZ2V0KCdtZW51JyksXG5cdFx0XHR2aWV3O1xuXG5cdFx0dGhpcy5mcmFtZS4kZWwudG9nZ2xlQ2xhc3MoICdoaWRlLW1lbnUnLCAhIG1vZGUgKTtcblx0XHRpZiAoICEgbW9kZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRtZW51Lm1vZGUoIG1vZGUgKTtcblxuXHRcdHZpZXcgPSBtZW51LmdldCgpO1xuXHRcdGlmICggdmlldyAmJiB2aWV3LnNlbGVjdCApIHtcblx0XHRcdHZpZXcuc2VsZWN0KCB0aGlzLmlkICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRfdXBkYXRlTWVudTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHByZXZpb3VzID0gdGhpcy5wcmV2aW91cygnbWVudScpLFxuXHRcdFx0bWVudSA9IHRoaXMuZ2V0KCdtZW51Jyk7XG5cblx0XHRpZiAoIHByZXZpb3VzICkge1xuXHRcdFx0dGhpcy5mcmFtZS5vZmYoICdtZW51OnJlbmRlcjonICsgcHJldmlvdXMsIHRoaXMuX3JlbmRlck1lbnUsIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIG1lbnUgKSB7XG5cdFx0XHR0aGlzLmZyYW1lLm9uKCAnbWVudTpyZW5kZXI6JyArIG1lbnUsIHRoaXMuX3JlbmRlck1lbnUsIHRoaXMgKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHZpZXcgaW4gdGhlIG1lZGlhIG1lbnUgZm9yIHRoZSBzdGF0ZS5cblx0ICpcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge21lZGlhLnZpZXcuTWVudX0gdmlldyBUaGUgbWVudSB2aWV3LlxuXHQgKi9cblx0X3JlbmRlck1lbnU6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZhciBtZW51SXRlbSA9IHRoaXMuZ2V0KCdtZW51SXRlbScpLFxuXHRcdFx0dGl0bGUgPSB0aGlzLmdldCgndGl0bGUnKSxcblx0XHRcdHByaW9yaXR5ID0gdGhpcy5nZXQoJ3ByaW9yaXR5Jyk7XG5cblx0XHRpZiAoICEgbWVudUl0ZW0gJiYgdGl0bGUgKSB7XG5cdFx0XHRtZW51SXRlbSA9IHsgdGV4dDogdGl0bGUgfTtcblxuXHRcdFx0aWYgKCBwcmlvcml0eSApIHtcblx0XHRcdFx0bWVudUl0ZW0ucHJpb3JpdHkgPSBwcmlvcml0eTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICEgbWVudUl0ZW0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmlldy5zZXQoIHRoaXMuaWQsIG1lbnVJdGVtICk7XG5cdH1cbn0pO1xuXG5fLmVhY2goWyd0b29sYmFyJywnY29udGVudCddLCBmdW5jdGlvbiggcmVnaW9uICkge1xuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqL1xuXHRTdGF0ZS5wcm90b3R5cGVbICdfJyArIHJlZ2lvbiBdID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1vZGUgPSB0aGlzLmdldCggcmVnaW9uICk7XG5cdFx0aWYgKCBtb2RlICkge1xuXHRcdFx0dGhpcy5mcmFtZVsgcmVnaW9uIF0ucmVuZGVyKCBtb2RlICk7XG5cdFx0fVxuXHR9O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhdGU7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnNlbGVjdGlvblN5bmNcbiAqXG4gKiBTeW5jIGFuIGF0dGFjaG1lbnRzIHNlbGVjdGlvbiBpbiBhIHN0YXRlIHdpdGggYW5vdGhlciBzdGF0ZS5cbiAqXG4gKiBBbGxvd3MgZm9yIHNlbGVjdGluZyBtdWx0aXBsZSBpbWFnZXMgaW4gdGhlIEluc2VydCBNZWRpYSB3b3JrZmxvdywgYW5kIHRoZW5cbiAqIHN3aXRjaGluZyB0byB0aGUgSW5zZXJ0IEdhbGxlcnkgd29ya2Zsb3cgd2hpbGUgcHJlc2VydmluZyB0aGUgYXR0YWNobWVudHMgc2VsZWN0aW9uLlxuICpcbiAqIEBtaXhpblxuICovXG52YXIgc2VsZWN0aW9uU3luYyA9IHtcblx0LyoqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0c3luY1NlbGVjdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMuZ2V0KCdzZWxlY3Rpb24nKSxcblx0XHRcdG1hbmFnZXIgPSB0aGlzLmZyYW1lLl9zZWxlY3Rpb247XG5cblx0XHRpZiAoICEgdGhpcy5nZXQoJ3N5bmNTZWxlY3Rpb24nKSB8fCAhIG1hbmFnZXIgfHwgISBzZWxlY3Rpb24gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIHNlbGVjdGlvbiBzdXBwb3J0cyBtdWx0aXBsZSBpdGVtcywgdmFsaWRhdGUgdGhlIHN0b3JlZFxuXHRcdC8vIGF0dGFjaG1lbnRzIGJhc2VkIG9uIHRoZSBuZXcgc2VsZWN0aW9uJ3MgY29uZGl0aW9ucy4gUmVjb3JkXG5cdFx0Ly8gdGhlIGF0dGFjaG1lbnRzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZDsgd2UnbGwgbWFpbnRhaW4gYVxuXHRcdC8vIHJlZmVyZW5jZSB0byB0aG9zZS4gT3RoZXIgYXR0YWNobWVudHMgYXJlIGNvbnNpZGVyZWQgaW4gZmx1eC5cblx0XHRpZiAoIHNlbGVjdGlvbi5tdWx0aXBsZSApIHtcblx0XHRcdHNlbGVjdGlvbi5yZXNldCggW10sIHsgc2lsZW50OiB0cnVlIH0pO1xuXHRcdFx0c2VsZWN0aW9uLnZhbGlkYXRlQWxsKCBtYW5hZ2VyLmF0dGFjaG1lbnRzICk7XG5cdFx0XHRtYW5hZ2VyLmRpZmZlcmVuY2UgPSBfLmRpZmZlcmVuY2UoIG1hbmFnZXIuYXR0YWNobWVudHMubW9kZWxzLCBzZWxlY3Rpb24ubW9kZWxzICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3luYyB0aGUgc2VsZWN0aW9uJ3Mgc2luZ2xlIGl0ZW0gd2l0aCB0aGUgbWFzdGVyLlxuXHRcdHNlbGVjdGlvbi5zaW5nbGUoIG1hbmFnZXIuc2luZ2xlICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlY29yZCB0aGUgY3VycmVudGx5IGFjdGl2ZSBhdHRhY2htZW50cywgd2hpY2ggaXMgYSBjb21iaW5hdGlvblxuXHQgKiBvZiB0aGUgc2VsZWN0aW9uJ3MgYXR0YWNobWVudHMgYW5kIHRoZSBzZXQgb2Ygc2VsZWN0ZWRcblx0ICogYXR0YWNobWVudHMgdGhhdCB0aGlzIHNwZWNpZmljIHNlbGVjdGlvbiBjb25zaWRlcmVkIGludmFsaWQuXG5cdCAqIFJlc2V0IHRoZSBkaWZmZXJlbmNlIGFuZCByZWNvcmQgdGhlIHNpbmdsZSBhdHRhY2htZW50LlxuXHQgKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdHJlY29yZFNlbGVjdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMuZ2V0KCdzZWxlY3Rpb24nKSxcblx0XHRcdG1hbmFnZXIgPSB0aGlzLmZyYW1lLl9zZWxlY3Rpb247XG5cblx0XHRpZiAoICEgdGhpcy5nZXQoJ3N5bmNTZWxlY3Rpb24nKSB8fCAhIG1hbmFnZXIgfHwgISBzZWxlY3Rpb24gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3Rpb24ubXVsdGlwbGUgKSB7XG5cdFx0XHRtYW5hZ2VyLmF0dGFjaG1lbnRzLnJlc2V0KCBzZWxlY3Rpb24udG9BcnJheSgpLmNvbmNhdCggbWFuYWdlci5kaWZmZXJlbmNlICkgKTtcblx0XHRcdG1hbmFnZXIuZGlmZmVyZW5jZSA9IFtdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYW5hZ2VyLmF0dGFjaG1lbnRzLmFkZCggc2VsZWN0aW9uLnRvQXJyYXkoKSApO1xuXHRcdH1cblxuXHRcdG1hbmFnZXIuc2luZ2xlID0gc2VsZWN0aW9uLl9zaW5nbGU7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gc2VsZWN0aW9uU3luYztcbiIsInZhciBtZWRpYSA9IHdwLm1lZGlhLFxuXHQkID0galF1ZXJ5LFxuXHRsMTBuO1xuXG5tZWRpYS5pc1RvdWNoRGV2aWNlID0gKCAnb250b3VjaGVuZCcgaW4gZG9jdW1lbnQgKTtcblxuLy8gTGluayBhbnkgbG9jYWxpemVkIHN0cmluZ3MuXG5sMTBuID0gbWVkaWEudmlldy5sMTBuID0gd2luZG93Ll93cE1lZGlhVmlld3NMMTBuIHx8IHt9O1xuXG4vLyBMaW5rIGFueSBzZXR0aW5ncy5cbm1lZGlhLnZpZXcuc2V0dGluZ3MgPSBsMTBuLnNldHRpbmdzIHx8IHt9O1xuZGVsZXRlIGwxMG4uc2V0dGluZ3M7XG5cbi8vIENvcHkgdGhlIGBwb3N0YCBzZXR0aW5nIG92ZXIgdG8gdGhlIG1vZGVsIHNldHRpbmdzLlxubWVkaWEubW9kZWwuc2V0dGluZ3MucG9zdCA9IG1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdDtcblxuLy8gQ2hlY2sgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgQ1NTIDMuMCB0cmFuc2l0aW9uc1xuJC5zdXBwb3J0LnRyYW5zaXRpb24gPSAoZnVuY3Rpb24oKXtcblx0dmFyIHN0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLFxuXHRcdHRyYW5zaXRpb25zID0ge1xuXHRcdFx0V2Via2l0VHJhbnNpdGlvbjogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuXHRcdFx0TW96VHJhbnNpdGlvbjogICAgJ3RyYW5zaXRpb25lbmQnLFxuXHRcdFx0T1RyYW5zaXRpb246ICAgICAgJ29UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kJyxcblx0XHRcdHRyYW5zaXRpb246ICAgICAgICd0cmFuc2l0aW9uZW5kJ1xuXHRcdH0sIHRyYW5zaXRpb247XG5cblx0dHJhbnNpdGlvbiA9IF8uZmluZCggXy5rZXlzKCB0cmFuc2l0aW9ucyApLCBmdW5jdGlvbiggdHJhbnNpdGlvbiApIHtcblx0XHRyZXR1cm4gISBfLmlzVW5kZWZpbmVkKCBzdHlsZVsgdHJhbnNpdGlvbiBdICk7XG5cdH0pO1xuXG5cdHJldHVybiB0cmFuc2l0aW9uICYmIHtcblx0XHRlbmQ6IHRyYW5zaXRpb25zWyB0cmFuc2l0aW9uIF1cblx0fTtcbn0oKSk7XG5cbi8qKlxuICogQSBzaGFyZWQgZXZlbnQgYnVzIHVzZWQgdG8gcHJvdmlkZSBldmVudHMgaW50b1xuICogdGhlIG1lZGlhIHdvcmtmbG93cyB0aGF0IDNyZC1wYXJ0eSBkZXZzIGNhbiB1c2UgdG8gaG9va1xuICogaW4uXG4gKi9cbm1lZGlhLmV2ZW50cyA9IF8uZXh0ZW5kKCB7fSwgQmFja2JvbmUuRXZlbnRzICk7XG5cbi8qKlxuICogTWFrZXMgaXQgZWFzaWVyIHRvIGJpbmQgZXZlbnRzIHVzaW5nIHRyYW5zaXRpb25zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHNlbnNpdGl2aXR5XG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xubWVkaWEudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCBzZWxlY3Rvciwgc2Vuc2l0aXZpdHkgKSB7XG5cdHZhciBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuXHRzZW5zaXRpdml0eSA9IHNlbnNpdGl2aXR5IHx8IDIwMDA7XG5cblx0aWYgKCAkLnN1cHBvcnQudHJhbnNpdGlvbiApIHtcblx0XHRpZiAoICEgKHNlbGVjdG9yIGluc3RhbmNlb2YgJCkgKSB7XG5cdFx0XHRzZWxlY3RvciA9ICQoIHNlbGVjdG9yICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmVzb2x2ZSB0aGUgZGVmZXJyZWQgd2hlbiB0aGUgZmlyc3QgZWxlbWVudCBmaW5pc2hlcyBhbmltYXRpbmcuXG5cdFx0c2VsZWN0b3IuZmlyc3QoKS5vbmUoICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwgZGVmZXJyZWQucmVzb2x2ZSApO1xuXG5cdFx0Ly8gSnVzdCBpbiBjYXNlIHRoZSBldmVudCBkb2Vzbid0IHRyaWdnZXIsIGZpcmUgYSBjYWxsYmFjay5cblx0XHRfLmRlbGF5KCBkZWZlcnJlZC5yZXNvbHZlLCBzZW5zaXRpdml0eSApO1xuXG5cdC8vIE90aGVyd2lzZSwgZXhlY3V0ZSBvbiB0aGUgc3BvdC5cblx0fSBlbHNlIHtcblx0XHRkZWZlcnJlZC5yZXNvbHZlKCk7XG5cdH1cblxuXHRyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpO1xufTtcblxubWVkaWEuY29udHJvbGxlci5SZWdpb24gPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9yZWdpb24uanMnICk7XG5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZSA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL3N0YXRlLW1hY2hpbmUuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLlN0YXRlID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvc3RhdGUuanMnICk7XG5cbm1lZGlhLnNlbGVjdGlvblN5bmMgPSByZXF1aXJlKCAnLi91dGlscy9zZWxlY3Rpb24tc3luYy5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeSA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL2xpYnJhcnkuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLkltYWdlRGV0YWlscyA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL2ltYWdlLWRldGFpbHMuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLkdhbGxlcnlFZGl0ID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvZ2FsbGVyeS1lZGl0LmpzJyApO1xubWVkaWEuY29udHJvbGxlci5HYWxsZXJ5QWRkID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvZ2FsbGVyeS1hZGQuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLkNvbGxlY3Rpb25FZGl0ID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvY29sbGVjdGlvbi1lZGl0LmpzJyApO1xubWVkaWEuY29udHJvbGxlci5Db2xsZWN0aW9uQWRkID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvY29sbGVjdGlvbi1hZGQuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLkZlYXR1cmVkSW1hZ2UgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9mZWF0dXJlZC1pbWFnZS5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuUmVwbGFjZUltYWdlID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvcmVwbGFjZS1pbWFnZS5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuRWRpdEltYWdlID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvZWRpdC1pbWFnZS5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuTWVkaWFMaWJyYXJ5ID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvbWVkaWEtbGlicmFyeS5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuRW1iZWQgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9lbWJlZC5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuQ3JvcHBlciA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL2Nyb3BwZXIuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLkN1c3RvbWl6ZUltYWdlQ3JvcHBlciA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL2N1c3RvbWl6ZS1pbWFnZS1jcm9wcGVyLmpzJyApO1xubWVkaWEuY29udHJvbGxlci5TaXRlSWNvbkNyb3BwZXIgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9zaXRlLWljb24tY3JvcHBlci5qcycgKTtcblxubWVkaWEuVmlldyA9IHJlcXVpcmUoICcuL3ZpZXdzL3ZpZXcuanMnICk7XG5tZWRpYS52aWV3LkZyYW1lID0gcmVxdWlyZSggJy4vdmlld3MvZnJhbWUuanMnICk7XG5tZWRpYS52aWV3Lk1lZGlhRnJhbWUgPSByZXF1aXJlKCAnLi92aWV3cy9tZWRpYS1mcmFtZS5qcycgKTtcbm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5TZWxlY3QgPSByZXF1aXJlKCAnLi92aWV3cy9mcmFtZS9zZWxlY3QuanMnICk7XG5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuUG9zdCA9IHJlcXVpcmUoICcuL3ZpZXdzL2ZyYW1lL3Bvc3QuanMnICk7XG5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuSW1hZ2VEZXRhaWxzID0gcmVxdWlyZSggJy4vdmlld3MvZnJhbWUvaW1hZ2UtZGV0YWlscy5qcycgKTtcbm1lZGlhLnZpZXcuTW9kYWwgPSByZXF1aXJlKCAnLi92aWV3cy9tb2RhbC5qcycgKTtcbm1lZGlhLnZpZXcuRm9jdXNNYW5hZ2VyID0gcmVxdWlyZSggJy4vdmlld3MvZm9jdXMtbWFuYWdlci5qcycgKTtcbm1lZGlhLnZpZXcuVXBsb2FkZXJXaW5kb3cgPSByZXF1aXJlKCAnLi92aWV3cy91cGxvYWRlci93aW5kb3cuanMnICk7XG5tZWRpYS52aWV3LkVkaXRvclVwbG9hZGVyID0gcmVxdWlyZSggJy4vdmlld3MvdXBsb2FkZXIvZWRpdG9yLmpzJyApO1xubWVkaWEudmlldy5VcGxvYWRlcklubGluZSA9IHJlcXVpcmUoICcuL3ZpZXdzL3VwbG9hZGVyL2lubGluZS5qcycgKTtcbm1lZGlhLnZpZXcuVXBsb2FkZXJTdGF0dXMgPSByZXF1aXJlKCAnLi92aWV3cy91cGxvYWRlci9zdGF0dXMuanMnICk7XG5tZWRpYS52aWV3LlVwbG9hZGVyU3RhdHVzRXJyb3IgPSByZXF1aXJlKCAnLi92aWV3cy91cGxvYWRlci9zdGF0dXMtZXJyb3IuanMnICk7XG5tZWRpYS52aWV3LlRvb2xiYXIgPSByZXF1aXJlKCAnLi92aWV3cy90b29sYmFyLmpzJyApO1xubWVkaWEudmlldy5Ub29sYmFyLlNlbGVjdCA9IHJlcXVpcmUoICcuL3ZpZXdzL3Rvb2xiYXIvc2VsZWN0LmpzJyApO1xubWVkaWEudmlldy5Ub29sYmFyLkVtYmVkID0gcmVxdWlyZSggJy4vdmlld3MvdG9vbGJhci9lbWJlZC5qcycgKTtcbm1lZGlhLnZpZXcuQnV0dG9uID0gcmVxdWlyZSggJy4vdmlld3MvYnV0dG9uLmpzJyApO1xubWVkaWEudmlldy5CdXR0b25Hcm91cCA9IHJlcXVpcmUoICcuL3ZpZXdzL2J1dHRvbi1ncm91cC5qcycgKTtcbm1lZGlhLnZpZXcuUHJpb3JpdHlMaXN0ID0gcmVxdWlyZSggJy4vdmlld3MvcHJpb3JpdHktbGlzdC5qcycgKTtcbm1lZGlhLnZpZXcuTWVudUl0ZW0gPSByZXF1aXJlKCAnLi92aWV3cy9tZW51LWl0ZW0uanMnICk7XG5tZWRpYS52aWV3Lk1lbnUgPSByZXF1aXJlKCAnLi92aWV3cy9tZW51LmpzJyApO1xubWVkaWEudmlldy5Sb3V0ZXJJdGVtID0gcmVxdWlyZSggJy4vdmlld3Mvcm91dGVyLWl0ZW0uanMnICk7XG5tZWRpYS52aWV3LlJvdXRlciA9IHJlcXVpcmUoICcuL3ZpZXdzL3JvdXRlci5qcycgKTtcbm1lZGlhLnZpZXcuU2lkZWJhciA9IHJlcXVpcmUoICcuL3ZpZXdzL3NpZGViYXIuanMnICk7XG5tZWRpYS52aWV3LkF0dGFjaG1lbnQgPSByZXF1aXJlKCAnLi92aWV3cy9hdHRhY2htZW50LmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50LkxpYnJhcnkgPSByZXF1aXJlKCAnLi92aWV3cy9hdHRhY2htZW50L2xpYnJhcnkuanMnICk7XG5tZWRpYS52aWV3LkF0dGFjaG1lbnQuRWRpdExpYnJhcnkgPSByZXF1aXJlKCAnLi92aWV3cy9hdHRhY2htZW50L2VkaXQtbGlicmFyeS5qcycgKTtcbm1lZGlhLnZpZXcuQXR0YWNobWVudHMgPSByZXF1aXJlKCAnLi92aWV3cy9hdHRhY2htZW50cy5qcycgKTtcbm1lZGlhLnZpZXcuU2VhcmNoID0gcmVxdWlyZSggJy4vdmlld3Mvc2VhcmNoLmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50RmlsdGVycyA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnQtZmlsdGVycy5qcycgKTtcbm1lZGlhLnZpZXcuRGF0ZUZpbHRlciA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnQtZmlsdGVycy9kYXRlLmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50RmlsdGVycy5VcGxvYWRlZCA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnQtZmlsdGVycy91cGxvYWRlZC5qcycgKTtcbm1lZGlhLnZpZXcuQXR0YWNobWVudEZpbHRlcnMuQWxsID0gcmVxdWlyZSggJy4vdmlld3MvYXR0YWNobWVudC1maWx0ZXJzL2FsbC5qcycgKTtcbm1lZGlhLnZpZXcuQXR0YWNobWVudHNCcm93c2VyID0gcmVxdWlyZSggJy4vdmlld3MvYXR0YWNobWVudHMvYnJvd3Nlci5qcycgKTtcbm1lZGlhLnZpZXcuU2VsZWN0aW9uID0gcmVxdWlyZSggJy4vdmlld3Mvc2VsZWN0aW9uLmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50LlNlbGVjdGlvbiA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnQvc2VsZWN0aW9uLmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50cy5TZWxlY3Rpb24gPSByZXF1aXJlKCAnLi92aWV3cy9hdHRhY2htZW50cy9zZWxlY3Rpb24uanMnICk7XG5tZWRpYS52aWV3LkF0dGFjaG1lbnQuRWRpdFNlbGVjdGlvbiA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnQvZWRpdC1zZWxlY3Rpb24uanMnICk7XG5tZWRpYS52aWV3LlNldHRpbmdzID0gcmVxdWlyZSggJy4vdmlld3Mvc2V0dGluZ3MuanMnICk7XG5tZWRpYS52aWV3LlNldHRpbmdzLkF0dGFjaG1lbnREaXNwbGF5ID0gcmVxdWlyZSggJy4vdmlld3Mvc2V0dGluZ3MvYXR0YWNobWVudC1kaXNwbGF5LmpzJyApO1xubWVkaWEudmlldy5TZXR0aW5ncy5HYWxsZXJ5ID0gcmVxdWlyZSggJy4vdmlld3Mvc2V0dGluZ3MvZ2FsbGVyeS5qcycgKTtcbm1lZGlhLnZpZXcuU2V0dGluZ3MuUGxheWxpc3QgPSByZXF1aXJlKCAnLi92aWV3cy9zZXR0aW5ncy9wbGF5bGlzdC5qcycgKTtcbm1lZGlhLnZpZXcuQXR0YWNobWVudC5EZXRhaWxzID0gcmVxdWlyZSggJy4vdmlld3MvYXR0YWNobWVudC9kZXRhaWxzLmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50Q29tcGF0ID0gcmVxdWlyZSggJy4vdmlld3MvYXR0YWNobWVudC1jb21wYXQuanMnICk7XG5tZWRpYS52aWV3LklmcmFtZSA9IHJlcXVpcmUoICcuL3ZpZXdzL2lmcmFtZS5qcycgKTtcbm1lZGlhLnZpZXcuRW1iZWQgPSByZXF1aXJlKCAnLi92aWV3cy9lbWJlZC5qcycgKTtcbm1lZGlhLnZpZXcuTGFiZWwgPSByZXF1aXJlKCAnLi92aWV3cy9sYWJlbC5qcycgKTtcbm1lZGlhLnZpZXcuRW1iZWRVcmwgPSByZXF1aXJlKCAnLi92aWV3cy9lbWJlZC91cmwuanMnICk7XG5tZWRpYS52aWV3LkVtYmVkTGluayA9IHJlcXVpcmUoICcuL3ZpZXdzL2VtYmVkL2xpbmsuanMnICk7XG5tZWRpYS52aWV3LkVtYmVkSW1hZ2UgPSByZXF1aXJlKCAnLi92aWV3cy9lbWJlZC9pbWFnZS5qcycgKTtcbm1lZGlhLnZpZXcuSW1hZ2VEZXRhaWxzID0gcmVxdWlyZSggJy4vdmlld3MvaW1hZ2UtZGV0YWlscy5qcycgKTtcbm1lZGlhLnZpZXcuQ3JvcHBlciA9IHJlcXVpcmUoICcuL3ZpZXdzL2Nyb3BwZXIuanMnICk7XG5tZWRpYS52aWV3LlNpdGVJY29uQ3JvcHBlciA9IHJlcXVpcmUoICcuL3ZpZXdzL3NpdGUtaWNvbi1jcm9wcGVyLmpzJyApO1xubWVkaWEudmlldy5TaXRlSWNvblByZXZpZXcgPSByZXF1aXJlKCAnLi92aWV3cy9zaXRlLWljb24tcHJldmlldy5qcycgKTtcbm1lZGlhLnZpZXcuRWRpdEltYWdlID0gcmVxdWlyZSggJy4vdmlld3MvZWRpdC1pbWFnZS5qcycgKTtcbm1lZGlhLnZpZXcuU3Bpbm5lciA9IHJlcXVpcmUoICcuL3ZpZXdzL3NwaW5uZXIuanMnICk7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudENvbXBhdFxuICpcbiAqIEEgdmlldyB0byBkaXNwbGF5IGZpZWxkcyBhZGRlZCB2aWEgdGhlIGBhdHRhY2htZW50X2ZpZWxkc190b19lZGl0YCBmaWx0ZXIuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0QXR0YWNobWVudENvbXBhdDtcblxuQXR0YWNobWVudENvbXBhdCA9IFZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnZm9ybScsXG5cdGNsYXNzTmFtZTogJ2NvbXBhdC1pdGVtJyxcblxuXHRldmVudHM6IHtcblx0XHQnc3VibWl0JzogICAgICAgICAgJ3ByZXZlbnREZWZhdWx0Jyxcblx0XHQnY2hhbmdlIGlucHV0JzogICAgJ3NhdmUnLFxuXHRcdCdjaGFuZ2Ugc2VsZWN0JzogICAnc2F2ZScsXG5cdFx0J2NoYW5nZSB0ZXh0YXJlYSc6ICdzYXZlJ1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6Y29tcGF0JywgdGhpcy5yZW5kZXIgKTtcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRDb21wYXR9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRkaXNwb3NlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIHRoaXMuJCgnOmZvY3VzJykubGVuZ3RoICkge1xuXHRcdFx0dGhpcy5zYXZlKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIGNhbGwgJ2Rpc3Bvc2UnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRyZXR1cm4gVmlldy5wcm90b3R5cGUuZGlzcG9zZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5BdHRhY2htZW50Q29tcGF0fSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY29tcGF0ID0gdGhpcy5tb2RlbC5nZXQoJ2NvbXBhdCcpO1xuXHRcdGlmICggISBjb21wYXQgfHwgISBjb21wYXQuaXRlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnZpZXdzLmRldGFjaCgpO1xuXHRcdHRoaXMuJGVsLmh0bWwoIGNvbXBhdC5pdGVtICk7XG5cdFx0dGhpcy52aWV3cy5yZW5kZXIoKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0cHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHRzYXZlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyIGRhdGEgPSB7fTtcblxuXHRcdGlmICggZXZlbnQgKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblxuXHRcdF8uZWFjaCggdGhpcy4kZWwuc2VyaWFsaXplQXJyYXkoKSwgZnVuY3Rpb24oIHBhaXIgKSB7XG5cdFx0XHRkYXRhWyBwYWlyLm5hbWUgXSA9IHBhaXIudmFsdWU7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmNvbnRyb2xsZXIudHJpZ2dlciggJ2F0dGFjaG1lbnQ6Y29tcGF0OndhaXRpbmcnLCBbJ3dhaXRpbmcnXSApO1xuXHRcdHRoaXMubW9kZWwuc2F2ZUNvbXBhdCggZGF0YSApLmFsd2F5cyggXy5iaW5kKCB0aGlzLnBvc3RTYXZlLCB0aGlzICkgKTtcblx0fSxcblxuXHRwb3N0U2F2ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb250cm9sbGVyLnRyaWdnZXIoICdhdHRhY2htZW50OmNvbXBhdDpyZWFkeScsIFsncmVhZHknXSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBdHRhY2htZW50Q29tcGF0O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciAkID0galF1ZXJ5LFxuXHRBdHRhY2htZW50RmlsdGVycztcblxuQXR0YWNobWVudEZpbHRlcnMgPSB3cC5tZWRpYS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ3NlbGVjdCcsXG5cdGNsYXNzTmFtZTogJ2F0dGFjaG1lbnQtZmlsdGVycycsXG5cdGlkOiAgICAgICAgJ21lZGlhLWF0dGFjaG1lbnQtZmlsdGVycycsXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2hhbmdlOiAnY2hhbmdlJ1xuXHR9LFxuXG5cdGtleXM6IFtdLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY3JlYXRlRmlsdGVycygpO1xuXHRcdF8uZXh0ZW5kKCB0aGlzLmZpbHRlcnMsIHRoaXMub3B0aW9ucy5maWx0ZXJzICk7XG5cblx0XHQvLyBCdWlsZCBgPG9wdGlvbj5gIGVsZW1lbnRzLlxuXHRcdHRoaXMuJGVsLmh0bWwoIF8uY2hhaW4oIHRoaXMuZmlsdGVycyApLm1hcCggZnVuY3Rpb24oIGZpbHRlciwgdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRlbDogJCggJzxvcHRpb24+PC9vcHRpb24+JyApLnZhbCggdmFsdWUgKS5odG1sKCBmaWx0ZXIudGV4dCApWzBdLFxuXHRcdFx0XHRwcmlvcml0eTogZmlsdGVyLnByaW9yaXR5IHx8IDUwXG5cdFx0XHR9O1xuXHRcdH0sIHRoaXMgKS5zb3J0QnkoJ3ByaW9yaXR5JykucGx1Y2soJ2VsJykudmFsdWUoKSApO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZScsIHRoaXMuc2VsZWN0ICk7XG5cdFx0dGhpcy5zZWxlY3QoKTtcblx0fSxcblxuXHQvKipcblx0ICogQGFic3RyYWN0XG5cdCAqL1xuXHRjcmVhdGVGaWx0ZXJzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmZpbHRlcnMgPSB7fTtcblx0fSxcblxuXHQvKipcblx0ICogV2hlbiB0aGUgc2VsZWN0ZWQgZmlsdGVyIGNoYW5nZXMsIHVwZGF0ZSB0aGUgQXR0YWNobWVudCBRdWVyeSBwcm9wZXJ0aWVzIHRvIG1hdGNoLlxuXHQgKi9cblx0Y2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZmlsdGVyID0gdGhpcy5maWx0ZXJzWyB0aGlzLmVsLnZhbHVlIF07XG5cdFx0aWYgKCBmaWx0ZXIgKSB7XG5cdFx0XHR0aGlzLm1vZGVsLnNldCggZmlsdGVyLnByb3BzICk7XG5cdFx0fVxuXHR9LFxuXG5cdHNlbGVjdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1vZGVsID0gdGhpcy5tb2RlbCxcblx0XHRcdHZhbHVlID0gJ2FsbCcsXG5cdFx0XHRwcm9wcyA9IG1vZGVsLnRvSlNPTigpO1xuXG5cdFx0Xy5maW5kKCB0aGlzLmZpbHRlcnMsIGZ1bmN0aW9uKCBmaWx0ZXIsIGlkICkge1xuXHRcdFx0dmFyIGVxdWFsID0gXy5hbGwoIGZpbHRlci5wcm9wcywgZnVuY3Rpb24oIHByb3AsIGtleSApIHtcblx0XHRcdFx0cmV0dXJuIHByb3AgPT09ICggXy5pc1VuZGVmaW5lZCggcHJvcHNbIGtleSBdICkgPyBudWxsIDogcHJvcHNbIGtleSBdICk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKCBlcXVhbCApIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlID0gaWQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0aGlzLiRlbC52YWwoIHZhbHVlICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF0dGFjaG1lbnRGaWx0ZXJzO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzLkFsbFxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudEZpbHRlcnNcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEFsbDtcblxuQWxsID0gd3AubWVkaWEudmlldy5BdHRhY2htZW50RmlsdGVycy5leHRlbmQoe1xuXHRjcmVhdGVGaWx0ZXJzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZmlsdGVycyA9IHt9O1xuXG5cdFx0Xy5lYWNoKCB3cC5tZWRpYS52aWV3LnNldHRpbmdzLm1pbWVUeXBlcyB8fCB7fSwgZnVuY3Rpb24oIHRleHQsIGtleSApIHtcblx0XHRcdGZpbHRlcnNbIGtleSBdID0ge1xuXHRcdFx0XHR0ZXh0OiB0ZXh0LFxuXHRcdFx0XHRwcm9wczoge1xuXHRcdFx0XHRcdHN0YXR1czogIG51bGwsXG5cdFx0XHRcdFx0dHlwZTogICAga2V5LFxuXHRcdFx0XHRcdHVwbG9hZGVkVG86IG51bGwsXG5cdFx0XHRcdFx0b3JkZXJieTogJ2RhdGUnLFxuXHRcdFx0XHRcdG9yZGVyOiAgICdERVNDJ1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH0pO1xuXG5cdFx0ZmlsdGVycy5hbGwgPSB7XG5cdFx0XHR0ZXh0OiAgbDEwbi5hbGxNZWRpYUl0ZW1zLFxuXHRcdFx0cHJvcHM6IHtcblx0XHRcdFx0c3RhdHVzOiAgbnVsbCxcblx0XHRcdFx0dHlwZTogICAgbnVsbCxcblx0XHRcdFx0dXBsb2FkZWRUbzogbnVsbCxcblx0XHRcdFx0b3JkZXJieTogJ2RhdGUnLFxuXHRcdFx0XHRvcmRlcjogICAnREVTQydcblx0XHRcdH0sXG5cdFx0XHRwcmlvcml0eTogMTBcblx0XHR9O1xuXG5cdFx0aWYgKCB3cC5tZWRpYS52aWV3LnNldHRpbmdzLnBvc3QuaWQgKSB7XG5cdFx0XHRmaWx0ZXJzLnVwbG9hZGVkID0ge1xuXHRcdFx0XHR0ZXh0OiAgbDEwbi51cGxvYWRlZFRvVGhpc1Bvc3QsXG5cdFx0XHRcdHByb3BzOiB7XG5cdFx0XHRcdFx0c3RhdHVzOiAgbnVsbCxcblx0XHRcdFx0XHR0eXBlOiAgICBudWxsLFxuXHRcdFx0XHRcdHVwbG9hZGVkVG86IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5pZCxcblx0XHRcdFx0XHRvcmRlcmJ5OiAnbWVudU9yZGVyJyxcblx0XHRcdFx0XHRvcmRlcjogICAnQVNDJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRwcmlvcml0eTogMjBcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0ZmlsdGVycy51bmF0dGFjaGVkID0ge1xuXHRcdFx0dGV4dDogIGwxMG4udW5hdHRhY2hlZCxcblx0XHRcdHByb3BzOiB7XG5cdFx0XHRcdHN0YXR1czogICAgIG51bGwsXG5cdFx0XHRcdHVwbG9hZGVkVG86IDAsXG5cdFx0XHRcdHR5cGU6ICAgICAgIG51bGwsXG5cdFx0XHRcdG9yZGVyYnk6ICAgICdtZW51T3JkZXInLFxuXHRcdFx0XHRvcmRlcjogICAgICAnQVNDJ1xuXHRcdFx0fSxcblx0XHRcdHByaW9yaXR5OiA1MFxuXHRcdH07XG5cblx0XHRpZiAoIHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MubWVkaWFUcmFzaCAmJlxuXHRcdFx0dGhpcy5jb250cm9sbGVyLmlzTW9kZUFjdGl2ZSggJ2dyaWQnICkgKSB7XG5cblx0XHRcdGZpbHRlcnMudHJhc2ggPSB7XG5cdFx0XHRcdHRleHQ6ICBsMTBuLnRyYXNoLFxuXHRcdFx0XHRwcm9wczoge1xuXHRcdFx0XHRcdHVwbG9hZGVkVG86IG51bGwsXG5cdFx0XHRcdFx0c3RhdHVzOiAgICAgJ3RyYXNoJyxcblx0XHRcdFx0XHR0eXBlOiAgICAgICBudWxsLFxuXHRcdFx0XHRcdG9yZGVyYnk6ICAgICdkYXRlJyxcblx0XHRcdFx0XHRvcmRlcjogICAgICAnREVTQydcblx0XHRcdFx0fSxcblx0XHRcdFx0cHJpb3JpdHk6IDUwXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHRoaXMuZmlsdGVycyA9IGZpbHRlcnM7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFsbDtcbiIsIi8qKlxuICogQSBmaWx0ZXIgZHJvcGRvd24gZm9yIG1vbnRoL2RhdGVzLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudEZpbHRlcnNcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdERhdGVGaWx0ZXI7XG5cbkRhdGVGaWx0ZXIgPSB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzLmV4dGVuZCh7XG5cdGlkOiAnbWVkaWEtYXR0YWNobWVudC1kYXRlLWZpbHRlcnMnLFxuXG5cdGNyZWF0ZUZpbHRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBmaWx0ZXJzID0ge307XG5cdFx0Xy5lYWNoKCB3cC5tZWRpYS52aWV3LnNldHRpbmdzLm1vbnRocyB8fCB7fSwgZnVuY3Rpb24oIHZhbHVlLCBpbmRleCApIHtcblx0XHRcdGZpbHRlcnNbIGluZGV4IF0gPSB7XG5cdFx0XHRcdHRleHQ6IHZhbHVlLnRleHQsXG5cdFx0XHRcdHByb3BzOiB7XG5cdFx0XHRcdFx0eWVhcjogdmFsdWUueWVhcixcblx0XHRcdFx0XHRtb250aG51bTogdmFsdWUubW9udGhcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9KTtcblx0XHRmaWx0ZXJzLmFsbCA9IHtcblx0XHRcdHRleHQ6ICBsMTBuLmFsbERhdGVzLFxuXHRcdFx0cHJvcHM6IHtcblx0XHRcdFx0bW9udGhudW06IGZhbHNlLFxuXHRcdFx0XHR5ZWFyOiAgZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHRwcmlvcml0eTogMTBcblx0XHR9O1xuXHRcdHRoaXMuZmlsdGVycyA9IGZpbHRlcnM7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGVGaWx0ZXI7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudEZpbHRlcnMuVXBsb2FkZWRcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRVcGxvYWRlZDtcblxuVXBsb2FkZWQgPSB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzLmV4dGVuZCh7XG5cdGNyZWF0ZUZpbHRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB0eXBlID0gdGhpcy5tb2RlbC5nZXQoJ3R5cGUnKSxcblx0XHRcdHR5cGVzID0gd3AubWVkaWEudmlldy5zZXR0aW5ncy5taW1lVHlwZXMsXG5cdFx0XHR0ZXh0O1xuXG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlICkge1xuXHRcdFx0dGV4dCA9IHR5cGVzWyB0eXBlIF07XG5cdFx0fVxuXG5cdFx0dGhpcy5maWx0ZXJzID0ge1xuXHRcdFx0YWxsOiB7XG5cdFx0XHRcdHRleHQ6ICB0ZXh0IHx8IGwxMG4uYWxsTWVkaWFJdGVtcyxcblx0XHRcdFx0cHJvcHM6IHtcblx0XHRcdFx0XHR1cGxvYWRlZFRvOiBudWxsLFxuXHRcdFx0XHRcdG9yZGVyYnk6ICdkYXRlJyxcblx0XHRcdFx0XHRvcmRlcjogICAnREVTQydcblx0XHRcdFx0fSxcblx0XHRcdFx0cHJpb3JpdHk6IDEwXG5cdFx0XHR9LFxuXG5cdFx0XHR1cGxvYWRlZDoge1xuXHRcdFx0XHR0ZXh0OiAgbDEwbi51cGxvYWRlZFRvVGhpc1Bvc3QsXG5cdFx0XHRcdHByb3BzOiB7XG5cdFx0XHRcdFx0dXBsb2FkZWRUbzogd3AubWVkaWEudmlldy5zZXR0aW5ncy5wb3N0LmlkLFxuXHRcdFx0XHRcdG9yZGVyYnk6ICdtZW51T3JkZXInLFxuXHRcdFx0XHRcdG9yZGVyOiAgICdBU0MnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHByaW9yaXR5OiAyMFxuXHRcdFx0fSxcblxuXHRcdFx0dW5hdHRhY2hlZDoge1xuXHRcdFx0XHR0ZXh0OiAgbDEwbi51bmF0dGFjaGVkLFxuXHRcdFx0XHRwcm9wczoge1xuXHRcdFx0XHRcdHVwbG9hZGVkVG86IDAsXG5cdFx0XHRcdFx0b3JkZXJieTogJ21lbnVPcmRlcicsXG5cdFx0XHRcdFx0b3JkZXI6ICAgJ0FTQydcblx0XHRcdFx0fSxcblx0XHRcdFx0cHJpb3JpdHk6IDUwXG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVXBsb2FkZWQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudFxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVmlldyA9IHdwLm1lZGlhLlZpZXcsXG5cdCQgPSBqUXVlcnksXG5cdEF0dGFjaG1lbnQ7XG5cbkF0dGFjaG1lbnQgPSBWaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ2xpJyxcblx0Y2xhc3NOYW1lOiAnYXR0YWNobWVudCcsXG5cdHRlbXBsYXRlOiAgd3AudGVtcGxhdGUoJ2F0dGFjaG1lbnQnKSxcblxuXHRhdHRyaWJ1dGVzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0J3RhYkluZGV4JzogICAgIDAsXG5cdFx0XHQncm9sZSc6ICAgICAgICAgJ2NoZWNrYm94Jyxcblx0XHRcdCdhcmlhLWxhYmVsJzogICB0aGlzLm1vZGVsLmdldCggJ3RpdGxlJyApLFxuXHRcdFx0J2FyaWEtY2hlY2tlZCc6IGZhbHNlLFxuXHRcdFx0J2RhdGEtaWQnOiAgICAgIHRoaXMubW9kZWwuZ2V0KCAnaWQnIClcblx0XHR9O1xuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdCdjbGljayAuanMtLXNlbGVjdC1hdHRhY2htZW50JzogICAndG9nZ2xlU2VsZWN0aW9uSGFuZGxlcicsXG5cdFx0J2NoYW5nZSBbZGF0YS1zZXR0aW5nXSc6ICAgICAgICAgICd1cGRhdGVTZXR0aW5nJyxcblx0XHQnY2hhbmdlIFtkYXRhLXNldHRpbmddIGlucHV0JzogICAgJ3VwZGF0ZVNldHRpbmcnLFxuXHRcdCdjaGFuZ2UgW2RhdGEtc2V0dGluZ10gc2VsZWN0JzogICAndXBkYXRlU2V0dGluZycsXG5cdFx0J2NoYW5nZSBbZGF0YS1zZXR0aW5nXSB0ZXh0YXJlYSc6ICd1cGRhdGVTZXR0aW5nJyxcblx0XHQnY2xpY2sgLmF0dGFjaG1lbnQtY2xvc2UnOiAgICAgICAgJ3JlbW92ZUZyb21MaWJyYXJ5Jyxcblx0XHQnY2xpY2sgLmNoZWNrJzogICAgICAgICAgICAgICAgICAgJ2NoZWNrQ2xpY2tIYW5kbGVyJyxcblx0XHQna2V5ZG93bic6ICAgICAgICAgICAgICAgICAgICAgICAgJ3RvZ2dsZVNlbGVjdGlvbkhhbmRsZXInXG5cdH0sXG5cblx0YnV0dG9uczoge30sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5zZWxlY3Rpb24sXG5cdFx0XHRvcHRpb25zID0gXy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHRcdHJlcmVuZGVyT25Nb2RlbENoYW5nZTogdHJ1ZVxuXHRcdFx0fSApO1xuXG5cdFx0aWYgKCBvcHRpb25zLnJlcmVuZGVyT25Nb2RlbENoYW5nZSApIHtcblx0XHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2UnLCB0aGlzLnJlbmRlciApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnY2hhbmdlOnBlcmNlbnQnLCB0aGlzLnByb2dyZXNzICk7XG5cdFx0fVxuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6dGl0bGUnLCB0aGlzLl9zeW5jVGl0bGUgKTtcblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnY2hhbmdlOmNhcHRpb24nLCB0aGlzLl9zeW5jQ2FwdGlvbiApO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6YXJ0aXN0JywgdGhpcy5fc3luY0FydGlzdCApO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6YWxidW0nLCB0aGlzLl9zeW5jQWxidW0gKTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgc2VsZWN0aW9uLlxuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdhZGQnLCB0aGlzLnNlbGVjdCApO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdyZW1vdmUnLCB0aGlzLmRlc2VsZWN0ICk7XG5cdFx0aWYgKCBzZWxlY3Rpb24gKSB7XG5cdFx0XHRzZWxlY3Rpb24ub24oICdyZXNldCcsIHRoaXMudXBkYXRlU2VsZWN0LCB0aGlzICk7XG5cdFx0XHQvLyBVcGRhdGUgdGhlIG1vZGVsJ3MgZGV0YWlscyB2aWV3LlxuXHRcdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ3NlbGVjdGlvbjpzaW5nbGUgc2VsZWN0aW9uOnVuc2luZ2xlJywgdGhpcy5kZXRhaWxzICk7XG5cdFx0XHR0aGlzLmRldGFpbHMoIHRoaXMubW9kZWwsIHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCgnc2VsZWN0aW9uJykgKTtcblx0XHR9XG5cblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLmNvbnRyb2xsZXIsICdhdHRhY2htZW50OmNvbXBhdDp3YWl0aW5nIGF0dGFjaG1lbnQ6Y29tcGF0OnJlYWR5JywgdGhpcy51cGRhdGVTYXZlICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5BdHRhY2htZW50fSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0ZGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5zZWxlY3Rpb247XG5cblx0XHQvLyBNYWtlIHN1cmUgYWxsIHNldHRpbmdzIGFyZSBzYXZlZCBiZWZvcmUgcmVtb3ZpbmcgdGhlIHZpZXcuXG5cdFx0dGhpcy51cGRhdGVBbGwoKTtcblxuXHRcdGlmICggc2VsZWN0aW9uICkge1xuXHRcdFx0c2VsZWN0aW9uLm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBjYWxsICdkaXNwb3NlJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0Vmlldy5wcm90b3R5cGUuZGlzcG9zZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5BdHRhY2htZW50fSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgb3B0aW9ucyA9IF8uZGVmYXVsdHMoIHRoaXMubW9kZWwudG9KU09OKCksIHtcblx0XHRcdFx0b3JpZW50YXRpb246ICAgJ2xhbmRzY2FwZScsXG5cdFx0XHRcdHVwbG9hZGluZzogICAgIGZhbHNlLFxuXHRcdFx0XHR0eXBlOiAgICAgICAgICAnJyxcblx0XHRcdFx0c3VidHlwZTogICAgICAgJycsXG5cdFx0XHRcdGljb246ICAgICAgICAgICcnLFxuXHRcdFx0XHRmaWxlbmFtZTogICAgICAnJyxcblx0XHRcdFx0Y2FwdGlvbjogICAgICAgJycsXG5cdFx0XHRcdHRpdGxlOiAgICAgICAgICcnLFxuXHRcdFx0XHRkYXRlRm9ybWF0dGVkOiAnJyxcblx0XHRcdFx0d2lkdGg6ICAgICAgICAgJycsXG5cdFx0XHRcdGhlaWdodDogICAgICAgICcnLFxuXHRcdFx0XHRjb21wYXQ6ICAgICAgICBmYWxzZSxcblx0XHRcdFx0YWx0OiAgICAgICAgICAgJycsXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAgICcnXG5cdFx0XHR9LCB0aGlzLm9wdGlvbnMgKTtcblxuXHRcdG9wdGlvbnMuYnV0dG9ucyAgPSB0aGlzLmJ1dHRvbnM7XG5cdFx0b3B0aW9ucy5kZXNjcmliZSA9IHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCgnZGVzY3JpYmUnKTtcblxuXHRcdGlmICggJ2ltYWdlJyA9PT0gb3B0aW9ucy50eXBlICkge1xuXHRcdFx0b3B0aW9ucy5zaXplID0gdGhpcy5pbWFnZVNpemUoKTtcblx0XHR9XG5cblx0XHRvcHRpb25zLmNhbiA9IHt9O1xuXHRcdGlmICggb3B0aW9ucy5ub25jZXMgKSB7XG5cdFx0XHRvcHRpb25zLmNhbi5yZW1vdmUgPSAhISBvcHRpb25zLm5vbmNlc1snZGVsZXRlJ107XG5cdFx0XHRvcHRpb25zLmNhbi5zYXZlID0gISEgb3B0aW9ucy5ub25jZXMudXBkYXRlO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLnN0YXRlKCkuZ2V0KCdhbGxvd0xvY2FsRWRpdHMnKSApIHtcblx0XHRcdG9wdGlvbnMuYWxsb3dMb2NhbEVkaXRzID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMudXBsb2FkaW5nICYmICEgb3B0aW9ucy5wZXJjZW50ICkge1xuXHRcdFx0b3B0aW9ucy5wZXJjZW50ID0gMDtcblx0XHR9XG5cblx0XHR0aGlzLnZpZXdzLmRldGFjaCgpO1xuXHRcdHRoaXMuJGVsLmh0bWwoIHRoaXMudGVtcGxhdGUoIG9wdGlvbnMgKSApO1xuXG5cdFx0dGhpcy4kZWwudG9nZ2xlQ2xhc3MoICd1cGxvYWRpbmcnLCBvcHRpb25zLnVwbG9hZGluZyApO1xuXG5cdFx0aWYgKCBvcHRpb25zLnVwbG9hZGluZyApIHtcblx0XHRcdHRoaXMuJGJhciA9IHRoaXMuJCgnLm1lZGlhLXByb2dyZXNzLWJhciBkaXYnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIHRoaXMuJGJhcjtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgbW9kZWwgaXMgc2VsZWN0ZWQuXG5cdFx0dGhpcy51cGRhdGVTZWxlY3QoKTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgc2F2ZSBzdGF0dXMuXG5cdFx0dGhpcy51cGRhdGVTYXZlKCk7XG5cblx0XHR0aGlzLnZpZXdzLnJlbmRlcigpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cHJvZ3Jlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy4kYmFyICYmIHRoaXMuJGJhci5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLiRiYXIud2lkdGgoIHRoaXMubW9kZWwuZ2V0KCdwZXJjZW50JykgKyAnJScgKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0dG9nZ2xlU2VsZWN0aW9uSGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBtZXRob2Q7XG5cblx0XHQvLyBEb24ndCBkbyBhbnl0aGluZyBpbnNpZGUgaW5wdXRzIGFuZCBvbiB0aGUgYXR0YWNobWVudCBjaGVjayBhbmQgcmVtb3ZlIGJ1dHRvbnMuXG5cdFx0aWYgKCAnSU5QVVQnID09PSBldmVudC50YXJnZXQubm9kZU5hbWUgfHwgJ0JVVFRPTicgPT09IGV2ZW50LnRhcmdldC5ub2RlTmFtZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYXRjaCBhcnJvdyBldmVudHNcblx0XHRpZiAoIDM3ID09PSBldmVudC5rZXlDb2RlIHx8IDM4ID09PSBldmVudC5rZXlDb2RlIHx8IDM5ID09PSBldmVudC5rZXlDb2RlIHx8IDQwID09PSBldmVudC5rZXlDb2RlICkge1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLnRyaWdnZXIoICdhdHRhY2htZW50OmtleWRvd246YXJyb3cnLCBldmVudCApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENhdGNoIGVudGVyIGFuZCBzcGFjZSBldmVudHNcblx0XHRpZiAoICdrZXlkb3duJyA9PT0gZXZlbnQudHlwZSAmJiAxMyAhPT0gZXZlbnQua2V5Q29kZSAmJiAzMiAhPT0gZXZlbnQua2V5Q29kZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Ly8gSW4gdGhlIGdyaWQgdmlldywgYnViYmxlIHVwIGFuIGVkaXQ6YXR0YWNobWVudCBldmVudCB0byB0aGUgY29udHJvbGxlci5cblx0XHRpZiAoIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdncmlkJyApICkge1xuXHRcdFx0aWYgKCB0aGlzLmNvbnRyb2xsZXIuaXNNb2RlQWN0aXZlKCAnZWRpdCcgKSApIHtcblx0XHRcdFx0Ly8gUGFzcyB0aGUgY3VycmVudCB0YXJnZXQgdG8gcmVzdG9yZSBmb2N1cyB3aGVuIGNsb3Npbmdcblx0XHRcdFx0dGhpcy5jb250cm9sbGVyLnRyaWdnZXIoICdlZGl0OmF0dGFjaG1lbnQnLCB0aGlzLm1vZGVsLCBldmVudC5jdXJyZW50VGFyZ2V0ICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLmNvbnRyb2xsZXIuaXNNb2RlQWN0aXZlKCAnc2VsZWN0JyApICkge1xuXHRcdFx0XHRtZXRob2QgPSAndG9nZ2xlJztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGV2ZW50LnNoaWZ0S2V5ICkge1xuXHRcdFx0bWV0aG9kID0gJ2JldHdlZW4nO1xuXHRcdH0gZWxzZSBpZiAoIGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSApIHtcblx0XHRcdG1ldGhvZCA9ICd0b2dnbGUnO1xuXHRcdH1cblxuXHRcdHRoaXMudG9nZ2xlU2VsZWN0aW9uKHtcblx0XHRcdG1ldGhvZDogbWV0aG9kXG5cdFx0fSk7XG5cblx0XHR0aGlzLmNvbnRyb2xsZXIudHJpZ2dlciggJ3NlbGVjdGlvbjp0b2dnbGUnICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHQgKi9cblx0dG9nZ2xlU2VsZWN0aW9uOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIgY29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbixcblx0XHRcdHNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5zZWxlY3Rpb24sXG5cdFx0XHRtb2RlbCA9IHRoaXMubW9kZWwsXG5cdFx0XHRtZXRob2QgPSBvcHRpb25zICYmIG9wdGlvbnMubWV0aG9kLFxuXHRcdFx0c2luZ2xlLCBtb2RlbHMsIHNpbmdsZUluZGV4LCBtb2RlbEluZGV4O1xuXG5cdFx0aWYgKCAhIHNlbGVjdGlvbiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzaW5nbGUgPSBzZWxlY3Rpb24uc2luZ2xlKCk7XG5cdFx0bWV0aG9kID0gXy5pc1VuZGVmaW5lZCggbWV0aG9kICkgPyBzZWxlY3Rpb24ubXVsdGlwbGUgOiBtZXRob2Q7XG5cblx0XHQvLyBJZiB0aGUgYG1ldGhvZGAgaXMgc2V0IHRvIGBiZXR3ZWVuYCwgc2VsZWN0IGFsbCBtb2RlbHMgdGhhdFxuXHRcdC8vIGV4aXN0IGJldHdlZW4gdGhlIGN1cnJlbnQgYW5kIHRoZSBzZWxlY3RlZCBtb2RlbC5cblx0XHRpZiAoICdiZXR3ZWVuJyA9PT0gbWV0aG9kICYmIHNpbmdsZSAmJiBzZWxlY3Rpb24ubXVsdGlwbGUgKSB7XG5cdFx0XHQvLyBJZiB0aGUgbW9kZWxzIGFyZSB0aGUgc2FtZSwgc2hvcnQtY2lyY3VpdC5cblx0XHRcdGlmICggc2luZ2xlID09PSBtb2RlbCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRzaW5nbGVJbmRleCA9IGNvbGxlY3Rpb24uaW5kZXhPZiggc2luZ2xlICk7XG5cdFx0XHRtb2RlbEluZGV4ICA9IGNvbGxlY3Rpb24uaW5kZXhPZiggdGhpcy5tb2RlbCApO1xuXG5cdFx0XHRpZiAoIHNpbmdsZUluZGV4IDwgbW9kZWxJbmRleCApIHtcblx0XHRcdFx0bW9kZWxzID0gY29sbGVjdGlvbi5tb2RlbHMuc2xpY2UoIHNpbmdsZUluZGV4LCBtb2RlbEluZGV4ICsgMSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bW9kZWxzID0gY29sbGVjdGlvbi5tb2RlbHMuc2xpY2UoIG1vZGVsSW5kZXgsIHNpbmdsZUluZGV4ICsgMSApO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3Rpb24uYWRkKCBtb2RlbHMgKTtcblx0XHRcdHNlbGVjdGlvbi5zaW5nbGUoIG1vZGVsICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHQvLyBJZiB0aGUgYG1ldGhvZGAgaXMgc2V0IHRvIGB0b2dnbGVgLCBqdXN0IGZsaXAgdGhlIHNlbGVjdGlvblxuXHRcdC8vIHN0YXR1cywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBtb2RlbCBpcyB0aGUgc2luZ2xlIG1vZGVsLlxuXHRcdH0gZWxzZSBpZiAoICd0b2dnbGUnID09PSBtZXRob2QgKSB7XG5cdFx0XHRzZWxlY3Rpb25bIHRoaXMuc2VsZWN0ZWQoKSA/ICdyZW1vdmUnIDogJ2FkZCcgXSggbW9kZWwgKTtcblx0XHRcdHNlbGVjdGlvbi5zaW5nbGUoIG1vZGVsICk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fSBlbHNlIGlmICggJ2FkZCcgPT09IG1ldGhvZCApIHtcblx0XHRcdHNlbGVjdGlvbi5hZGQoIG1vZGVsICk7XG5cdFx0XHRzZWxlY3Rpb24uc2luZ2xlKCBtb2RlbCApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZpeGVzIGJ1ZyB0aGF0IGxvc2VzIGZvY3VzIHdoZW4gc2VsZWN0aW5nIGEgZmVhdHVyZWQgaW1hZ2Vcblx0XHRpZiAoICEgbWV0aG9kICkge1xuXHRcdFx0bWV0aG9kID0gJ2FkZCc7XG5cdFx0fVxuXG5cdFx0aWYgKCBtZXRob2QgIT09ICdhZGQnICkge1xuXHRcdFx0bWV0aG9kID0gJ3Jlc2V0Jztcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuc2VsZWN0ZWQoKSApIHtcblx0XHRcdC8vIElmIHRoZSBtb2RlbCBpcyB0aGUgc2luZ2xlIG1vZGVsLCByZW1vdmUgaXQuXG5cdFx0XHQvLyBJZiBpdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHNpbmdsZSBtb2RlbCxcblx0XHRcdC8vIGl0IG5vdyBiZWNvbWVzIHRoZSBzaW5nbGUgbW9kZWwuXG5cdFx0XHRzZWxlY3Rpb25bIHNpbmdsZSA9PT0gbW9kZWwgPyAncmVtb3ZlJyA6ICdzaW5nbGUnIF0oIG1vZGVsICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIHRoZSBtb2RlbCBpcyBub3Qgc2VsZWN0ZWQsIHJ1biB0aGUgYG1ldGhvZGAgb24gdGhlXG5cdFx0XHQvLyBzZWxlY3Rpb24uIEJ5IGRlZmF1bHQsIHdlIGByZXNldGAgdGhlIHNlbGVjdGlvbiwgYnV0IHRoZVxuXHRcdFx0Ly8gYG1ldGhvZGAgY2FuIGJlIHNldCB0byBgYWRkYCB0aGUgbW9kZWwgdG8gdGhlIHNlbGVjdGlvbi5cblx0XHRcdHNlbGVjdGlvblsgbWV0aG9kIF0oIG1vZGVsICk7XG5cdFx0XHRzZWxlY3Rpb24uc2luZ2xlKCBtb2RlbCApO1xuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVTZWxlY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXNbIHRoaXMuc2VsZWN0ZWQoKSA/ICdzZWxlY3QnIDogJ2Rlc2VsZWN0JyBdKCk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7dW5yZXNvbHZlZHxCb29sZWFufVxuXHQgKi9cblx0c2VsZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzZWxlY3Rpb24gPSB0aGlzLm9wdGlvbnMuc2VsZWN0aW9uO1xuXHRcdGlmICggc2VsZWN0aW9uICkge1xuXHRcdFx0cmV0dXJuICEhIHNlbGVjdGlvbi5nZXQoIHRoaXMubW9kZWwuY2lkICk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gbW9kZWxcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Db2xsZWN0aW9ufSBjb2xsZWN0aW9uXG5cdCAqL1xuXHRzZWxlY3Q6IGZ1bmN0aW9uKCBtb2RlbCwgY29sbGVjdGlvbiApIHtcblx0XHR2YXIgc2VsZWN0aW9uID0gdGhpcy5vcHRpb25zLnNlbGVjdGlvbixcblx0XHRcdGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXI7XG5cblx0XHQvLyBDaGVjayBpZiBhIHNlbGVjdGlvbiBleGlzdHMgYW5kIGlmIGl0J3MgdGhlIGNvbGxlY3Rpb24gcHJvdmlkZWQuXG5cdFx0Ly8gSWYgdGhleSdyZSBub3QgdGhlIHNhbWUgY29sbGVjdGlvbiwgYmFpbDsgd2UncmUgaW4gYW5vdGhlclxuXHRcdC8vIHNlbGVjdGlvbidzIGV2ZW50IGxvb3AuXG5cdFx0aWYgKCAhIHNlbGVjdGlvbiB8fCAoIGNvbGxlY3Rpb24gJiYgY29sbGVjdGlvbiAhPT0gc2VsZWN0aW9uICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQmFpbCBpZiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBzZWxlY3RlZC5cblx0XHRpZiAoIHRoaXMuJGVsLmhhc0NsYXNzKCAnc2VsZWN0ZWQnICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQWRkICdzZWxlY3RlZCcgY2xhc3MgdG8gbW9kZWwsIHNldCBhcmlhLWNoZWNrZWQgdG8gdHJ1ZS5cblx0XHR0aGlzLiRlbC5hZGRDbGFzcyggJ3NlbGVjdGVkJyApLmF0dHIoICdhcmlhLWNoZWNrZWQnLCB0cnVlICk7XG5cdFx0Ly8gIE1ha2UgdGhlIGNoZWNrYm94IHRhYmFibGUsIGV4Y2VwdCBpbiBtZWRpYSBncmlkIChidWxrIHNlbGVjdCBtb2RlKS5cblx0XHRpZiAoICEgKCBjb250cm9sbGVyLmlzTW9kZUFjdGl2ZSggJ2dyaWQnICkgJiYgY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdzZWxlY3QnICkgKSApIHtcblx0XHRcdHRoaXMuJCggJy5jaGVjaycgKS5hdHRyKCAndGFiaW5kZXgnLCAnMCcgKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge0JhY2tib25lLk1vZGVsfSBtb2RlbFxuXHQgKiBAcGFyYW0ge0JhY2tib25lLkNvbGxlY3Rpb259IGNvbGxlY3Rpb25cblx0ICovXG5cdGRlc2VsZWN0OiBmdW5jdGlvbiggbW9kZWwsIGNvbGxlY3Rpb24gKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5zZWxlY3Rpb247XG5cblx0XHQvLyBDaGVjayBpZiBhIHNlbGVjdGlvbiBleGlzdHMgYW5kIGlmIGl0J3MgdGhlIGNvbGxlY3Rpb24gcHJvdmlkZWQuXG5cdFx0Ly8gSWYgdGhleSdyZSBub3QgdGhlIHNhbWUgY29sbGVjdGlvbiwgYmFpbDsgd2UncmUgaW4gYW5vdGhlclxuXHRcdC8vIHNlbGVjdGlvbidzIGV2ZW50IGxvb3AuXG5cdFx0aWYgKCAhIHNlbGVjdGlvbiB8fCAoIGNvbGxlY3Rpb24gJiYgY29sbGVjdGlvbiAhPT0gc2VsZWN0aW9uICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKCAnc2VsZWN0ZWQnICkuYXR0ciggJ2FyaWEtY2hlY2tlZCcsIGZhbHNlIClcblx0XHRcdC5maW5kKCAnLmNoZWNrJyApLmF0dHIoICd0YWJpbmRleCcsICctMScgKTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuTW9kZWx9IG1vZGVsXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuQ29sbGVjdGlvbn0gY29sbGVjdGlvblxuXHQgKi9cblx0ZGV0YWlsczogZnVuY3Rpb24oIG1vZGVsLCBjb2xsZWN0aW9uICkge1xuXHRcdHZhciBzZWxlY3Rpb24gPSB0aGlzLm9wdGlvbnMuc2VsZWN0aW9uLFxuXHRcdFx0ZGV0YWlscztcblxuXHRcdGlmICggc2VsZWN0aW9uICE9PSBjb2xsZWN0aW9uICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRldGFpbHMgPSBzZWxlY3Rpb24uc2luZ2xlKCk7XG5cdFx0dGhpcy4kZWwudG9nZ2xlQ2xhc3MoICdkZXRhaWxzJywgZGV0YWlscyA9PT0gdGhpcy5tb2RlbCApO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNpemVcblx0ICogQHJldHVybnMge09iamVjdH1cblx0ICovXG5cdGltYWdlU2l6ZTogZnVuY3Rpb24oIHNpemUgKSB7XG5cdFx0dmFyIHNpemVzID0gdGhpcy5tb2RlbC5nZXQoJ3NpemVzJyksIG1hdGNoZWQgPSBmYWxzZTtcblxuXHRcdHNpemUgPSBzaXplIHx8ICdtZWRpdW0nO1xuXG5cdFx0Ly8gVXNlIHRoZSBwcm92aWRlZCBpbWFnZSBzaXplIGlmIHBvc3NpYmxlLlxuXHRcdGlmICggc2l6ZXMgKSB7XG5cdFx0XHRpZiAoIHNpemVzWyBzaXplIF0gKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBzaXplc1sgc2l6ZSBdO1xuXHRcdFx0fSBlbHNlIGlmICggc2l6ZXMubGFyZ2UgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBzaXplcy5sYXJnZTtcblx0XHRcdH0gZWxzZSBpZiAoIHNpemVzLnRodW1ibmFpbCApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IHNpemVzLnRodW1ibmFpbDtcblx0XHRcdH0gZWxzZSBpZiAoIHNpemVzLmZ1bGwgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBzaXplcy5mdWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGNoZWQgKSB7XG5cdFx0XHRcdHJldHVybiBfLmNsb25lKCBtYXRjaGVkICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHVybDogICAgICAgICB0aGlzLm1vZGVsLmdldCgndXJsJyksXG5cdFx0XHR3aWR0aDogICAgICAgdGhpcy5tb2RlbC5nZXQoJ3dpZHRoJyksXG5cdFx0XHRoZWlnaHQ6ICAgICAgdGhpcy5tb2RlbC5nZXQoJ2hlaWdodCcpLFxuXHRcdFx0b3JpZW50YXRpb246IHRoaXMubW9kZWwuZ2V0KCdvcmllbnRhdGlvbicpXG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0dXBkYXRlU2V0dGluZzogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciAkc2V0dGluZyA9ICQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoJ1tkYXRhLXNldHRpbmddJyksXG5cdFx0XHRzZXR0aW5nLCB2YWx1ZTtcblxuXHRcdGlmICggISAkc2V0dGluZy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0c2V0dGluZyA9ICRzZXR0aW5nLmRhdGEoJ3NldHRpbmcnKTtcblx0XHR2YWx1ZSAgID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG5cdFx0aWYgKCB0aGlzLm1vZGVsLmdldCggc2V0dGluZyApICE9PSB2YWx1ZSApIHtcblx0XHRcdHRoaXMuc2F2ZSggc2V0dGluZywgdmFsdWUgKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFBhc3MgYWxsIHRoZSBhcmd1bWVudHMgdG8gdGhlIG1vZGVsJ3Mgc2F2ZSBtZXRob2QuXG5cdCAqXG5cdCAqIFJlY29yZHMgdGhlIGFnZ3JlZ2F0ZSBzdGF0dXMgb2YgYWxsIHNhdmUgcmVxdWVzdHMgYW5kIHVwZGF0ZXMgdGhlXG5cdCAqIHZpZXcncyBjbGFzc2VzIGFjY29yZGluZ2x5LlxuXHQgKi9cblx0c2F2ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZpZXcgPSB0aGlzLFxuXHRcdFx0c2F2ZSA9IHRoaXMuX3NhdmUgPSB0aGlzLl9zYXZlIHx8IHsgc3RhdHVzOiAncmVhZHknIH0sXG5cdFx0XHRyZXF1ZXN0ID0gdGhpcy5tb2RlbC5zYXZlLmFwcGx5KCB0aGlzLm1vZGVsLCBhcmd1bWVudHMgKSxcblx0XHRcdHJlcXVlc3RzID0gc2F2ZS5yZXF1ZXN0cyA/ICQud2hlbiggcmVxdWVzdCwgc2F2ZS5yZXF1ZXN0cyApIDogcmVxdWVzdDtcblxuXHRcdC8vIElmIHdlJ3JlIHdhaXRpbmcgdG8gcmVtb3ZlICdTYXZlZC4nLCBzdG9wLlxuXHRcdGlmICggc2F2ZS5zYXZlZFRpbWVyICkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KCBzYXZlLnNhdmVkVGltZXIgKTtcblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZVNhdmUoJ3dhaXRpbmcnKTtcblx0XHRzYXZlLnJlcXVlc3RzID0gcmVxdWVzdHM7XG5cdFx0cmVxdWVzdHMuYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdC8vIElmIHdlJ3ZlIHBlcmZvcm1lZCBhbm90aGVyIHJlcXVlc3Qgc2luY2UgdGhpcyBvbmUsIGJhaWwuXG5cdFx0XHRpZiAoIHNhdmUucmVxdWVzdHMgIT09IHJlcXVlc3RzICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHZpZXcudXBkYXRlU2F2ZSggcmVxdWVzdHMuc3RhdGUoKSA9PT0gJ3Jlc29sdmVkJyA/ICdjb21wbGV0ZScgOiAnZXJyb3InICk7XG5cdFx0XHRzYXZlLnNhdmVkVGltZXIgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmlldy51cGRhdGVTYXZlKCdyZWFkeScpO1xuXHRcdFx0XHRkZWxldGUgc2F2ZS5zYXZlZFRpbWVyO1xuXHRcdFx0fSwgMjAwMCApO1xuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHN0YXR1c1xuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5BdHRhY2htZW50fSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0dXBkYXRlU2F2ZTogZnVuY3Rpb24oIHN0YXR1cyApIHtcblx0XHR2YXIgc2F2ZSA9IHRoaXMuX3NhdmUgPSB0aGlzLl9zYXZlIHx8IHsgc3RhdHVzOiAncmVhZHknIH07XG5cblx0XHRpZiAoIHN0YXR1cyAmJiBzdGF0dXMgIT09IHNhdmUuc3RhdHVzICkge1xuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoICdzYXZlLScgKyBzYXZlLnN0YXR1cyApO1xuXHRcdFx0c2F2ZS5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0fVxuXG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoICdzYXZlLScgKyBzYXZlLnN0YXR1cyApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHVwZGF0ZUFsbDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyICRzZXR0aW5ncyA9IHRoaXMuJCgnW2RhdGEtc2V0dGluZ10nKSxcblx0XHRcdG1vZGVsID0gdGhpcy5tb2RlbCxcblx0XHRcdGNoYW5nZWQ7XG5cblx0XHRjaGFuZ2VkID0gXy5jaGFpbiggJHNldHRpbmdzICkubWFwKCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0XHR2YXIgJGlucHV0ID0gJCgnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIFt2YWx1ZV0nLCBlbCApLFxuXHRcdFx0XHRzZXR0aW5nLCB2YWx1ZTtcblxuXHRcdFx0aWYgKCAhICRpbnB1dC5sZW5ndGggKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0c2V0dGluZyA9ICQoZWwpLmRhdGEoJ3NldHRpbmcnKTtcblx0XHRcdHZhbHVlID0gJGlucHV0LnZhbCgpO1xuXG5cdFx0XHQvLyBSZWNvcmQgdGhlIHZhbHVlIGlmIGl0IGNoYW5nZWQuXG5cdFx0XHRpZiAoIG1vZGVsLmdldCggc2V0dGluZyApICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuIFsgc2V0dGluZywgdmFsdWUgXTtcblx0XHRcdH1cblx0XHR9KS5jb21wYWN0KCkub2JqZWN0KCkudmFsdWUoKTtcblxuXHRcdGlmICggISBfLmlzRW1wdHkoIGNoYW5nZWQgKSApIHtcblx0XHRcdG1vZGVsLnNhdmUoIGNoYW5nZWQgKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcblx0ICovXG5cdHJlbW92ZUZyb21MaWJyYXJ5OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0Ly8gQ2F0Y2ggZW50ZXIgYW5kIHNwYWNlIGV2ZW50c1xuXHRcdGlmICggJ2tleWRvd24nID09PSBldmVudC50eXBlICYmIDEzICE9PSBldmVudC5rZXlDb2RlICYmIDMyICE9PSBldmVudC5rZXlDb2RlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFN0b3AgcHJvcGFnYXRpb24gc28gdGhlIG1vZGVsIGlzbid0IHNlbGVjdGVkLlxuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLnJlbW92ZSggdGhpcy5tb2RlbCApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGQgdGhlIG1vZGVsIGlmIGl0IGlzbid0IGluIHRoZSBzZWxlY3Rpb24sIGlmIGl0IGlzIGluIHRoZSBzZWxlY3Rpb24sXG5cdCAqIHJlbW92ZSBpdC5cblx0ICpcblx0ICogQHBhcmFtICB7W3R5cGVdfSBldmVudCBbZGVzY3JpcHRpb25dXG5cdCAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgW2Rlc2NyaXB0aW9uXVxuXHQgKi9cblx0Y2hlY2tDbGlja0hhbmRsZXI6IGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5zZWxlY3Rpb247XG5cdFx0aWYgKCAhIHNlbGVjdGlvbiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0aWYgKCBzZWxlY3Rpb24ud2hlcmUoIHsgaWQ6IHRoaXMubW9kZWwuZ2V0KCAnaWQnICkgfSApLmxlbmd0aCApIHtcblx0XHRcdHNlbGVjdGlvbi5yZW1vdmUoIHRoaXMubW9kZWwgKTtcblx0XHRcdC8vIE1vdmUgZm9jdXMgYmFjayB0byB0aGUgYXR0YWNobWVudCB0aWxlIChmcm9tIHRoZSBjaGVjaykuXG5cdFx0XHR0aGlzLiRlbC5mb2N1cygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzZWxlY3Rpb24uYWRkKCB0aGlzLm1vZGVsICk7XG5cdFx0fVxuXHR9XG59KTtcblxuLy8gRW5zdXJlIHNldHRpbmdzIHJlbWFpbiBpbiBzeW5jIGJldHdlZW4gYXR0YWNobWVudCB2aWV3cy5cbl8uZWFjaCh7XG5cdGNhcHRpb246ICdfc3luY0NhcHRpb24nLFxuXHR0aXRsZTogICAnX3N5bmNUaXRsZScsXG5cdGFydGlzdDogICdfc3luY0FydGlzdCcsXG5cdGFsYnVtOiAgICdfc3luY0FsYnVtJ1xufSwgZnVuY3Rpb24oIG1ldGhvZCwgc2V0dGluZyApIHtcblx0LyoqXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuTW9kZWx9IG1vZGVsXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5BdHRhY2htZW50fSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0QXR0YWNobWVudC5wcm90b3R5cGVbIG1ldGhvZCBdID0gZnVuY3Rpb24oIG1vZGVsLCB2YWx1ZSApIHtcblx0XHR2YXIgJHNldHRpbmcgPSB0aGlzLiQoJ1tkYXRhLXNldHRpbmc9XCInICsgc2V0dGluZyArICdcIl0nKTtcblxuXHRcdGlmICggISAkc2V0dGluZy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgdXBkYXRlZCB2YWx1ZSBpcyBpbiBzeW5jIHdpdGggdGhlIHZhbHVlIGluIHRoZSBET00sIHRoZXJlXG5cdFx0Ly8gaXMgbm8gbmVlZCB0byByZS1yZW5kZXIuIElmIHdlJ3JlIGN1cnJlbnRseSBlZGl0aW5nIHRoZSB2YWx1ZSxcblx0XHQvLyBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW4gc3luYywgc3VwcHJlc3NpbmcgdGhlIHJlLXJlbmRlciBmb3Jcblx0XHQvLyB0aGUgdmlldyB3ZSdyZSBlZGl0aW5nLCB3aGlsZSB1cGRhdGluZyBhbnkgb3RoZXJzLlxuXHRcdGlmICggdmFsdWUgPT09ICRzZXR0aW5nLmZpbmQoJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBbdmFsdWVdJykudmFsKCkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZW5kZXIoKTtcblx0fTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF0dGFjaG1lbnQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5EZXRhaWxzXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5BdHRhY2htZW50XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBBdHRhY2htZW50ID0gd3AubWVkaWEudmlldy5BdHRhY2htZW50LFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHREZXRhaWxzO1xuXG5EZXRhaWxzID0gQXR0YWNobWVudC5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdkaXYnLFxuXHRjbGFzc05hbWU6ICdhdHRhY2htZW50LWRldGFpbHMnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCdhdHRhY2htZW50LWRldGFpbHMnKSxcblxuXHRhdHRyaWJ1dGVzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0J3RhYkluZGV4JzogICAgIDAsXG5cdFx0XHQnZGF0YS1pZCc6ICAgICAgdGhpcy5tb2RlbC5nZXQoICdpZCcgKVxuXHRcdH07XG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0J2NoYW5nZSBbZGF0YS1zZXR0aW5nXSc6ICAgICAgICAgICd1cGRhdGVTZXR0aW5nJyxcblx0XHQnY2hhbmdlIFtkYXRhLXNldHRpbmddIGlucHV0JzogICAgJ3VwZGF0ZVNldHRpbmcnLFxuXHRcdCdjaGFuZ2UgW2RhdGEtc2V0dGluZ10gc2VsZWN0JzogICAndXBkYXRlU2V0dGluZycsXG5cdFx0J2NoYW5nZSBbZGF0YS1zZXR0aW5nXSB0ZXh0YXJlYSc6ICd1cGRhdGVTZXR0aW5nJyxcblx0XHQnY2xpY2sgLmRlbGV0ZS1hdHRhY2htZW50JzogICAgICAgJ2RlbGV0ZUF0dGFjaG1lbnQnLFxuXHRcdCdjbGljayAudHJhc2gtYXR0YWNobWVudCc6ICAgICAgICAndHJhc2hBdHRhY2htZW50Jyxcblx0XHQnY2xpY2sgLnVudHJhc2gtYXR0YWNobWVudCc6ICAgICAgJ3VudHJhc2hBdHRhY2htZW50Jyxcblx0XHQnY2xpY2sgLmVkaXQtYXR0YWNobWVudCc6ICAgICAgICAgJ2VkaXRBdHRhY2htZW50Jyxcblx0XHQna2V5ZG93bic6ICAgICAgICAgICAgICAgICAgICAgICAgJ3RvZ2dsZVNlbGVjdGlvbkhhbmRsZXInXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gXy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHRyZXJlbmRlck9uTW9kZWxDaGFuZ2U6IGZhbHNlXG5cdFx0fSk7XG5cblx0XHR0aGlzLm9uKCAncmVhZHknLCB0aGlzLmluaXRpYWxGb2N1cyApO1xuXHRcdC8vIENhbGwgJ2luaXRpYWxpemUnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3MuXG5cdFx0QXR0YWNobWVudC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0aW5pdGlhbEZvY3VzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICEgd3AubWVkaWEuaXNUb3VjaERldmljZSApIHtcblx0XHRcdC8qXG5cdFx0XHRQcmV2aW91c2x5IGZvY3VzZWQgdGhlIGZpcnN0ICc6aW5wdXQnICh0aGUgcmVhZG9ubHkgVVJMIHRleHQgZmllbGQpLlxuXHRcdFx0U2luY2UgdGhlIGZpcnN0ICc6aW5wdXQnIGlzIG5vdyBhIGJ1dHRvbiAoZGVsZXRlL3RyYXNoKTogd2hlbiBwcmVzc2luZ1xuXHRcdFx0c3BhY2ViYXIgb24gYW4gYXR0YWNobWVudCwgRmlyZWZveCBmaXJlcyBkZWxldGVBdHRhY2htZW50L3RyYXNoQXR0YWNobWVudFxuXHRcdFx0YXMgc29vbiBhcyBmb2N1cyBpcyBtb3ZlZC4gRXhwbGljaXRseSB0YXJnZXQgdGhlIGZpcnN0IHRleHQgZmllbGQgZm9yIG5vdy5cblx0XHRcdEB0b2RvIGNoYW5nZSBpbml0aWFsIGZvY3VzIGxvZ2ljLCBhbHNvIGZvciBhY2Nlc3NpYmlsaXR5LlxuXHRcdFx0Ki9cblx0XHRcdHRoaXMuJCggJ2lucHV0W3R5cGU9XCJ0ZXh0XCJdJyApLmVxKCAwICkuZm9jdXMoKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcblx0ICovXG5cdGRlbGV0ZUF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYgKCB3aW5kb3cuY29uZmlybSggbDEwbi53YXJuRGVsZXRlICkgKSB7XG5cdFx0XHR0aGlzLm1vZGVsLmRlc3Ryb3koKTtcblx0XHRcdC8vIEtlZXAgZm9jdXMgaW5zaWRlIG1lZGlhIG1vZGFsXG5cdFx0XHQvLyBhZnRlciBpbWFnZSBpcyBkZWxldGVkXG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIubW9kYWwuZm9jdXNNYW5hZ2VyLmZvY3VzKCk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHR0cmFzaEF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgbGlicmFyeSA9IHRoaXMuY29udHJvbGxlci5saWJyYXJ5O1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAoIHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MubWVkaWFUcmFzaCAmJlxuXHRcdFx0J2VkaXQtbWV0YWRhdGEnID09PSB0aGlzLmNvbnRyb2xsZXIuY29udGVudC5tb2RlKCkgKSB7XG5cblx0XHRcdHRoaXMubW9kZWwuc2V0KCAnc3RhdHVzJywgJ3RyYXNoJyApO1xuXHRcdFx0dGhpcy5tb2RlbC5zYXZlKCkuZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxpYnJhcnkuX3JlcXVlcnkoIHRydWUgKTtcblx0XHRcdH0gKTtcblx0XHR9ICBlbHNlIHtcblx0XHRcdHRoaXMubW9kZWwuZGVzdHJveSgpO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0dW50cmFzaEF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgbGlicmFyeSA9IHRoaXMuY29udHJvbGxlci5saWJyYXJ5O1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHR0aGlzLm1vZGVsLnNldCggJ3N0YXR1cycsICdpbmhlcml0JyApO1xuXHRcdHRoaXMubW9kZWwuc2F2ZSgpLmRvbmUoIGZ1bmN0aW9uKCkge1xuXHRcdFx0bGlicmFyeS5fcmVxdWVyeSggdHJ1ZSApO1xuXHRcdH0gKTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0ZWRpdEF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgZWRpdFN0YXRlID0gdGhpcy5jb250cm9sbGVyLnN0YXRlcy5nZXQoICdlZGl0LWltYWdlJyApO1xuXHRcdGlmICggd2luZG93LmltYWdlRWRpdCAmJiBlZGl0U3RhdGUgKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRlZGl0U3RhdGUuc2V0KCAnaW1hZ2UnLCB0aGlzLm1vZGVsICk7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIuc2V0U3RhdGUoICdlZGl0LWltYWdlJyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcygnbmVlZHMtcmVmcmVzaCcpO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFdoZW4gcmV2ZXJzZSB0YWJiaW5nKHNoaWZ0K3RhYikgb3V0IG9mIHRoZSByaWdodCBkZXRhaWxzIHBhbmVsLCBkZWxpdmVyXG5cdCAqIHRoZSBmb2N1cyB0byB0aGUgaXRlbSBpbiB0aGUgbGlzdCB0aGF0IHdhcyBiZWluZyBlZGl0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0dG9nZ2xlU2VsZWN0aW9uSGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGlmICggJ2tleWRvd24nID09PSBldmVudC50eXBlICYmIDkgPT09IGV2ZW50LmtleUNvZGUgJiYgZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQudGFyZ2V0ID09PSB0aGlzLiQoICc6dGFiYmFibGUnICkuZ2V0KCAwICkgKSB7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIudHJpZ2dlciggJ2F0dGFjaG1lbnQ6ZGV0YWlsczpzaGlmdC10YWInLCBldmVudCApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICggMzcgPT09IGV2ZW50LmtleUNvZGUgfHwgMzggPT09IGV2ZW50LmtleUNvZGUgfHwgMzkgPT09IGV2ZW50LmtleUNvZGUgfHwgNDAgPT09IGV2ZW50LmtleUNvZGUgKSB7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIudHJpZ2dlciggJ2F0dGFjaG1lbnQ6a2V5ZG93bjphcnJvdycsIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBEZXRhaWxzO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuRWRpdExpYnJhcnlcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIEVkaXRMaWJyYXJ5ID0gd3AubWVkaWEudmlldy5BdHRhY2htZW50LmV4dGVuZCh7XG5cdGJ1dHRvbnM6IHtcblx0XHRjbG9zZTogdHJ1ZVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFZGl0TGlicmFyeTtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5BdHRhY2htZW50cy5FZGl0U2VsZWN0aW9uXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5BdHRhY2htZW50LlNlbGVjdGlvblxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudFxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgRWRpdFNlbGVjdGlvbiA9IHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5TZWxlY3Rpb24uZXh0ZW5kKHtcblx0YnV0dG9uczoge1xuXHRcdGNsb3NlOiB0cnVlXG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVkaXRTZWxlY3Rpb247XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5MaWJyYXJ5XG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5BdHRhY2htZW50XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBMaWJyYXJ5ID0gd3AubWVkaWEudmlldy5BdHRhY2htZW50LmV4dGVuZCh7XG5cdGJ1dHRvbnM6IHtcblx0XHRjaGVjazogdHJ1ZVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaWJyYXJ5O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuU2VsZWN0aW9uXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5BdHRhY2htZW50XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBTZWxlY3Rpb24gPSB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAnYXR0YWNobWVudCBzZWxlY3Rpb24nLFxuXG5cdC8vIE9uIGNsaWNrLCBqdXN0IHNlbGVjdCB0aGUgbW9kZWwsIGluc3RlYWQgb2YgcmVtb3ZpbmcgdGhlIG1vZGVsIGZyb21cblx0Ly8gdGhlIHNlbGVjdGlvbi5cblx0dG9nZ2xlU2VsZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm9wdGlvbnMuc2VsZWN0aW9uLnNpbmdsZSggdGhpcy5tb2RlbCApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3Rpb247XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudHNcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFZpZXcgPSB3cC5tZWRpYS5WaWV3LFxuXHQkID0galF1ZXJ5LFxuXHRBdHRhY2htZW50cztcblxuQXR0YWNobWVudHMgPSBWaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ3VsJyxcblx0Y2xhc3NOYW1lOiAnYXR0YWNobWVudHMnLFxuXG5cdGF0dHJpYnV0ZXM6IHtcblx0XHR0YWJJbmRleDogLTFcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVsLmlkID0gXy51bmlxdWVJZCgnX19hdHRhY2htZW50cy12aWV3LScpO1xuXG5cdFx0Xy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHRyZWZyZXNoU2Vuc2l0aXZpdHk6IHdwLm1lZGlhLmlzVG91Y2hEZXZpY2UgPyAzMDAgOiAyMDAsXG5cdFx0XHRyZWZyZXNoVGhyZXNob2xkOiAgIDMsXG5cdFx0XHRBdHRhY2htZW50VmlldzogICAgIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudCxcblx0XHRcdHNvcnRhYmxlOiAgICAgICAgICAgZmFsc2UsXG5cdFx0XHRyZXNpemU6ICAgICAgICAgICAgIHRydWUsXG5cdFx0XHRpZGVhbENvbHVtbldpZHRoOiAgICQoIHdpbmRvdyApLndpZHRoKCkgPCA2NDAgPyAxMzUgOiAxNTBcblx0XHR9KTtcblxuXHRcdHRoaXMuX3ZpZXdzQnlDaWQgPSB7fTtcblx0XHR0aGlzLiR3aW5kb3cgPSAkKCB3aW5kb3cgKTtcblx0XHR0aGlzLnJlc2l6ZUV2ZW50ID0gJ3Jlc2l6ZS5tZWRpYS1tb2RhbC1jb2x1bW5zJztcblxuXHRcdHRoaXMuY29sbGVjdGlvbi5vbiggJ2FkZCcsIGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdFx0dGhpcy52aWV3cy5hZGQoIHRoaXMuY3JlYXRlQXR0YWNobWVudFZpZXcoIGF0dGFjaG1lbnQgKSwge1xuXHRcdFx0XHRhdDogdGhpcy5jb2xsZWN0aW9uLmluZGV4T2YoIGF0dGFjaG1lbnQgKVxuXHRcdFx0fSk7XG5cdFx0fSwgdGhpcyApO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLm9uKCAncmVtb3ZlJywgZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHR2YXIgdmlldyA9IHRoaXMuX3ZpZXdzQnlDaWRbIGF0dGFjaG1lbnQuY2lkIF07XG5cdFx0XHRkZWxldGUgdGhpcy5fdmlld3NCeUNpZFsgYXR0YWNobWVudC5jaWQgXTtcblxuXHRcdFx0aWYgKCB2aWV3ICkge1xuXHRcdFx0XHR2aWV3LnJlbW92ZSgpO1xuXHRcdFx0fVxuXHRcdH0sIHRoaXMgKTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbi5vbiggJ3Jlc2V0JywgdGhpcy5yZW5kZXIsIHRoaXMgKTtcblxuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMuY29udHJvbGxlciwgJ2xpYnJhcnk6c2VsZWN0aW9uOmFkZCcsICAgIHRoaXMuYXR0YWNobWVudEZvY3VzICk7XG5cblx0XHQvLyBUaHJvdHRsZSB0aGUgc2Nyb2xsIGhhbmRsZXIgYW5kIGJpbmQgdGhpcy5cblx0XHR0aGlzLnNjcm9sbCA9IF8uY2hhaW4oIHRoaXMuc2Nyb2xsICkuYmluZCggdGhpcyApLnRocm90dGxlKCB0aGlzLm9wdGlvbnMucmVmcmVzaFNlbnNpdGl2aXR5ICkudmFsdWUoKTtcblxuXHRcdHRoaXMub3B0aW9ucy5zY3JvbGxFbGVtZW50ID0gdGhpcy5vcHRpb25zLnNjcm9sbEVsZW1lbnQgfHwgdGhpcy5lbDtcblx0XHQkKCB0aGlzLm9wdGlvbnMuc2Nyb2xsRWxlbWVudCApLm9uKCAnc2Nyb2xsJywgdGhpcy5zY3JvbGwgKTtcblxuXHRcdHRoaXMuaW5pdFNvcnRhYmxlKCk7XG5cblx0XHRfLmJpbmRBbGwoIHRoaXMsICdzZXRDb2x1bW5zJyApO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMucmVzaXplICkge1xuXHRcdFx0dGhpcy5vbiggJ3JlYWR5JywgdGhpcy5iaW5kRXZlbnRzICk7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIub24oICdvcGVuJywgdGhpcy5zZXRDb2x1bW5zICk7XG5cblx0XHRcdC8vIENhbGwgdGhpcy5zZXRDb2x1bW5zKCkgYWZ0ZXIgdGhpcyB2aWV3IGhhcyBiZWVuIHJlbmRlcmVkIGluIHRoZSBET00gc29cblx0XHRcdC8vIGF0dGFjaG1lbnRzIGdldCBwcm9wZXIgd2lkdGggYXBwbGllZC5cblx0XHRcdF8uZGVmZXIoIHRoaXMuc2V0Q29sdW1ucywgdGhpcyApO1xuXHRcdH1cblx0fSxcblxuXHRiaW5kRXZlbnRzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiR3aW5kb3cub2ZmKCB0aGlzLnJlc2l6ZUV2ZW50ICkub24oIHRoaXMucmVzaXplRXZlbnQsIF8uZGVib3VuY2UoIHRoaXMuc2V0Q29sdW1ucywgNTAgKSApO1xuXHR9LFxuXG5cdGF0dGFjaG1lbnRGb2N1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kKCAnbGk6Zmlyc3QnICkuZm9jdXMoKTtcblx0fSxcblxuXHRyZXN0b3JlRm9jdXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJCggJ2xpLnNlbGVjdGVkOmZpcnN0JyApLmZvY3VzKCk7XG5cdH0sXG5cblx0YXJyb3dFdmVudDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBhdHRhY2htZW50cyA9IHRoaXMuJGVsLmNoaWxkcmVuKCAnbGknICksXG5cdFx0XHRwZXJSb3cgPSB0aGlzLmNvbHVtbnMsXG5cdFx0XHRpbmRleCA9IGF0dGFjaG1lbnRzLmZpbHRlciggJzpmb2N1cycgKS5pbmRleCgpLFxuXHRcdFx0cm93ID0gKCBpbmRleCArIDEgKSA8PSBwZXJSb3cgPyAxIDogTWF0aC5jZWlsKCAoIGluZGV4ICsgMSApIC8gcGVyUm93ICk7XG5cblx0XHRpZiAoIGluZGV4ID09PSAtMSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBMZWZ0IGFycm93XG5cdFx0aWYgKCAzNyA9PT0gZXZlbnQua2V5Q29kZSApIHtcblx0XHRcdGlmICggMCA9PT0gaW5kZXggKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGF0dGFjaG1lbnRzLmVxKCBpbmRleCAtIDEgKS5mb2N1cygpO1xuXHRcdH1cblxuXHRcdC8vIFVwIGFycm93XG5cdFx0aWYgKCAzOCA9PT0gZXZlbnQua2V5Q29kZSApIHtcblx0XHRcdGlmICggMSA9PT0gcm93ICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRhdHRhY2htZW50cy5lcSggaW5kZXggLSBwZXJSb3cgKS5mb2N1cygpO1xuXHRcdH1cblxuXHRcdC8vIFJpZ2h0IGFycm93XG5cdFx0aWYgKCAzOSA9PT0gZXZlbnQua2V5Q29kZSApIHtcblx0XHRcdGlmICggYXR0YWNobWVudHMubGVuZ3RoID09PSBpbmRleCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0YXR0YWNobWVudHMuZXEoIGluZGV4ICsgMSApLmZvY3VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gRG93biBhcnJvd1xuXHRcdGlmICggNDAgPT09IGV2ZW50LmtleUNvZGUgKSB7XG5cdFx0XHRpZiAoIE1hdGguY2VpbCggYXR0YWNobWVudHMubGVuZ3RoIC8gcGVyUm93ICkgPT09IHJvdyApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0YXR0YWNobWVudHMuZXEoIGluZGV4ICsgcGVyUm93ICkuZm9jdXMoKTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLnByb3BzLm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHRcdGlmICggdGhpcy5vcHRpb25zLnJlc2l6ZSApIHtcblx0XHRcdHRoaXMuJHdpbmRvdy5vZmYoIHRoaXMucmVzaXplRXZlbnQgKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBjYWxsICdkaXNwb3NlJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0Vmlldy5wcm90b3R5cGUuZGlzcG9zZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0c2V0Q29sdW1uczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHByZXYgPSB0aGlzLmNvbHVtbnMsXG5cdFx0XHR3aWR0aCA9IHRoaXMuJGVsLndpZHRoKCk7XG5cblx0XHRpZiAoIHdpZHRoICkge1xuXHRcdFx0dGhpcy5jb2x1bW5zID0gTWF0aC5taW4oIE1hdGgucm91bmQoIHdpZHRoIC8gdGhpcy5vcHRpb25zLmlkZWFsQ29sdW1uV2lkdGggKSwgMTIgKSB8fCAxO1xuXG5cdFx0XHRpZiAoICEgcHJldiB8fCBwcmV2ICE9PSB0aGlzLmNvbHVtbnMgKSB7XG5cdFx0XHRcdHRoaXMuJGVsLmNsb3Nlc3QoICcubWVkaWEtZnJhbWUtY29udGVudCcgKS5hdHRyKCAnZGF0YS1jb2x1bW5zJywgdGhpcy5jb2x1bW5zICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdGluaXRTb3J0YWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb247XG5cblx0XHRpZiAoIHdwLm1lZGlhLmlzVG91Y2hEZXZpY2UgfHwgISB0aGlzLm9wdGlvbnMuc29ydGFibGUgfHwgISAkLmZuLnNvcnRhYmxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuJGVsLnNvcnRhYmxlKCBfLmV4dGVuZCh7XG5cdFx0XHQvLyBJZiB0aGUgYGNvbGxlY3Rpb25gIGhhcyBhIGBjb21wYXJhdG9yYCwgZGlzYWJsZSBzb3J0aW5nLlxuXHRcdFx0ZGlzYWJsZWQ6ICEhIGNvbGxlY3Rpb24uY29tcGFyYXRvcixcblxuXHRcdFx0Ly8gQ2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB0aGUgYXR0YWNobWVudCBhcyBzb29uIGFzIHRoZVxuXHRcdFx0Ly8gbW91c2UgcG9pbnRlciBvdmVybGFwcyBhIHRodW1ibmFpbC5cblx0XHRcdHRvbGVyYW5jZTogJ3BvaW50ZXInLFxuXG5cdFx0XHQvLyBSZWNvcmQgdGhlIGluaXRpYWwgYGluZGV4YCBvZiB0aGUgZHJhZ2dlZCBtb2RlbC5cblx0XHRcdHN0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIHVpICkge1xuXHRcdFx0XHR1aS5pdGVtLmRhdGEoJ3NvcnRhYmxlSW5kZXhTdGFydCcsIHVpLml0ZW0uaW5kZXgoKSk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIG1vZGVsJ3MgaW5kZXggaW4gdGhlIGNvbGxlY3Rpb24uXG5cdFx0XHQvLyBEbyBzbyBzaWxlbnRseSwgYXMgdGhlIHZpZXcgaXMgYWxyZWFkeSBhY2N1cmF0ZS5cblx0XHRcdHVwZGF0ZTogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHtcblx0XHRcdFx0dmFyIG1vZGVsID0gY29sbGVjdGlvbi5hdCggdWkuaXRlbS5kYXRhKCdzb3J0YWJsZUluZGV4U3RhcnQnKSApLFxuXHRcdFx0XHRcdGNvbXBhcmF0b3IgPSBjb2xsZWN0aW9uLmNvbXBhcmF0b3I7XG5cblx0XHRcdFx0Ly8gVGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgY29tcGFyYXRvciB0byBwcmV2ZW50IGBhZGRgXG5cdFx0XHRcdC8vIGZyb20gcmUtc29ydGluZy5cblx0XHRcdFx0ZGVsZXRlIGNvbGxlY3Rpb24uY29tcGFyYXRvcjtcblxuXHRcdFx0XHQvLyBTaWxlbnRseSBzaGlmdCB0aGUgbW9kZWwgdG8gaXRzIG5ldyBpbmRleC5cblx0XHRcdFx0Y29sbGVjdGlvbi5yZW1vdmUoIG1vZGVsLCB7XG5cdFx0XHRcdFx0c2lsZW50OiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb2xsZWN0aW9uLmFkZCggbW9kZWwsIHtcblx0XHRcdFx0XHRzaWxlbnQ6IHRydWUsXG5cdFx0XHRcdFx0YXQ6ICAgICB1aS5pdGVtLmluZGV4KClcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gUmVzdG9yZSB0aGUgY29tcGFyYXRvci5cblx0XHRcdFx0Y29sbGVjdGlvbi5jb21wYXJhdG9yID0gY29tcGFyYXRvcjtcblxuXHRcdFx0XHQvLyBGaXJlIHRoZSBgcmVzZXRgIGV2ZW50IHRvIGVuc3VyZSBvdGhlciBjb2xsZWN0aW9ucyBzeW5jLlxuXHRcdFx0XHRjb2xsZWN0aW9uLnRyaWdnZXIoICdyZXNldCcsIGNvbGxlY3Rpb24gKTtcblxuXHRcdFx0XHQvLyBJZiB0aGUgY29sbGVjdGlvbiBpcyBzb3J0ZWQgYnkgbWVudSBvcmRlcixcblx0XHRcdFx0Ly8gdXBkYXRlIHRoZSBtZW51IG9yZGVyLlxuXHRcdFx0XHRjb2xsZWN0aW9uLnNhdmVNZW51T3JkZXIoKTtcblx0XHRcdH1cblx0XHR9LCB0aGlzLm9wdGlvbnMuc29ydGFibGUgKSApO1xuXG5cdFx0Ly8gSWYgdGhlIGBvcmRlcmJ5YCBwcm9wZXJ0eSBpcyBjaGFuZ2VkIG9uIHRoZSBgY29sbGVjdGlvbmAsXG5cdFx0Ly8gY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBgY29tcGFyYXRvcmAuIElmIHNvLCBkaXNhYmxlIHNvcnRpbmcuXG5cdFx0Y29sbGVjdGlvbi5wcm9wcy5vbiggJ2NoYW5nZTpvcmRlcmJ5JywgZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLiRlbC5zb3J0YWJsZSggJ29wdGlvbicsICdkaXNhYmxlZCcsICEhIGNvbGxlY3Rpb24uY29tcGFyYXRvciApO1xuXHRcdH0sIHRoaXMgKTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbi5wcm9wcy5vbiggJ2NoYW5nZTpvcmRlcmJ5JywgdGhpcy5yZWZyZXNoU29ydGFibGUsIHRoaXMgKTtcblx0XHR0aGlzLnJlZnJlc2hTb3J0YWJsZSgpO1xuXHR9LFxuXG5cdHJlZnJlc2hTb3J0YWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB3cC5tZWRpYS5pc1RvdWNoRGV2aWNlIHx8ICEgdGhpcy5vcHRpb25zLnNvcnRhYmxlIHx8ICEgJC5mbi5zb3J0YWJsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgYGNvbGxlY3Rpb25gIGhhcyBhIGBjb21wYXJhdG9yYCwgZGlzYWJsZSBzb3J0aW5nLlxuXHRcdHZhciBjb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9uLFxuXHRcdFx0b3JkZXJieSA9IGNvbGxlY3Rpb24ucHJvcHMuZ2V0KCdvcmRlcmJ5JyksXG5cdFx0XHRlbmFibGVkID0gJ21lbnVPcmRlcicgPT09IG9yZGVyYnkgfHwgISBjb2xsZWN0aW9uLmNvbXBhcmF0b3I7XG5cblx0XHR0aGlzLiRlbC5zb3J0YWJsZSggJ29wdGlvbicsICdkaXNhYmxlZCcsICEgZW5hYmxlZCApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dGFjaG1lbnRcblx0ICogQHJldHVybnMge3dwLm1lZGlhLlZpZXd9XG5cdCAqL1xuXHRjcmVhdGVBdHRhY2htZW50VmlldzogZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0dmFyIHZpZXcgPSBuZXcgdGhpcy5vcHRpb25zLkF0dGFjaG1lbnRWaWV3KHtcblx0XHRcdGNvbnRyb2xsZXI6ICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRtb2RlbDogICAgICAgICAgICAgICAgYXR0YWNobWVudCxcblx0XHRcdGNvbGxlY3Rpb246ICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0XHRzZWxlY3Rpb246ICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlbGVjdGlvblxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdzQnlDaWRbIGF0dGFjaG1lbnQuY2lkIF0gPSB2aWV3O1xuXHR9LFxuXG5cdHByZXBhcmU6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENyZWF0ZSBhbGwgb2YgdGhlIEF0dGFjaG1lbnQgdmlld3MsIGFuZCByZXBsYWNlXG5cdFx0Ly8gdGhlIGxpc3QgaW4gYSBzaW5nbGUgRE9NIG9wZXJhdGlvbi5cblx0XHRpZiAoIHRoaXMuY29sbGVjdGlvbi5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLnZpZXdzLnNldCggdGhpcy5jb2xsZWN0aW9uLm1hcCggdGhpcy5jcmVhdGVBdHRhY2htZW50VmlldywgdGhpcyApICk7XG5cblx0XHQvLyBJZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMsIGNsZWFyIHRoZSB2aWV3cyBhbmQgbG9hZCBzb21lLlxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnZpZXdzLnVuc2V0KCk7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24ubW9yZSgpLmRvbmUoIHRoaXMuc2Nyb2xsICk7XG5cdFx0fVxuXHR9LFxuXG5cdHJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHQvLyBUcmlnZ2VyIHRoZSBzY3JvbGwgZXZlbnQgdG8gY2hlY2sgaWYgd2UncmUgd2l0aGluIHRoZVxuXHRcdC8vIHRocmVzaG9sZCB0byBxdWVyeSBmb3IgYWRkaXRpb25hbCBhdHRhY2htZW50cy5cblx0XHR0aGlzLnNjcm9sbCgpO1xuXHR9LFxuXG5cdHNjcm9sbDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZpZXcgPSB0aGlzLFxuXHRcdFx0ZWwgPSB0aGlzLm9wdGlvbnMuc2Nyb2xsRWxlbWVudCxcblx0XHRcdHNjcm9sbFRvcCA9IGVsLnNjcm9sbFRvcCxcblx0XHRcdHRvb2xiYXI7XG5cblx0XHQvLyBUaGUgc2Nyb2xsIGV2ZW50IG9jY3VycyBvbiB0aGUgZG9jdW1lbnQsIGJ1dCB0aGUgZWxlbWVudFxuXHRcdC8vIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgaXMgdGhlIGRvY3VtZW50IGJvZHkuXG5cdFx0aWYgKCBlbCA9PT0gZG9jdW1lbnQgKSB7XG5cdFx0XHRlbCA9IGRvY3VtZW50LmJvZHk7XG5cdFx0XHRzY3JvbGxUb3AgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKTtcblx0XHR9XG5cblx0XHRpZiAoICEgJChlbCkuaXMoJzp2aXNpYmxlJykgfHwgISB0aGlzLmNvbGxlY3Rpb24uaGFzTW9yZSgpICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRvb2xiYXIgPSB0aGlzLnZpZXdzLnBhcmVudC50b29sYmFyO1xuXG5cdFx0Ly8gU2hvdyB0aGUgc3Bpbm5lciBvbmx5IGlmIHdlIGFyZSBjbG9zZSB0byB0aGUgYm90dG9tLlxuXHRcdGlmICggZWwuc2Nyb2xsSGVpZ2h0IC0gKCBzY3JvbGxUb3AgKyBlbC5jbGllbnRIZWlnaHQgKSA8IGVsLmNsaWVudEhlaWdodCAvIDMgKSB7XG5cdFx0XHR0b29sYmFyLmdldCgnc3Bpbm5lcicpLnNob3coKTtcblx0XHR9XG5cblx0XHRpZiAoIGVsLnNjcm9sbEhlaWdodCA8IHNjcm9sbFRvcCArICggZWwuY2xpZW50SGVpZ2h0ICogdGhpcy5vcHRpb25zLnJlZnJlc2hUaHJlc2hvbGQgKSApIHtcblx0XHRcdHRoaXMuY29sbGVjdGlvbi5tb3JlKCkuZG9uZShmdW5jdGlvbigpIHtcblx0XHRcdFx0dmlldy5zY3JvbGwoKTtcblx0XHRcdFx0dG9vbGJhci5nZXQoJ3NwaW5uZXInKS5oaWRlKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF0dGFjaG1lbnRzO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRzQnJvd3NlclxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICAgIFtvcHRpb25zXSAgICAgICAgICAgICAgIFRoZSBvcHRpb25zIGhhc2ggcGFzc2VkIHRvIHRoZSB2aWV3LlxuICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gW29wdGlvbnMuZmlsdGVycz1mYWxzZV0gV2hpY2ggZmlsdGVycyB0byBzaG93IGluIHRoZSBicm93c2VyJ3MgdG9vbGJhci5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdHMgJ3VwbG9hZGVkJyBhbmQgJ2FsbCcuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICBbb3B0aW9ucy5zZWFyY2g9dHJ1ZV0gICBXaGV0aGVyIHRvIHNob3cgdGhlIHNlYXJjaCBpbnRlcmZhY2UgaW4gdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyJ3MgdG9vbGJhci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgIFtvcHRpb25zLmRhdGU9dHJ1ZV0gICAgIFdoZXRoZXIgdG8gc2hvdyB0aGUgZGF0ZSBmaWx0ZXIgaW4gdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyJ3MgdG9vbGJhci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgIFtvcHRpb25zLmRpc3BsYXk9ZmFsc2VdIFdoZXRoZXIgdG8gc2hvdyB0aGUgYXR0YWNobWVudHMgZGlzcGxheSBzZXR0aW5nc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldyBpbiB0aGUgc2lkZWJhci5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IFtvcHRpb25zLnNpZGViYXI9dHJ1ZV0gIFdoZXRoZXIgdG8gY3JlYXRlIGEgc2lkZWJhciBmb3IgdGhlIGJyb3dzZXIuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRzIHRydWUsIGZhbHNlLCBhbmQgJ2Vycm9ycycuXG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0bWVkaWFUcmFzaCA9IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MubWVkaWFUcmFzaCxcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0JCA9IGpRdWVyeSxcblx0QXR0YWNobWVudHNCcm93c2VyO1xuXG5BdHRhY2htZW50c0Jyb3dzZXIgPSBWaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ2RpdicsXG5cdGNsYXNzTmFtZTogJ2F0dGFjaG1lbnRzLWJyb3dzZXInLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZGVmYXVsdHMoIHRoaXMub3B0aW9ucywge1xuXHRcdFx0ZmlsdGVyczogZmFsc2UsXG5cdFx0XHRzZWFyY2g6ICB0cnVlLFxuXHRcdFx0ZGF0ZTogICAgdHJ1ZSxcblx0XHRcdGRpc3BsYXk6IGZhbHNlLFxuXHRcdFx0c2lkZWJhcjogdHJ1ZSxcblx0XHRcdEF0dGFjaG1lbnRWaWV3OiB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuTGlicmFyeVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5jb250cm9sbGVyLCAndG9nZ2xlOnVwbG9hZDphdHRhY2htZW50JywgXy5iaW5kKCB0aGlzLnRvZ2dsZVVwbG9hZGVyLCB0aGlzICkgKTtcblx0XHR0aGlzLmNvbnRyb2xsZXIub24oICdlZGl0OnNlbGVjdGlvbicsIHRoaXMuZWRpdFNlbGVjdGlvbiApO1xuXHRcdHRoaXMuY3JlYXRlVG9vbGJhcigpO1xuXHRcdGlmICggdGhpcy5vcHRpb25zLnNpZGViYXIgKSB7XG5cdFx0XHR0aGlzLmNyZWF0ZVNpZGViYXIoKTtcblx0XHR9XG5cdFx0dGhpcy5jcmVhdGVVcGxvYWRlcigpO1xuXHRcdHRoaXMuY3JlYXRlQXR0YWNobWVudHMoKTtcblx0XHR0aGlzLnVwZGF0ZUNvbnRlbnQoKTtcblxuXHRcdGlmICggISB0aGlzLm9wdGlvbnMuc2lkZWJhciB8fCAnZXJyb3JzJyA9PT0gdGhpcy5vcHRpb25zLnNpZGViYXIgKSB7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyggJ2hpZGUtc2lkZWJhcicgKTtcblxuXHRcdFx0aWYgKCAnZXJyb3JzJyA9PT0gdGhpcy5vcHRpb25zLnNpZGViYXIgKSB7XG5cdFx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKCAnc2lkZWJhci1mb3ItZXJyb3JzJyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuY29sbGVjdGlvbi5vbiggJ2FkZCByZW1vdmUgcmVzZXQnLCB0aGlzLnVwZGF0ZUNvbnRlbnQsIHRoaXMgKTtcblx0fSxcblxuXHRlZGl0U2VsZWN0aW9uOiBmdW5jdGlvbiggbW9kYWwgKSB7XG5cdFx0bW9kYWwuJCggJy5tZWRpYS1idXR0b24tYmFja1RvTGlicmFyeScgKS5mb2N1cygpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5BdHRhY2htZW50c0Jyb3dzZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRkaXNwb3NlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm9wdGlvbnMuc2VsZWN0aW9uLm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHRcdFZpZXcucHJvdG90eXBlLmRpc3Bvc2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNyZWF0ZVRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBMaWJyYXJ5Vmlld1N3aXRjaGVyLCBGaWx0ZXJzLCB0b29sYmFyT3B0aW9ucztcblxuXHRcdHRvb2xiYXJPcHRpb25zID0ge1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyXG5cdFx0fTtcblxuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLmlzTW9kZUFjdGl2ZSggJ2dyaWQnICkgKSB7XG5cdFx0XHR0b29sYmFyT3B0aW9ucy5jbGFzc05hbWUgPSAnbWVkaWEtdG9vbGJhciB3cC1maWx0ZXInO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCogQG1lbWJlciB7d3AubWVkaWEudmlldy5Ub29sYmFyfVxuXHRcdCovXG5cdFx0dGhpcy50b29sYmFyID0gbmV3IHdwLm1lZGlhLnZpZXcuVG9vbGJhciggdG9vbGJhck9wdGlvbnMgKTtcblxuXHRcdHRoaXMudmlld3MuYWRkKCB0aGlzLnRvb2xiYXIgKTtcblxuXHRcdHRoaXMudG9vbGJhci5zZXQoICdzcGlubmVyJywgbmV3IHdwLm1lZGlhLnZpZXcuU3Bpbm5lcih7XG5cdFx0XHRwcmlvcml0eTogLTYwXG5cdFx0fSkgKTtcblxuXHRcdGlmICggLTEgIT09ICQuaW5BcnJheSggdGhpcy5vcHRpb25zLmZpbHRlcnMsIFsgJ3VwbG9hZGVkJywgJ2FsbCcgXSApICkge1xuXHRcdFx0Ly8gXCJGaWx0ZXJzXCIgd2lsbCByZXR1cm4gYSA8c2VsZWN0PiwgbmVlZCB0byByZW5kZXJcblx0XHRcdC8vIHNjcmVlbiByZWFkZXIgdGV4dCBiZWZvcmVcblx0XHRcdHRoaXMudG9vbGJhci5zZXQoICdmaWx0ZXJzTGFiZWwnLCBuZXcgd3AubWVkaWEudmlldy5MYWJlbCh7XG5cdFx0XHRcdHZhbHVlOiBsMTBuLmZpbHRlckJ5VHlwZSxcblx0XHRcdFx0YXR0cmlidXRlczoge1xuXHRcdFx0XHRcdCdmb3InOiAgJ21lZGlhLWF0dGFjaG1lbnQtZmlsdGVycydcblx0XHRcdFx0fSxcblx0XHRcdFx0cHJpb3JpdHk6ICAgLTgwXG5cdFx0XHR9KS5yZW5kZXIoKSApO1xuXG5cdFx0XHRpZiAoICd1cGxvYWRlZCcgPT09IHRoaXMub3B0aW9ucy5maWx0ZXJzICkge1xuXHRcdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnZmlsdGVycycsIG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzLlVwbG9hZGVkKHtcblx0XHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdFx0bW9kZWw6ICAgICAgdGhpcy5jb2xsZWN0aW9uLnByb3BzLFxuXHRcdFx0XHRcdHByaW9yaXR5OiAgIC04MFxuXHRcdFx0XHR9KS5yZW5kZXIoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0RmlsdGVycyA9IG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzLkFsbCh7XG5cdFx0XHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRcdG1vZGVsOiAgICAgIHRoaXMuY29sbGVjdGlvbi5wcm9wcyxcblx0XHRcdFx0XHRwcmlvcml0eTogICAtODBcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy50b29sYmFyLnNldCggJ2ZpbHRlcnMnLCBGaWx0ZXJzLnJlbmRlcigpICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmVlbHMgb2RkIHRvIGJyaW5nIHRoZSBnbG9iYWwgbWVkaWEgbGlicmFyeSBzd2l0Y2hlciBpbnRvIHRoZSBBdHRhY2htZW50XG5cdFx0Ly8gYnJvd3NlciB2aWV3LiBJcyB0aGlzIGEgdXNlIGNhc2UgZm9yIGRvQWN0aW9uKCAnYWRkOnRvb2xiYXItaXRlbXM6YXR0YWNobWVudHMtYnJvd3NlcicsIHRoaXMudG9vbGJhciApO1xuXHRcdC8vIHdoaWNoIHRoZSBjb250cm9sbGVyIGNhbiB0YXAgaW50byBhbmQgYWRkIHRoaXMgdmlldz9cblx0XHRpZiAoIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdncmlkJyApICkge1xuXHRcdFx0TGlicmFyeVZpZXdTd2l0Y2hlciA9IFZpZXcuZXh0ZW5kKHtcblx0XHRcdFx0Y2xhc3NOYW1lOiAndmlldy1zd2l0Y2ggbWVkaWEtZ3JpZC12aWV3LXN3aXRjaCcsXG5cdFx0XHRcdHRlbXBsYXRlOiB3cC50ZW1wbGF0ZSggJ21lZGlhLWxpYnJhcnktdmlldy1zd2l0Y2hlcicpXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy50b29sYmFyLnNldCggJ2xpYnJhcnlWaWV3U3dpdGNoZXInLCBuZXcgTGlicmFyeVZpZXdTd2l0Y2hlcih7XG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0cHJpb3JpdHk6IC05MFxuXHRcdFx0fSkucmVuZGVyKCkgKTtcblxuXHRcdFx0Ly8gRGF0ZUZpbHRlciBpcyBhIDxzZWxlY3Q+LCBzY3JlZW4gcmVhZGVyIHRleHQgbmVlZHMgdG8gYmUgcmVuZGVyZWQgYmVmb3JlXG5cdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnZGF0ZUZpbHRlckxhYmVsJywgbmV3IHdwLm1lZGlhLnZpZXcuTGFiZWwoe1xuXHRcdFx0XHR2YWx1ZTogbDEwbi5maWx0ZXJCeURhdGUsXG5cdFx0XHRcdGF0dHJpYnV0ZXM6IHtcblx0XHRcdFx0XHQnZm9yJzogJ21lZGlhLWF0dGFjaG1lbnQtZGF0ZS1maWx0ZXJzJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRwcmlvcml0eTogLTc1XG5cdFx0XHR9KS5yZW5kZXIoKSApO1xuXHRcdFx0dGhpcy50b29sYmFyLnNldCggJ2RhdGVGaWx0ZXInLCBuZXcgd3AubWVkaWEudmlldy5EYXRlRmlsdGVyKHtcblx0XHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRtb2RlbDogICAgICB0aGlzLmNvbGxlY3Rpb24ucHJvcHMsXG5cdFx0XHRcdHByaW9yaXR5OiAtNzVcblx0XHRcdH0pLnJlbmRlcigpICk7XG5cblx0XHRcdC8vIEJ1bGtTZWxlY3Rpb24gaXMgYSA8ZGl2PiB3aXRoIHN1YnZpZXdzLCBpbmNsdWRpbmcgc2NyZWVuIHJlYWRlciB0ZXh0XG5cdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnc2VsZWN0TW9kZVRvZ2dsZUJ1dHRvbicsIG5ldyB3cC5tZWRpYS52aWV3LlNlbGVjdE1vZGVUb2dnbGVCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiBsMTBuLmJ1bGtTZWxlY3QsXG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0cHJpb3JpdHk6IC03MFxuXHRcdFx0fSkucmVuZGVyKCkgKTtcblxuXHRcdFx0dGhpcy50b29sYmFyLnNldCggJ2RlbGV0ZVNlbGVjdGVkQnV0dG9uJywgbmV3IHdwLm1lZGlhLnZpZXcuRGVsZXRlU2VsZWN0ZWRCdXR0b24oe1xuXHRcdFx0XHRmaWx0ZXJzOiBGaWx0ZXJzLFxuXHRcdFx0XHRzdHlsZTogJ3ByaW1hcnknLFxuXHRcdFx0XHRkaXNhYmxlZDogdHJ1ZSxcblx0XHRcdFx0dGV4dDogbWVkaWFUcmFzaCA/IGwxMG4udHJhc2hTZWxlY3RlZCA6IGwxMG4uZGVsZXRlU2VsZWN0ZWQsXG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0cHJpb3JpdHk6IC02MCxcblx0XHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHZhciBjaGFuZ2VkID0gW10sIHJlbW92ZWQgPSBbXSxcblx0XHRcdFx0XHRcdHNlbGVjdGlvbiA9IHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCggJ3NlbGVjdGlvbicgKSxcblx0XHRcdFx0XHRcdGxpYnJhcnkgPSB0aGlzLmNvbnRyb2xsZXIuc3RhdGUoKS5nZXQoICdsaWJyYXJ5JyApO1xuXG5cdFx0XHRcdFx0aWYgKCAhIHNlbGVjdGlvbi5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhIG1lZGlhVHJhc2ggJiYgISB3aW5kb3cuY29uZmlybSggbDEwbi53YXJuQnVsa0RlbGV0ZSApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggbWVkaWFUcmFzaCAmJlxuXHRcdFx0XHRcdFx0J3RyYXNoJyAhPT0gc2VsZWN0aW9uLmF0KCAwICkuZ2V0KCAnc3RhdHVzJyApICYmXG5cdFx0XHRcdFx0XHQhIHdpbmRvdy5jb25maXJtKCBsMTBuLndhcm5CdWxrVHJhc2ggKSApIHtcblxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNlbGVjdGlvbi5lYWNoKCBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICEgbW9kZWwuZ2V0KCAnbm9uY2VzJyApWydkZWxldGUnXSApIHtcblx0XHRcdFx0XHRcdFx0cmVtb3ZlZC5wdXNoKCBtb2RlbCApO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICggbWVkaWFUcmFzaCAmJiAndHJhc2gnID09PSBtb2RlbC5nZXQoICdzdGF0dXMnICkgKSB7XG5cdFx0XHRcdFx0XHRcdG1vZGVsLnNldCggJ3N0YXR1cycsICdpbmhlcml0JyApO1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2VkLnB1c2goIG1vZGVsLnNhdmUoKSApO1xuXHRcdFx0XHRcdFx0XHRyZW1vdmVkLnB1c2goIG1vZGVsICk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBtZWRpYVRyYXNoICkge1xuXHRcdFx0XHRcdFx0XHRtb2RlbC5zZXQoICdzdGF0dXMnLCAndHJhc2gnICk7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZWQucHVzaCggbW9kZWwuc2F2ZSgpICk7XG5cdFx0XHRcdFx0XHRcdHJlbW92ZWQucHVzaCggbW9kZWwgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG1vZGVsLmRlc3Ryb3koe3dhaXQ6IHRydWV9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0XHRpZiAoIGNoYW5nZWQubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uLnJlbW92ZSggcmVtb3ZlZCApO1xuXG5cdFx0XHRcdFx0XHQkLndoZW4uYXBwbHkoIG51bGwsIGNoYW5nZWQgKS50aGVuKCBfLmJpbmQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRsaWJyYXJ5Ll9yZXF1ZXJ5KCB0cnVlICk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCAnc2VsZWN0aW9uOmFjdGlvbjpkb25lJyApO1xuXHRcdFx0XHRcdFx0fSwgdGhpcyApICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCAnc2VsZWN0aW9uOmFjdGlvbjpkb25lJyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSkucmVuZGVyKCkgKTtcblxuXHRcdFx0aWYgKCBtZWRpYVRyYXNoICkge1xuXHRcdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnZGVsZXRlU2VsZWN0ZWRQZXJtYW5lbnRseUJ1dHRvbicsIG5ldyB3cC5tZWRpYS52aWV3LkRlbGV0ZVNlbGVjdGVkUGVybWFuZW50bHlCdXR0b24oe1xuXHRcdFx0XHRcdGZpbHRlcnM6IEZpbHRlcnMsXG5cdFx0XHRcdFx0c3R5bGU6ICdwcmltYXJ5Jyxcblx0XHRcdFx0XHRkaXNhYmxlZDogdHJ1ZSxcblx0XHRcdFx0XHR0ZXh0OiBsMTBuLmRlbGV0ZVNlbGVjdGVkLFxuXHRcdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0XHRwcmlvcml0eTogLTU1LFxuXHRcdFx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciByZW1vdmVkID0gW10sIHNlbGVjdGlvbiA9IHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCggJ3NlbGVjdGlvbicgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCAhIHNlbGVjdGlvbi5sZW5ndGggfHwgISB3aW5kb3cuY29uZmlybSggbDEwbi53YXJuQnVsa0RlbGV0ZSApICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHNlbGVjdGlvbi5lYWNoKCBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISBtb2RlbC5nZXQoICdub25jZXMnIClbJ2RlbGV0ZSddICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlbW92ZWQucHVzaCggbW9kZWwgKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRtb2RlbC5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0XHRcdHNlbGVjdGlvbi5yZW1vdmUoIHJlbW92ZWQgKTtcblx0XHRcdFx0XHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCAnc2VsZWN0aW9uOmFjdGlvbjpkb25lJyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkucmVuZGVyKCkgKTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIHRoaXMub3B0aW9ucy5kYXRlICkge1xuXHRcdFx0Ly8gRGF0ZUZpbHRlciBpcyBhIDxzZWxlY3Q+LCBzY3JlZW4gcmVhZGVyIHRleHQgbmVlZHMgdG8gYmUgcmVuZGVyZWQgYmVmb3JlXG5cdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnZGF0ZUZpbHRlckxhYmVsJywgbmV3IHdwLm1lZGlhLnZpZXcuTGFiZWwoe1xuXHRcdFx0XHR2YWx1ZTogbDEwbi5maWx0ZXJCeURhdGUsXG5cdFx0XHRcdGF0dHJpYnV0ZXM6IHtcblx0XHRcdFx0XHQnZm9yJzogJ21lZGlhLWF0dGFjaG1lbnQtZGF0ZS1maWx0ZXJzJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRwcmlvcml0eTogLTc1XG5cdFx0XHR9KS5yZW5kZXIoKSApO1xuXHRcdFx0dGhpcy50b29sYmFyLnNldCggJ2RhdGVGaWx0ZXInLCBuZXcgd3AubWVkaWEudmlldy5EYXRlRmlsdGVyKHtcblx0XHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRtb2RlbDogICAgICB0aGlzLmNvbGxlY3Rpb24ucHJvcHMsXG5cdFx0XHRcdHByaW9yaXR5OiAtNzVcblx0XHRcdH0pLnJlbmRlcigpICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc2VhcmNoICkge1xuXHRcdFx0Ly8gU2VhcmNoIGlzIGFuIGlucHV0LCBzY3JlZW4gcmVhZGVyIHRleHQgbmVlZHMgdG8gYmUgcmVuZGVyZWQgYmVmb3JlXG5cdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnc2VhcmNoTGFiZWwnLCBuZXcgd3AubWVkaWEudmlldy5MYWJlbCh7XG5cdFx0XHRcdHZhbHVlOiBsMTBuLnNlYXJjaE1lZGlhTGFiZWwsXG5cdFx0XHRcdGF0dHJpYnV0ZXM6IHtcblx0XHRcdFx0XHQnZm9yJzogJ21lZGlhLXNlYXJjaC1pbnB1dCdcblx0XHRcdFx0fSxcblx0XHRcdFx0cHJpb3JpdHk6ICAgNjBcblx0XHRcdH0pLnJlbmRlcigpICk7XG5cdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnc2VhcmNoJywgbmV3IHdwLm1lZGlhLnZpZXcuU2VhcmNoKHtcblx0XHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRtb2RlbDogICAgICB0aGlzLmNvbGxlY3Rpb24ucHJvcHMsXG5cdFx0XHRcdHByaW9yaXR5OiAgIDYwXG5cdFx0XHR9KS5yZW5kZXIoKSApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5vcHRpb25zLmRyYWdJbmZvICkge1xuXHRcdFx0dGhpcy50b29sYmFyLnNldCggJ2RyYWdJbmZvJywgbmV3IFZpZXcoe1xuXHRcdFx0XHRlbDogJCggJzxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbnNcIj4nICsgbDEwbi5kcmFnSW5mbyArICc8L2Rpdj4nIClbMF0sXG5cdFx0XHRcdHByaW9yaXR5OiAtNDBcblx0XHRcdH0pICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3VnZ2VzdGVkV2lkdGggJiYgdGhpcy5vcHRpb25zLnN1Z2dlc3RlZEhlaWdodCApIHtcblx0XHRcdHRoaXMudG9vbGJhci5zZXQoICdzdWdnZXN0ZWREaW1lbnNpb25zJywgbmV3IFZpZXcoe1xuXHRcdFx0XHRlbDogJCggJzxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbnNcIj4nICsgbDEwbi5zdWdnZXN0ZWREaW1lbnNpb25zICsgJyAnICsgdGhpcy5vcHRpb25zLnN1Z2dlc3RlZFdpZHRoICsgJyAmdGltZXM7ICcgKyB0aGlzLm9wdGlvbnMuc3VnZ2VzdGVkSGVpZ2h0ICsgJzwvZGl2PicgKVswXSxcblx0XHRcdFx0cHJpb3JpdHk6IC00MFxuXHRcdFx0fSkgKTtcblx0XHR9XG5cdH0sXG5cblx0dXBkYXRlQ29udGVudDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZpZXcgPSB0aGlzLFxuXHRcdFx0bm9JdGVtc1ZpZXc7XG5cblx0XHRpZiAoIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdncmlkJyApICkge1xuXHRcdFx0bm9JdGVtc1ZpZXcgPSB2aWV3LmF0dGFjaG1lbnRzTm9SZXN1bHRzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRub0l0ZW1zVmlldyA9IHZpZXcudXBsb2FkZXI7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIHRoaXMuY29sbGVjdGlvbi5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLnRvb2xiYXIuZ2V0KCAnc3Bpbm5lcicgKS5zaG93KCk7XG5cdFx0XHR0aGlzLmRmZCA9IHRoaXMuY29sbGVjdGlvbi5tb3JlKCkuZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISB2aWV3LmNvbGxlY3Rpb24ubGVuZ3RoICkge1xuXHRcdFx0XHRcdG5vSXRlbXNWaWV3LiRlbC5yZW1vdmVDbGFzcyggJ2hpZGRlbicgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRub0l0ZW1zVmlldy4kZWwuYWRkQ2xhc3MoICdoaWRkZW4nICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dmlldy50b29sYmFyLmdldCggJ3NwaW5uZXInICkuaGlkZSgpO1xuXHRcdFx0fSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRub0l0ZW1zVmlldy4kZWwuYWRkQ2xhc3MoICdoaWRkZW4nICk7XG5cdFx0XHR2aWV3LnRvb2xiYXIuZ2V0KCAnc3Bpbm5lcicgKS5oaWRlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGNyZWF0ZVVwbG9hZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVwbG9hZGVyID0gbmV3IHdwLm1lZGlhLnZpZXcuVXBsb2FkZXJJbmxpbmUoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0c3RhdHVzOiAgICAgZmFsc2UsXG5cdFx0XHRtZXNzYWdlOiAgICB0aGlzLmNvbnRyb2xsZXIuaXNNb2RlQWN0aXZlKCAnZ3JpZCcgKSA/ICcnIDogbDEwbi5ub0l0ZW1zRm91bmQsXG5cdFx0XHRjYW5DbG9zZTogICB0aGlzLmNvbnRyb2xsZXIuaXNNb2RlQWN0aXZlKCAnZ3JpZCcgKVxuXHRcdH0pO1xuXG5cdFx0dGhpcy51cGxvYWRlci5oaWRlKCk7XG5cdFx0dGhpcy52aWV3cy5hZGQoIHRoaXMudXBsb2FkZXIgKTtcblx0fSxcblxuXHR0b2dnbGVVcGxvYWRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLnVwbG9hZGVyLiRlbC5oYXNDbGFzcyggJ2hpZGRlbicgKSApIHtcblx0XHRcdHRoaXMudXBsb2FkZXIuc2hvdygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnVwbG9hZGVyLmhpZGUoKTtcblx0XHR9XG5cdH0sXG5cblx0Y3JlYXRlQXR0YWNobWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYXR0YWNobWVudHMgPSBuZXcgd3AubWVkaWEudmlldy5BdHRhY2htZW50cyh7XG5cdFx0XHRjb250cm9sbGVyOiAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0Y29sbGVjdGlvbjogICAgICAgICAgIHRoaXMuY29sbGVjdGlvbixcblx0XHRcdHNlbGVjdGlvbjogICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VsZWN0aW9uLFxuXHRcdFx0bW9kZWw6ICAgICAgICAgICAgICAgIHRoaXMubW9kZWwsXG5cdFx0XHRzb3J0YWJsZTogICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNvcnRhYmxlLFxuXHRcdFx0c2Nyb2xsRWxlbWVudDogICAgICAgIHRoaXMub3B0aW9ucy5zY3JvbGxFbGVtZW50LFxuXHRcdFx0aWRlYWxDb2x1bW5XaWR0aDogICAgIHRoaXMub3B0aW9ucy5pZGVhbENvbHVtbldpZHRoLFxuXG5cdFx0XHQvLyBUaGUgc2luZ2xlIGBBdHRhY2htZW50YCB2aWV3IHRvIGJlIHVzZWQgaW4gdGhlIGBBdHRhY2htZW50c2Agdmlldy5cblx0XHRcdEF0dGFjaG1lbnRWaWV3OiB0aGlzLm9wdGlvbnMuQXR0YWNobWVudFZpZXdcblx0XHR9KTtcblxuXHRcdC8vIEFkZCBrZXlkb3duIGxpc3RlbmVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgQXR0YWNobWVudHMgdmlld1xuXHRcdHRoaXMuYXR0YWNobWVudHMubGlzdGVuVG8oIHRoaXMuY29udHJvbGxlciwgJ2F0dGFjaG1lbnQ6a2V5ZG93bjphcnJvdycsICAgICB0aGlzLmF0dGFjaG1lbnRzLmFycm93RXZlbnQgKTtcblx0XHR0aGlzLmF0dGFjaG1lbnRzLmxpc3RlblRvKCB0aGlzLmNvbnRyb2xsZXIsICdhdHRhY2htZW50OmRldGFpbHM6c2hpZnQtdGFiJywgdGhpcy5hdHRhY2htZW50cy5yZXN0b3JlRm9jdXMgKTtcblxuXHRcdHRoaXMudmlld3MuYWRkKCB0aGlzLmF0dGFjaG1lbnRzICk7XG5cblxuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLmlzTW9kZUFjdGl2ZSggJ2dyaWQnICkgKSB7XG5cdFx0XHR0aGlzLmF0dGFjaG1lbnRzTm9SZXN1bHRzID0gbmV3IFZpZXcoe1xuXHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdHRhZ05hbWU6ICdwJ1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuYXR0YWNobWVudHNOb1Jlc3VsdHMuJGVsLmFkZENsYXNzKCAnaGlkZGVuIG5vLW1lZGlhJyApO1xuXHRcdFx0dGhpcy5hdHRhY2htZW50c05vUmVzdWx0cy4kZWwuaHRtbCggbDEwbi5ub01lZGlhICk7XG5cblx0XHRcdHRoaXMudmlld3MuYWRkKCB0aGlzLmF0dGFjaG1lbnRzTm9SZXN1bHRzICk7XG5cdFx0fVxuXHR9LFxuXG5cdGNyZWF0ZVNpZGViYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuXHRcdFx0c2VsZWN0aW9uID0gb3B0aW9ucy5zZWxlY3Rpb24sXG5cdFx0XHRzaWRlYmFyID0gdGhpcy5zaWRlYmFyID0gbmV3IHdwLm1lZGlhLnZpZXcuU2lkZWJhcih7XG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlclxuXHRcdFx0fSk7XG5cblx0XHR0aGlzLnZpZXdzLmFkZCggc2lkZWJhciApO1xuXG5cdFx0aWYgKCB0aGlzLmNvbnRyb2xsZXIudXBsb2FkZXIgKSB7XG5cdFx0XHRzaWRlYmFyLnNldCggJ3VwbG9hZHMnLCBuZXcgd3AubWVkaWEudmlldy5VcGxvYWRlclN0YXR1cyh7XG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0cHJpb3JpdHk6ICAgNDBcblx0XHRcdH0pICk7XG5cdFx0fVxuXG5cdFx0c2VsZWN0aW9uLm9uKCAnc2VsZWN0aW9uOnNpbmdsZScsIHRoaXMuY3JlYXRlU2luZ2xlLCB0aGlzICk7XG5cdFx0c2VsZWN0aW9uLm9uKCAnc2VsZWN0aW9uOnVuc2luZ2xlJywgdGhpcy5kaXNwb3NlU2luZ2xlLCB0aGlzICk7XG5cblx0XHRpZiAoIHNlbGVjdGlvbi5zaW5nbGUoKSApIHtcblx0XHRcdHRoaXMuY3JlYXRlU2luZ2xlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGNyZWF0ZVNpbmdsZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNpZGViYXIgPSB0aGlzLnNpZGViYXIsXG5cdFx0XHRzaW5nbGUgPSB0aGlzLm9wdGlvbnMuc2VsZWN0aW9uLnNpbmdsZSgpO1xuXG5cdFx0c2lkZWJhci5zZXQoICdkZXRhaWxzJywgbmV3IHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5EZXRhaWxzKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdG1vZGVsOiAgICAgIHNpbmdsZSxcblx0XHRcdHByaW9yaXR5OiAgIDgwXG5cdFx0fSkgKTtcblxuXHRcdHNpZGViYXIuc2V0KCAnY29tcGF0JywgbmV3IHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudENvbXBhdCh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRtb2RlbDogICAgICBzaW5nbGUsXG5cdFx0XHRwcmlvcml0eTogICAxMjBcblx0XHR9KSApO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZGlzcGxheSApIHtcblx0XHRcdHNpZGViYXIuc2V0KCAnZGlzcGxheScsIG5ldyB3cC5tZWRpYS52aWV3LlNldHRpbmdzLkF0dGFjaG1lbnREaXNwbGF5KHtcblx0XHRcdFx0Y29udHJvbGxlcjogICB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdG1vZGVsOiAgICAgICAgdGhpcy5tb2RlbC5kaXNwbGF5KCBzaW5nbGUgKSxcblx0XHRcdFx0YXR0YWNobWVudDogICBzaW5nbGUsXG5cdFx0XHRcdHByaW9yaXR5OiAgICAgMTYwLFxuXHRcdFx0XHR1c2VyU2V0dGluZ3M6IHRoaXMubW9kZWwuZ2V0KCdkaXNwbGF5VXNlclNldHRpbmdzJylcblx0XHRcdH0pICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2hvdyB0aGUgc2lkZWJhciBvbiBtb2JpbGVcblx0XHRpZiAoIHRoaXMubW9kZWwuaWQgPT09ICdpbnNlcnQnICkge1xuXHRcdFx0c2lkZWJhci4kZWwuYWRkQ2xhc3MoICd2aXNpYmxlJyApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwb3NlU2luZ2xlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2lkZWJhciA9IHRoaXMuc2lkZWJhcjtcblx0XHRzaWRlYmFyLnVuc2V0KCdkZXRhaWxzJyk7XG5cdFx0c2lkZWJhci51bnNldCgnY29tcGF0Jyk7XG5cdFx0c2lkZWJhci51bnNldCgnZGlzcGxheScpO1xuXHRcdC8vIEhpZGUgdGhlIHNpZGViYXIgb24gbW9iaWxlXG5cdFx0c2lkZWJhci4kZWwucmVtb3ZlQ2xhc3MoICd2aXNpYmxlJyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBdHRhY2htZW50c0Jyb3dzZXI7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudHMuU2VsZWN0aW9uXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5BdHRhY2htZW50c1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgQXR0YWNobWVudHMgPSB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRzLFxuXHRTZWxlY3Rpb247XG5cblNlbGVjdGlvbiA9IEF0dGFjaG1lbnRzLmV4dGVuZCh7XG5cdGV2ZW50czoge30sXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZGVmYXVsdHMoIHRoaXMub3B0aW9ucywge1xuXHRcdFx0c29ydGFibGU6ICAgZmFsc2UsXG5cdFx0XHRyZXNpemU6ICAgICBmYWxzZSxcblxuXHRcdFx0Ly8gVGhlIHNpbmdsZSBgQXR0YWNobWVudGAgdmlldyB0byBiZSB1c2VkIGluIHRoZSBgQXR0YWNobWVudHNgIHZpZXcuXG5cdFx0XHRBdHRhY2htZW50Vmlldzogd3AubWVkaWEudmlldy5BdHRhY2htZW50LlNlbGVjdGlvblxuXHRcdH0pO1xuXHRcdC8vIENhbGwgJ2luaXRpYWxpemUnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3MuXG5cdFx0cmV0dXJuIEF0dGFjaG1lbnRzLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2VsZWN0aW9uO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkJ1dHRvbkdyb3VwXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciAkID0gQmFja2JvbmUuJCxcblx0QnV0dG9uR3JvdXA7XG5cbkJ1dHRvbkdyb3VwID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdkaXYnLFxuXHRjbGFzc05hbWU6ICdidXR0b24tZ3JvdXAgYnV0dG9uLWxhcmdlIG1lZGlhLWJ1dHRvbi1ncm91cCcsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0LyoqXG5cdFx0ICogQG1lbWJlciB7d3AubWVkaWEudmlldy5CdXR0b25bXX1cblx0XHQgKi9cblx0XHR0aGlzLmJ1dHRvbnMgPSBfLm1hcCggdGhpcy5vcHRpb25zLmJ1dHRvbnMgfHwgW10sIGZ1bmN0aW9uKCBidXR0b24gKSB7XG5cdFx0XHRpZiAoIGJ1dHRvbiBpbnN0YW5jZW9mIEJhY2tib25lLlZpZXcgKSB7XG5cdFx0XHRcdHJldHVybiBidXR0b247XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gbmV3IHdwLm1lZGlhLnZpZXcuQnV0dG9uKCBidXR0b24gKS5yZW5kZXIoKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGRlbGV0ZSB0aGlzLm9wdGlvbnMuYnV0dG9ucztcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLmNsYXNzZXMgKSB7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyggdGhpcy5vcHRpb25zLmNsYXNzZXMgKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LkJ1dHRvbkdyb3VwfVxuXHQgKi9cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5odG1sKCAkKCBfLnBsdWNrKCB0aGlzLmJ1dHRvbnMsICdlbCcgKSApLmRldGFjaCgpICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1dHRvbkdyb3VwO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkJ1dHRvblxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgQnV0dG9uID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICAnYnV0dG9uJyxcblx0Y2xhc3NOYW1lOiAgJ21lZGlhLWJ1dHRvbicsXG5cdGF0dHJpYnV0ZXM6IHsgdHlwZTogJ2J1dHRvbicgfSxcblxuXHRldmVudHM6IHtcblx0XHQnY2xpY2snOiAnY2xpY2snXG5cdH0sXG5cblx0ZGVmYXVsdHM6IHtcblx0XHR0ZXh0OiAgICAgJycsXG5cdFx0c3R5bGU6ICAgICcnLFxuXHRcdHNpemU6ICAgICAnbGFyZ2UnLFxuXHRcdGRpc2FibGVkOiBmYWxzZVxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdC8qKlxuXHRcdCAqIENyZWF0ZSBhIG1vZGVsIHdpdGggdGhlIHByb3ZpZGVkIGBkZWZhdWx0c2AuXG5cdFx0ICpcblx0XHQgKiBAbWVtYmVyIHtCYWNrYm9uZS5Nb2RlbH1cblx0XHQgKi9cblx0XHR0aGlzLm1vZGVsID0gbmV3IEJhY2tib25lLk1vZGVsKCB0aGlzLmRlZmF1bHRzICk7XG5cblx0XHQvLyBJZiBhbnkgb2YgdGhlIGBvcHRpb25zYCBoYXZlIGEga2V5IGZyb20gYGRlZmF1bHRzYCwgYXBwbHkgaXRzXG5cdFx0Ly8gdmFsdWUgdG8gdGhlIGBtb2RlbGAgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBgb3B0aW9ucyBvYmplY3QuXG5cdFx0Xy5lYWNoKCB0aGlzLmRlZmF1bHRzLCBmdW5jdGlvbiggZGVmLCBrZXkgKSB7XG5cdFx0XHR2YXIgdmFsdWUgPSB0aGlzLm9wdGlvbnNbIGtleSBdO1xuXHRcdFx0aWYgKCBfLmlzVW5kZWZpbmVkKCB2YWx1ZSApICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9kZWwuc2V0KCBrZXksIHZhbHVlICk7XG5cdFx0XHRkZWxldGUgdGhpcy5vcHRpb25zWyBrZXkgXTtcblx0XHR9LCB0aGlzICk7XG5cblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnY2hhbmdlJywgdGhpcy5yZW5kZXIgKTtcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LkJ1dHRvbn0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbICdidXR0b24nLCB0aGlzLmNsYXNzTmFtZSBdLFxuXHRcdFx0bW9kZWwgPSB0aGlzLm1vZGVsLnRvSlNPTigpO1xuXG5cdFx0aWYgKCBtb2RlbC5zdHlsZSApIHtcblx0XHRcdGNsYXNzZXMucHVzaCggJ2J1dHRvbi0nICsgbW9kZWwuc3R5bGUgKTtcblx0XHR9XG5cblx0XHRpZiAoIG1vZGVsLnNpemUgKSB7XG5cdFx0XHRjbGFzc2VzLnB1c2goICdidXR0b24tJyArIG1vZGVsLnNpemUgKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gXy51bmlxKCBjbGFzc2VzLmNvbmNhdCggdGhpcy5vcHRpb25zLmNsYXNzZXMgKSApO1xuXHRcdHRoaXMuZWwuY2xhc3NOYW1lID0gY2xhc3Nlcy5qb2luKCcgJyk7XG5cblx0XHR0aGlzLiRlbC5hdHRyKCAnZGlzYWJsZWQnLCBtb2RlbC5kaXNhYmxlZCApO1xuXHRcdHRoaXMuJGVsLnRleHQoIHRoaXMubW9kZWwuZ2V0KCd0ZXh0JykgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHRjbGljazogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGlmICggJyMnID09PSB0aGlzLmF0dHJpYnV0ZXMuaHJlZiApIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuY2xpY2sgJiYgISB0aGlzLm1vZGVsLmdldCgnZGlzYWJsZWQnKSApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5jbGljay5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCdXR0b247XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQ3JvcHBlclxuICpcbiAqIFVzZXMgdGhlIGltZ0FyZWFTZWxlY3QgcGx1Z2luIHRvIGFsbG93IGEgdXNlciB0byBjcm9wIGFuIGltYWdlLlxuICpcbiAqIFRha2VzIGltZ0FyZWFTZWxlY3Qgb3B0aW9ucyBmcm9tXG4gKiB3cC5jdXN0b21pemUuSGVhZGVyQ29udHJvbC5jYWxjdWxhdGVJbWFnZVNlbGVjdE9wdGlvbnMgdmlhXG4gKiB3cC5jdXN0b21pemUuSGVhZGVyQ29udHJvbC5vcGVuTU0uXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0VXBsb2FkZXJTdGF0dXMgPSB3cC5tZWRpYS52aWV3LlVwbG9hZGVyU3RhdHVzLFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHQkID0galF1ZXJ5LFxuXHRDcm9wcGVyO1xuXG5Dcm9wcGVyID0gVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdjcm9wLWNvbnRlbnQnLFxuXHR0ZW1wbGF0ZTogd3AudGVtcGxhdGUoJ2Nyb3AtY29udGVudCcpLFxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmJpbmRBbGwodGhpcywgJ29uSW1hZ2VMb2FkJyk7XG5cdH0sXG5cdHJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbnRyb2xsZXIuZnJhbWUub24oJ2NvbnRlbnQ6ZXJyb3I6Y3JvcCcsIHRoaXMub25FcnJvciwgdGhpcyk7XG5cdFx0dGhpcy4kaW1hZ2UgPSB0aGlzLiRlbC5maW5kKCcuY3JvcC1pbWFnZScpO1xuXHRcdHRoaXMuJGltYWdlLm9uKCdsb2FkJywgdGhpcy5vbkltYWdlTG9hZCk7XG5cdFx0JCh3aW5kb3cpLm9uKCdyZXNpemUuY3JvcHBlcicsIF8uZGVib3VuY2UodGhpcy5vbkltYWdlTG9hZCwgMjUwKSk7XG5cdH0sXG5cdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0JCh3aW5kb3cpLm9mZigncmVzaXplLmNyb3BwZXInKTtcblx0XHR0aGlzLiRlbC5yZW1vdmUoKTtcblx0XHR0aGlzLiRlbC5vZmYoKTtcblx0XHRWaWV3LnByb3RvdHlwZS5yZW1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0fSxcblx0cHJlcGFyZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRpdGxlOiBsMTBuLmNyb3BZb3VySW1hZ2UsXG5cdFx0XHR1cmw6IHRoaXMub3B0aW9ucy5hdHRhY2htZW50LmdldCgndXJsJylcblx0XHR9O1xuXHR9LFxuXHRvbkltYWdlTG9hZDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGltZ09wdGlvbnMgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0KCdpbWdTZWxlY3RPcHRpb25zJyk7XG5cdFx0aWYgKHR5cGVvZiBpbWdPcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRpbWdPcHRpb25zID0gaW1nT3B0aW9ucyh0aGlzLm9wdGlvbnMuYXR0YWNobWVudCwgdGhpcy5jb250cm9sbGVyKTtcblx0XHR9XG5cblx0XHRpbWdPcHRpb25zID0gXy5leHRlbmQoaW1nT3B0aW9ucywge3BhcmVudDogdGhpcy4kZWx9KTtcblx0XHR0aGlzLnRyaWdnZXIoJ2ltYWdlLWxvYWRlZCcpO1xuXHRcdHRoaXMuY29udHJvbGxlci5pbWdTZWxlY3QgPSB0aGlzLiRpbWFnZS5pbWdBcmVhU2VsZWN0KGltZ09wdGlvbnMpO1xuXHR9LFxuXHRvbkVycm9yOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZmlsZW5hbWUgPSB0aGlzLm9wdGlvbnMuYXR0YWNobWVudC5nZXQoJ2ZpbGVuYW1lJyk7XG5cblx0XHR0aGlzLnZpZXdzLmFkZCggJy51cGxvYWQtZXJyb3JzJywgbmV3IHdwLm1lZGlhLnZpZXcuVXBsb2FkZXJTdGF0dXNFcnJvcih7XG5cdFx0XHRmaWxlbmFtZTogVXBsb2FkZXJTdGF0dXMucHJvdG90eXBlLmZpbGVuYW1lKGZpbGVuYW1lKSxcblx0XHRcdG1lc3NhZ2U6IHdpbmRvdy5fd3BNZWRpYVZpZXdzTDEwbi5jcm9wRXJyb3Jcblx0XHR9KSwgeyBhdDogMCB9KTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ3JvcHBlcjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5FZGl0SW1hZ2VcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFZpZXcgPSB3cC5tZWRpYS5WaWV3LFxuXHRFZGl0SW1hZ2U7XG5cbkVkaXRJbWFnZSA9IFZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAnaW1hZ2UtZWRpdG9yJyxcblx0dGVtcGxhdGU6IHdwLnRlbXBsYXRlKCdpbWFnZS1lZGl0b3InKSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR0aGlzLmVkaXRvciA9IHdpbmRvdy5pbWFnZUVkaXQ7XG5cdFx0dGhpcy5jb250cm9sbGVyID0gb3B0aW9ucy5jb250cm9sbGVyO1xuXHRcdFZpZXcucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdHByZXBhcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLnRvSlNPTigpO1xuXHR9LFxuXG5cdGxvYWRFZGl0b3I6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBkZmQgPSB0aGlzLmVkaXRvci5vcGVuKCB0aGlzLm1vZGVsLmdldCgnaWQnKSwgdGhpcy5tb2RlbC5nZXQoJ25vbmNlcycpLmVkaXQsIHRoaXMgKTtcblx0XHRkZmQuZG9uZSggXy5iaW5kKCB0aGlzLmZvY3VzLCB0aGlzICkgKTtcblx0fSxcblxuXHRmb2N1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kKCAnLmltZ2VkaXQtc3VibWl0IC5idXR0b24nICkuZXEoIDAgKS5mb2N1cygpO1xuXHR9LFxuXG5cdGJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsYXN0U3RhdGUgPSB0aGlzLmNvbnRyb2xsZXIubGFzdFN0YXRlKCk7XG5cdFx0dGhpcy5jb250cm9sbGVyLnNldFN0YXRlKCBsYXN0U3RhdGUgKTtcblx0fSxcblxuXHRyZWZyZXNoOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLmZldGNoKCk7XG5cdH0sXG5cblx0c2F2ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGxhc3RTdGF0ZSA9IHRoaXMuY29udHJvbGxlci5sYXN0U3RhdGUoKTtcblxuXHRcdHRoaXMubW9kZWwuZmV0Y2goKS5kb25lKCBfLmJpbmQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLnNldFN0YXRlKCBsYXN0U3RhdGUgKTtcblx0XHR9LCB0aGlzICkgKTtcblx0fVxuXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFZGl0SW1hZ2U7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuRW1iZWRcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIEVtYmVkID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdtZWRpYS1lbWJlZCcsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0LyoqXG5cdFx0ICogQG1lbWJlciB7d3AubWVkaWEudmlldy5FbWJlZFVybH1cblx0XHQgKi9cblx0XHR0aGlzLnVybCA9IG5ldyB3cC5tZWRpYS52aWV3LkVtYmVkVXJsKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdG1vZGVsOiAgICAgIHRoaXMubW9kZWwucHJvcHNcblx0XHR9KS5yZW5kZXIoKTtcblxuXHRcdHRoaXMudmlld3Muc2V0KFsgdGhpcy51cmwgXSk7XG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTp0eXBlJywgdGhpcy5yZWZyZXNoICk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTpsb2FkaW5nJywgdGhpcy5sb2FkaW5nICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSB2aWV3XG5cdCAqL1xuXHRzZXR0aW5nczogZnVuY3Rpb24oIHZpZXcgKSB7XG5cdFx0aWYgKCB0aGlzLl9zZXR0aW5ncyApIHtcblx0XHRcdHRoaXMuX3NldHRpbmdzLnJlbW92ZSgpO1xuXHRcdH1cblx0XHR0aGlzLl9zZXR0aW5ncyA9IHZpZXc7XG5cdFx0dGhpcy52aWV3cy5hZGQoIHZpZXcgKTtcblx0fSxcblxuXHRyZWZyZXNoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdHlwZSA9IHRoaXMubW9kZWwuZ2V0KCd0eXBlJyksXG5cdFx0XHRjb25zdHJ1Y3RvcjtcblxuXHRcdGlmICggJ2ltYWdlJyA9PT0gdHlwZSApIHtcblx0XHRcdGNvbnN0cnVjdG9yID0gd3AubWVkaWEudmlldy5FbWJlZEltYWdlO1xuXHRcdH0gZWxzZSBpZiAoICdsaW5rJyA9PT0gdHlwZSApIHtcblx0XHRcdGNvbnN0cnVjdG9yID0gd3AubWVkaWEudmlldy5FbWJlZExpbms7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnNldHRpbmdzKCBuZXcgY29uc3RydWN0b3Ioe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0bW9kZWw6ICAgICAgdGhpcy5tb2RlbC5wcm9wcyxcblx0XHRcdHByaW9yaXR5OiAgIDQwXG5cdFx0fSkgKTtcblx0fSxcblxuXHRsb2FkaW5nOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC50b2dnbGVDbGFzcyggJ2VtYmVkLWxvYWRpbmcnLCB0aGlzLm1vZGVsLmdldCgnbG9hZGluZycpICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVtYmVkO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkVtYmVkSW1hZ2VcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlNldHRpbmdzLkF0dGFjaG1lbnREaXNwbGF5XG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5TZXR0aW5nc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgQXR0YWNobWVudERpc3BsYXkgPSB3cC5tZWRpYS52aWV3LlNldHRpbmdzLkF0dGFjaG1lbnREaXNwbGF5LFxuXHRFbWJlZEltYWdlO1xuXG5FbWJlZEltYWdlID0gQXR0YWNobWVudERpc3BsYXkuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAnZW1iZWQtbWVkaWEtc2V0dGluZ3MnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCdlbWJlZC1pbWFnZS1zZXR0aW5ncycpLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdC8qKlxuXHRcdCAqIENhbGwgYGluaXRpYWxpemVgIGRpcmVjdGx5IG9uIHBhcmVudCBjbGFzcyB3aXRoIHBhc3NlZCBhcmd1bWVudHNcblx0XHQgKi9cblx0XHRBdHRhY2htZW50RGlzcGxheS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTp1cmwnLCB0aGlzLnVwZGF0ZUltYWdlICk7XG5cdH0sXG5cblx0dXBkYXRlSW1hZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJCgnaW1nJykuYXR0ciggJ3NyYycsIHRoaXMubW9kZWwuZ2V0KCd1cmwnKSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbWJlZEltYWdlO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkVtYmVkTGlua1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyICQgPSBqUXVlcnksXG5cdEVtYmVkTGluaztcblxuRW1iZWRMaW5rID0gd3AubWVkaWEudmlldy5TZXR0aW5ncy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdlbWJlZC1saW5rLXNldHRpbmdzJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgnZW1iZWQtbGluay1zZXR0aW5ncycpLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6dXJsJywgdGhpcy51cGRhdGVvRW1iZWQgKTtcblx0fSxcblxuXHR1cGRhdGVvRW1iZWQ6IF8uZGVib3VuY2UoIGZ1bmN0aW9uKCkge1xuXHRcdHZhciB1cmwgPSB0aGlzLm1vZGVsLmdldCggJ3VybCcgKTtcblxuXHRcdC8vIGNsZWFyIG91dCBwcmV2aW91cyByZXN1bHRzXG5cdFx0dGhpcy4kKCcuZW1iZWQtY29udGFpbmVyJykuaGlkZSgpLmZpbmQoJy5lbWJlZC1wcmV2aWV3JykuZW1wdHkoKTtcblx0XHR0aGlzLiQoICcuc2V0dGluZycgKS5oaWRlKCk7XG5cblx0XHQvLyBvbmx5IHByb2NlZWQgd2l0aCBlbWJlZCBpZiB0aGUgZmllbGQgY29udGFpbnMgbW9yZSB0aGFuIDExIGNoYXJhY3RlcnNcblx0XHQvLyBFeGFtcGxlOiBodHRwOi8vYS5pbyBpcyAxMSBjaGFyc1xuXHRcdGlmICggdXJsICYmICggdXJsLmxlbmd0aCA8IDExIHx8ICEgdXJsLm1hdGNoKC9eaHR0cChzKT86XFwvXFwvLykgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmZldGNoKCk7XG5cdH0sIHdwLm1lZGlhLmNvbnRyb2xsZXIuRW1iZWQuc2Vuc2l0aXZpdHkgKSxcblxuXHRmZXRjaDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGVtYmVkO1xuXG5cdFx0Ly8gY2hlY2sgaWYgdGhleSBoYXZlbid0IHR5cGVkIGluIDUwMCBtc1xuXHRcdGlmICggJCgnI2VtYmVkLXVybC1maWVsZCcpLnZhbCgpICE9PSB0aGlzLm1vZGVsLmdldCgndXJsJykgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmRmZCAmJiAncGVuZGluZycgPT09IHRoaXMuZGZkLnN0YXRlKCkgKSB7XG5cdFx0XHR0aGlzLmRmZC5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdGVtYmVkID0gbmV3IHdwLnNob3J0Y29kZSh7XG5cdFx0XHR0YWc6ICdlbWJlZCcsXG5cdFx0XHRhdHRyczogXy5waWNrKCB0aGlzLm1vZGVsLmF0dHJpYnV0ZXMsIFsgJ3dpZHRoJywgJ2hlaWdodCcsICdzcmMnIF0gKSxcblx0XHRcdGNvbnRlbnQ6IHRoaXMubW9kZWwuZ2V0KCd1cmwnKVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5kZmQgPSAkLmFqYXgoe1xuXHRcdFx0dHlwZTogICAgJ1BPU1QnLFxuXHRcdFx0dXJsOiAgICAgd3AuYWpheC5zZXR0aW5ncy51cmwsXG5cdFx0XHRjb250ZXh0OiB0aGlzLFxuXHRcdFx0ZGF0YTogICAge1xuXHRcdFx0XHRhY3Rpb246ICdwYXJzZS1lbWJlZCcsXG5cdFx0XHRcdHBvc3RfSUQ6IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5pZCxcblx0XHRcdFx0c2hvcnRjb2RlOiBlbWJlZC5zdHJpbmcoKVxuXHRcdFx0fVxuXHRcdH0pXG5cdFx0XHQuZG9uZSggdGhpcy5yZW5kZXJvRW1iZWQgKVxuXHRcdFx0LmZhaWwoIHRoaXMucmVuZGVyRmFpbCApO1xuXHR9LFxuXG5cdHJlbmRlckZhaWw6IGZ1bmN0aW9uICggcmVzcG9uc2UsIHN0YXR1cyApIHtcblx0XHRpZiAoICdhYm9ydCcgPT09IHN0YXR1cyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy4kKCAnLmxpbmstdGV4dCcgKS5zaG93KCk7XG5cdH0sXG5cblx0cmVuZGVyb0VtYmVkOiBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG5cdFx0dmFyIGh0bWwgPSAoIHJlc3BvbnNlICYmIHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5ib2R5ICkgfHwgJyc7XG5cblx0XHRpZiAoIGh0bWwgKSB7XG5cdFx0XHR0aGlzLiQoJy5lbWJlZC1jb250YWluZXInKS5zaG93KCkuZmluZCgnLmVtYmVkLXByZXZpZXcnKS5odG1sKCBodG1sICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucmVuZGVyRmFpbCgpO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRW1iZWRMaW5rO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkVtYmVkVXJsXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0JCA9IGpRdWVyeSxcblx0RW1iZWRVcmw7XG5cbkVtYmVkVXJsID0gVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdsYWJlbCcsXG5cdGNsYXNzTmFtZTogJ2VtYmVkLXVybCcsXG5cblx0ZXZlbnRzOiB7XG5cdFx0J2lucHV0JzogICd1cmwnLFxuXHRcdCdrZXl1cCc6ICAndXJsJyxcblx0XHQnY2hhbmdlJzogJ3VybCdcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRpbnB1dCA9ICQoJzxpbnB1dCBpZD1cImVtYmVkLXVybC1maWVsZFwiIHR5cGU9XCJ1cmxcIiAvPicpLnZhbCggdGhpcy5tb2RlbC5nZXQoJ3VybCcpICk7XG5cdFx0dGhpcy5pbnB1dCA9IHRoaXMuJGlucHV0WzBdO1xuXG5cdFx0dGhpcy5zcGlubmVyID0gJCgnPHNwYW4gY2xhc3M9XCJzcGlubmVyXCIgLz4nKVswXTtcblx0XHR0aGlzLiRlbC5hcHBlbmQoWyB0aGlzLmlucHV0LCB0aGlzLnNwaW5uZXIgXSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnY2hhbmdlOnVybCcsIHRoaXMucmVuZGVyICk7XG5cblx0XHRpZiAoIHRoaXMubW9kZWwuZ2V0KCAndXJsJyApICkge1xuXHRcdFx0Xy5kZWxheSggXy5iaW5kKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRoaXMubW9kZWwudHJpZ2dlciggJ2NoYW5nZTp1cmwnICk7XG5cdFx0XHR9LCB0aGlzICksIDUwMCApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LkVtYmVkVXJsfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgJGlucHV0ID0gdGhpcy4kaW5wdXQ7XG5cblx0XHRpZiAoICRpbnB1dC5pcygnOmZvY3VzJykgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5pbnB1dC52YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KCd1cmwnKSB8fCAnaHR0cDovLyc7XG5cdFx0LyoqXG5cdFx0ICogQ2FsbCBgcmVuZGVyYCBkaXJlY3RseSBvbiBwYXJlbnQgY2xhc3Mgd2l0aCBwYXNzZWQgYXJndW1lbnRzXG5cdFx0ICovXG5cdFx0Vmlldy5wcm90b3R5cGUucmVuZGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhIHdwLm1lZGlhLmlzVG91Y2hEZXZpY2UgKSB7XG5cdFx0XHR0aGlzLmZvY3VzKCk7XG5cdFx0fVxuXHR9LFxuXG5cdHVybDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHRoaXMubW9kZWwuc2V0KCAndXJsJywgZXZlbnQudGFyZ2V0LnZhbHVlICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIElmIHRoZSBpbnB1dCBpcyB2aXNpYmxlLCBmb2N1cyBhbmQgc2VsZWN0IGl0cyBjb250ZW50cy5cblx0ICovXG5cdGZvY3VzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgJGlucHV0ID0gdGhpcy4kaW5wdXQ7XG5cdFx0aWYgKCAkaW5wdXQuaXMoJzp2aXNpYmxlJykgKSB7XG5cdFx0XHQkaW5wdXQuZm9jdXMoKVswXS5zZWxlY3QoKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVtYmVkVXJsO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkZvY3VzTWFuYWdlclxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgRm9jdXNNYW5hZ2VyID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXG5cdGV2ZW50czoge1xuXHRcdCdrZXlkb3duJzogJ2NvbnN0cmFpblRhYmJpbmcnXG5cdH0sXG5cblx0Zm9jdXM6IGZ1bmN0aW9uKCkgeyAvLyBSZXNldCBmb2N1cyBvbiBmaXJzdCBsZWZ0IG1lbnUgaXRlbVxuXHRcdHRoaXMuJCgnLm1lZGlhLW1lbnUtaXRlbScpLmZpcnN0KCkuZm9jdXMoKTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0Y29uc3RyYWluVGFiYmluZzogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciB0YWJiYWJsZXM7XG5cblx0XHQvLyBMb29rIGZvciB0aGUgdGFiIGtleS5cblx0XHRpZiAoIDkgIT09IGV2ZW50LmtleUNvZGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gU2tpcCB0aGUgZmlsZSBpbnB1dCBhZGRlZCBieSBQbHVwbG9hZC5cblx0XHR0YWJiYWJsZXMgPSB0aGlzLiQoICc6dGFiYmFibGUnICkubm90KCAnLm1veGllLXNoaW0gaW5wdXRbdHlwZT1cImZpbGVcIl0nICk7XG5cblx0XHQvLyBLZWVwIHRhYiBmb2N1cyB3aXRoaW4gbWVkaWEgbW9kYWwgd2hpbGUgaXQncyBvcGVuXG5cdFx0aWYgKCB0YWJiYWJsZXMubGFzdCgpWzBdID09PSBldmVudC50YXJnZXQgJiYgISBldmVudC5zaGlmdEtleSApIHtcblx0XHRcdHRhYmJhYmxlcy5maXJzdCgpLmZvY3VzKCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIGlmICggdGFiYmFibGVzLmZpcnN0KClbMF0gPT09IGV2ZW50LnRhcmdldCAmJiBldmVudC5zaGlmdEtleSApIHtcblx0XHRcdHRhYmJhYmxlcy5sYXN0KCkuZm9jdXMoKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRm9jdXNNYW5hZ2VyO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkZyYW1lXG4gKlxuICogQSBmcmFtZSBpcyBhIGNvbXBvc2l0ZSB2aWV3IGNvbnNpc3Rpbmcgb2Ygb25lIG9yIG1vcmUgcmVnaW9ucyBhbmQgb25lIG9yIG1vcmVcbiAqIHN0YXRlcy5cbiAqXG4gKiBAc2VlIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBzZWUgd3AubWVkaWEuY29udHJvbGxlci5SZWdpb25cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqIEBtaXhlcyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZVxuICovXG52YXIgRnJhbWUgPSB3cC5tZWRpYS5WaWV3LmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZGVmYXVsdHMoIHRoaXMub3B0aW9ucywge1xuXHRcdFx0bW9kZTogWyAnc2VsZWN0JyBdXG5cdFx0fSk7XG5cdFx0dGhpcy5fY3JlYXRlUmVnaW9ucygpO1xuXHRcdHRoaXMuX2NyZWF0ZVN0YXRlcygpO1xuXHRcdHRoaXMuX2NyZWF0ZU1vZGVzKCk7XG5cdH0sXG5cblx0X2NyZWF0ZVJlZ2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENsb25lIHRoZSByZWdpb25zIGFycmF5LlxuXHRcdHRoaXMucmVnaW9ucyA9IHRoaXMucmVnaW9ucyA/IHRoaXMucmVnaW9ucy5zbGljZSgpIDogW107XG5cblx0XHQvLyBJbml0aWFsaXplIHJlZ2lvbnMuXG5cdFx0Xy5lYWNoKCB0aGlzLnJlZ2lvbnMsIGZ1bmN0aW9uKCByZWdpb24gKSB7XG5cdFx0XHR0aGlzWyByZWdpb24gXSA9IG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLlJlZ2lvbih7XG5cdFx0XHRcdHZpZXc6ICAgICB0aGlzLFxuXHRcdFx0XHRpZDogICAgICAgcmVnaW9uLFxuXHRcdFx0XHRzZWxlY3RvcjogJy5tZWRpYS1mcmFtZS0nICsgcmVnaW9uXG5cdFx0XHR9KTtcblx0XHR9LCB0aGlzICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIGZyYW1lJ3Mgc3RhdGVzLlxuXHQgKlxuXHQgKiBAc2VlIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcblx0ICogQHNlZSB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZVxuXHQgKlxuXHQgKiBAZmlyZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZSNyZWFkeVxuXHQgKi9cblx0X2NyZWF0ZVN0YXRlczogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ3JlYXRlIHRoZSBkZWZhdWx0IGBzdGF0ZXNgIGNvbGxlY3Rpb24uXG5cdFx0dGhpcy5zdGF0ZXMgPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbiggbnVsbCwge1xuXHRcdFx0bW9kZWw6IHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcblx0XHR9KTtcblxuXHRcdC8vIEVuc3VyZSBzdGF0ZXMgaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgZnJhbWUuXG5cdFx0dGhpcy5zdGF0ZXMub24oICdhZGQnLCBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0XHRtb2RlbC5mcmFtZSA9IHRoaXM7XG5cdFx0XHRtb2RlbC50cmlnZ2VyKCdyZWFkeScpO1xuXHRcdH0sIHRoaXMgKTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLnN0YXRlcyApIHtcblx0XHRcdHRoaXMuc3RhdGVzLmFkZCggdGhpcy5vcHRpb25zLnN0YXRlcyApO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQSBmcmFtZSBjYW4gYmUgaW4gYSBtb2RlIG9yIG11bHRpcGxlIG1vZGVzIGF0IG9uZSB0aW1lLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgdGhlIG1hbmFnZSBtZWRpYSBmcmFtZSBjYW4gYmUgaW4gdGhlIGBCdWxrIFNlbGVjdGAgb3IgYEVkaXRgIG1vZGUuXG5cdCAqL1xuXHRfY3JlYXRlTW9kZXM6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFN0b3JlIGFjdGl2ZSBcIm1vZGVzXCIgdGhhdCB0aGUgZnJhbWUgaXMgaW4uIFVucmVsYXRlZCB0byByZWdpb24gbW9kZXMuXG5cdFx0dGhpcy5hY3RpdmVNb2RlcyA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKCk7XG5cdFx0dGhpcy5hY3RpdmVNb2Rlcy5vbiggJ2FkZCByZW1vdmUgcmVzZXQnLCBfLmJpbmQoIHRoaXMudHJpZ2dlck1vZGVFdmVudHMsIHRoaXMgKSApO1xuXG5cdFx0Xy5lYWNoKCB0aGlzLm9wdGlvbnMubW9kZSwgZnVuY3Rpb24oIG1vZGUgKSB7XG5cdFx0XHR0aGlzLmFjdGl2YXRlTW9kZSggbW9kZSApO1xuXHRcdH0sIHRoaXMgKTtcblx0fSxcblx0LyoqXG5cdCAqIFJlc2V0IGFsbCBzdGF0ZXMgb24gdGhlIGZyYW1lIHRvIHRoZWlyIGRlZmF1bHRzLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5GcmFtZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHJlc2V0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0YXRlcy5pbnZva2UoICd0cmlnZ2VyJywgJ3Jlc2V0JyApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogTWFwIGFjdGl2ZU1vZGUgY29sbGVjdGlvbiBldmVudHMgdG8gdGhlIGZyYW1lLlxuXHQgKi9cblx0dHJpZ2dlck1vZGVFdmVudHM6IGZ1bmN0aW9uKCBtb2RlbCwgY29sbGVjdGlvbiwgb3B0aW9ucyApIHtcblx0XHR2YXIgY29sbGVjdGlvbkV2ZW50LFxuXHRcdFx0bW9kZUV2ZW50TWFwID0ge1xuXHRcdFx0XHRhZGQ6ICdhY3RpdmF0ZScsXG5cdFx0XHRcdHJlbW92ZTogJ2RlYWN0aXZhdGUnXG5cdFx0XHR9LFxuXHRcdFx0ZXZlbnRUb1RyaWdnZXI7XG5cdFx0Ly8gUHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMuXG5cdFx0Xy5lYWNoKCBvcHRpb25zLCBmdW5jdGlvbiggdmFsdWUsIGtleSApIHtcblx0XHRcdGlmICggdmFsdWUgKSB7XG5cdFx0XHRcdGNvbGxlY3Rpb25FdmVudCA9IGtleTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0XHRpZiAoICEgXy5oYXMoIG1vZGVFdmVudE1hcCwgY29sbGVjdGlvbkV2ZW50ICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZXZlbnRUb1RyaWdnZXIgPSBtb2RlbC5nZXQoJ2lkJykgKyAnOicgKyBtb2RlRXZlbnRNYXBbY29sbGVjdGlvbkV2ZW50XTtcblx0XHR0aGlzLnRyaWdnZXIoIGV2ZW50VG9UcmlnZ2VyICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBBY3RpdmF0ZSBhIG1vZGUgb24gdGhlIGZyYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gc3RyaW5nIG1vZGUgTW9kZSBJRC5cblx0ICogQHJldHVybnMge3RoaXN9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nLlxuXHQgKi9cblx0YWN0aXZhdGVNb2RlOiBmdW5jdGlvbiggbW9kZSApIHtcblx0XHQvLyBCYWlsIGlmIHRoZSBtb2RlIGlzIGFscmVhZHkgYWN0aXZlLlxuXHRcdGlmICggdGhpcy5pc01vZGVBY3RpdmUoIG1vZGUgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5hY3RpdmVNb2Rlcy5hZGQoIFsgeyBpZDogbW9kZSB9IF0gKTtcblx0XHQvLyBBZGQgYSBDU1MgY2xhc3MgdG8gdGhlIGZyYW1lIHNvIGVsZW1lbnRzIGNhbiBiZSBzdHlsZWQgZm9yIHRoZSBtb2RlLlxuXHRcdHRoaXMuJGVsLmFkZENsYXNzKCAnbW9kZS0nICsgbW9kZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBEZWFjdGl2YXRlIGEgbW9kZSBvbiB0aGUgZnJhbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzdHJpbmcgbW9kZSBNb2RlIElELlxuXHQgKiBAcmV0dXJucyB7dGhpc30gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmcuXG5cdCAqL1xuXHRkZWFjdGl2YXRlTW9kZTogZnVuY3Rpb24oIG1vZGUgKSB7XG5cdFx0Ly8gQmFpbCBpZiB0aGUgbW9kZSBpc24ndCBhY3RpdmUuXG5cdFx0aWYgKCAhIHRoaXMuaXNNb2RlQWN0aXZlKCBtb2RlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0dGhpcy5hY3RpdmVNb2Rlcy5yZW1vdmUoIHRoaXMuYWN0aXZlTW9kZXMud2hlcmUoIHsgaWQ6IG1vZGUgfSApICk7XG5cdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoICdtb2RlLScgKyBtb2RlICk7XG5cdFx0LyoqXG5cdFx0ICogRnJhbWUgbW9kZSBkZWFjdGl2YXRpb24gZXZlbnQuXG5cdFx0ICpcblx0XHQgKiBAZXZlbnQgdGhpcyN7bW9kZX06ZGVhY3RpdmF0ZVxuXHRcdCAqL1xuXHRcdHRoaXMudHJpZ2dlciggbW9kZSArICc6ZGVhY3RpdmF0ZScgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSBtb2RlIGlzIGVuYWJsZWQgb24gdGhlIGZyYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gIHN0cmluZyBtb2RlIE1vZGUgSUQuXG5cdCAqIEByZXR1cm4gYm9vbFxuXHQgKi9cblx0aXNNb2RlQWN0aXZlOiBmdW5jdGlvbiggbW9kZSApIHtcblx0XHRyZXR1cm4gQm9vbGVhbiggdGhpcy5hY3RpdmVNb2Rlcy53aGVyZSggeyBpZDogbW9kZSB9ICkubGVuZ3RoICk7XG5cdH1cbn0pO1xuXG4vLyBNYWtlIHRoZSBgRnJhbWVgIGEgYFN0YXRlTWFjaGluZWAuXG5fLmV4dGVuZCggRnJhbWUucHJvdG90eXBlLCB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZS5wcm90b3R5cGUgKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGcmFtZTtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLkltYWdlRGV0YWlsc1xuICpcbiAqIEEgbWVkaWEgZnJhbWUgZm9yIG1hbmlwdWxhdGluZyBhbiBpbWFnZSB0aGF0J3MgYWxyZWFkeSBiZWVuIGluc2VydGVkXG4gKiBpbnRvIGEgcG9zdC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuU2VsZWN0XG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5GcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICogQG1peGVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lXG4gKi9cbnZhciBTZWxlY3QgPSB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuU2VsZWN0LFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRJbWFnZURldGFpbHM7XG5cbkltYWdlRGV0YWlscyA9IFNlbGVjdC5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdGlkOiAgICAgICdpbWFnZScsXG5cdFx0dXJsOiAgICAgJycsXG5cdFx0bWVudTogICAgJ2ltYWdlLWRldGFpbHMnLFxuXHRcdGNvbnRlbnQ6ICdpbWFnZS1kZXRhaWxzJyxcblx0XHR0b29sYmFyOiAnaW1hZ2UtZGV0YWlscycsXG5cdFx0dHlwZTogICAgJ2xpbmsnLFxuXHRcdHRpdGxlOiAgICBsMTBuLmltYWdlRGV0YWlsc1RpdGxlLFxuXHRcdHByaW9yaXR5OiAxMjBcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR0aGlzLmltYWdlID0gbmV3IHdwLm1lZGlhLm1vZGVsLlBvc3RJbWFnZSggb3B0aW9ucy5tZXRhZGF0YSApO1xuXHRcdHRoaXMub3B0aW9ucy5zZWxlY3Rpb24gPSBuZXcgd3AubWVkaWEubW9kZWwuU2VsZWN0aW9uKCB0aGlzLmltYWdlLmF0dGFjaG1lbnQsIHsgbXVsdGlwbGU6IGZhbHNlIH0gKTtcblx0XHRTZWxlY3QucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdGJpbmRIYW5kbGVyczogZnVuY3Rpb24oKSB7XG5cdFx0U2VsZWN0LnByb3RvdHlwZS5iaW5kSGFuZGxlcnMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdHRoaXMub24oICdtZW51OmNyZWF0ZTppbWFnZS1kZXRhaWxzJywgdGhpcy5jcmVhdGVNZW51LCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2NvbnRlbnQ6Y3JlYXRlOmltYWdlLWRldGFpbHMnLCB0aGlzLmltYWdlRGV0YWlsc0NvbnRlbnQsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnY29udGVudDpyZW5kZXI6ZWRpdC1pbWFnZScsIHRoaXMuZWRpdEltYWdlQ29udGVudCwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOnJlbmRlcjppbWFnZS1kZXRhaWxzJywgdGhpcy5yZW5kZXJJbWFnZURldGFpbHNUb29sYmFyLCB0aGlzICk7XG5cdFx0Ly8gb3ZlcnJpZGUgdGhlIHNlbGVjdCB0b29sYmFyXG5cdFx0dGhpcy5vbiggJ3Rvb2xiYXI6cmVuZGVyOnJlcGxhY2UnLCB0aGlzLnJlbmRlclJlcGxhY2VJbWFnZVRvb2xiYXIsIHRoaXMgKTtcblx0fSxcblxuXHRjcmVhdGVTdGF0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RhdGVzLmFkZChbXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5JbWFnZURldGFpbHMoe1xuXHRcdFx0XHRpbWFnZTogdGhpcy5pbWFnZSxcblx0XHRcdFx0ZWRpdGFibGU6IGZhbHNlXG5cdFx0XHR9KSxcblx0XHRcdG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLlJlcGxhY2VJbWFnZSh7XG5cdFx0XHRcdGlkOiAncmVwbGFjZS1pbWFnZScsXG5cdFx0XHRcdGxpYnJhcnk6IHdwLm1lZGlhLnF1ZXJ5KCB7IHR5cGU6ICdpbWFnZScgfSApLFxuXHRcdFx0XHRpbWFnZTogdGhpcy5pbWFnZSxcblx0XHRcdFx0bXVsdGlwbGU6ICBmYWxzZSxcblx0XHRcdFx0dGl0bGU6ICAgICBsMTBuLmltYWdlUmVwbGFjZVRpdGxlLFxuXHRcdFx0XHR0b29sYmFyOiAncmVwbGFjZScsXG5cdFx0XHRcdHByaW9yaXR5OiAgODAsXG5cdFx0XHRcdGRpc3BsYXlTZXR0aW5nczogdHJ1ZVxuXHRcdFx0fSksXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5FZGl0SW1hZ2UoIHtcblx0XHRcdFx0aW1hZ2U6IHRoaXMuaW1hZ2UsXG5cdFx0XHRcdHNlbGVjdGlvbjogdGhpcy5vcHRpb25zLnNlbGVjdGlvblxuXHRcdFx0fSApXG5cdFx0XSk7XG5cdH0sXG5cblx0aW1hZ2VEZXRhaWxzQ29udGVudDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0b3B0aW9ucy52aWV3ID0gbmV3IHdwLm1lZGlhLnZpZXcuSW1hZ2VEZXRhaWxzKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRtb2RlbDogdGhpcy5zdGF0ZSgpLmltYWdlLFxuXHRcdFx0YXR0YWNobWVudDogdGhpcy5zdGF0ZSgpLmltYWdlLmF0dGFjaG1lbnRcblx0XHR9KTtcblx0fSxcblxuXHRlZGl0SW1hZ2VDb250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc3RhdGUgPSB0aGlzLnN0YXRlKCksXG5cdFx0XHRtb2RlbCA9IHN0YXRlLmdldCgnaW1hZ2UnKSxcblx0XHRcdHZpZXc7XG5cblx0XHRpZiAoICEgbW9kZWwgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LkVkaXRJbWFnZSggeyBtb2RlbDogbW9kZWwsIGNvbnRyb2xsZXI6IHRoaXMgfSApLnJlbmRlcigpO1xuXG5cdFx0dGhpcy5jb250ZW50LnNldCggdmlldyApO1xuXG5cdFx0Ly8gYWZ0ZXIgYnJpbmdpbmcgaW4gdGhlIGZyYW1lLCBsb2FkIHRoZSBhY3R1YWwgZWRpdG9yIHZpYSBhbiBhamF4IGNhbGxcblx0XHR2aWV3LmxvYWRFZGl0b3IoKTtcblxuXHR9LFxuXG5cdHJlbmRlckltYWdlRGV0YWlsc1Rvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudG9vbGJhci5zZXQoIG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdHNlbGVjdDoge1xuXHRcdFx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHRcdFx0dGV4dDogICAgIGwxMG4udXBkYXRlLFxuXHRcdFx0XHRcdHByaW9yaXR5OiA4MCxcblxuXHRcdFx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRzdGF0ZSA9IGNvbnRyb2xsZXIuc3RhdGUoKTtcblxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXG5cdFx0XHRcdFx0XHQvLyBub3Qgc3VyZSBpZiB3ZSB3YW50IHRvIHVzZSB3cC5tZWRpYS5zdHJpbmcuaW1hZ2Ugd2hpY2ggd2lsbCBjcmVhdGUgYSBzaG9ydGNvZGUgb3Jcblx0XHRcdFx0XHRcdC8vIHBlcmhhcHMgd3AuaHRtbC5zdHJpbmcgdG8gYXQgbGVhc3QgdG8gYnVpbGQgdGhlIDxpbWcgLz5cblx0XHRcdFx0XHRcdHN0YXRlLnRyaWdnZXIoICd1cGRhdGUnLCBjb250cm9sbGVyLmltYWdlLnRvSlNPTigpICk7XG5cblx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgYW5kIHJlc2V0IHRoZSBkZWZhdWx0IHN0YXRlLlxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zZXRTdGF0ZSggY29udHJvbGxlci5vcHRpb25zLnN0YXRlICk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnJlc2V0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fSxcblxuXHRyZW5kZXJSZXBsYWNlSW1hZ2VUb29sYmFyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZnJhbWUgPSB0aGlzLFxuXHRcdFx0bGFzdFN0YXRlID0gZnJhbWUubGFzdFN0YXRlKCksXG5cdFx0XHRwcmV2aW91cyA9IGxhc3RTdGF0ZSAmJiBsYXN0U3RhdGUuaWQ7XG5cblx0XHR0aGlzLnRvb2xiYXIuc2V0KCBuZXcgd3AubWVkaWEudmlldy5Ub29sYmFyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRpdGVtczoge1xuXHRcdFx0XHRiYWNrOiB7XG5cdFx0XHRcdFx0dGV4dDogICAgIGwxMG4uYmFjayxcblx0XHRcdFx0XHRwcmlvcml0eTogMjAsXG5cdFx0XHRcdFx0Y2xpY2s6ICAgIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBwcmV2aW91cyApIHtcblx0XHRcdFx0XHRcdFx0ZnJhbWUuc2V0U3RhdGUoIHByZXZpb3VzICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRmcmFtZS5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHRyZXBsYWNlOiB7XG5cdFx0XHRcdFx0c3R5bGU6ICAgICdwcmltYXJ5Jyxcblx0XHRcdFx0XHR0ZXh0OiAgICAgbDEwbi5yZXBsYWNlLFxuXHRcdFx0XHRcdHByaW9yaXR5OiA4MCxcblxuXHRcdFx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRzdGF0ZSA9IGNvbnRyb2xsZXIuc3RhdGUoKSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uID0gc3RhdGUuZ2V0KCAnc2VsZWN0aW9uJyApLFxuXHRcdFx0XHRcdFx0XHRhdHRhY2htZW50ID0gc2VsZWN0aW9uLnNpbmdsZSgpO1xuXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLmNsb3NlKCk7XG5cblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuaW1hZ2UuY2hhbmdlQXR0YWNobWVudCggYXR0YWNobWVudCwgc3RhdGUuZGlzcGxheSggYXR0YWNobWVudCApICk7XG5cblx0XHRcdFx0XHRcdC8vIG5vdCBzdXJlIGlmIHdlIHdhbnQgdG8gdXNlIHdwLm1lZGlhLnN0cmluZy5pbWFnZSB3aGljaCB3aWxsIGNyZWF0ZSBhIHNob3J0Y29kZSBvclxuXHRcdFx0XHRcdFx0Ly8gcGVyaGFwcyB3cC5odG1sLnN0cmluZyB0byBhdCBsZWFzdCB0byBidWlsZCB0aGUgPGltZyAvPlxuXHRcdFx0XHRcdFx0c3RhdGUudHJpZ2dlciggJ3JlcGxhY2UnLCBjb250cm9sbGVyLmltYWdlLnRvSlNPTigpICk7XG5cblx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgYW5kIHJlc2V0IHRoZSBkZWZhdWx0IHN0YXRlLlxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zZXRTdGF0ZSggY29udHJvbGxlci5vcHRpb25zLnN0YXRlICk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnJlc2V0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fVxuXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbWFnZURldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5Qb3N0XG4gKlxuICogVGhlIGZyYW1lIGZvciBtYW5pcHVsYXRpbmcgbWVkaWEgb24gdGhlIEVkaXQgUG9zdCBwYWdlLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5TZWxlY3RcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWVcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKiBAbWl4ZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZU1hY2hpbmVcbiAqL1xudmFyIFNlbGVjdCA9IHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5TZWxlY3QsXG5cdExpYnJhcnkgPSB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnksXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdFBvc3Q7XG5cblBvc3QgPSBTZWxlY3QuZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb3VudHMgPSB7XG5cdFx0XHRhdWRpbzoge1xuXHRcdFx0XHRjb3VudDogd3AubWVkaWEudmlldy5zZXR0aW5ncy5hdHRhY2htZW50Q291bnRzLmF1ZGlvLFxuXHRcdFx0XHRzdGF0ZTogJ3BsYXlsaXN0J1xuXHRcdFx0fSxcblx0XHRcdHZpZGVvOiB7XG5cdFx0XHRcdGNvdW50OiB3cC5tZWRpYS52aWV3LnNldHRpbmdzLmF0dGFjaG1lbnRDb3VudHMudmlkZW8sXG5cdFx0XHRcdHN0YXRlOiAndmlkZW8tcGxheWxpc3QnXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdF8uZGVmYXVsdHMoIHRoaXMub3B0aW9ucywge1xuXHRcdFx0bXVsdGlwbGU6ICB0cnVlLFxuXHRcdFx0ZWRpdGluZzogICBmYWxzZSxcblx0XHRcdHN0YXRlOiAgICAnaW5zZXJ0Jyxcblx0XHRcdG1ldGFkYXRhOiAge31cblx0XHR9KTtcblxuXHRcdC8vIENhbGwgJ2luaXRpYWxpemUnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3MuXG5cdFx0U2VsZWN0LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR0aGlzLmNyZWF0ZUlmcmFtZVN0YXRlcygpO1xuXG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgZGVmYXVsdCBzdGF0ZXMuXG5cdCAqL1xuXHRjcmVhdGVTdGF0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0dGhpcy5zdGF0ZXMuYWRkKFtcblx0XHRcdC8vIE1haW4gc3RhdGVzLlxuXHRcdFx0bmV3IExpYnJhcnkoe1xuXHRcdFx0XHRpZDogICAgICAgICAnaW5zZXJ0Jyxcblx0XHRcdFx0dGl0bGU6ICAgICAgbDEwbi5pbnNlcnRNZWRpYVRpdGxlLFxuXHRcdFx0XHRwcmlvcml0eTogICAyMCxcblx0XHRcdFx0dG9vbGJhcjogICAgJ21haW4taW5zZXJ0Jyxcblx0XHRcdFx0ZmlsdGVyYWJsZTogJ2FsbCcsXG5cdFx0XHRcdGxpYnJhcnk6ICAgIHdwLm1lZGlhLnF1ZXJ5KCBvcHRpb25zLmxpYnJhcnkgKSxcblx0XHRcdFx0bXVsdGlwbGU6ICAgb3B0aW9ucy5tdWx0aXBsZSA/ICdyZXNldCcgOiBmYWxzZSxcblx0XHRcdFx0ZWRpdGFibGU6ICAgdHJ1ZSxcblxuXHRcdFx0XHQvLyBJZiB0aGUgdXNlciBpc24ndCBhbGxvd2VkIHRvIGVkaXQgZmllbGRzLFxuXHRcdFx0XHQvLyBjYW4gdGhleSBzdGlsbCBlZGl0IGl0IGxvY2FsbHk/XG5cdFx0XHRcdGFsbG93TG9jYWxFZGl0czogdHJ1ZSxcblxuXHRcdFx0XHQvLyBTaG93IHRoZSBhdHRhY2htZW50IGRpc3BsYXkgc2V0dGluZ3MuXG5cdFx0XHRcdGRpc3BsYXlTZXR0aW5nczogdHJ1ZSxcblx0XHRcdFx0Ly8gVXBkYXRlIHVzZXIgc2V0dGluZ3Mgd2hlbiB1c2VycyBhZGp1c3QgdGhlXG5cdFx0XHRcdC8vIGF0dGFjaG1lbnQgZGlzcGxheSBzZXR0aW5ncy5cblx0XHRcdFx0ZGlzcGxheVVzZXJTZXR0aW5nczogdHJ1ZVxuXHRcdFx0fSksXG5cblx0XHRcdG5ldyBMaWJyYXJ5KHtcblx0XHRcdFx0aWQ6ICAgICAgICAgJ2dhbGxlcnknLFxuXHRcdFx0XHR0aXRsZTogICAgICBsMTBuLmNyZWF0ZUdhbGxlcnlUaXRsZSxcblx0XHRcdFx0cHJpb3JpdHk6ICAgNDAsXG5cdFx0XHRcdHRvb2xiYXI6ICAgICdtYWluLWdhbGxlcnknLFxuXHRcdFx0XHRmaWx0ZXJhYmxlOiAndXBsb2FkZWQnLFxuXHRcdFx0XHRtdWx0aXBsZTogICAnYWRkJyxcblx0XHRcdFx0ZWRpdGFibGU6ICAgZmFsc2UsXG5cblx0XHRcdFx0bGlicmFyeTogIHdwLm1lZGlhLnF1ZXJ5KCBfLmRlZmF1bHRzKHtcblx0XHRcdFx0XHR0eXBlOiAnaW1hZ2UnXG5cdFx0XHRcdH0sIG9wdGlvbnMubGlicmFyeSApIClcblx0XHRcdH0pLFxuXG5cdFx0XHQvLyBFbWJlZCBzdGF0ZXMuXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5FbWJlZCggeyBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSB9ICksXG5cblx0XHRcdG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLkVkaXRJbWFnZSggeyBtb2RlbDogb3B0aW9ucy5lZGl0SW1hZ2UgfSApLFxuXG5cdFx0XHQvLyBHYWxsZXJ5IHN0YXRlcy5cblx0XHRcdG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLkdhbGxlcnlFZGl0KHtcblx0XHRcdFx0bGlicmFyeTogb3B0aW9ucy5zZWxlY3Rpb24sXG5cdFx0XHRcdGVkaXRpbmc6IG9wdGlvbnMuZWRpdGluZyxcblx0XHRcdFx0bWVudTogICAgJ2dhbGxlcnknXG5cdFx0XHR9KSxcblxuXHRcdFx0bmV3IHdwLm1lZGlhLmNvbnRyb2xsZXIuR2FsbGVyeUFkZCgpLFxuXG5cdFx0XHRuZXcgTGlicmFyeSh7XG5cdFx0XHRcdGlkOiAgICAgICAgICdwbGF5bGlzdCcsXG5cdFx0XHRcdHRpdGxlOiAgICAgIGwxMG4uY3JlYXRlUGxheWxpc3RUaXRsZSxcblx0XHRcdFx0cHJpb3JpdHk6ICAgNjAsXG5cdFx0XHRcdHRvb2xiYXI6ICAgICdtYWluLXBsYXlsaXN0Jyxcblx0XHRcdFx0ZmlsdGVyYWJsZTogJ3VwbG9hZGVkJyxcblx0XHRcdFx0bXVsdGlwbGU6ICAgJ2FkZCcsXG5cdFx0XHRcdGVkaXRhYmxlOiAgIGZhbHNlLFxuXG5cdFx0XHRcdGxpYnJhcnk6ICB3cC5tZWRpYS5xdWVyeSggXy5kZWZhdWx0cyh7XG5cdFx0XHRcdFx0dHlwZTogJ2F1ZGlvJ1xuXHRcdFx0XHR9LCBvcHRpb25zLmxpYnJhcnkgKSApXG5cdFx0XHR9KSxcblxuXHRcdFx0Ly8gUGxheWxpc3Qgc3RhdGVzLlxuXHRcdFx0bmV3IHdwLm1lZGlhLmNvbnRyb2xsZXIuQ29sbGVjdGlvbkVkaXQoe1xuXHRcdFx0XHR0eXBlOiAnYXVkaW8nLFxuXHRcdFx0XHRjb2xsZWN0aW9uVHlwZTogJ3BsYXlsaXN0Jyxcblx0XHRcdFx0dGl0bGU6ICAgICAgICAgIGwxMG4uZWRpdFBsYXlsaXN0VGl0bGUsXG5cdFx0XHRcdFNldHRpbmdzVmlldzogICB3cC5tZWRpYS52aWV3LlNldHRpbmdzLlBsYXlsaXN0LFxuXHRcdFx0XHRsaWJyYXJ5OiAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb24sXG5cdFx0XHRcdGVkaXRpbmc6ICAgICAgICBvcHRpb25zLmVkaXRpbmcsXG5cdFx0XHRcdG1lbnU6ICAgICAgICAgICAncGxheWxpc3QnLFxuXHRcdFx0XHRkcmFnSW5mb1RleHQ6ICAgbDEwbi5wbGF5bGlzdERyYWdJbmZvLFxuXHRcdFx0XHRkcmFnSW5mbzogICAgICAgZmFsc2Vcblx0XHRcdH0pLFxuXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5Db2xsZWN0aW9uQWRkKHtcblx0XHRcdFx0dHlwZTogJ2F1ZGlvJyxcblx0XHRcdFx0Y29sbGVjdGlvblR5cGU6ICdwbGF5bGlzdCcsXG5cdFx0XHRcdHRpdGxlOiBsMTBuLmFkZFRvUGxheWxpc3RUaXRsZVxuXHRcdFx0fSksXG5cblx0XHRcdG5ldyBMaWJyYXJ5KHtcblx0XHRcdFx0aWQ6ICAgICAgICAgJ3ZpZGVvLXBsYXlsaXN0Jyxcblx0XHRcdFx0dGl0bGU6ICAgICAgbDEwbi5jcmVhdGVWaWRlb1BsYXlsaXN0VGl0bGUsXG5cdFx0XHRcdHByaW9yaXR5OiAgIDYwLFxuXHRcdFx0XHR0b29sYmFyOiAgICAnbWFpbi12aWRlby1wbGF5bGlzdCcsXG5cdFx0XHRcdGZpbHRlcmFibGU6ICd1cGxvYWRlZCcsXG5cdFx0XHRcdG11bHRpcGxlOiAgICdhZGQnLFxuXHRcdFx0XHRlZGl0YWJsZTogICBmYWxzZSxcblxuXHRcdFx0XHRsaWJyYXJ5OiAgd3AubWVkaWEucXVlcnkoIF8uZGVmYXVsdHMoe1xuXHRcdFx0XHRcdHR5cGU6ICd2aWRlbydcblx0XHRcdFx0fSwgb3B0aW9ucy5saWJyYXJ5ICkgKVxuXHRcdFx0fSksXG5cblx0XHRcdG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLkNvbGxlY3Rpb25FZGl0KHtcblx0XHRcdFx0dHlwZTogJ3ZpZGVvJyxcblx0XHRcdFx0Y29sbGVjdGlvblR5cGU6ICdwbGF5bGlzdCcsXG5cdFx0XHRcdHRpdGxlOiAgICAgICAgICBsMTBuLmVkaXRWaWRlb1BsYXlsaXN0VGl0bGUsXG5cdFx0XHRcdFNldHRpbmdzVmlldzogICB3cC5tZWRpYS52aWV3LlNldHRpbmdzLlBsYXlsaXN0LFxuXHRcdFx0XHRsaWJyYXJ5OiAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb24sXG5cdFx0XHRcdGVkaXRpbmc6ICAgICAgICBvcHRpb25zLmVkaXRpbmcsXG5cdFx0XHRcdG1lbnU6ICAgICAgICAgICAndmlkZW8tcGxheWxpc3QnLFxuXHRcdFx0XHRkcmFnSW5mb1RleHQ6ICAgbDEwbi52aWRlb1BsYXlsaXN0RHJhZ0luZm8sXG5cdFx0XHRcdGRyYWdJbmZvOiAgICAgICBmYWxzZVxuXHRcdFx0fSksXG5cblx0XHRcdG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLkNvbGxlY3Rpb25BZGQoe1xuXHRcdFx0XHR0eXBlOiAndmlkZW8nLFxuXHRcdFx0XHRjb2xsZWN0aW9uVHlwZTogJ3BsYXlsaXN0Jyxcblx0XHRcdFx0dGl0bGU6IGwxMG4uYWRkVG9WaWRlb1BsYXlsaXN0VGl0bGVcblx0XHRcdH0pXG5cdFx0XSk7XG5cblx0XHRpZiAoIHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5mZWF0dXJlZEltYWdlSWQgKSB7XG5cdFx0XHR0aGlzLnN0YXRlcy5hZGQoIG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLkZlYXR1cmVkSW1hZ2UoKSApO1xuXHRcdH1cblx0fSxcblxuXHRiaW5kSGFuZGxlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBoYW5kbGVycywgY2hlY2tDb3VudHM7XG5cblx0XHRTZWxlY3QucHJvdG90eXBlLmJpbmRIYW5kbGVycy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cblx0XHR0aGlzLm9uKCAnYWN0aXZhdGUnLCB0aGlzLmFjdGl2YXRlLCB0aGlzICk7XG5cblx0XHQvLyBPbmx5IGJvdGhlciBjaGVja2luZyBtZWRpYSB0eXBlIGNvdW50cyBpZiBvbmUgb2YgdGhlIGNvdW50cyBpcyB6ZXJvXG5cdFx0Y2hlY2tDb3VudHMgPSBfLmZpbmQoIHRoaXMuY291bnRzLCBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdHJldHVybiB0eXBlLmNvdW50ID09PSAwO1xuXHRcdH0gKTtcblxuXHRcdGlmICggdHlwZW9mIGNoZWNrQ291bnRzICE9PSAndW5kZWZpbmVkJyApIHtcblx0XHRcdHRoaXMubGlzdGVuVG8oIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzLmFsbCwgJ2NoYW5nZTp0eXBlJywgdGhpcy5tZWRpYVR5cGVDb3VudHMgKTtcblx0XHR9XG5cblx0XHR0aGlzLm9uKCAnbWVudTpjcmVhdGU6Z2FsbGVyeScsIHRoaXMuY3JlYXRlTWVudSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdtZW51OmNyZWF0ZTpwbGF5bGlzdCcsIHRoaXMuY3JlYXRlTWVudSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdtZW51OmNyZWF0ZTp2aWRlby1wbGF5bGlzdCcsIHRoaXMuY3JlYXRlTWVudSwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOmNyZWF0ZTptYWluLWluc2VydCcsIHRoaXMuY3JlYXRlVG9vbGJhciwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOmNyZWF0ZTptYWluLWdhbGxlcnknLCB0aGlzLmNyZWF0ZVRvb2xiYXIsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpjcmVhdGU6bWFpbi1wbGF5bGlzdCcsIHRoaXMuY3JlYXRlVG9vbGJhciwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOmNyZWF0ZTptYWluLXZpZGVvLXBsYXlsaXN0JywgdGhpcy5jcmVhdGVUb29sYmFyLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ3Rvb2xiYXI6Y3JlYXRlOmZlYXR1cmVkLWltYWdlJywgdGhpcy5mZWF0dXJlZEltYWdlVG9vbGJhciwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOmNyZWF0ZTptYWluLWVtYmVkJywgdGhpcy5tYWluRW1iZWRUb29sYmFyLCB0aGlzICk7XG5cblx0XHRoYW5kbGVycyA9IHtcblx0XHRcdG1lbnU6IHtcblx0XHRcdFx0J2RlZmF1bHQnOiAnbWFpbk1lbnUnLFxuXHRcdFx0XHQnZ2FsbGVyeSc6ICdnYWxsZXJ5TWVudScsXG5cdFx0XHRcdCdwbGF5bGlzdCc6ICdwbGF5bGlzdE1lbnUnLFxuXHRcdFx0XHQndmlkZW8tcGxheWxpc3QnOiAndmlkZW9QbGF5bGlzdE1lbnUnXG5cdFx0XHR9LFxuXG5cdFx0XHRjb250ZW50OiB7XG5cdFx0XHRcdCdlbWJlZCc6ICAgICAgICAgICdlbWJlZENvbnRlbnQnLFxuXHRcdFx0XHQnZWRpdC1pbWFnZSc6ICAgICAnZWRpdEltYWdlQ29udGVudCcsXG5cdFx0XHRcdCdlZGl0LXNlbGVjdGlvbic6ICdlZGl0U2VsZWN0aW9uQ29udGVudCdcblx0XHRcdH0sXG5cblx0XHRcdHRvb2xiYXI6IHtcblx0XHRcdFx0J21haW4taW5zZXJ0JzogICAgICAnbWFpbkluc2VydFRvb2xiYXInLFxuXHRcdFx0XHQnbWFpbi1nYWxsZXJ5JzogICAgICdtYWluR2FsbGVyeVRvb2xiYXInLFxuXHRcdFx0XHQnZ2FsbGVyeS1lZGl0JzogICAgICdnYWxsZXJ5RWRpdFRvb2xiYXInLFxuXHRcdFx0XHQnZ2FsbGVyeS1hZGQnOiAgICAgICdnYWxsZXJ5QWRkVG9vbGJhcicsXG5cdFx0XHRcdCdtYWluLXBsYXlsaXN0JzpcdCdtYWluUGxheWxpc3RUb29sYmFyJyxcblx0XHRcdFx0J3BsYXlsaXN0LWVkaXQnOlx0J3BsYXlsaXN0RWRpdFRvb2xiYXInLFxuXHRcdFx0XHQncGxheWxpc3QtYWRkJzpcdFx0J3BsYXlsaXN0QWRkVG9vbGJhcicsXG5cdFx0XHRcdCdtYWluLXZpZGVvLXBsYXlsaXN0JzogJ21haW5WaWRlb1BsYXlsaXN0VG9vbGJhcicsXG5cdFx0XHRcdCd2aWRlby1wbGF5bGlzdC1lZGl0JzogJ3ZpZGVvUGxheWxpc3RFZGl0VG9vbGJhcicsXG5cdFx0XHRcdCd2aWRlby1wbGF5bGlzdC1hZGQnOiAndmlkZW9QbGF5bGlzdEFkZFRvb2xiYXInXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdF8uZWFjaCggaGFuZGxlcnMsIGZ1bmN0aW9uKCByZWdpb25IYW5kbGVycywgcmVnaW9uICkge1xuXHRcdFx0Xy5lYWNoKCByZWdpb25IYW5kbGVycywgZnVuY3Rpb24oIGNhbGxiYWNrLCBoYW5kbGVyICkge1xuXHRcdFx0XHR0aGlzLm9uKCByZWdpb24gKyAnOnJlbmRlcjonICsgaGFuZGxlciwgdGhpc1sgY2FsbGJhY2sgXSwgdGhpcyApO1xuXHRcdFx0fSwgdGhpcyApO1xuXHRcdH0sIHRoaXMgKTtcblx0fSxcblxuXHRhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gSGlkZSBtZW51IGl0ZW1zIGZvciBzdGF0ZXMgdGllZCB0byBwYXJ0aWN1bGFyIG1lZGlhIHR5cGVzIGlmIHRoZXJlIGFyZSBubyBpdGVtc1xuXHRcdF8uZWFjaCggdGhpcy5jb3VudHMsIGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0aWYgKCB0eXBlLmNvdW50IDwgMSApIHtcblx0XHRcdFx0dGhpcy5tZW51SXRlbVZpc2liaWxpdHkoIHR5cGUuc3RhdGUsICdoaWRlJyApO1xuXHRcdFx0fVxuXHRcdH0sIHRoaXMgKTtcblx0fSxcblxuXHRtZWRpYVR5cGVDb3VudHM6IGZ1bmN0aW9uKCBtb2RlbCwgYXR0ciApIHtcblx0XHRpZiAoIHR5cGVvZiB0aGlzLmNvdW50c1sgYXR0ciBdICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNvdW50c1sgYXR0ciBdLmNvdW50IDwgMSApIHtcblx0XHRcdHRoaXMuY291bnRzWyBhdHRyIF0uY291bnQrKztcblx0XHRcdHRoaXMubWVudUl0ZW1WaXNpYmlsaXR5KCB0aGlzLmNvdW50c1sgYXR0ciBdLnN0YXRlLCAnc2hvdycgKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTWVudXNcblx0LyoqXG5cdCAqIEBwYXJhbSB7d3AuQmFja2JvbmUuVmlld30gdmlld1xuXHQgKi9cblx0bWFpbk1lbnU6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZpZXcuc2V0KHtcblx0XHRcdCdsaWJyYXJ5LXNlcGFyYXRvcic6IG5ldyB3cC5tZWRpYS5WaWV3KHtcblx0XHRcdFx0Y2xhc3NOYW1lOiAnc2VwYXJhdG9yJyxcblx0XHRcdFx0cHJpb3JpdHk6IDEwMFxuXHRcdFx0fSlcblx0XHR9KTtcblx0fSxcblxuXHRtZW51SXRlbVZpc2liaWxpdHk6IGZ1bmN0aW9uKCBzdGF0ZSwgdmlzaWJpbGl0eSApIHtcblx0XHR2YXIgbWVudSA9IHRoaXMubWVudS5nZXQoKTtcblx0XHRpZiAoIHZpc2liaWxpdHkgPT09ICdoaWRlJyApIHtcblx0XHRcdG1lbnUuaGlkZSggc3RhdGUgKTtcblx0XHR9IGVsc2UgaWYgKCB2aXNpYmlsaXR5ID09PSAnc2hvdycgKSB7XG5cdFx0XHRtZW51LnNob3coIHN0YXRlICk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHt3cC5CYWNrYm9uZS5WaWV3fSB2aWV3XG5cdCAqL1xuXHRnYWxsZXJ5TWVudTogZnVuY3Rpb24oIHZpZXcgKSB7XG5cdFx0dmFyIGxhc3RTdGF0ZSA9IHRoaXMubGFzdFN0YXRlKCksXG5cdFx0XHRwcmV2aW91cyA9IGxhc3RTdGF0ZSAmJiBsYXN0U3RhdGUuaWQsXG5cdFx0XHRmcmFtZSA9IHRoaXM7XG5cblx0XHR2aWV3LnNldCh7XG5cdFx0XHRjYW5jZWw6IHtcblx0XHRcdFx0dGV4dDogICAgIGwxMG4uY2FuY2VsR2FsbGVyeVRpdGxlLFxuXHRcdFx0XHRwcmlvcml0eTogMjAsXG5cdFx0XHRcdGNsaWNrOiAgICBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHByZXZpb3VzICkge1xuXHRcdFx0XHRcdFx0ZnJhbWUuc2V0U3RhdGUoIHByZXZpb3VzICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZyYW1lLmNsb3NlKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gS2VlcCBmb2N1cyBpbnNpZGUgbWVkaWEgbW9kYWxcblx0XHRcdFx0XHQvLyBhZnRlciBjYW5jZWxpbmcgYSBnYWxsZXJ5XG5cdFx0XHRcdFx0dGhpcy5jb250cm9sbGVyLm1vZGFsLmZvY3VzTWFuYWdlci5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c2VwYXJhdGVDYW5jZWw6IG5ldyB3cC5tZWRpYS5WaWV3KHtcblx0XHRcdFx0Y2xhc3NOYW1lOiAnc2VwYXJhdG9yJyxcblx0XHRcdFx0cHJpb3JpdHk6IDQwXG5cdFx0XHR9KVxuXHRcdH0pO1xuXHR9LFxuXG5cdHBsYXlsaXN0TWVudTogZnVuY3Rpb24oIHZpZXcgKSB7XG5cdFx0dmFyIGxhc3RTdGF0ZSA9IHRoaXMubGFzdFN0YXRlKCksXG5cdFx0XHRwcmV2aW91cyA9IGxhc3RTdGF0ZSAmJiBsYXN0U3RhdGUuaWQsXG5cdFx0XHRmcmFtZSA9IHRoaXM7XG5cblx0XHR2aWV3LnNldCh7XG5cdFx0XHRjYW5jZWw6IHtcblx0XHRcdFx0dGV4dDogICAgIGwxMG4uY2FuY2VsUGxheWxpc3RUaXRsZSxcblx0XHRcdFx0cHJpb3JpdHk6IDIwLFxuXHRcdFx0XHRjbGljazogICAgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCBwcmV2aW91cyApIHtcblx0XHRcdFx0XHRcdGZyYW1lLnNldFN0YXRlKCBwcmV2aW91cyApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRmcmFtZS5jbG9zZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNlcGFyYXRlQ2FuY2VsOiBuZXcgd3AubWVkaWEuVmlldyh7XG5cdFx0XHRcdGNsYXNzTmFtZTogJ3NlcGFyYXRvcicsXG5cdFx0XHRcdHByaW9yaXR5OiA0MFxuXHRcdFx0fSlcblx0XHR9KTtcblx0fSxcblxuXHR2aWRlb1BsYXlsaXN0TWVudTogZnVuY3Rpb24oIHZpZXcgKSB7XG5cdFx0dmFyIGxhc3RTdGF0ZSA9IHRoaXMubGFzdFN0YXRlKCksXG5cdFx0XHRwcmV2aW91cyA9IGxhc3RTdGF0ZSAmJiBsYXN0U3RhdGUuaWQsXG5cdFx0XHRmcmFtZSA9IHRoaXM7XG5cblx0XHR2aWV3LnNldCh7XG5cdFx0XHRjYW5jZWw6IHtcblx0XHRcdFx0dGV4dDogICAgIGwxMG4uY2FuY2VsVmlkZW9QbGF5bGlzdFRpdGxlLFxuXHRcdFx0XHRwcmlvcml0eTogMjAsXG5cdFx0XHRcdGNsaWNrOiAgICBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHByZXZpb3VzICkge1xuXHRcdFx0XHRcdFx0ZnJhbWUuc2V0U3RhdGUoIHByZXZpb3VzICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZyYW1lLmNsb3NlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c2VwYXJhdGVDYW5jZWw6IG5ldyB3cC5tZWRpYS5WaWV3KHtcblx0XHRcdFx0Y2xhc3NOYW1lOiAnc2VwYXJhdG9yJyxcblx0XHRcdFx0cHJpb3JpdHk6IDQwXG5cdFx0XHR9KVxuXHRcdH0pO1xuXHR9LFxuXG5cdC8vIENvbnRlbnRcblx0ZW1iZWRDb250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LkVtYmVkKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRtb2RlbDogICAgICB0aGlzLnN0YXRlKClcblx0XHR9KS5yZW5kZXIoKTtcblxuXHRcdHRoaXMuY29udGVudC5zZXQoIHZpZXcgKTtcblxuXHRcdGlmICggISB3cC5tZWRpYS5pc1RvdWNoRGV2aWNlICkge1xuXHRcdFx0dmlldy51cmwuZm9jdXMoKTtcblx0XHR9XG5cdH0sXG5cblx0ZWRpdFNlbGVjdGlvbkNvbnRlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzdGF0ZSA9IHRoaXMuc3RhdGUoKSxcblx0XHRcdHNlbGVjdGlvbiA9IHN0YXRlLmdldCgnc2VsZWN0aW9uJyksXG5cdFx0XHR2aWV3O1xuXG5cdFx0dmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRzQnJvd3Nlcih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0Y29sbGVjdGlvbjogc2VsZWN0aW9uLFxuXHRcdFx0c2VsZWN0aW9uOiAgc2VsZWN0aW9uLFxuXHRcdFx0bW9kZWw6ICAgICAgc3RhdGUsXG5cdFx0XHRzb3J0YWJsZTogICB0cnVlLFxuXHRcdFx0c2VhcmNoOiAgICAgZmFsc2UsXG5cdFx0XHRkYXRlOiAgICAgICBmYWxzZSxcblx0XHRcdGRyYWdJbmZvOiAgIHRydWUsXG5cblx0XHRcdEF0dGFjaG1lbnRWaWV3OiB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRzLkVkaXRTZWxlY3Rpb25cblx0XHR9KS5yZW5kZXIoKTtcblxuXHRcdHZpZXcudG9vbGJhci5zZXQoICdiYWNrVG9MaWJyYXJ5Jywge1xuXHRcdFx0dGV4dDogICAgIGwxMG4ucmV0dXJuVG9MaWJyYXJ5LFxuXHRcdFx0cHJpb3JpdHk6IC0xMDAsXG5cblx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dGhpcy5jb250cm9sbGVyLmNvbnRlbnQubW9kZSgnYnJvd3NlJyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBCcm93c2Ugb3VyIGxpYnJhcnkgb2YgYXR0YWNobWVudHMuXG5cdFx0dGhpcy5jb250ZW50LnNldCggdmlldyApO1xuXG5cdFx0Ly8gVHJpZ2dlciB0aGUgY29udHJvbGxlciB0byBzZXQgZm9jdXNcblx0XHR0aGlzLnRyaWdnZXIoICdlZGl0OnNlbGVjdGlvbicsIHRoaXMgKTtcblx0fSxcblxuXHRlZGl0SW1hZ2VDb250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW1hZ2UgPSB0aGlzLnN0YXRlKCkuZ2V0KCdpbWFnZScpLFxuXHRcdFx0dmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LkVkaXRJbWFnZSggeyBtb2RlbDogaW1hZ2UsIGNvbnRyb2xsZXI6IHRoaXMgfSApLnJlbmRlcigpO1xuXG5cdFx0dGhpcy5jb250ZW50LnNldCggdmlldyApO1xuXG5cdFx0Ly8gYWZ0ZXIgY3JlYXRpbmcgdGhlIHdyYXBwZXIgdmlldywgbG9hZCB0aGUgYWN0dWFsIGVkaXRvciB2aWEgYW4gYWpheCBjYWxsXG5cdFx0dmlldy5sb2FkRWRpdG9yKCk7XG5cblx0fSxcblxuXHQvLyBUb29sYmFyc1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3dwLkJhY2tib25lLlZpZXd9IHZpZXdcblx0ICovXG5cdHNlbGVjdGlvblN0YXR1c1Rvb2xiYXI6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZhciBlZGl0YWJsZSA9IHRoaXMuc3RhdGUoKS5nZXQoJ2VkaXRhYmxlJyk7XG5cblx0XHR2aWV3LnNldCggJ3NlbGVjdGlvbicsIG5ldyB3cC5tZWRpYS52aWV3LlNlbGVjdGlvbih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0Y29sbGVjdGlvbjogdGhpcy5zdGF0ZSgpLmdldCgnc2VsZWN0aW9uJyksXG5cdFx0XHRwcmlvcml0eTogICAtNDAsXG5cblx0XHRcdC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZWRpdGFibGUsIHBhc3MgdGhlIGNhbGxiYWNrIHRvXG5cdFx0XHQvLyBzd2l0Y2ggdGhlIGNvbnRlbnQgbW9kZS5cblx0XHRcdGVkaXRhYmxlOiBlZGl0YWJsZSAmJiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dGhpcy5jb250cm9sbGVyLmNvbnRlbnQubW9kZSgnZWRpdC1zZWxlY3Rpb24nKTtcblx0XHRcdH1cblx0XHR9KS5yZW5kZXIoKSApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3dwLkJhY2tib25lLlZpZXd9IHZpZXdcblx0ICovXG5cdG1haW5JbnNlcnRUb29sYmFyOiBmdW5jdGlvbiggdmlldyApIHtcblx0XHR2YXIgY29udHJvbGxlciA9IHRoaXM7XG5cblx0XHR0aGlzLnNlbGVjdGlvblN0YXR1c1Rvb2xiYXIoIHZpZXcgKTtcblxuXHRcdHZpZXcuc2V0KCAnaW5zZXJ0Jywge1xuXHRcdFx0c3R5bGU6ICAgICdwcmltYXJ5Jyxcblx0XHRcdHByaW9yaXR5OiA4MCxcblx0XHRcdHRleHQ6ICAgICBsMTBuLmluc2VydEludG9Qb3N0LFxuXHRcdFx0cmVxdWlyZXM6IHsgc2VsZWN0aW9uOiB0cnVlIH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQGZpcmVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUjaW5zZXJ0XG5cdFx0XHQgKi9cblx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHN0YXRlID0gY29udHJvbGxlci5zdGF0ZSgpLFxuXHRcdFx0XHRcdHNlbGVjdGlvbiA9IHN0YXRlLmdldCgnc2VsZWN0aW9uJyk7XG5cblx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0XHRzdGF0ZS50cmlnZ2VyKCAnaW5zZXJ0Jywgc2VsZWN0aW9uICkucmVzZXQoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogQHBhcmFtIHt3cC5CYWNrYm9uZS5WaWV3fSB2aWV3XG5cdCAqL1xuXHRtYWluR2FsbGVyeVRvb2xiYXI6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZhciBjb250cm9sbGVyID0gdGhpcztcblxuXHRcdHRoaXMuc2VsZWN0aW9uU3RhdHVzVG9vbGJhciggdmlldyApO1xuXG5cdFx0dmlldy5zZXQoICdnYWxsZXJ5Jywge1xuXHRcdFx0c3R5bGU6ICAgICdwcmltYXJ5Jyxcblx0XHRcdHRleHQ6ICAgICBsMTBuLmNyZWF0ZU5ld0dhbGxlcnksXG5cdFx0XHRwcmlvcml0eTogNjAsXG5cdFx0XHRyZXF1aXJlczogeyBzZWxlY3Rpb246IHRydWUgfSxcblxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgc2VsZWN0aW9uID0gY29udHJvbGxlci5zdGF0ZSgpLmdldCgnc2VsZWN0aW9uJyksXG5cdFx0XHRcdFx0ZWRpdCA9IGNvbnRyb2xsZXIuc3RhdGUoJ2dhbGxlcnktZWRpdCcpLFxuXHRcdFx0XHRcdG1vZGVscyA9IHNlbGVjdGlvbi53aGVyZSh7IHR5cGU6ICdpbWFnZScgfSk7XG5cblx0XHRcdFx0ZWRpdC5zZXQoICdsaWJyYXJ5JywgbmV3IHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbiggbW9kZWxzLCB7XG5cdFx0XHRcdFx0cHJvcHM6ICAgIHNlbGVjdGlvbi5wcm9wcy50b0pTT04oKSxcblx0XHRcdFx0XHRtdWx0aXBsZTogdHJ1ZVxuXHRcdFx0XHR9KSApO1xuXG5cdFx0XHRcdHRoaXMuY29udHJvbGxlci5zZXRTdGF0ZSgnZ2FsbGVyeS1lZGl0Jyk7XG5cblx0XHRcdFx0Ly8gS2VlcCBmb2N1cyBpbnNpZGUgbWVkaWEgbW9kYWxcblx0XHRcdFx0Ly8gYWZ0ZXIganVtcGluZyB0byBnYWxsZXJ5IHZpZXdcblx0XHRcdFx0dGhpcy5jb250cm9sbGVyLm1vZGFsLmZvY3VzTWFuYWdlci5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdG1haW5QbGF5bGlzdFRvb2xiYXI6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZhciBjb250cm9sbGVyID0gdGhpcztcblxuXHRcdHRoaXMuc2VsZWN0aW9uU3RhdHVzVG9vbGJhciggdmlldyApO1xuXG5cdFx0dmlldy5zZXQoICdwbGF5bGlzdCcsIHtcblx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHR0ZXh0OiAgICAgbDEwbi5jcmVhdGVOZXdQbGF5bGlzdCxcblx0XHRcdHByaW9yaXR5OiAxMDAsXG5cdFx0XHRyZXF1aXJlczogeyBzZWxlY3Rpb246IHRydWUgfSxcblxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgc2VsZWN0aW9uID0gY29udHJvbGxlci5zdGF0ZSgpLmdldCgnc2VsZWN0aW9uJyksXG5cdFx0XHRcdFx0ZWRpdCA9IGNvbnRyb2xsZXIuc3RhdGUoJ3BsYXlsaXN0LWVkaXQnKSxcblx0XHRcdFx0XHRtb2RlbHMgPSBzZWxlY3Rpb24ud2hlcmUoeyB0eXBlOiAnYXVkaW8nIH0pO1xuXG5cdFx0XHRcdGVkaXQuc2V0KCAnbGlicmFyeScsIG5ldyB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb24oIG1vZGVscywge1xuXHRcdFx0XHRcdHByb3BzOiAgICBzZWxlY3Rpb24ucHJvcHMudG9KU09OKCksXG5cdFx0XHRcdFx0bXVsdGlwbGU6IHRydWVcblx0XHRcdFx0fSkgKTtcblxuXHRcdFx0XHR0aGlzLmNvbnRyb2xsZXIuc2V0U3RhdGUoJ3BsYXlsaXN0LWVkaXQnKTtcblxuXHRcdFx0XHQvLyBLZWVwIGZvY3VzIGluc2lkZSBtZWRpYSBtb2RhbFxuXHRcdFx0XHQvLyBhZnRlciBqdW1waW5nIHRvIHBsYXlsaXN0IHZpZXdcblx0XHRcdFx0dGhpcy5jb250cm9sbGVyLm1vZGFsLmZvY3VzTWFuYWdlci5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdG1haW5WaWRlb1BsYXlsaXN0VG9vbGJhcjogZnVuY3Rpb24oIHZpZXcgKSB7XG5cdFx0dmFyIGNvbnRyb2xsZXIgPSB0aGlzO1xuXG5cdFx0dGhpcy5zZWxlY3Rpb25TdGF0dXNUb29sYmFyKCB2aWV3ICk7XG5cblx0XHR2aWV3LnNldCggJ3ZpZGVvLXBsYXlsaXN0Jywge1xuXHRcdFx0c3R5bGU6ICAgICdwcmltYXJ5Jyxcblx0XHRcdHRleHQ6ICAgICBsMTBuLmNyZWF0ZU5ld1ZpZGVvUGxheWxpc3QsXG5cdFx0XHRwcmlvcml0eTogMTAwLFxuXHRcdFx0cmVxdWlyZXM6IHsgc2VsZWN0aW9uOiB0cnVlIH0sXG5cblx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHNlbGVjdGlvbiA9IGNvbnRyb2xsZXIuc3RhdGUoKS5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0XHRcdGVkaXQgPSBjb250cm9sbGVyLnN0YXRlKCd2aWRlby1wbGF5bGlzdC1lZGl0JyksXG5cdFx0XHRcdFx0bW9kZWxzID0gc2VsZWN0aW9uLndoZXJlKHsgdHlwZTogJ3ZpZGVvJyB9KTtcblxuXHRcdFx0XHRlZGl0LnNldCggJ2xpYnJhcnknLCBuZXcgd3AubWVkaWEubW9kZWwuU2VsZWN0aW9uKCBtb2RlbHMsIHtcblx0XHRcdFx0XHRwcm9wczogICAgc2VsZWN0aW9uLnByb3BzLnRvSlNPTigpLFxuXHRcdFx0XHRcdG11bHRpcGxlOiB0cnVlXG5cdFx0XHRcdH0pICk7XG5cblx0XHRcdFx0dGhpcy5jb250cm9sbGVyLnNldFN0YXRlKCd2aWRlby1wbGF5bGlzdC1lZGl0Jyk7XG5cblx0XHRcdFx0Ly8gS2VlcCBmb2N1cyBpbnNpZGUgbWVkaWEgbW9kYWxcblx0XHRcdFx0Ly8gYWZ0ZXIganVtcGluZyB0byB2aWRlbyBwbGF5bGlzdCB2aWV3XG5cdFx0XHRcdHRoaXMuY29udHJvbGxlci5tb2RhbC5mb2N1c01hbmFnZXIuZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRmZWF0dXJlZEltYWdlVG9vbGJhcjogZnVuY3Rpb24oIHRvb2xiYXIgKSB7XG5cdFx0dGhpcy5jcmVhdGVTZWxlY3RUb29sYmFyKCB0b29sYmFyLCB7XG5cdFx0XHR0ZXh0OiAgbDEwbi5zZXRGZWF0dXJlZEltYWdlLFxuXHRcdFx0c3RhdGU6IHRoaXMub3B0aW9ucy5zdGF0ZVxuXHRcdH0pO1xuXHR9LFxuXG5cdG1haW5FbWJlZFRvb2xiYXI6IGZ1bmN0aW9uKCB0b29sYmFyICkge1xuXHRcdHRvb2xiYXIudmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIuRW1iZWQoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpc1xuXHRcdH0pO1xuXHR9LFxuXG5cdGdhbGxlcnlFZGl0VG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGVkaXRpbmcgPSB0aGlzLnN0YXRlKCkuZ2V0KCdlZGl0aW5nJyk7XG5cdFx0dGhpcy50b29sYmFyLnNldCggbmV3IHdwLm1lZGlhLnZpZXcuVG9vbGJhcih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0aXRlbXM6IHtcblx0XHRcdFx0aW5zZXJ0OiB7XG5cdFx0XHRcdFx0c3R5bGU6ICAgICdwcmltYXJ5Jyxcblx0XHRcdFx0XHR0ZXh0OiAgICAgZWRpdGluZyA/IGwxMG4udXBkYXRlR2FsbGVyeSA6IGwxMG4uaW5zZXJ0R2FsbGVyeSxcblx0XHRcdFx0XHRwcmlvcml0eTogODAsXG5cdFx0XHRcdFx0cmVxdWlyZXM6IHsgbGlicmFyeTogdHJ1ZSB9LFxuXG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogQGZpcmVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUjdXBkYXRlXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0dmFyIGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gY29udHJvbGxlci5zdGF0ZSgpO1xuXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRzdGF0ZS50cmlnZ2VyKCAndXBkYXRlJywgc3RhdGUuZ2V0KCdsaWJyYXJ5JykgKTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBhbmQgcmVzZXQgdGhlIGRlZmF1bHQgc3RhdGUuXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnNldFN0YXRlKCBjb250cm9sbGVyLm9wdGlvbnMuc3RhdGUgKTtcblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIucmVzZXQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KSApO1xuXHR9LFxuXG5cdGdhbGxlcnlBZGRUb29sYmFyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRvb2xiYXIuc2V0KCBuZXcgd3AubWVkaWEudmlldy5Ub29sYmFyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRpdGVtczoge1xuXHRcdFx0XHRpbnNlcnQ6IHtcblx0XHRcdFx0XHRzdHlsZTogICAgJ3ByaW1hcnknLFxuXHRcdFx0XHRcdHRleHQ6ICAgICBsMTBuLmFkZFRvR2FsbGVyeSxcblx0XHRcdFx0XHRwcmlvcml0eTogODAsXG5cdFx0XHRcdFx0cmVxdWlyZXM6IHsgc2VsZWN0aW9uOiB0cnVlIH0sXG5cblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBAZmlyZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZSNyZXNldFxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRzdGF0ZSA9IGNvbnRyb2xsZXIuc3RhdGUoKSxcblx0XHRcdFx0XHRcdFx0ZWRpdCA9IGNvbnRyb2xsZXIuc3RhdGUoJ2dhbGxlcnktZWRpdCcpO1xuXG5cdFx0XHRcdFx0XHRlZGl0LmdldCgnbGlicmFyeScpLmFkZCggc3RhdGUuZ2V0KCdzZWxlY3Rpb24nKS5tb2RlbHMgKTtcblx0XHRcdFx0XHRcdHN0YXRlLnRyaWdnZXIoJ3Jlc2V0Jyk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnNldFN0YXRlKCdnYWxsZXJ5LWVkaXQnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KSApO1xuXHR9LFxuXG5cdHBsYXlsaXN0RWRpdFRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlZGl0aW5nID0gdGhpcy5zdGF0ZSgpLmdldCgnZWRpdGluZycpO1xuXHRcdHRoaXMudG9vbGJhci5zZXQoIG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdGluc2VydDoge1xuXHRcdFx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHRcdFx0dGV4dDogICAgIGVkaXRpbmcgPyBsMTBuLnVwZGF0ZVBsYXlsaXN0IDogbDEwbi5pbnNlcnRQbGF5bGlzdCxcblx0XHRcdFx0XHRwcmlvcml0eTogODAsXG5cdFx0XHRcdFx0cmVxdWlyZXM6IHsgbGlicmFyeTogdHJ1ZSB9LFxuXG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogQGZpcmVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUjdXBkYXRlXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0dmFyIGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gY29udHJvbGxlci5zdGF0ZSgpO1xuXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRzdGF0ZS50cmlnZ2VyKCAndXBkYXRlJywgc3RhdGUuZ2V0KCdsaWJyYXJ5JykgKTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBhbmQgcmVzZXQgdGhlIGRlZmF1bHQgc3RhdGUuXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnNldFN0YXRlKCBjb250cm9sbGVyLm9wdGlvbnMuc3RhdGUgKTtcblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIucmVzZXQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KSApO1xuXHR9LFxuXG5cdHBsYXlsaXN0QWRkVG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50b29sYmFyLnNldCggbmV3IHdwLm1lZGlhLnZpZXcuVG9vbGJhcih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0aXRlbXM6IHtcblx0XHRcdFx0aW5zZXJ0OiB7XG5cdFx0XHRcdFx0c3R5bGU6ICAgICdwcmltYXJ5Jyxcblx0XHRcdFx0XHR0ZXh0OiAgICAgbDEwbi5hZGRUb1BsYXlsaXN0LFxuXHRcdFx0XHRcdHByaW9yaXR5OiA4MCxcblx0XHRcdFx0XHRyZXF1aXJlczogeyBzZWxlY3Rpb246IHRydWUgfSxcblxuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIEBmaXJlcyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlI3Jlc2V0XG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0dmFyIGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gY29udHJvbGxlci5zdGF0ZSgpLFxuXHRcdFx0XHRcdFx0XHRlZGl0ID0gY29udHJvbGxlci5zdGF0ZSgncGxheWxpc3QtZWRpdCcpO1xuXG5cdFx0XHRcdFx0XHRlZGl0LmdldCgnbGlicmFyeScpLmFkZCggc3RhdGUuZ2V0KCdzZWxlY3Rpb24nKS5tb2RlbHMgKTtcblx0XHRcdFx0XHRcdHN0YXRlLnRyaWdnZXIoJ3Jlc2V0Jyk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnNldFN0YXRlKCdwbGF5bGlzdC1lZGl0Jyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fSxcblxuXHR2aWRlb1BsYXlsaXN0RWRpdFRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlZGl0aW5nID0gdGhpcy5zdGF0ZSgpLmdldCgnZWRpdGluZycpO1xuXHRcdHRoaXMudG9vbGJhci5zZXQoIG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdGluc2VydDoge1xuXHRcdFx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHRcdFx0dGV4dDogICAgIGVkaXRpbmcgPyBsMTBuLnVwZGF0ZVZpZGVvUGxheWxpc3QgOiBsMTBuLmluc2VydFZpZGVvUGxheWxpc3QsXG5cdFx0XHRcdFx0cHJpb3JpdHk6IDE0MCxcblx0XHRcdFx0XHRyZXF1aXJlczogeyBsaWJyYXJ5OiB0cnVlIH0sXG5cblx0XHRcdFx0XHRjbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHR2YXIgY29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0c3RhdGUgPSBjb250cm9sbGVyLnN0YXRlKCksXG5cdFx0XHRcdFx0XHRcdGxpYnJhcnkgPSBzdGF0ZS5nZXQoJ2xpYnJhcnknKTtcblxuXHRcdFx0XHRcdFx0bGlicmFyeS50eXBlID0gJ3ZpZGVvJztcblxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0c3RhdGUudHJpZ2dlciggJ3VwZGF0ZScsIGxpYnJhcnkgKTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBhbmQgcmVzZXQgdGhlIGRlZmF1bHQgc3RhdGUuXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnNldFN0YXRlKCBjb250cm9sbGVyLm9wdGlvbnMuc3RhdGUgKTtcblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIucmVzZXQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KSApO1xuXHR9LFxuXG5cdHZpZGVvUGxheWxpc3RBZGRUb29sYmFyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRvb2xiYXIuc2V0KCBuZXcgd3AubWVkaWEudmlldy5Ub29sYmFyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRpdGVtczoge1xuXHRcdFx0XHRpbnNlcnQ6IHtcblx0XHRcdFx0XHRzdHlsZTogICAgJ3ByaW1hcnknLFxuXHRcdFx0XHRcdHRleHQ6ICAgICBsMTBuLmFkZFRvVmlkZW9QbGF5bGlzdCxcblx0XHRcdFx0XHRwcmlvcml0eTogMTQwLFxuXHRcdFx0XHRcdHJlcXVpcmVzOiB7IHNlbGVjdGlvbjogdHJ1ZSB9LFxuXG5cdFx0XHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0dmFyIGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gY29udHJvbGxlci5zdGF0ZSgpLFxuXHRcdFx0XHRcdFx0XHRlZGl0ID0gY29udHJvbGxlci5zdGF0ZSgndmlkZW8tcGxheWxpc3QtZWRpdCcpO1xuXG5cdFx0XHRcdFx0XHRlZGl0LmdldCgnbGlicmFyeScpLmFkZCggc3RhdGUuZ2V0KCdzZWxlY3Rpb24nKS5tb2RlbHMgKTtcblx0XHRcdFx0XHRcdHN0YXRlLnRyaWdnZXIoJ3Jlc2V0Jyk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnNldFN0YXRlKCd2aWRlby1wbGF5bGlzdC1lZGl0Jyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9zdDtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLlNlbGVjdFxuICpcbiAqIEEgZnJhbWUgZm9yIHNlbGVjdGluZyBhbiBpdGVtIG9yIGl0ZW1zIGZyb20gdGhlIG1lZGlhIGxpYnJhcnkuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5GcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICogQG1peGVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lXG4gKi9cblxudmFyIE1lZGlhRnJhbWUgPSB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUsXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdFNlbGVjdDtcblxuU2VsZWN0ID0gTWVkaWFGcmFtZS5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHQvLyBDYWxsICdpbml0aWFsaXplJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzLlxuXHRcdE1lZGlhRnJhbWUucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0Xy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHRzZWxlY3Rpb246IFtdLFxuXHRcdFx0bGlicmFyeTogICB7fSxcblx0XHRcdG11bHRpcGxlOiAgZmFsc2UsXG5cdFx0XHRzdGF0ZTogICAgJ2xpYnJhcnknXG5cdFx0fSk7XG5cblx0XHR0aGlzLmNyZWF0ZVNlbGVjdGlvbigpO1xuXHRcdHRoaXMuY3JlYXRlU3RhdGVzKCk7XG5cdFx0dGhpcy5iaW5kSGFuZGxlcnMoKTtcblx0fSxcblxuXHQvKipcblx0ICogQXR0YWNoIGEgc2VsZWN0aW9uIGNvbGxlY3Rpb24gdG8gdGhlIGZyYW1lLlxuXHQgKlxuXHQgKiBBIHNlbGVjdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2YgYXR0YWNobWVudHMgdXNlZCBmb3IgYSBzcGVjaWZpYyBwdXJwb3NlXG5cdCAqIGJ5IGEgbWVkaWEgZnJhbWUuIGUuZy4gU2VsZWN0aW5nIGFuIGF0dGFjaG1lbnQgKG9yIG1hbnkpIHRvIGluc2VydCBpbnRvXG5cdCAqIHBvc3QgY29udGVudC5cblx0ICpcblx0ICogQHNlZSBtZWRpYS5tb2RlbC5TZWxlY3Rpb25cblx0ICovXG5cdGNyZWF0ZVNlbGVjdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5zZWxlY3Rpb247XG5cblx0XHRpZiAoICEgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbikgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuc2VsZWN0aW9uID0gbmV3IHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbiggc2VsZWN0aW9uLCB7XG5cdFx0XHRcdG11bHRpcGxlOiB0aGlzLm9wdGlvbnMubXVsdGlwbGVcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuX3NlbGVjdGlvbiA9IHtcblx0XHRcdGF0dGFjaG1lbnRzOiBuZXcgd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHMoKSxcblx0XHRcdGRpZmZlcmVuY2U6IFtdXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBkZWZhdWx0IHN0YXRlcyBvbiB0aGUgZnJhbWUuXG5cdCAqL1xuXHRjcmVhdGVTdGF0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RhdGVzICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgZGVmYXVsdCBzdGF0ZXMuXG5cdFx0dGhpcy5zdGF0ZXMuYWRkKFtcblx0XHRcdC8vIE1haW4gc3RhdGVzLlxuXHRcdFx0bmV3IHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeSh7XG5cdFx0XHRcdGxpYnJhcnk6ICAgd3AubWVkaWEucXVlcnkoIG9wdGlvbnMubGlicmFyeSApLFxuXHRcdFx0XHRtdWx0aXBsZTogIG9wdGlvbnMubXVsdGlwbGUsXG5cdFx0XHRcdHRpdGxlOiAgICAgb3B0aW9ucy50aXRsZSxcblx0XHRcdFx0cHJpb3JpdHk6ICAyMFxuXHRcdFx0fSlcblx0XHRdKTtcblx0fSxcblxuXHQvKipcblx0ICogQmluZCByZWdpb24gbW9kZSBldmVudCBjYWxsYmFja3MuXG5cdCAqXG5cdCAqIEBzZWUgbWVkaWEuY29udHJvbGxlci5SZWdpb24ucmVuZGVyXG5cdCAqL1xuXHRiaW5kSGFuZGxlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub24oICdyb3V0ZXI6Y3JlYXRlOmJyb3dzZScsIHRoaXMuY3JlYXRlUm91dGVyLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ3JvdXRlcjpyZW5kZXI6YnJvd3NlJywgdGhpcy5icm93c2VSb3V0ZXIsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnY29udGVudDpjcmVhdGU6YnJvd3NlJywgdGhpcy5icm93c2VDb250ZW50LCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2NvbnRlbnQ6cmVuZGVyOnVwbG9hZCcsIHRoaXMudXBsb2FkQ29udGVudCwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOmNyZWF0ZTpzZWxlY3QnLCB0aGlzLmNyZWF0ZVNlbGVjdFRvb2xiYXIsIHRoaXMgKTtcblx0fSxcblxuXHQvKipcblx0ICogUmVuZGVyIGNhbGxiYWNrIGZvciB0aGUgcm91dGVyIHJlZ2lvbiBpbiB0aGUgYGJyb3dzZWAgbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS52aWV3LlJvdXRlcn0gcm91dGVyVmlld1xuXHQgKi9cblx0YnJvd3NlUm91dGVyOiBmdW5jdGlvbiggcm91dGVyVmlldyApIHtcblx0XHRyb3V0ZXJWaWV3LnNldCh7XG5cdFx0XHR1cGxvYWQ6IHtcblx0XHRcdFx0dGV4dDogICAgIGwxMG4udXBsb2FkRmlsZXNUaXRsZSxcblx0XHRcdFx0cHJpb3JpdHk6IDIwXG5cdFx0XHR9LFxuXHRcdFx0YnJvd3NlOiB7XG5cdFx0XHRcdHRleHQ6ICAgICBsMTBuLm1lZGlhTGlicmFyeVRpdGxlLFxuXHRcdFx0XHRwcmlvcml0eTogNDBcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogUmVuZGVyIGNhbGxiYWNrIGZvciB0aGUgY29udGVudCByZWdpb24gaW4gdGhlIGBicm93c2VgIG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEuY29udHJvbGxlci5SZWdpb259IGNvbnRlbnRSZWdpb25cblx0ICovXG5cdGJyb3dzZUNvbnRlbnQ6IGZ1bmN0aW9uKCBjb250ZW50UmVnaW9uICkge1xuXHRcdHZhciBzdGF0ZSA9IHRoaXMuc3RhdGUoKTtcblxuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKCdoaWRlLXRvb2xiYXInKTtcblxuXHRcdC8vIEJyb3dzZSBvdXIgbGlicmFyeSBvZiBhdHRhY2htZW50cy5cblx0XHRjb250ZW50UmVnaW9uLnZpZXcgPSBuZXcgd3AubWVkaWEudmlldy5BdHRhY2htZW50c0Jyb3dzZXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGNvbGxlY3Rpb246IHN0YXRlLmdldCgnbGlicmFyeScpLFxuXHRcdFx0c2VsZWN0aW9uOiAgc3RhdGUuZ2V0KCdzZWxlY3Rpb24nKSxcblx0XHRcdG1vZGVsOiAgICAgIHN0YXRlLFxuXHRcdFx0c29ydGFibGU6ICAgc3RhdGUuZ2V0KCdzb3J0YWJsZScpLFxuXHRcdFx0c2VhcmNoOiAgICAgc3RhdGUuZ2V0KCdzZWFyY2hhYmxlJyksXG5cdFx0XHRmaWx0ZXJzOiAgICBzdGF0ZS5nZXQoJ2ZpbHRlcmFibGUnKSxcblx0XHRcdGRhdGU6ICAgICAgIHN0YXRlLmdldCgnZGF0ZScpLFxuXHRcdFx0ZGlzcGxheTogICAgc3RhdGUuaGFzKCdkaXNwbGF5JykgPyBzdGF0ZS5nZXQoJ2Rpc3BsYXknKSA6IHN0YXRlLmdldCgnZGlzcGxheVNldHRpbmdzJyksXG5cdFx0XHRkcmFnSW5mbzogICBzdGF0ZS5nZXQoJ2RyYWdJbmZvJyksXG5cblx0XHRcdGlkZWFsQ29sdW1uV2lkdGg6IHN0YXRlLmdldCgnaWRlYWxDb2x1bW5XaWR0aCcpLFxuXHRcdFx0c3VnZ2VzdGVkV2lkdGg6ICAgc3RhdGUuZ2V0KCdzdWdnZXN0ZWRXaWR0aCcpLFxuXHRcdFx0c3VnZ2VzdGVkSGVpZ2h0OiAgc3RhdGUuZ2V0KCdzdWdnZXN0ZWRIZWlnaHQnKSxcblxuXHRcdFx0QXR0YWNobWVudFZpZXc6IHN0YXRlLmdldCgnQXR0YWNobWVudFZpZXcnKVxuXHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZW5kZXIgY2FsbGJhY2sgZm9yIHRoZSBjb250ZW50IHJlZ2lvbiBpbiB0aGUgYHVwbG9hZGAgbW9kZS5cblx0ICovXG5cdHVwbG9hZENvbnRlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKCAnaGlkZS10b29sYmFyJyApO1xuXHRcdHRoaXMuY29udGVudC5zZXQoIG5ldyB3cC5tZWRpYS52aWV3LlVwbG9hZGVySW5saW5lKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXNcblx0XHR9KSApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBUb29sYmFyc1xuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gdG9vbGJhclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG5cdCAqIEB0aGlzIHdwLm1lZGlhLmNvbnRyb2xsZXIuUmVnaW9uXG5cdCAqL1xuXHRjcmVhdGVTZWxlY3RUb29sYmFyOiBmdW5jdGlvbiggdG9vbGJhciwgb3B0aW9ucyApIHtcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMuYnV0dG9uIHx8IHt9O1xuXHRcdG9wdGlvbnMuY29udHJvbGxlciA9IHRoaXM7XG5cblx0XHR0b29sYmFyLnZpZXcgPSBuZXcgd3AubWVkaWEudmlldy5Ub29sYmFyLlNlbGVjdCggb3B0aW9ucyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3Q7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuSWZyYW1lXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBJZnJhbWUgPSB3cC5tZWRpYS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogJ21lZGlhLWlmcmFtZScsXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5JZnJhbWV9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudmlld3MuZGV0YWNoKCk7XG5cdFx0dGhpcy4kZWwuaHRtbCggJzxpZnJhbWUgc3JjPVwiJyArIHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCgnc3JjJykgKyAnXCIgLz4nICk7XG5cdFx0dGhpcy52aWV3cy5yZW5kZXIoKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gSWZyYW1lO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkltYWdlRGV0YWlsc1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuQXR0YWNobWVudERpc3BsYXlcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlNldHRpbmdzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBBdHRhY2htZW50RGlzcGxheSA9IHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuQXR0YWNobWVudERpc3BsYXksXG5cdCQgPSBqUXVlcnksXG5cdEltYWdlRGV0YWlscztcblxuSW1hZ2VEZXRhaWxzID0gQXR0YWNobWVudERpc3BsYXkuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAnaW1hZ2UtZGV0YWlscycsXG5cdHRlbXBsYXRlOiAgd3AudGVtcGxhdGUoJ2ltYWdlLWRldGFpbHMnKSxcblx0ZXZlbnRzOiBfLmRlZmF1bHRzKCBBdHRhY2htZW50RGlzcGxheS5wcm90b3R5cGUuZXZlbnRzLCB7XG5cdFx0J2NsaWNrIC5lZGl0LWF0dGFjaG1lbnQnOiAnZWRpdEF0dGFjaG1lbnQnLFxuXHRcdCdjbGljayAucmVwbGFjZS1hdHRhY2htZW50JzogJ3JlcGxhY2VBdHRhY2htZW50Jyxcblx0XHQnY2xpY2sgLmFkdmFuY2VkLXRvZ2dsZSc6ICdvblRvZ2dsZUFkdmFuY2VkJyxcblx0XHQnY2hhbmdlIFtkYXRhLXNldHRpbmc9XCJjdXN0b21XaWR0aFwiXSc6ICdvbkN1c3RvbVNpemUnLFxuXHRcdCdjaGFuZ2UgW2RhdGEtc2V0dGluZz1cImN1c3RvbUhlaWdodFwiXSc6ICdvbkN1c3RvbVNpemUnLFxuXHRcdCdrZXl1cCBbZGF0YS1zZXR0aW5nPVwiY3VzdG9tV2lkdGhcIl0nOiAnb25DdXN0b21TaXplJyxcblx0XHQna2V5dXAgW2RhdGEtc2V0dGluZz1cImN1c3RvbUhlaWdodFwiXSc6ICdvbkN1c3RvbVNpemUnXG5cdH0gKSxcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gdXNlZCBpbiBBdHRhY2htZW50RGlzcGxheS5wcm90b3R5cGUudXBkYXRlTGlua1RvXG5cdFx0dGhpcy5vcHRpb25zLmF0dGFjaG1lbnQgPSB0aGlzLm1vZGVsLmF0dGFjaG1lbnQ7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTp1cmwnLCB0aGlzLnVwZGF0ZVVybCApO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6bGluaycsIHRoaXMudG9nZ2xlTGlua1NldHRpbmdzICk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTpzaXplJywgdGhpcy50b2dnbGVDdXN0b21TaXplICk7XG5cblx0XHRBdHRhY2htZW50RGlzcGxheS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0cHJlcGFyZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGF0dGFjaG1lbnQgPSBmYWxzZTtcblxuXHRcdGlmICggdGhpcy5tb2RlbC5hdHRhY2htZW50ICkge1xuXHRcdFx0YXR0YWNobWVudCA9IHRoaXMubW9kZWwuYXR0YWNobWVudC50b0pTT04oKTtcblx0XHR9XG5cdFx0cmV0dXJuIF8uZGVmYXVsdHMoe1xuXHRcdFx0bW9kZWw6IHRoaXMubW9kZWwudG9KU09OKCksXG5cdFx0XHRhdHRhY2htZW50OiBhdHRhY2htZW50XG5cdFx0fSwgdGhpcy5vcHRpb25zICk7XG5cdH0sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuXHRcdGlmICggdGhpcy5tb2RlbC5hdHRhY2htZW50ICYmICdwZW5kaW5nJyA9PT0gdGhpcy5tb2RlbC5kZmQuc3RhdGUoKSApIHtcblx0XHRcdHRoaXMubW9kZWwuZGZkXG5cdFx0XHRcdC5kb25lKCBfLmJpbmQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdEF0dGFjaG1lbnREaXNwbGF5LnByb3RvdHlwZS5yZW5kZXIuYXBwbHkoIHRoaXMsIGFyZ3MgKTtcblx0XHRcdFx0XHR0aGlzLnBvc3RSZW5kZXIoKTtcblx0XHRcdFx0fSwgdGhpcyApIClcblx0XHRcdFx0LmZhaWwoIF8uYmluZCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dGhpcy5tb2RlbC5hdHRhY2htZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0QXR0YWNobWVudERpc3BsYXkucHJvdG90eXBlLnJlbmRlci5hcHBseSggdGhpcywgYXJncyApO1xuXHRcdFx0XHRcdHRoaXMucG9zdFJlbmRlcigpO1xuXHRcdFx0XHR9LCB0aGlzICkgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QXR0YWNobWVudERpc3BsYXkucHJvdG90eXBlLnJlbmRlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR0aGlzLnBvc3RSZW5kZXIoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRwb3N0UmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRzZXRUaW1lb3V0KCBfLmJpbmQoIHRoaXMucmVzZXRGb2N1cywgdGhpcyApLCAxMCApO1xuXHRcdHRoaXMudG9nZ2xlTGlua1NldHRpbmdzKCk7XG5cdFx0aWYgKCB3aW5kb3cuZ2V0VXNlclNldHRpbmcoICdhZHZJbWdEZXRhaWxzJyApID09PSAnc2hvdycgKSB7XG5cdFx0XHR0aGlzLnRvZ2dsZUFkdmFuY2VkKCB0cnVlICk7XG5cdFx0fVxuXHRcdHRoaXMudHJpZ2dlciggJ3Bvc3QtcmVuZGVyJyApO1xuXHR9LFxuXG5cdHJlc2V0Rm9jdXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJCggJy5saW5rLXRvLWN1c3RvbScgKS5ibHVyKCk7XG5cdFx0dGhpcy4kKCAnLmVtYmVkLW1lZGlhLXNldHRpbmdzJyApLnNjcm9sbFRvcCggMCApO1xuXHR9LFxuXG5cdHVwZGF0ZVVybDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kKCAnLmltYWdlIGltZycgKS5hdHRyKCAnc3JjJywgdGhpcy5tb2RlbC5nZXQoICd1cmwnICkgKTtcblx0XHR0aGlzLiQoICcudXJsJyApLnZhbCggdGhpcy5tb2RlbC5nZXQoICd1cmwnICkgKTtcblx0fSxcblxuXHR0b2dnbGVMaW5rU2V0dGluZ3M6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy5tb2RlbC5nZXQoICdsaW5rJyApID09PSAnbm9uZScgKSB7XG5cdFx0XHR0aGlzLiQoICcubGluay1zZXR0aW5ncycgKS5hZGRDbGFzcygnaGlkZGVuJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuJCggJy5saW5rLXNldHRpbmdzJyApLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblx0XHR9XG5cdH0sXG5cblx0dG9nZ2xlQ3VzdG9tU2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLm1vZGVsLmdldCggJ3NpemUnICkgIT09ICdjdXN0b20nICkge1xuXHRcdFx0dGhpcy4kKCAnLmN1c3RvbS1zaXplJyApLmFkZENsYXNzKCdoaWRkZW4nKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy4kKCAnLmN1c3RvbS1zaXplJyApLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblx0XHR9XG5cdH0sXG5cblx0b25DdXN0b21TaXplOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyIGRpbWVuc2lvbiA9ICQoIGV2ZW50LnRhcmdldCApLmRhdGEoJ3NldHRpbmcnKSxcblx0XHRcdG51bSA9ICQoIGV2ZW50LnRhcmdldCApLnZhbCgpLFxuXHRcdFx0dmFsdWU7XG5cblx0XHQvLyBJZ25vcmUgYm9ndXMgaW5wdXRcblx0XHRpZiAoICEgL15cXGQrLy50ZXN0KCBudW0gKSB8fCBwYXJzZUludCggbnVtLCAxMCApIDwgMSApIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBkaW1lbnNpb24gPT09ICdjdXN0b21XaWR0aCcgKSB7XG5cdFx0XHR2YWx1ZSA9IE1hdGgucm91bmQoIDEgLyB0aGlzLm1vZGVsLmdldCggJ2FzcGVjdFJhdGlvJyApICogbnVtICk7XG5cdFx0XHR0aGlzLm1vZGVsLnNldCggJ2N1c3RvbUhlaWdodCcsIHZhbHVlLCB7IHNpbGVudDogdHJ1ZSB9ICk7XG5cdFx0XHR0aGlzLiQoICdbZGF0YS1zZXR0aW5nPVwiY3VzdG9tSGVpZ2h0XCJdJyApLnZhbCggdmFsdWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFsdWUgPSBNYXRoLnJvdW5kKCB0aGlzLm1vZGVsLmdldCggJ2FzcGVjdFJhdGlvJyApICogbnVtICk7XG5cdFx0XHR0aGlzLm1vZGVsLnNldCggJ2N1c3RvbVdpZHRoJywgdmFsdWUsIHsgc2lsZW50OiB0cnVlICB9ICk7XG5cdFx0XHR0aGlzLiQoICdbZGF0YS1zZXR0aW5nPVwiY3VzdG9tV2lkdGhcIl0nICkudmFsKCB2YWx1ZSApO1xuXHRcdH1cblx0fSxcblxuXHRvblRvZ2dsZUFkdmFuY2VkOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR0aGlzLnRvZ2dsZUFkdmFuY2VkKCk7XG5cdH0sXG5cblx0dG9nZ2xlQWR2YW5jZWQ6IGZ1bmN0aW9uKCBzaG93ICkge1xuXHRcdHZhciAkYWR2YW5jZWQgPSB0aGlzLiRlbC5maW5kKCAnLmFkdmFuY2VkLXNlY3Rpb24nICksXG5cdFx0XHRtb2RlO1xuXG5cdFx0aWYgKCAkYWR2YW5jZWQuaGFzQ2xhc3MoJ2FkdmFuY2VkLXZpc2libGUnKSB8fCBzaG93ID09PSBmYWxzZSApIHtcblx0XHRcdCRhZHZhbmNlZC5yZW1vdmVDbGFzcygnYWR2YW5jZWQtdmlzaWJsZScpO1xuXHRcdFx0JGFkdmFuY2VkLmZpbmQoJy5hZHZhbmNlZC1zZXR0aW5ncycpLmFkZENsYXNzKCdoaWRkZW4nKTtcblx0XHRcdG1vZGUgPSAnaGlkZSc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRhZHZhbmNlZC5hZGRDbGFzcygnYWR2YW5jZWQtdmlzaWJsZScpO1xuXHRcdFx0JGFkdmFuY2VkLmZpbmQoJy5hZHZhbmNlZC1zZXR0aW5ncycpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblx0XHRcdG1vZGUgPSAnc2hvdyc7XG5cdFx0fVxuXG5cdFx0d2luZG93LnNldFVzZXJTZXR0aW5nKCAnYWR2SW1nRGV0YWlscycsIG1vZGUgKTtcblx0fSxcblxuXHRlZGl0QXR0YWNobWVudDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBlZGl0U3RhdGUgPSB0aGlzLmNvbnRyb2xsZXIuc3RhdGVzLmdldCggJ2VkaXQtaW1hZ2UnICk7XG5cblx0XHRpZiAoIHdpbmRvdy5pbWFnZUVkaXQgJiYgZWRpdFN0YXRlICkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGVkaXRTdGF0ZS5zZXQoICdpbWFnZScsIHRoaXMubW9kZWwuYXR0YWNobWVudCApO1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLnNldFN0YXRlKCAnZWRpdC1pbWFnZScgKTtcblx0XHR9XG5cdH0sXG5cblx0cmVwbGFjZUF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHRoaXMuY29udHJvbGxlci5zZXRTdGF0ZSggJ3JlcGxhY2UtaW1hZ2UnICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEltYWdlRGV0YWlscztcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5MYWJlbFxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgTGFiZWwgPSB3cC5tZWRpYS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICdsYWJlbCcsXG5cdGNsYXNzTmFtZTogJ3NjcmVlbi1yZWFkZXItdGV4dCcsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy52YWx1ZSA9IHRoaXMub3B0aW9ucy52YWx1ZTtcblx0fSxcblxuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmh0bWwoIHRoaXMudmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBMYWJlbDtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5NZWRpYUZyYW1lXG4gKlxuICogVGhlIGZyYW1lIHVzZWQgdG8gY3JlYXRlIHRoZSBtZWRpYSBtb2RhbC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKiBAbWl4ZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZU1hY2hpbmVcbiAqL1xudmFyIEZyYW1lID0gd3AubWVkaWEudmlldy5GcmFtZSxcblx0JCA9IGpRdWVyeSxcblx0TWVkaWFGcmFtZTtcblxuTWVkaWFGcmFtZSA9IEZyYW1lLmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogJ21lZGlhLWZyYW1lJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgnbWVkaWEtZnJhbWUnKSxcblx0cmVnaW9uczogICBbJ21lbnUnLCd0aXRsZScsJ2NvbnRlbnQnLCd0b29sYmFyJywncm91dGVyJ10sXG5cblx0ZXZlbnRzOiB7XG5cdFx0J2NsaWNrIGRpdi5tZWRpYS1mcmFtZS10aXRsZSBoMSc6ICd0b2dnbGVNZW51J1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAZ2xvYmFsIHdwLlVwbG9hZGVyXG5cdCAqL1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRGcmFtZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdHRpdGxlOiAgICAnJyxcblx0XHRcdG1vZGFsOiAgICB0cnVlLFxuXHRcdFx0dXBsb2FkZXI6IHRydWVcblx0XHR9KTtcblxuXHRcdC8vIEVuc3VyZSBjb3JlIFVJIGlzIGVuYWJsZWQuXG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoJ3dwLWNvcmUtdWknKTtcblxuXHRcdC8vIEluaXRpYWxpemUgbW9kYWwgY29udGFpbmVyIHZpZXcuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMubW9kYWwgKSB7XG5cdFx0XHR0aGlzLm1vZGFsID0gbmV3IHdwLm1lZGlhLnZpZXcuTW9kYWwoe1xuXHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0XHR0aXRsZTogICAgICB0aGlzLm9wdGlvbnMudGl0bGVcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLm1vZGFsLmNvbnRlbnQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSB0aGUgdXBsb2FkZXIgb2ZmIGlmIHRoZSB1cGxvYWQgbGltaXQgaGFzIGJlZW4gZXhjZWVkZWQgb3Jcblx0XHQvLyBpZiB0aGUgYnJvd3NlciBpc24ndCBzdXBwb3J0ZWQuXG5cdFx0aWYgKCB3cC5VcGxvYWRlci5saW1pdEV4Y2VlZGVkIHx8ICEgd3AuVXBsb2FkZXIuYnJvd3Nlci5zdXBwb3J0ZWQgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMudXBsb2FkZXIgPSBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBJbml0aWFsaXplIHdpbmRvdy13aWRlIHVwbG9hZGVyLlxuXHRcdGlmICggdGhpcy5vcHRpb25zLnVwbG9hZGVyICkge1xuXHRcdFx0dGhpcy51cGxvYWRlciA9IG5ldyB3cC5tZWRpYS52aWV3LlVwbG9hZGVyV2luZG93KHtcblx0XHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdFx0dXBsb2FkZXI6IHtcblx0XHRcdFx0XHRkcm9wem9uZTogIHRoaXMubW9kYWwgPyB0aGlzLm1vZGFsLiRlbCA6IHRoaXMuJGVsLFxuXHRcdFx0XHRcdGNvbnRhaW5lcjogdGhpcy4kZWxcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnZpZXdzLnNldCggJy5tZWRpYS1mcmFtZS11cGxvYWRlcicsIHRoaXMudXBsb2FkZXIgKTtcblx0XHR9XG5cblx0XHR0aGlzLm9uKCAnYXR0YWNoJywgXy5iaW5kKCB0aGlzLnZpZXdzLnJlYWR5LCB0aGlzLnZpZXdzICksIHRoaXMgKTtcblxuXHRcdC8vIEJpbmQgZGVmYXVsdCB0aXRsZSBjcmVhdGlvbi5cblx0XHR0aGlzLm9uKCAndGl0bGU6Y3JlYXRlOmRlZmF1bHQnLCB0aGlzLmNyZWF0ZVRpdGxlLCB0aGlzICk7XG5cdFx0dGhpcy50aXRsZS5tb2RlKCdkZWZhdWx0Jyk7XG5cblx0XHR0aGlzLm9uKCAndGl0bGU6cmVuZGVyJywgZnVuY3Rpb24oIHZpZXcgKSB7XG5cdFx0XHR2aWV3LiRlbC5hcHBlbmQoICc8c3BhbiBjbGFzcz1cImRhc2hpY29ucyBkYXNoaWNvbnMtYXJyb3ctZG93blwiPjwvc3Bhbj4nICk7XG5cdFx0fSk7XG5cblx0XHQvLyBCaW5kIGRlZmF1bHQgbWVudS5cblx0XHR0aGlzLm9uKCAnbWVudTpjcmVhdGU6ZGVmYXVsdCcsIHRoaXMuY3JlYXRlTWVudSwgdGhpcyApO1xuXHR9LFxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQWN0aXZhdGUgdGhlIGRlZmF1bHQgc3RhdGUgaWYgbm8gYWN0aXZlIHN0YXRlIGV4aXN0cy5cblx0XHRpZiAoICEgdGhpcy5zdGF0ZSgpICYmIHRoaXMub3B0aW9ucy5zdGF0ZSApIHtcblx0XHRcdHRoaXMuc2V0U3RhdGUoIHRoaXMub3B0aW9ucy5zdGF0ZSApO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBjYWxsICdyZW5kZXInIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRyZXR1cm4gRnJhbWUucHJvdG90eXBlLnJlbmRlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGl0bGVcblx0ICogQHRoaXMgd3AubWVkaWEuY29udHJvbGxlci5SZWdpb25cblx0ICovXG5cdGNyZWF0ZVRpdGxlOiBmdW5jdGlvbiggdGl0bGUgKSB7XG5cdFx0dGl0bGUudmlldyA9IG5ldyB3cC5tZWRpYS5WaWV3KHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHR0YWdOYW1lOiAnaDEnXG5cdFx0fSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gbWVudVxuXHQgKiBAdGhpcyB3cC5tZWRpYS5jb250cm9sbGVyLlJlZ2lvblxuXHQgKi9cblx0Y3JlYXRlTWVudTogZnVuY3Rpb24oIG1lbnUgKSB7XG5cdFx0bWVudS52aWV3ID0gbmV3IHdwLm1lZGlhLnZpZXcuTWVudSh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzXG5cdFx0fSk7XG5cdH0sXG5cblx0dG9nZ2xlTWVudTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuZmluZCggJy5tZWRpYS1tZW51JyApLnRvZ2dsZUNsYXNzKCAndmlzaWJsZScgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IHRvb2xiYXJcblx0ICogQHRoaXMgd3AubWVkaWEuY29udHJvbGxlci5SZWdpb25cblx0ICovXG5cdGNyZWF0ZVRvb2xiYXI6IGZ1bmN0aW9uKCB0b29sYmFyICkge1xuXHRcdHRvb2xiYXIudmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpc1xuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IHJvdXRlclxuXHQgKiBAdGhpcyB3cC5tZWRpYS5jb250cm9sbGVyLlJlZ2lvblxuXHQgKi9cblx0Y3JlYXRlUm91dGVyOiBmdW5jdGlvbiggcm91dGVyICkge1xuXHRcdHJvdXRlci52aWV3ID0gbmV3IHdwLm1lZGlhLnZpZXcuUm91dGVyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXNcblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqL1xuXHRjcmVhdGVJZnJhbWVTdGF0ZXM6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBzZXR0aW5ncyA9IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MsXG5cdFx0XHR0YWJzID0gc2V0dGluZ3MudGFicyxcblx0XHRcdHRhYlVybCA9IHNldHRpbmdzLnRhYlVybCxcblx0XHRcdCRwb3N0SWQ7XG5cblx0XHRpZiAoICEgdGFicyB8fCAhIHRhYlVybCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHBvc3QgSUQgdG8gdGhlIHRhYiBVUkwgaWYgaXQgZXhpc3RzLlxuXHRcdCRwb3N0SWQgPSAkKCcjcG9zdF9JRCcpO1xuXHRcdGlmICggJHBvc3RJZC5sZW5ndGggKSB7XG5cdFx0XHR0YWJVcmwgKz0gJyZwb3N0X2lkPScgKyAkcG9zdElkLnZhbCgpO1xuXHRcdH1cblxuXHRcdC8vIEdlbmVyYXRlIHRoZSB0YWIgc3RhdGVzLlxuXHRcdF8uZWFjaCggdGFicywgZnVuY3Rpb24oIHRpdGxlLCBpZCApIHtcblx0XHRcdHRoaXMuc3RhdGUoICdpZnJhbWU6JyArIGlkICkuc2V0KCBfLmRlZmF1bHRzKHtcblx0XHRcdFx0dGFiOiAgICAgaWQsXG5cdFx0XHRcdHNyYzogICAgIHRhYlVybCArICcmdGFiPScgKyBpZCxcblx0XHRcdFx0dGl0bGU6ICAgdGl0bGUsXG5cdFx0XHRcdGNvbnRlbnQ6ICdpZnJhbWUnLFxuXHRcdFx0XHRtZW51OiAgICAnZGVmYXVsdCdcblx0XHRcdH0sIG9wdGlvbnMgKSApO1xuXHRcdH0sIHRoaXMgKTtcblxuXHRcdHRoaXMub24oICdjb250ZW50OmNyZWF0ZTppZnJhbWUnLCB0aGlzLmlmcmFtZUNvbnRlbnQsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnY29udGVudDpkZWFjdGl2YXRlOmlmcmFtZScsIHRoaXMuaWZyYW1lQ29udGVudENsZWFudXAsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnbWVudTpyZW5kZXI6ZGVmYXVsdCcsIHRoaXMuaWZyYW1lTWVudSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdvcGVuJywgdGhpcy5oaWphY2tUaGlja2JveCwgdGhpcyApO1xuXHRcdHRoaXMub24oICdjbG9zZScsIHRoaXMucmVzdG9yZVRoaWNrYm94LCB0aGlzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZW50XG5cdCAqIEB0aGlzIHdwLm1lZGlhLmNvbnRyb2xsZXIuUmVnaW9uXG5cdCAqL1xuXHRpZnJhbWVDb250ZW50OiBmdW5jdGlvbiggY29udGVudCApIHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcygnaGlkZS10b29sYmFyJyk7XG5cdFx0Y29udGVudC52aWV3ID0gbmV3IHdwLm1lZGlhLnZpZXcuSWZyYW1lKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXNcblx0XHR9KTtcblx0fSxcblxuXHRpZnJhbWVDb250ZW50Q2xlYW51cDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoJ2hpZGUtdG9vbGJhcicpO1xuXHR9LFxuXG5cdGlmcmFtZU1lbnU6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZhciB2aWV3cyA9IHt9O1xuXG5cdFx0aWYgKCAhIHZpZXcgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Xy5lYWNoKCB3cC5tZWRpYS52aWV3LnNldHRpbmdzLnRhYnMsIGZ1bmN0aW9uKCB0aXRsZSwgaWQgKSB7XG5cdFx0XHR2aWV3c1sgJ2lmcmFtZTonICsgaWQgXSA9IHtcblx0XHRcdFx0dGV4dDogdGhpcy5zdGF0ZSggJ2lmcmFtZTonICsgaWQgKS5nZXQoJ3RpdGxlJyksXG5cdFx0XHRcdHByaW9yaXR5OiAyMDBcblx0XHRcdH07XG5cdFx0fSwgdGhpcyApO1xuXG5cdFx0dmlldy5zZXQoIHZpZXdzICk7XG5cdH0sXG5cblx0aGlqYWNrVGhpY2tib3g6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBmcmFtZSA9IHRoaXM7XG5cblx0XHRpZiAoICEgd2luZG93LnRiX3JlbW92ZSB8fCB0aGlzLl90Yl9yZW1vdmUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fdGJfcmVtb3ZlID0gd2luZG93LnRiX3JlbW92ZTtcblx0XHR3aW5kb3cudGJfcmVtb3ZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRmcmFtZS5jbG9zZSgpO1xuXHRcdFx0ZnJhbWUucmVzZXQoKTtcblx0XHRcdGZyYW1lLnNldFN0YXRlKCBmcmFtZS5vcHRpb25zLnN0YXRlICk7XG5cdFx0XHRmcmFtZS5fdGJfcmVtb3ZlLmNhbGwoIHdpbmRvdyApO1xuXHRcdH07XG5cdH0sXG5cblx0cmVzdG9yZVRoaWNrYm94OiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICEgdGhpcy5fdGJfcmVtb3ZlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHdpbmRvdy50Yl9yZW1vdmUgPSB0aGlzLl90Yl9yZW1vdmU7XG5cdFx0ZGVsZXRlIHRoaXMuX3RiX3JlbW92ZTtcblx0fVxufSk7XG5cbi8vIE1hcCBzb21lIG9mIHRoZSBtb2RhbCdzIG1ldGhvZHMgdG8gdGhlIGZyYW1lLlxuXy5lYWNoKFsnb3BlbicsJ2Nsb3NlJywnYXR0YWNoJywnZGV0YWNoJywnZXNjYXBlJ10sIGZ1bmN0aW9uKCBtZXRob2QgKSB7XG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5NZWRpYUZyYW1lfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0TWVkaWFGcmFtZS5wcm90b3R5cGVbIG1ldGhvZCBdID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLm1vZGFsICkge1xuXHRcdFx0dGhpcy5tb2RhbFsgbWV0aG9kIF0uYXBwbHkoIHRoaXMubW9kYWwsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1lZGlhRnJhbWU7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTWVudUl0ZW1cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyICQgPSBqUXVlcnksXG5cdE1lbnVJdGVtO1xuXG5NZW51SXRlbSA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnYScsXG5cdGNsYXNzTmFtZTogJ21lZGlhLW1lbnUtaXRlbScsXG5cblx0YXR0cmlidXRlczoge1xuXHRcdGhyZWY6ICcjJ1xuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdCdjbGljayc6ICdfY2xpY2snXG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcblx0ICovXG5cdF9jbGljazogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBjbGlja092ZXJyaWRlID0gdGhpcy5vcHRpb25zLmNsaWNrO1xuXG5cdFx0aWYgKCBldmVudCApIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXG5cdFx0aWYgKCBjbGlja092ZXJyaWRlICkge1xuXHRcdFx0Y2xpY2tPdmVycmlkZS5jYWxsKCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY2xpY2soKTtcblx0XHR9XG5cblx0XHQvLyBXaGVuIHNlbGVjdGluZyBhIHRhYiBhbG9uZyB0aGUgbGVmdCBzaWRlLFxuXHRcdC8vIGZvY3VzIHNob3VsZCBiZSB0cmFuc2ZlcnJlZCBpbnRvIHRoZSBtYWluIHBhbmVsXG5cdFx0aWYgKCAhIHdwLm1lZGlhLmlzVG91Y2hEZXZpY2UgKSB7XG5cdFx0XHQkKCcubWVkaWEtZnJhbWUtY29udGVudCBpbnB1dCcpLmZpcnN0KCkuZm9jdXMoKTtcblx0XHR9XG5cdH0sXG5cblx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzdGF0ZSA9IHRoaXMub3B0aW9ucy5zdGF0ZTtcblxuXHRcdGlmICggc3RhdGUgKSB7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIuc2V0U3RhdGUoIHN0YXRlICk7XG5cdFx0XHR0aGlzLnZpZXdzLnBhcmVudC4kZWwucmVtb3ZlQ2xhc3MoICd2aXNpYmxlJyApOyAvLyBUT0RPOiBvciBoaWRlIG9uIGFueSBjbGljaywgc2VlIGJlbG93XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuTWVudUl0ZW19IHJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0aWYgKCBvcHRpb25zLnRleHQgKSB7XG5cdFx0XHR0aGlzLiRlbC50ZXh0KCBvcHRpb25zLnRleHQgKTtcblx0XHR9IGVsc2UgaWYgKCBvcHRpb25zLmh0bWwgKSB7XG5cdFx0XHR0aGlzLiRlbC5odG1sKCBvcHRpb25zLmh0bWwgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVudUl0ZW07XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTWVudVxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuUHJpb3JpdHlMaXN0XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBNZW51SXRlbSA9IHdwLm1lZGlhLnZpZXcuTWVudUl0ZW0sXG5cdFByaW9yaXR5TGlzdCA9IHdwLm1lZGlhLnZpZXcuUHJpb3JpdHlMaXN0LFxuXHRNZW51O1xuXG5NZW51ID0gUHJpb3JpdHlMaXN0LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ2RpdicsXG5cdGNsYXNzTmFtZTogJ21lZGlhLW1lbnUnLFxuXHRwcm9wZXJ0eTogICdzdGF0ZScsXG5cdEl0ZW1WaWV3OiAgTWVudUl0ZW0sXG5cdHJlZ2lvbjogICAgJ21lbnUnLFxuXG5cdC8qIFRPRE86IGFsdGVybmF0aXZlbHkgaGlkZSBvbiBhbnkgY2xpY2sgYW55d2hlcmVcblx0ZXZlbnRzOiB7XG5cdFx0J2NsaWNrJzogJ2NsaWNrJ1xuXHR9LFxuXG5cdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyggJ3Zpc2libGUnICk7XG5cdH0sXG5cdCovXG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEuVmlld31cblx0ICovXG5cdHRvVmlldzogZnVuY3Rpb24oIG9wdGlvbnMsIGlkICkge1xuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRcdG9wdGlvbnNbIHRoaXMucHJvcGVydHkgXSA9IG9wdGlvbnNbIHRoaXMucHJvcGVydHkgXSB8fCBpZDtcblx0XHRyZXR1cm4gbmV3IHRoaXMuSXRlbVZpZXcoIG9wdGlvbnMgKS5yZW5kZXIoKTtcblx0fSxcblxuXHRyZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAncmVhZHknIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRQcmlvcml0eUxpc3QucHJvdG90eXBlLnJlYWR5LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR0aGlzLnZpc2liaWxpdHkoKTtcblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdC8qKlxuXHRcdCAqIGNhbGwgJ3NldCcgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzc1xuXHRcdCAqL1xuXHRcdFByaW9yaXR5TGlzdC5wcm90b3R5cGUuc2V0LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR0aGlzLnZpc2liaWxpdHkoKTtcblx0fSxcblxuXHR1bnNldDogZnVuY3Rpb24oKSB7XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAndW5zZXQnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRQcmlvcml0eUxpc3QucHJvdG90eXBlLnVuc2V0LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR0aGlzLnZpc2liaWxpdHkoKTtcblx0fSxcblxuXHR2aXNpYmlsaXR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgcmVnaW9uID0gdGhpcy5yZWdpb24sXG5cdFx0XHR2aWV3ID0gdGhpcy5jb250cm9sbGVyWyByZWdpb24gXS5nZXQoKSxcblx0XHRcdHZpZXdzID0gdGhpcy52aWV3cy5nZXQoKSxcblx0XHRcdGhpZGUgPSAhIHZpZXdzIHx8IHZpZXdzLmxlbmd0aCA8IDI7XG5cblx0XHRpZiAoIHRoaXMgPT09IHZpZXcgKSB7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIuJGVsLnRvZ2dsZUNsYXNzKCAnaGlkZS0nICsgcmVnaW9uLCBoaWRlICk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqL1xuXHRzZWxlY3Q6IGZ1bmN0aW9uKCBpZCApIHtcblx0XHR2YXIgdmlldyA9IHRoaXMuZ2V0KCBpZCApO1xuXG5cdFx0aWYgKCAhIHZpZXcgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5kZXNlbGVjdCgpO1xuXHRcdHZpZXcuJGVsLmFkZENsYXNzKCdhY3RpdmUnKTtcblx0fSxcblxuXHRkZXNlbGVjdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG5cdH0sXG5cblx0aGlkZTogZnVuY3Rpb24oIGlkICkge1xuXHRcdHZhciB2aWV3ID0gdGhpcy5nZXQoIGlkICk7XG5cblx0XHRpZiAoICEgdmlldyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2aWV3LiRlbC5hZGRDbGFzcygnaGlkZGVuJyk7XG5cdH0sXG5cblx0c2hvdzogZnVuY3Rpb24oIGlkICkge1xuXHRcdHZhciB2aWV3ID0gdGhpcy5nZXQoIGlkICk7XG5cblx0XHRpZiAoICEgdmlldyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2aWV3LiRlbC5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1lbnU7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTW9kYWxcbiAqXG4gKiBBIG1vZGFsIHZpZXcsIHdoaWNoIHRoZSBtZWRpYSBtb2RhbCB1c2VzIGFzIGl0cyBkZWZhdWx0IGNvbnRhaW5lci5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyICQgPSBqUXVlcnksXG5cdE1vZGFsO1xuXG5Nb2RhbCA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICdkaXYnLFxuXHR0ZW1wbGF0ZTogd3AudGVtcGxhdGUoJ21lZGlhLW1vZGFsJyksXG5cblx0YXR0cmlidXRlczoge1xuXHRcdHRhYmluZGV4OiAwXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0J2NsaWNrIC5tZWRpYS1tb2RhbC1iYWNrZHJvcCwgLm1lZGlhLW1vZGFsLWNsb3NlJzogJ2VzY2FwZUhhbmRsZXInLFxuXHRcdCdrZXlkb3duJzogJ2tleWRvd24nXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHRjb250YWluZXI6IGRvY3VtZW50LmJvZHksXG5cdFx0XHR0aXRsZTogICAgICcnLFxuXHRcdFx0cHJvcGFnYXRlOiB0cnVlLFxuXHRcdFx0ZnJlZXplOiAgICB0cnVlXG5cdFx0fSk7XG5cblx0XHR0aGlzLmZvY3VzTWFuYWdlciA9IG5ldyB3cC5tZWRpYS52aWV3LkZvY3VzTWFuYWdlcih7XG5cdFx0XHRlbDogdGhpcy5lbFxuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogQHJldHVybnMge09iamVjdH1cblx0ICovXG5cdHByZXBhcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogdGhpcy5vcHRpb25zLnRpdGxlXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuTW9kYWx9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRhdHRhY2g6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy52aWV3cy5hdHRhY2hlZCApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICggISB0aGlzLnZpZXdzLnJlbmRlcmVkICkge1xuXHRcdFx0dGhpcy5yZW5kZXIoKTtcblx0XHR9XG5cblx0XHR0aGlzLiRlbC5hcHBlbmRUbyggdGhpcy5vcHRpb25zLmNvbnRhaW5lciApO1xuXG5cdFx0Ly8gTWFudWFsbHkgbWFyayB0aGUgdmlldyBhcyBhdHRhY2hlZCBhbmQgdHJpZ2dlciByZWFkeS5cblx0XHR0aGlzLnZpZXdzLmF0dGFjaGVkID0gdHJ1ZTtcblx0XHR0aGlzLnZpZXdzLnJlYWR5KCk7XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9wYWdhdGUoJ2F0dGFjaCcpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5Nb2RhbH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdGRldGFjaDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLiRlbC5pcygnOnZpc2libGUnKSApIHtcblx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHR9XG5cblx0XHR0aGlzLiRlbC5kZXRhY2goKTtcblx0XHR0aGlzLnZpZXdzLmF0dGFjaGVkID0gZmFsc2U7XG5cdFx0cmV0dXJuIHRoaXMucHJvcGFnYXRlKCdkZXRhY2gnKTtcblx0fSxcblxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuTW9kYWx9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRvcGVuOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgJGVsID0gdGhpcy4kZWwsXG5cdFx0XHRvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuXHRcdFx0bWNlRWRpdG9yO1xuXG5cdFx0aWYgKCAkZWwuaXMoJzp2aXNpYmxlJykgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRpZiAoICEgdGhpcy52aWV3cy5hdHRhY2hlZCApIHtcblx0XHRcdHRoaXMuYXR0YWNoKCk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGBmcmVlemVgIG9wdGlvbiBpcyBzZXQsIHJlY29yZCB0aGUgd2luZG93J3Mgc2Nyb2xsIHBvc2l0aW9uLlxuXHRcdGlmICggb3B0aW9ucy5mcmVlemUgKSB7XG5cdFx0XHR0aGlzLl9mcmVlemUgPSB7XG5cdFx0XHRcdHNjcm9sbFRvcDogJCggd2luZG93ICkuc2Nyb2xsVG9wKClcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gRGlzYWJsZSBwYWdlIHNjcm9sbGluZy5cblx0XHQkKCAnYm9keScgKS5hZGRDbGFzcyggJ21vZGFsLW9wZW4nICk7XG5cblx0XHQkZWwuc2hvdygpO1xuXG5cdFx0Ly8gVHJ5IHRvIGNsb3NlIHRoZSBvbnNjcmVlbiBrZXlib2FyZFxuXHRcdGlmICggJ29udG91Y2hlbmQnIGluIGRvY3VtZW50ICkge1xuXHRcdFx0aWYgKCAoIG1jZUVkaXRvciA9IHdpbmRvdy50aW55bWNlICYmIHdpbmRvdy50aW55bWNlLmFjdGl2ZUVkaXRvciApICAmJiAhIG1jZUVkaXRvci5pc0hpZGRlbigpICYmIG1jZUVkaXRvci5pZnJhbWVFbGVtZW50ICkge1xuXHRcdFx0XHRtY2VFZGl0b3IuaWZyYW1lRWxlbWVudC5mb2N1cygpO1xuXHRcdFx0XHRtY2VFZGl0b3IuaWZyYW1lRWxlbWVudC5ibHVyKCk7XG5cblx0XHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0bWNlRWRpdG9yLmlmcmFtZUVsZW1lbnQuYmx1cigpO1xuXHRcdFx0XHR9LCAxMDAgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLiRlbC5mb2N1cygpO1xuXG5cdFx0cmV0dXJuIHRoaXMucHJvcGFnYXRlKCdvcGVuJyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3Lk1vZGFsfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0Y2xvc2U6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBmcmVlemUgPSB0aGlzLl9mcmVlemU7XG5cblx0XHRpZiAoICEgdGhpcy52aWV3cy5hdHRhY2hlZCB8fCAhIHRoaXMuJGVsLmlzKCc6dmlzaWJsZScpICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gRW5hYmxlIHBhZ2Ugc2Nyb2xsaW5nLlxuXHRcdCQoICdib2R5JyApLnJlbW92ZUNsYXNzKCAnbW9kYWwtb3BlbicgKTtcblxuXHRcdC8vIEhpZGUgbW9kYWwgYW5kIHJlbW92ZSByZXN0cmljdGVkIG1lZGlhIG1vZGFsIHRhYiBmb2N1cyBvbmNlIGl0J3MgY2xvc2VkXG5cdFx0dGhpcy4kZWwuaGlkZSgpLnVuZGVsZWdhdGUoICdrZXlkb3duJyApO1xuXG5cdFx0Ly8gUHV0IGZvY3VzIGJhY2sgaW4gdXNlZnVsIGxvY2F0aW9uIG9uY2UgbW9kYWwgaXMgY2xvc2VkXG5cdFx0JCgnI3dwYm9keS1jb250ZW50JykuZm9jdXMoKTtcblxuXHRcdHRoaXMucHJvcGFnYXRlKCdjbG9zZScpO1xuXG5cdFx0Ly8gSWYgdGhlIGBmcmVlemVgIG9wdGlvbiBpcyBzZXQsIHJlc3RvcmUgdGhlIGNvbnRhaW5lcidzIHNjcm9sbCBwb3NpdGlvbi5cblx0XHRpZiAoIGZyZWV6ZSApIHtcblx0XHRcdCQoIHdpbmRvdyApLnNjcm9sbFRvcCggZnJlZXplLnNjcm9sbFRvcCApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucyAmJiBvcHRpb25zLmVzY2FwZSApIHtcblx0XHRcdHRoaXMucHJvcGFnYXRlKCdlc2NhcGUnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3Lk1vZGFsfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0ZXNjYXBlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5jbG9zZSh7IGVzY2FwZTogdHJ1ZSB9KTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0ZXNjYXBlSGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy5lc2NhcGUoKTtcblx0fSxcblxuXHQvKipcblx0ICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbnRlbnQgVmlld3MgdG8gcmVnaXN0ZXIgdG8gJy5tZWRpYS1tb2RhbC1jb250ZW50J1xuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5Nb2RhbH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdGNvbnRlbnQ6IGZ1bmN0aW9uKCBjb250ZW50ICkge1xuXHRcdHRoaXMudmlld3Muc2V0KCAnLm1lZGlhLW1vZGFsLWNvbnRlbnQnLCBjb250ZW50ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRyaWdnZXJzIGEgbW9kYWwgZXZlbnQgYW5kIGlmIHRoZSBgcHJvcGFnYXRlYCBvcHRpb24gaXMgc2V0LFxuXHQgKiBmb3J3YXJkcyBldmVudHMgdG8gdGhlIG1vZGFsJ3MgY29udHJvbGxlci5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3Lk1vZGFsfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cHJvcGFnYXRlOiBmdW5jdGlvbiggaWQgKSB7XG5cdFx0dGhpcy50cmlnZ2VyKCBpZCApO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMucHJvcGFnYXRlICkge1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLnRyaWdnZXIoIGlkICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcblx0ICovXG5cdGtleWRvd246IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHQvLyBDbG9zZSB0aGUgbW9kYWwgd2hlbiBlc2NhcGUgaXMgcHJlc3NlZC5cblx0XHRpZiAoIDI3ID09PSBldmVudC53aGljaCAmJiB0aGlzLiRlbC5pcygnOnZpc2libGUnKSApIHtcblx0XHRcdHRoaXMuZXNjYXBlKCk7XG5cdFx0XHRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGFsO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlByaW9yaXR5TGlzdFxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgUHJpb3JpdHlMaXN0ID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdkaXYnLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuX3ZpZXdzID0ge307XG5cblx0XHR0aGlzLnNldCggXy5leHRlbmQoIHt9LCB0aGlzLl92aWV3cywgdGhpcy5vcHRpb25zLnZpZXdzICksIHsgc2lsZW50OiB0cnVlIH0pO1xuXHRcdGRlbGV0ZSB0aGlzLm9wdGlvbnMudmlld3M7XG5cblx0XHRpZiAoICEgdGhpcy5vcHRpb25zLnNpbGVudCApIHtcblx0XHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEuVmlld3xPYmplY3R9IHZpZXdcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuUHJpb3JpdHlMaXN0fSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0c2V0OiBmdW5jdGlvbiggaWQsIHZpZXcsIG9wdGlvbnMgKSB7XG5cdFx0dmFyIHByaW9yaXR5LCB2aWV3cywgaW5kZXg7XG5cblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdC8vIEFjY2VwdCBhbiBvYmplY3Qgd2l0aCBhbiBgaWRgIDogYHZpZXdgIG1hcHBpbmcuXG5cdFx0aWYgKCBfLmlzT2JqZWN0KCBpZCApICkge1xuXHRcdFx0Xy5lYWNoKCBpZCwgZnVuY3Rpb24oIHZpZXcsIGlkICkge1xuXHRcdFx0XHR0aGlzLnNldCggaWQsIHZpZXcgKTtcblx0XHRcdH0sIHRoaXMgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICggISAodmlldyBpbnN0YW5jZW9mIEJhY2tib25lLlZpZXcpICkge1xuXHRcdFx0dmlldyA9IHRoaXMudG9WaWV3KCB2aWV3LCBpZCwgb3B0aW9ucyApO1xuXHRcdH1cblx0XHR2aWV3LmNvbnRyb2xsZXIgPSB2aWV3LmNvbnRyb2xsZXIgfHwgdGhpcy5jb250cm9sbGVyO1xuXG5cdFx0dGhpcy51bnNldCggaWQgKTtcblxuXHRcdHByaW9yaXR5ID0gdmlldy5vcHRpb25zLnByaW9yaXR5IHx8IDEwO1xuXHRcdHZpZXdzID0gdGhpcy52aWV3cy5nZXQoKSB8fCBbXTtcblxuXHRcdF8uZmluZCggdmlld3MsIGZ1bmN0aW9uKCBleGlzdGluZywgaSApIHtcblx0XHRcdGlmICggZXhpc3Rpbmcub3B0aW9ucy5wcmlvcml0eSA+IHByaW9yaXR5ICkge1xuXHRcdFx0XHRpbmRleCA9IGk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fdmlld3NbIGlkIF0gPSB2aWV3O1xuXHRcdHRoaXMudmlld3MuYWRkKCB2aWV3LCB7XG5cdFx0XHRhdDogXy5pc051bWJlciggaW5kZXggKSA/IGluZGV4IDogdmlld3MubGVuZ3RoIHx8IDBcblx0XHR9KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5WaWV3fVxuXHQgKi9cblx0Z2V0OiBmdW5jdGlvbiggaWQgKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdzWyBpZCBdO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlByaW9yaXR5TGlzdH1cblx0ICovXG5cdHVuc2V0OiBmdW5jdGlvbiggaWQgKSB7XG5cdFx0dmFyIHZpZXcgPSB0aGlzLmdldCggaWQgKTtcblxuXHRcdGlmICggdmlldyApIHtcblx0XHRcdHZpZXcucmVtb3ZlKCk7XG5cdFx0fVxuXG5cdFx0ZGVsZXRlIHRoaXMuX3ZpZXdzWyBpZCBdO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0ICogQHJldHVybnMge3dwLm1lZGlhLlZpZXd9XG5cdCAqL1xuXHR0b1ZpZXc6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHJldHVybiBuZXcgd3AubWVkaWEuVmlldyggb3B0aW9ucyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcmlvcml0eUxpc3Q7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuUm91dGVySXRlbVxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVudUl0ZW1cbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFJvdXRlckl0ZW0gPSB3cC5tZWRpYS52aWV3Lk1lbnVJdGVtLmV4dGVuZCh7XG5cdC8qKlxuXHQgKiBPbiBjbGljayBoYW5kbGVyIHRvIGFjdGl2YXRlIHRoZSBjb250ZW50IHJlZ2lvbidzIGNvcnJlc3BvbmRpbmcgbW9kZS5cblx0ICovXG5cdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY29udGVudE1vZGUgPSB0aGlzLm9wdGlvbnMuY29udGVudE1vZGU7XG5cdFx0aWYgKCBjb250ZW50TW9kZSApIHtcblx0XHRcdHRoaXMuY29udHJvbGxlci5jb250ZW50Lm1vZGUoIGNvbnRlbnRNb2RlICk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSb3V0ZXJJdGVtO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlJvdXRlclxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVudVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuUHJpb3JpdHlMaXN0XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBNZW51ID0gd3AubWVkaWEudmlldy5NZW51LFxuXHRSb3V0ZXI7XG5cblJvdXRlciA9IE1lbnUuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnZGl2Jyxcblx0Y2xhc3NOYW1lOiAnbWVkaWEtcm91dGVyJyxcblx0cHJvcGVydHk6ICAnY29udGVudE1vZGUnLFxuXHRJdGVtVmlldzogIHdwLm1lZGlhLnZpZXcuUm91dGVySXRlbSxcblx0cmVnaW9uOiAgICAncm91dGVyJyxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbnRyb2xsZXIub24oICdjb250ZW50OnJlbmRlcicsIHRoaXMudXBkYXRlLCB0aGlzICk7XG5cdFx0Ly8gQ2FsbCAnaW5pdGlhbGl6ZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzcy5cblx0XHRNZW51LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtb2RlID0gdGhpcy5jb250cm9sbGVyLmNvbnRlbnQubW9kZSgpO1xuXHRcdGlmICggbW9kZSApIHtcblx0XHRcdHRoaXMuc2VsZWN0KCBtb2RlICk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSb3V0ZXI7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuU2VhcmNoXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRTZWFyY2g7XG5cblNlYXJjaCA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnaW5wdXQnLFxuXHRjbGFzc05hbWU6ICdzZWFyY2gnLFxuXHRpZDogICAgICAgICdtZWRpYS1zZWFyY2gtaW5wdXQnLFxuXG5cdGF0dHJpYnV0ZXM6IHtcblx0XHR0eXBlOiAgICAgICAgJ3NlYXJjaCcsXG5cdFx0cGxhY2Vob2xkZXI6IGwxMG4uc2VhcmNoXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0J2lucHV0JzogICdzZWFyY2gnLFxuXHRcdCdrZXl1cCc6ICAnc2VhcmNoJyxcblx0XHQnY2hhbmdlJzogJ3NlYXJjaCcsXG5cdFx0J3NlYXJjaCc6ICdzZWFyY2gnXG5cdH0sXG5cblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlNlYXJjaH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lbC52YWx1ZSA9IHRoaXMubW9kZWwuZXNjYXBlKCdzZWFyY2gnKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRzZWFyY2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRpZiAoIGV2ZW50LnRhcmdldC52YWx1ZSApIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KCAnc2VhcmNoJywgZXZlbnQudGFyZ2V0LnZhbHVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubW9kZWwudW5zZXQoJ3NlYXJjaCcpO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2VhcmNoO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlNlbGVjdGlvblxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgbDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0U2VsZWN0aW9uO1xuXG5TZWxlY3Rpb24gPSB3cC5tZWRpYS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ2RpdicsXG5cdGNsYXNzTmFtZTogJ21lZGlhLXNlbGVjdGlvbicsXG5cdHRlbXBsYXRlOiAgd3AudGVtcGxhdGUoJ21lZGlhLXNlbGVjdGlvbicpLFxuXG5cdGV2ZW50czoge1xuXHRcdCdjbGljayAuZWRpdC1zZWxlY3Rpb24nOiAgJ2VkaXQnLFxuXHRcdCdjbGljayAuY2xlYXItc2VsZWN0aW9uJzogJ2NsZWFyJ1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZGVmYXVsdHMoIHRoaXMub3B0aW9ucywge1xuXHRcdFx0ZWRpdGFibGU6ICBmYWxzZSxcblx0XHRcdGNsZWFyYWJsZTogdHJ1ZVxuXHRcdH0pO1xuXG5cdFx0LyoqXG5cdFx0ICogQG1lbWJlciB7d3AubWVkaWEudmlldy5BdHRhY2htZW50cy5TZWxlY3Rpb259XG5cdFx0ICovXG5cdFx0dGhpcy5hdHRhY2htZW50cyA9IG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRzLlNlbGVjdGlvbih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0XHRzZWxlY3Rpb246ICB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0XHRtb2RlbDogICAgICBuZXcgQmFja2JvbmUuTW9kZWwoKVxuXHRcdH0pO1xuXG5cdFx0dGhpcy52aWV3cy5zZXQoICcuc2VsZWN0aW9uLXZpZXcnLCB0aGlzLmF0dGFjaG1lbnRzICk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLm9uKCAnYWRkIHJlbW92ZSByZXNldCcsIHRoaXMucmVmcmVzaCwgdGhpcyApO1xuXHRcdHRoaXMuY29udHJvbGxlci5vbiggJ2NvbnRlbnQ6YWN0aXZhdGUnLCB0aGlzLnJlZnJlc2gsIHRoaXMgKTtcblx0fSxcblxuXHRyZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH0sXG5cblx0cmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gSWYgdGhlIHNlbGVjdGlvbiBoYXNuJ3QgYmVlbiByZW5kZXJlZCwgYmFpbC5cblx0XHRpZiAoICEgdGhpcy4kZWwuY2hpbGRyZW4oKS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGNvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0XHRlZGl0aW5nID0gJ2VkaXQtc2VsZWN0aW9uJyA9PT0gdGhpcy5jb250cm9sbGVyLmNvbnRlbnQubW9kZSgpO1xuXG5cdFx0Ly8gSWYgbm90aGluZyBpcyBzZWxlY3RlZCwgZGlzcGxheSBub3RoaW5nLlxuXHRcdHRoaXMuJGVsLnRvZ2dsZUNsYXNzKCAnZW1wdHknLCAhIGNvbGxlY3Rpb24ubGVuZ3RoICk7XG5cdFx0dGhpcy4kZWwudG9nZ2xlQ2xhc3MoICdvbmUnLCAxID09PSBjb2xsZWN0aW9uLmxlbmd0aCApO1xuXHRcdHRoaXMuJGVsLnRvZ2dsZUNsYXNzKCAnZWRpdGluZycsIGVkaXRpbmcgKTtcblxuXHRcdHRoaXMuJCgnLmNvdW50JykudGV4dCggbDEwbi5zZWxlY3RlZC5yZXBsYWNlKCclZCcsIGNvbGxlY3Rpb24ubGVuZ3RoKSApO1xuXHR9LFxuXG5cdGVkaXQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGlmICggdGhpcy5vcHRpb25zLmVkaXRhYmxlICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLmVkaXRhYmxlLmNhbGwoIHRoaXMsIHRoaXMuY29sbGVjdGlvbiApO1xuXHRcdH1cblx0fSxcblxuXHRjbGVhcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLnJlc2V0KCk7XG5cblx0XHQvLyBLZWVwIGZvY3VzIGluc2lkZSBtZWRpYSBtb2RhbFxuXHRcdC8vIGFmdGVyIGNsZWFyIGxpbmsgaXMgc2VsZWN0ZWRcblx0XHR0aGlzLmNvbnRyb2xsZXIubW9kYWwuZm9jdXNNYW5hZ2VyLmZvY3VzKCk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbGVjdGlvbjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5TZXR0aW5nc1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVmlldyA9IHdwLm1lZGlhLlZpZXcsXG5cdCQgPSBCYWNrYm9uZS4kLFxuXHRTZXR0aW5ncztcblxuU2V0dGluZ3MgPSBWaWV3LmV4dGVuZCh7XG5cdGV2ZW50czoge1xuXHRcdCdjbGljayBidXR0b24nOiAgICAndXBkYXRlSGFuZGxlcicsXG5cdFx0J2NoYW5nZSBpbnB1dCc6ICAgICd1cGRhdGVIYW5kbGVyJyxcblx0XHQnY2hhbmdlIHNlbGVjdCc6ICAgJ3VwZGF0ZUhhbmRsZXInLFxuXHRcdCdjaGFuZ2UgdGV4dGFyZWEnOiAndXBkYXRlSGFuZGxlcidcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsID0gdGhpcy5tb2RlbCB8fCBuZXcgQmFja2JvbmUuTW9kZWwoKTtcblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnY2hhbmdlJywgdGhpcy51cGRhdGVDaGFuZ2VzICk7XG5cdH0sXG5cblx0cHJlcGFyZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIF8uZGVmYXVsdHMoe1xuXHRcdFx0bW9kZWw6IHRoaXMubW9kZWwudG9KU09OKClcblx0XHR9LCB0aGlzLm9wdGlvbnMgKTtcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlNldHRpbmdzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRWaWV3LnByb3RvdHlwZS5yZW5kZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdC8vIFNlbGVjdCB0aGUgY29ycmVjdCB2YWx1ZXMuXG5cdFx0XyggdGhpcy5tb2RlbC5hdHRyaWJ1dGVzICkuY2hhaW4oKS5rZXlzKCkuZWFjaCggdGhpcy51cGRhdGUsIHRoaXMgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcblx0ICovXG5cdHVwZGF0ZTogZnVuY3Rpb24oIGtleSApIHtcblx0XHR2YXIgdmFsdWUgPSB0aGlzLm1vZGVsLmdldCgga2V5ICksXG5cdFx0XHQkc2V0dGluZyA9IHRoaXMuJCgnW2RhdGEtc2V0dGluZz1cIicgKyBrZXkgKyAnXCJdJyksXG5cdFx0XHQkYnV0dG9ucywgJHZhbHVlO1xuXG5cdFx0Ly8gQmFpbCBpZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoaW5nIHNldHRpbmcuXG5cdFx0aWYgKCAhICRzZXR0aW5nLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBBdHRlbXB0IHRvIGRldGVybWluZSBob3cgdGhlIHNldHRpbmcgaXMgcmVuZGVyZWQgYW5kIHVwZGF0ZVxuXHRcdC8vIHRoZSBzZWxlY3RlZCB2YWx1ZS5cblxuXHRcdC8vIEhhbmRsZSBkcm9wZG93bnMuXG5cdFx0aWYgKCAkc2V0dGluZy5pcygnc2VsZWN0JykgKSB7XG5cdFx0XHQkdmFsdWUgPSAkc2V0dGluZy5maW5kKCdbdmFsdWU9XCInICsgdmFsdWUgKyAnXCJdJyk7XG5cblx0XHRcdGlmICggJHZhbHVlLmxlbmd0aCApIHtcblx0XHRcdFx0JHNldHRpbmcuZmluZCgnb3B0aW9uJykucHJvcCggJ3NlbGVjdGVkJywgZmFsc2UgKTtcblx0XHRcdFx0JHZhbHVlLnByb3AoICdzZWxlY3RlZCcsIHRydWUgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIElmIHdlIGNhbid0IGZpbmQgdGhlIGRlc2lyZWQgdmFsdWUsIHJlY29yZCB3aGF0ICppcyogc2VsZWN0ZWQuXG5cdFx0XHRcdHRoaXMubW9kZWwuc2V0KCBrZXksICRzZXR0aW5nLmZpbmQoJzpzZWxlY3RlZCcpLnZhbCgpICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIYW5kbGUgYnV0dG9uIGdyb3Vwcy5cblx0XHR9IGVsc2UgaWYgKCAkc2V0dGluZy5oYXNDbGFzcygnYnV0dG9uLWdyb3VwJykgKSB7XG5cdFx0XHQkYnV0dG9ucyA9ICRzZXR0aW5nLmZpbmQoJ2J1dHRvbicpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcblx0XHRcdCRidXR0b25zLmZpbHRlciggJ1t2YWx1ZT1cIicgKyB2YWx1ZSArICdcIl0nICkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXG5cdFx0Ly8gSGFuZGxlIHRleHQgaW5wdXRzIGFuZCB0ZXh0YXJlYXMuXG5cdFx0fSBlbHNlIGlmICggJHNldHRpbmcuaXMoJ2lucHV0W3R5cGU9XCJ0ZXh0XCJdLCB0ZXh0YXJlYScpICkge1xuXHRcdFx0aWYgKCAhICRzZXR0aW5nLmlzKCc6Zm9jdXMnKSApIHtcblx0XHRcdFx0JHNldHRpbmcudmFsKCB2YWx1ZSApO1xuXHRcdFx0fVxuXHRcdC8vIEhhbmRsZSBjaGVja2JveGVzLlxuXHRcdH0gZWxzZSBpZiAoICRzZXR0aW5nLmlzKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKSApIHtcblx0XHRcdCRzZXR0aW5nLnByb3AoICdjaGVja2VkJywgISEgdmFsdWUgJiYgJ2ZhbHNlJyAhPT0gdmFsdWUgKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcblx0ICovXG5cdHVwZGF0ZUhhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgJHNldHRpbmcgPSAkKCBldmVudC50YXJnZXQgKS5jbG9zZXN0KCdbZGF0YS1zZXR0aW5nXScpLFxuXHRcdFx0dmFsdWUgPSBldmVudC50YXJnZXQudmFsdWUsXG5cdFx0XHR1c2VyU2V0dGluZztcblxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAoICEgJHNldHRpbmcubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFVzZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgY2hlY2tib3hlcy5cblx0XHRpZiAoICRzZXR0aW5nLmlzKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKSApIHtcblx0XHRcdHZhbHVlID0gJHNldHRpbmdbMF0uY2hlY2tlZDtcblx0XHR9XG5cblx0XHQvLyBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgc2V0dGluZy5cblx0XHR0aGlzLm1vZGVsLnNldCggJHNldHRpbmcuZGF0YSgnc2V0dGluZycpLCB2YWx1ZSApO1xuXG5cdFx0Ly8gSWYgdGhlIHNldHRpbmcgaGFzIGEgY29ycmVzcG9uZGluZyB1c2VyIHNldHRpbmcsXG5cdFx0Ly8gdXBkYXRlIHRoYXQgYXMgd2VsbC5cblx0XHRpZiAoIHVzZXJTZXR0aW5nID0gJHNldHRpbmcuZGF0YSgndXNlclNldHRpbmcnKSApIHtcblx0XHRcdHdpbmRvdy5zZXRVc2VyU2V0dGluZyggdXNlclNldHRpbmcsIHZhbHVlICk7XG5cdFx0fVxuXHR9LFxuXG5cdHVwZGF0ZUNoYW5nZXM6IGZ1bmN0aW9uKCBtb2RlbCApIHtcblx0XHRpZiAoIG1vZGVsLmhhc0NoYW5nZWQoKSApIHtcblx0XHRcdF8oIG1vZGVsLmNoYW5nZWQgKS5jaGFpbigpLmtleXMoKS5lYWNoKCB0aGlzLnVwZGF0ZSwgdGhpcyApO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0dGluZ3M7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuQXR0YWNobWVudERpc3BsYXlcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlNldHRpbmdzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBTZXR0aW5ncyA9IHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MsXG5cdEF0dGFjaG1lbnREaXNwbGF5O1xuXG5BdHRhY2htZW50RGlzcGxheSA9IFNldHRpbmdzLmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogJ2F0dGFjaG1lbnQtZGlzcGxheS1zZXR0aW5ncycsXG5cdHRlbXBsYXRlOiAgd3AudGVtcGxhdGUoJ2F0dGFjaG1lbnQtZGlzcGxheS1zZXR0aW5ncycpLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBhdHRhY2htZW50ID0gdGhpcy5vcHRpb25zLmF0dGFjaG1lbnQ7XG5cblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdHVzZXJTZXR0aW5nczogZmFsc2Vcblx0XHR9KTtcblx0XHQvLyBDYWxsICdpbml0aWFsaXplJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzLlxuXHRcdFNldHRpbmdzLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnY2hhbmdlOmxpbmsnLCB0aGlzLnVwZGF0ZUxpbmtUbyApO1xuXG5cdFx0aWYgKCBhdHRhY2htZW50ICkge1xuXHRcdFx0YXR0YWNobWVudC5vbiggJ2NoYW5nZTp1cGxvYWRpbmcnLCB0aGlzLnJlbmRlciwgdGhpcyApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXR0YWNobWVudCA9IHRoaXMub3B0aW9ucy5hdHRhY2htZW50O1xuXHRcdGlmICggYXR0YWNobWVudCApIHtcblx0XHRcdGF0dGFjaG1lbnQub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIGNhbGwgJ2Rpc3Bvc2UnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRTZXR0aW5ncy5wcm90b3R5cGUuZGlzcG9zZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5BdHRhY2htZW50RGlzcGxheX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGF0dGFjaG1lbnQgPSB0aGlzLm9wdGlvbnMuYXR0YWNobWVudDtcblx0XHRpZiAoIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHRfLmV4dGVuZCggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHRcdHNpemVzOiBhdHRhY2htZW50LmdldCgnc2l6ZXMnKSxcblx0XHRcdFx0dHlwZTogIGF0dGFjaG1lbnQuZ2V0KCd0eXBlJylcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBjYWxsICdyZW5kZXInIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRTZXR0aW5ncy5wcm90b3R5cGUucmVuZGVyLmNhbGwoIHRoaXMgKTtcblx0XHR0aGlzLnVwZGF0ZUxpbmtUbygpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHVwZGF0ZUxpbmtUbzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGxpbmtUbyA9IHRoaXMubW9kZWwuZ2V0KCdsaW5rJyksXG5cdFx0XHQkaW5wdXQgPSB0aGlzLiQoJy5saW5rLXRvLWN1c3RvbScpLFxuXHRcdFx0YXR0YWNobWVudCA9IHRoaXMub3B0aW9ucy5hdHRhY2htZW50O1xuXG5cdFx0aWYgKCAnbm9uZScgPT09IGxpbmtUbyB8fCAnZW1iZWQnID09PSBsaW5rVG8gfHwgKCAhIGF0dGFjaG1lbnQgJiYgJ2N1c3RvbScgIT09IGxpbmtUbyApICkge1xuXHRcdFx0JGlucHV0LmFkZENsYXNzKCAnaGlkZGVuJyApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggYXR0YWNobWVudCApIHtcblx0XHRcdGlmICggJ3Bvc3QnID09PSBsaW5rVG8gKSB7XG5cdFx0XHRcdCRpbnB1dC52YWwoIGF0dGFjaG1lbnQuZ2V0KCdsaW5rJykgKTtcblx0XHRcdH0gZWxzZSBpZiAoICdmaWxlJyA9PT0gbGlua1RvICkge1xuXHRcdFx0XHQkaW5wdXQudmFsKCBhdHRhY2htZW50LmdldCgndXJsJykgKTtcblx0XHRcdH0gZWxzZSBpZiAoICEgdGhpcy5tb2RlbC5nZXQoJ2xpbmtVcmwnKSApIHtcblx0XHRcdFx0JGlucHV0LnZhbCgnaHR0cDovLycpO1xuXHRcdFx0fVxuXG5cdFx0XHQkaW5wdXQucHJvcCggJ3JlYWRvbmx5JywgJ2N1c3RvbScgIT09IGxpbmtUbyApO1xuXHRcdH1cblxuXHRcdCRpbnB1dC5yZW1vdmVDbGFzcyggJ2hpZGRlbicgKTtcblxuXHRcdC8vIElmIHRoZSBpbnB1dCBpcyB2aXNpYmxlLCBmb2N1cyBhbmQgc2VsZWN0IGl0cyBjb250ZW50cy5cblx0XHRpZiAoICEgd3AubWVkaWEuaXNUb3VjaERldmljZSAmJiAkaW5wdXQuaXMoJzp2aXNpYmxlJykgKSB7XG5cdFx0XHQkaW5wdXQuZm9jdXMoKVswXS5zZWxlY3QoKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF0dGFjaG1lbnREaXNwbGF5O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlNldHRpbmdzLkdhbGxlcnlcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlNldHRpbmdzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBHYWxsZXJ5ID0gd3AubWVkaWEudmlldy5TZXR0aW5ncy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdjb2xsZWN0aW9uLXNldHRpbmdzIGdhbGxlcnktc2V0dGluZ3MnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCdnYWxsZXJ5LXNldHRpbmdzJylcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdhbGxlcnk7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuUGxheWxpc3RcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlNldHRpbmdzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBQbGF5bGlzdCA9IHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAnY29sbGVjdGlvbi1zZXR0aW5ncyBwbGF5bGlzdC1zZXR0aW5ncycsXG5cdHRlbXBsYXRlOiAgd3AudGVtcGxhdGUoJ3BsYXlsaXN0LXNldHRpbmdzJylcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBsYXlsaXN0O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlNpZGViYXJcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlByaW9yaXR5TGlzdFxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgU2lkZWJhciA9IHdwLm1lZGlhLnZpZXcuUHJpb3JpdHlMaXN0LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogJ21lZGlhLXNpZGViYXInXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTaWRlYmFyO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlNpdGVJY29uQ3JvcHBlclxuICpcbiAqIFVzZXMgdGhlIGltZ0FyZWFTZWxlY3QgcGx1Z2luIHRvIGFsbG93IGEgdXNlciB0byBjcm9wIGEgU2l0ZSBJY29uLlxuICpcbiAqIFRha2VzIGltZ0FyZWFTZWxlY3Qgb3B0aW9ucyBmcm9tXG4gKiB3cC5jdXN0b21pemUuU2l0ZUljb25Db250cm9sLmNhbGN1bGF0ZUltYWdlU2VsZWN0T3B0aW9ucy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkNyb3BwZXJcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFZpZXcgPSB3cC5tZWRpYS52aWV3LFxuXHRTaXRlSWNvbkNyb3BwZXI7XG5cblNpdGVJY29uQ3JvcHBlciA9IFZpZXcuQ3JvcHBlci5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdjcm9wLWNvbnRlbnQgc2l0ZS1pY29uJyxcblxuXHRyZWFkeTogZnVuY3Rpb24gKCkge1xuXHRcdFZpZXcuQ3JvcHBlci5wcm90b3R5cGUucmVhZHkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0dGhpcy4kKCAnLmNyb3AtaW1hZ2UnICkub24oICdsb2FkJywgXy5iaW5kKCB0aGlzLmFkZFNpZGViYXIsIHRoaXMgKSApO1xuXHR9LFxuXG5cdGFkZFNpZGViYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2lkZWJhciA9IG5ldyB3cC5tZWRpYS52aWV3LlNpZGViYXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLnNpZGViYXIuc2V0KCAncHJldmlldycsIG5ldyB3cC5tZWRpYS52aWV3LlNpdGVJY29uUHJldmlldyh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRhdHRhY2htZW50OiB0aGlzLm9wdGlvbnMuYXR0YWNobWVudFxuXHRcdH0pICk7XG5cblx0XHR0aGlzLmNvbnRyb2xsZXIuY3JvcHBlclZpZXcudmlld3MuYWRkKCB0aGlzLnNpZGViYXIgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2l0ZUljb25Dcm9wcGVyO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlNpdGVJY29uUHJldmlld1xuICpcbiAqIFNob3dzIGEgcHJldmlldyBvZiB0aGUgU2l0ZSBJY29uIGFzIGEgZmF2aWNvbiBhbmQgYXBwIGljb24gd2hpbGUgY3JvcHBpbmcuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0JCA9IGpRdWVyeSxcblx0U2l0ZUljb25QcmV2aWV3O1xuXG5TaXRlSWNvblByZXZpZXcgPSBWaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogJ3NpdGUtaWNvbi1wcmV2aWV3Jyxcblx0dGVtcGxhdGU6IHdwLnRlbXBsYXRlKCAnc2l0ZS1pY29uLXByZXZpZXcnICksXG5cblx0cmVhZHk6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29udHJvbGxlci5pbWdTZWxlY3Quc2V0T3B0aW9ucyh7XG5cdFx0XHRvbkluaXQ6IHRoaXMudXBkYXRlUHJldmlldyxcblx0XHRcdG9uU2VsZWN0Q2hhbmdlOiB0aGlzLnVwZGF0ZVByZXZpZXdcblx0XHR9KTtcblx0fSxcblxuXHRwcmVwYXJlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dXJsOiB0aGlzLm9wdGlvbnMuYXR0YWNobWVudC5nZXQoICd1cmwnIClcblx0XHR9O1xuXHR9LFxuXG5cdHVwZGF0ZVByZXZpZXc6IGZ1bmN0aW9uKCBpbWcsIGNvb3JkcyApIHtcblx0XHR2YXIgcnggPSA2NCAvIGNvb3Jkcy53aWR0aCxcblx0XHRcdHJ5ID0gNjQgLyBjb29yZHMuaGVpZ2h0LFxuXHRcdFx0cHJldmlld19yeCA9IDE2IC8gY29vcmRzLndpZHRoLFxuXHRcdFx0cHJldmlld19yeSA9IDE2IC8gY29vcmRzLmhlaWdodDtcblxuXHRcdCQoICcjcHJldmlldy1hcHAtaWNvbicgKS5jc3Moe1xuXHRcdFx0d2lkdGg6IE1hdGgucm91bmQocnggKiB0aGlzLmltYWdlV2lkdGggKSArICdweCcsXG5cdFx0XHRoZWlnaHQ6IE1hdGgucm91bmQocnkgKiB0aGlzLmltYWdlSGVpZ2h0ICkgKyAncHgnLFxuXHRcdFx0bWFyZ2luTGVmdDogJy0nICsgTWF0aC5yb3VuZChyeCAqIGNvb3Jkcy54MSkgKyAncHgnLFxuXHRcdFx0bWFyZ2luVG9wOiAnLScgKyBNYXRoLnJvdW5kKHJ5ICogY29vcmRzLnkxKSArICdweCdcblx0XHR9KTtcblxuXHRcdCQoICcjcHJldmlldy1mYXZpY29uJyApLmNzcyh7XG5cdFx0XHR3aWR0aDogTWF0aC5yb3VuZCggcHJldmlld19yeCAqIHRoaXMuaW1hZ2VXaWR0aCApICsgJ3B4Jyxcblx0XHRcdGhlaWdodDogTWF0aC5yb3VuZCggcHJldmlld19yeSAqIHRoaXMuaW1hZ2VIZWlnaHQgKSArICdweCcsXG5cdFx0XHRtYXJnaW5MZWZ0OiAnLScgKyBNYXRoLnJvdW5kKCBwcmV2aWV3X3J4ICogY29vcmRzLngxICkgKyAncHgnLFxuXHRcdFx0bWFyZ2luVG9wOiAnLScgKyBNYXRoLmZsb29yKCBwcmV2aWV3X3J5KiBjb29yZHMueTEgKSArICdweCdcblx0XHR9KTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2l0ZUljb25QcmV2aWV3O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlNwaW5uZXJcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFNwaW5uZXIgPSB3cC5tZWRpYS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ3NwYW4nLFxuXHRjbGFzc05hbWU6ICdzcGlubmVyJyxcblx0c3Bpbm5lclRpbWVvdXQ6IGZhbHNlLFxuXHRkZWxheTogNDAwLFxuXG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggISB0aGlzLnNwaW5uZXJUaW1lb3V0ICkge1xuXHRcdFx0dGhpcy5zcGlubmVyVGltZW91dCA9IF8uZGVsYXkoZnVuY3Rpb24oICRlbCApIHtcblx0XHRcdFx0JGVsLmFkZENsYXNzKCAnaXMtYWN0aXZlJyApO1xuXHRcdFx0fSwgdGhpcy5kZWxheSwgdGhpcy4kZWwgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyggJ2lzLWFjdGl2ZScgKTtcblx0XHR0aGlzLnNwaW5uZXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0KCB0aGlzLnNwaW5uZXJUaW1lb3V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3Bpbm5lcjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5Ub29sYmFyXG4gKlxuICogQSB0b29sYmFyIHdoaWNoIGNvbnNpc3RzIG9mIGEgcHJpbWFyeSBhbmQgYSBzZWNvbmRhcnkgc2VjdGlvbi4gRWFjaCBzZWN0aW9uc1xuICogY2FuIGJlIGZpbGxlZCB3aXRoIHZpZXdzLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVmlldyA9IHdwLm1lZGlhLlZpZXcsXG5cdFRvb2xiYXI7XG5cblRvb2xiYXIgPSBWaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ2RpdicsXG5cdGNsYXNzTmFtZTogJ21lZGlhLXRvb2xiYXInLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzdGF0ZSA9IHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLFxuXHRcdFx0c2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gPSBzdGF0ZS5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0bGlicmFyeSA9IHRoaXMubGlicmFyeSA9IHN0YXRlLmdldCgnbGlicmFyeScpO1xuXG5cdFx0dGhpcy5fdmlld3MgPSB7fTtcblxuXHRcdC8vIFRoZSB0b29sYmFyIGlzIGNvbXBvc2VkIG9mIHR3byBgUHJpb3JpdHlMaXN0YCB2aWV3cy5cblx0XHR0aGlzLnByaW1hcnkgICA9IG5ldyB3cC5tZWRpYS52aWV3LlByaW9yaXR5TGlzdCgpO1xuXHRcdHRoaXMuc2Vjb25kYXJ5ID0gbmV3IHdwLm1lZGlhLnZpZXcuUHJpb3JpdHlMaXN0KCk7XG5cdFx0dGhpcy5wcmltYXJ5LiRlbC5hZGRDbGFzcygnbWVkaWEtdG9vbGJhci1wcmltYXJ5IHNlYXJjaC1mb3JtJyk7XG5cdFx0dGhpcy5zZWNvbmRhcnkuJGVsLmFkZENsYXNzKCdtZWRpYS10b29sYmFyLXNlY29uZGFyeScpO1xuXG5cdFx0dGhpcy52aWV3cy5zZXQoWyB0aGlzLnNlY29uZGFyeSwgdGhpcy5wcmltYXJ5IF0pO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuaXRlbXMgKSB7XG5cdFx0XHR0aGlzLnNldCggdGhpcy5vcHRpb25zLml0ZW1zLCB7IHNpbGVudDogdHJ1ZSB9KTtcblx0XHR9XG5cblx0XHRpZiAoICEgdGhpcy5vcHRpb25zLnNpbGVudCApIHtcblx0XHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3Rpb24gKSB7XG5cdFx0XHRzZWxlY3Rpb24ub24oICdhZGQgcmVtb3ZlIHJlc2V0JywgdGhpcy5yZWZyZXNoLCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBsaWJyYXJ5ICkge1xuXHRcdFx0bGlicmFyeS5vbiggJ2FkZCByZW1vdmUgcmVzZXQnLCB0aGlzLnJlZnJlc2gsIHRoaXMgKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5Ub29sYmFyfSBSZXR1cm5zIGl0c2VmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRkaXNwb3NlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIHRoaXMuc2VsZWN0aW9uICkge1xuXHRcdFx0dGhpcy5zZWxlY3Rpb24ub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxpYnJhcnkgKSB7XG5cdFx0XHR0aGlzLmxpYnJhcnkub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIGNhbGwgJ2Rpc3Bvc2UnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRyZXR1cm4gVmlldy5wcm90b3R5cGUuZGlzcG9zZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0cmVhZHk6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWRcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5WaWV3fE9iamVjdH0gdmlld1xuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlRvb2xiYXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRzZXQ6IGZ1bmN0aW9uKCBpZCwgdmlldywgb3B0aW9ucyApIHtcblx0XHR2YXIgbGlzdDtcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdC8vIEFjY2VwdCBhbiBvYmplY3Qgd2l0aCBhbiBgaWRgIDogYHZpZXdgIG1hcHBpbmcuXG5cdFx0aWYgKCBfLmlzT2JqZWN0KCBpZCApICkge1xuXHRcdFx0Xy5lYWNoKCBpZCwgZnVuY3Rpb24oIHZpZXcsIGlkICkge1xuXHRcdFx0XHR0aGlzLnNldCggaWQsIHZpZXcsIHsgc2lsZW50OiB0cnVlIH0pO1xuXHRcdFx0fSwgdGhpcyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggISAoIHZpZXcgaW5zdGFuY2VvZiBCYWNrYm9uZS5WaWV3ICkgKSB7XG5cdFx0XHRcdHZpZXcuY2xhc3NlcyA9IFsgJ21lZGlhLWJ1dHRvbi0nICsgaWQgXS5jb25jYXQoIHZpZXcuY2xhc3NlcyB8fCBbXSApO1xuXHRcdFx0XHR2aWV3ID0gbmV3IHdwLm1lZGlhLnZpZXcuQnV0dG9uKCB2aWV3ICkucmVuZGVyKCk7XG5cdFx0XHR9XG5cblx0XHRcdHZpZXcuY29udHJvbGxlciA9IHZpZXcuY29udHJvbGxlciB8fCB0aGlzLmNvbnRyb2xsZXI7XG5cblx0XHRcdHRoaXMuX3ZpZXdzWyBpZCBdID0gdmlldztcblxuXHRcdFx0bGlzdCA9IHZpZXcub3B0aW9ucy5wcmlvcml0eSA8IDAgPyAnc2Vjb25kYXJ5JyA6ICdwcmltYXJ5Jztcblx0XHRcdHRoaXNbIGxpc3QgXS5zZXQoIGlkLCB2aWV3LCBvcHRpb25zICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIG9wdGlvbnMuc2lsZW50ICkge1xuXHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWRcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuQnV0dG9ufVxuXHQgKi9cblx0Z2V0OiBmdW5jdGlvbiggaWQgKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdzWyBpZCBdO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlRvb2xiYXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHR1bnNldDogZnVuY3Rpb24oIGlkLCBvcHRpb25zICkge1xuXHRcdGRlbGV0ZSB0aGlzLl92aWV3c1sgaWQgXTtcblx0XHR0aGlzLnByaW1hcnkudW5zZXQoIGlkLCBvcHRpb25zICk7XG5cdFx0dGhpcy5zZWNvbmRhcnkudW5zZXQoIGlkLCBvcHRpb25zICk7XG5cblx0XHRpZiAoICEgb3B0aW9ucyB8fCAhIG9wdGlvbnMuc2lsZW50ICkge1xuXHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlZnJlc2g6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzdGF0ZSA9IHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLFxuXHRcdFx0bGlicmFyeSA9IHN0YXRlLmdldCgnbGlicmFyeScpLFxuXHRcdFx0c2VsZWN0aW9uID0gc3RhdGUuZ2V0KCdzZWxlY3Rpb24nKTtcblxuXHRcdF8uZWFjaCggdGhpcy5fdmlld3MsIGZ1bmN0aW9uKCBidXR0b24gKSB7XG5cdFx0XHRpZiAoICEgYnV0dG9uLm1vZGVsIHx8ICEgYnV0dG9uLm9wdGlvbnMgfHwgISBidXR0b24ub3B0aW9ucy5yZXF1aXJlcyApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcmVxdWlyZXMgPSBidXR0b24ub3B0aW9ucy5yZXF1aXJlcyxcblx0XHRcdFx0ZGlzYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0Ly8gUHJldmVudCBpbnNlcnRpb24gb2YgYXR0YWNobWVudHMgaWYgYW55IG9mIHRoZW0gYXJlIHN0aWxsIHVwbG9hZGluZ1xuXHRcdFx0ZGlzYWJsZWQgPSBfLnNvbWUoIHNlbGVjdGlvbi5tb2RlbHMsIGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdFx0XHRyZXR1cm4gYXR0YWNobWVudC5nZXQoJ3VwbG9hZGluZycpID09PSB0cnVlO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmICggcmVxdWlyZXMuc2VsZWN0aW9uICYmIHNlbGVjdGlvbiAmJiAhIHNlbGVjdGlvbi5sZW5ndGggKSB7XG5cdFx0XHRcdGRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoIHJlcXVpcmVzLmxpYnJhcnkgJiYgbGlicmFyeSAmJiAhIGxpYnJhcnkubGVuZ3RoICkge1xuXHRcdFx0XHRkaXNhYmxlZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRidXR0b24ubW9kZWwuc2V0KCAnZGlzYWJsZWQnLCBkaXNhYmxlZCApO1xuXHRcdH0pO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBUb29sYmFyO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlRvb2xiYXIuRW1iZWRcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlRvb2xiYXIuU2VsZWN0XG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5Ub29sYmFyXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBTZWxlY3QgPSB3cC5tZWRpYS52aWV3LlRvb2xiYXIuU2VsZWN0LFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRFbWJlZDtcblxuRW1iZWQgPSBTZWxlY3QuZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHR0ZXh0OiBsMTBuLmluc2VydEludG9Qb3N0LFxuXHRcdFx0cmVxdWlyZXM6IGZhbHNlXG5cdFx0fSk7XG5cdFx0Ly8gQ2FsbCAnaW5pdGlhbGl6ZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzcy5cblx0XHRTZWxlY3QucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdHJlZnJlc2g6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB1cmwgPSB0aGlzLmNvbnRyb2xsZXIuc3RhdGUoKS5wcm9wcy5nZXQoJ3VybCcpO1xuXHRcdHRoaXMuZ2V0KCdzZWxlY3QnKS5tb2RlbC5zZXQoICdkaXNhYmxlZCcsICEgdXJsIHx8IHVybCA9PT0gJ2h0dHA6Ly8nICk7XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAncmVmcmVzaCcgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzc1xuXHRcdCAqL1xuXHRcdFNlbGVjdC5wcm90b3R5cGUucmVmcmVzaC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVtYmVkO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlRvb2xiYXIuU2VsZWN0XG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5Ub29sYmFyXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBUb29sYmFyID0gd3AubWVkaWEudmlldy5Ub29sYmFyLFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRTZWxlY3Q7XG5cblNlbGVjdCA9IFRvb2xiYXIuZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cblx0XHRfLmJpbmRBbGwoIHRoaXMsICdjbGlja1NlbGVjdCcgKTtcblxuXHRcdF8uZGVmYXVsdHMoIG9wdGlvbnMsIHtcblx0XHRcdGV2ZW50OiAnc2VsZWN0Jyxcblx0XHRcdHN0YXRlOiBmYWxzZSxcblx0XHRcdHJlc2V0OiB0cnVlLFxuXHRcdFx0Y2xvc2U6IHRydWUsXG5cdFx0XHR0ZXh0OiAgbDEwbi5zZWxlY3QsXG5cblx0XHRcdC8vIERvZXMgdGhlIGJ1dHRvbiByZWx5IG9uIHRoZSBzZWxlY3Rpb24/XG5cdFx0XHRyZXF1aXJlczoge1xuXHRcdFx0XHRzZWxlY3Rpb246IHRydWVcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdG9wdGlvbnMuaXRlbXMgPSBfLmRlZmF1bHRzKCBvcHRpb25zLml0ZW1zIHx8IHt9LCB7XG5cdFx0XHRzZWxlY3Q6IHtcblx0XHRcdFx0c3R5bGU6ICAgICdwcmltYXJ5Jyxcblx0XHRcdFx0dGV4dDogICAgIG9wdGlvbnMudGV4dCxcblx0XHRcdFx0cHJpb3JpdHk6IDgwLFxuXHRcdFx0XHRjbGljazogICAgdGhpcy5jbGlja1NlbGVjdCxcblx0XHRcdFx0cmVxdWlyZXM6IG9wdGlvbnMucmVxdWlyZXNcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvLyBDYWxsICdpbml0aWFsaXplJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzLlxuXHRcdFRvb2xiYXIucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdGNsaWNrU2VsZWN0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcblx0XHRcdGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXI7XG5cblx0XHRpZiAoIG9wdGlvbnMuY2xvc2UgKSB7XG5cdFx0XHRjb250cm9sbGVyLmNsb3NlKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLmV2ZW50ICkge1xuXHRcdFx0Y29udHJvbGxlci5zdGF0ZSgpLnRyaWdnZXIoIG9wdGlvbnMuZXZlbnQgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMuc3RhdGUgKSB7XG5cdFx0XHRjb250cm9sbGVyLnNldFN0YXRlKCBvcHRpb25zLnN0YXRlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnJlc2V0ICkge1xuXHRcdFx0Y29udHJvbGxlci5yZXNldCgpO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2VsZWN0O1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgZHJvcHpvbmUgb24gV1AgZWRpdG9yIGluc3RhbmNlcyAoZWxlbWVudHMgd2l0aCAud3AtZWRpdG9yLXdyYXApXG4gKiBhbmQgcmVsYXlzIGRyYWcnbidkcm9wcGVkIGZpbGVzIHRvIGEgbWVkaWEgd29ya2Zsb3cuXG4gKlxuICogd3AubWVkaWEudmlldy5FZGl0b3JVcGxvYWRlclxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVmlldyA9IHdwLm1lZGlhLlZpZXcsXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdCQgPSBqUXVlcnksXG5cdEVkaXRvclVwbG9hZGVyO1xuXG5FZGl0b3JVcGxvYWRlciA9IFZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnZGl2Jyxcblx0Y2xhc3NOYW1lOiAndXBsb2FkZXItZWRpdG9yJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSggJ3VwbG9hZGVyLWVkaXRvcicgKSxcblxuXHRsb2NhbERyYWc6IGZhbHNlLFxuXHRvdmVyQ29udGFpbmVyOiBmYWxzZSxcblx0b3ZlckRyb3B6b25lOiBmYWxzZSxcblx0ZHJhZ2dpbmdGaWxlOiBudWxsLFxuXG5cdC8qKlxuXHQgKiBCaW5kIGRyYWcnbidkcm9wIGV2ZW50cyB0byBjYWxsYmFja3MuXG5cdCAqL1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG5cblx0XHQvLyBCYWlsIGlmIG5vdCBlbmFibGVkIG9yIFVBIGRvZXMgbm90IHN1cHBvcnQgZHJhZyduJ2Ryb3Agb3IgRmlsZSBBUEkuXG5cdFx0aWYgKCAhIHdpbmRvdy50aW55TUNFUHJlSW5pdCB8fCAhIHdpbmRvdy50aW55TUNFUHJlSW5pdC5kcmFnRHJvcFVwbG9hZCB8fCAhIHRoaXMuYnJvd3NlclN1cHBvcnQoKSApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdHRoaXMuJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XG5cdFx0dGhpcy5kcm9wem9uZXMgPSBbXTtcblx0XHR0aGlzLmZpbGVzID0gW107XG5cblx0XHR0aGlzLiRkb2N1bWVudC5vbiggJ2Ryb3AnLCAnLnVwbG9hZGVyLWVkaXRvcicsIF8uYmluZCggdGhpcy5kcm9wLCB0aGlzICkgKTtcblx0XHR0aGlzLiRkb2N1bWVudC5vbiggJ2RyYWdvdmVyJywgJy51cGxvYWRlci1lZGl0b3InLCBfLmJpbmQoIHRoaXMuZHJvcHpvbmVEcmFnb3ZlciwgdGhpcyApICk7XG5cdFx0dGhpcy4kZG9jdW1lbnQub24oICdkcmFnbGVhdmUnLCAnLnVwbG9hZGVyLWVkaXRvcicsIF8uYmluZCggdGhpcy5kcm9wem9uZURyYWdsZWF2ZSwgdGhpcyApICk7XG5cdFx0dGhpcy4kZG9jdW1lbnQub24oICdjbGljaycsICcudXBsb2FkZXItZWRpdG9yJywgXy5iaW5kKCB0aGlzLmNsaWNrLCB0aGlzICkgKTtcblxuXHRcdHRoaXMuJGRvY3VtZW50Lm9uKCAnZHJhZ292ZXInLCBfLmJpbmQoIHRoaXMuY29udGFpbmVyRHJhZ292ZXIsIHRoaXMgKSApO1xuXHRcdHRoaXMuJGRvY3VtZW50Lm9uKCAnZHJhZ2xlYXZlJywgXy5iaW5kKCB0aGlzLmNvbnRhaW5lckRyYWdsZWF2ZSwgdGhpcyApICk7XG5cblx0XHR0aGlzLiRkb2N1bWVudC5vbiggJ2RyYWdzdGFydCBkcmFnZW5kIGRyb3AnLCBfLmJpbmQoIGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHRoaXMubG9jYWxEcmFnID0gZXZlbnQudHlwZSA9PT0gJ2RyYWdzdGFydCc7XG5cblx0XHRcdGlmICggZXZlbnQudHlwZSA9PT0gJ2Ryb3AnICkge1xuXHRcdFx0XHR0aGlzLmNvbnRhaW5lckRyYWdsZWF2ZSgpO1xuXHRcdFx0fVxuXHRcdH0sIHRoaXMgKSApO1xuXG5cdFx0dGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrIGJyb3dzZXIgc3VwcG9ydCBmb3IgZHJhZyduJ2Ryb3AuXG5cdCAqXG5cdCAqIEByZXR1cm4gQm9vbGVhblxuXHQgKi9cblx0YnJvd3NlclN1cHBvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzdXBwb3J0cyA9IGZhbHNlLCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuXHRcdHN1cHBvcnRzID0gKCAnZHJhZ2dhYmxlJyBpbiBkaXYgKSB8fCAoICdvbmRyYWdzdGFydCcgaW4gZGl2ICYmICdvbmRyb3AnIGluIGRpdiApO1xuXHRcdHN1cHBvcnRzID0gc3VwcG9ydHMgJiYgISEgKCB3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LkZpbGVSZWFkZXIgKTtcblx0XHRyZXR1cm4gc3VwcG9ydHM7XG5cdH0sXG5cblx0aXNEcmFnZ2luZ0ZpbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRpZiAoIHRoaXMuZHJhZ2dpbmdGaWxlICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZHJhZ2dpbmdGaWxlO1xuXHRcdH1cblxuXHRcdGlmICggXy5pc1VuZGVmaW5lZCggZXZlbnQub3JpZ2luYWxFdmVudCApIHx8IF8uaXNVbmRlZmluZWQoIGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5kcmFnZ2luZ0ZpbGUgPSBfLmluZGV4T2YoIGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzLCAnRmlsZXMnICkgPiAtMSAmJlxuXHRcdFx0Xy5pbmRleE9mKCBldmVudC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcywgJ3RleHQvcGxhaW4nICkgPT09IC0xO1xuXG5cdFx0cmV0dXJuIHRoaXMuZHJhZ2dpbmdGaWxlO1xuXHR9LFxuXG5cdHJlZnJlc2g6IGZ1bmN0aW9uKCBlICkge1xuXHRcdHZhciBkcm9wem9uZV9pZDtcblx0XHRmb3IgKCBkcm9wem9uZV9pZCBpbiB0aGlzLmRyb3B6b25lcyApIHtcblx0XHRcdC8vIEhpZGUgdGhlIGRyb3B6b25lcyBvbmx5IGlmIGRyYWdnaW5nIGhhcyBsZWZ0IHRoZSBzY3JlZW4uXG5cdFx0XHR0aGlzLmRyb3B6b25lc1sgZHJvcHpvbmVfaWQgXS50b2dnbGUoIHRoaXMub3ZlckNvbnRhaW5lciB8fCB0aGlzLm92ZXJEcm9wem9uZSApO1xuXHRcdH1cblxuXHRcdGlmICggISBfLmlzVW5kZWZpbmVkKCBlICkgKSB7XG5cdFx0XHQkKCBlLnRhcmdldCApLmNsb3Nlc3QoICcudXBsb2FkZXItZWRpdG9yJyApLnRvZ2dsZUNsYXNzKCAnZHJvcHBhYmxlJywgdGhpcy5vdmVyRHJvcHpvbmUgKTtcblx0XHR9XG5cblx0XHRpZiAoICEgdGhpcy5vdmVyQ29udGFpbmVyICYmICEgdGhpcy5vdmVyRHJvcHpvbmUgKSB7XG5cdFx0XHR0aGlzLmRyYWdnaW5nRmlsZSA9IG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICEgdGhpcy5pbml0aWFsaXplZCApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdFZpZXcucHJvdG90eXBlLnJlbmRlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0JCggJy53cC1lZGl0b3Itd3JhcCcgKS5lYWNoKCBfLmJpbmQoIHRoaXMuYXR0YWNoLCB0aGlzICkgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRhdHRhY2g6IGZ1bmN0aW9uKCBpbmRleCwgZWRpdG9yICkge1xuXHRcdC8vIEF0dGFjaCBhIGRyb3B6b25lIHRvIGFuIGVkaXRvci5cblx0XHR2YXIgZHJvcHpvbmUgPSB0aGlzLiRlbC5jbG9uZSgpO1xuXHRcdHRoaXMuZHJvcHpvbmVzLnB1c2goIGRyb3B6b25lICk7XG5cdFx0JCggZWRpdG9yICkuYXBwZW5kKCBkcm9wem9uZSApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBXaGVuIGEgZmlsZSBpcyBkcm9wcGVkIG9uIHRoZSBlZGl0b3IgdXBsb2FkZXIsIG9wZW4gdXAgYW4gZWRpdG9yIG1lZGlhIHdvcmtmbG93XG5cdCAqIGFuZCB1cGxvYWQgdGhlIGZpbGUgaW1tZWRpYXRlbHkuXG5cdCAqXG5cdCAqIEBwYXJhbSAge2pRdWVyeS5FdmVudH0gZXZlbnQgVGhlICdkcm9wJyBldmVudC5cblx0ICovXG5cdGRyb3A6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgJHdyYXAsIHVwbG9hZFZpZXc7XG5cblx0XHR0aGlzLmNvbnRhaW5lckRyYWdsZWF2ZSggZXZlbnQgKTtcblx0XHR0aGlzLmRyb3B6b25lRHJhZ2xlYXZlKCBldmVudCApO1xuXG5cdFx0dGhpcy5maWxlcyA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuXHRcdGlmICggdGhpcy5maWxlcy5sZW5ndGggPCAxICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYWN0aXZlIGVkaXRvciB0byB0aGUgZHJvcCB0YXJnZXQuXG5cdFx0JHdyYXAgPSAkKCBldmVudC50YXJnZXQgKS5wYXJlbnRzKCAnLndwLWVkaXRvci13cmFwJyApO1xuXHRcdGlmICggJHdyYXAubGVuZ3RoID4gMCAmJiAkd3JhcFswXS5pZCApIHtcblx0XHRcdHdpbmRvdy53cEFjdGl2ZUVkaXRvciA9ICR3cmFwWzBdLmlkLnNsaWNlKCAzLCAtNSApO1xuXHRcdH1cblxuXHRcdGlmICggISB0aGlzLndvcmtmbG93ICkge1xuXHRcdFx0dGhpcy53b3JrZmxvdyA9IHdwLm1lZGlhLmVkaXRvci5vcGVuKCB3aW5kb3cud3BBY3RpdmVFZGl0b3IsIHtcblx0XHRcdFx0ZnJhbWU6ICAgICdwb3N0Jyxcblx0XHRcdFx0c3RhdGU6ICAgICdpbnNlcnQnLFxuXHRcdFx0XHR0aXRsZTogICAgbDEwbi5hZGRNZWRpYSxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWVcblx0XHRcdH0pO1xuXG5cdFx0XHR1cGxvYWRWaWV3ID0gdGhpcy53b3JrZmxvdy51cGxvYWRlcjtcblxuXHRcdFx0aWYgKCB1cGxvYWRWaWV3LnVwbG9hZGVyICYmIHVwbG9hZFZpZXcudXBsb2FkZXIucmVhZHkgKSB7XG5cdFx0XHRcdHRoaXMuYWRkRmlsZXMuYXBwbHkoIHRoaXMgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMud29ya2Zsb3cub24oICd1cGxvYWRlcjpyZWFkeScsIHRoaXMuYWRkRmlsZXMsIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy53b3JrZmxvdy5zdGF0ZSgpLnJlc2V0KCk7XG5cdFx0XHR0aGlzLmFkZEZpbGVzLmFwcGx5KCB0aGlzICk7XG5cdFx0XHR0aGlzLndvcmtmbG93Lm9wZW4oKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZCB0aGUgZmlsZXMgdG8gdGhlIHVwbG9hZGVyLlxuXHQgKi9cblx0YWRkRmlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy5maWxlcy5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLndvcmtmbG93LnVwbG9hZGVyLnVwbG9hZGVyLnVwbG9hZGVyLmFkZEZpbGUoIF8udG9BcnJheSggdGhpcy5maWxlcyApICk7XG5cdFx0XHR0aGlzLmZpbGVzID0gW107XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNvbnRhaW5lckRyYWdvdmVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0aWYgKCB0aGlzLmxvY2FsRHJhZyB8fCAhIHRoaXMuaXNEcmFnZ2luZ0ZpbGUoIGV2ZW50ICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5vdmVyQ29udGFpbmVyID0gdHJ1ZTtcblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fSxcblxuXHRjb250YWluZXJEcmFnbGVhdmU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub3ZlckNvbnRhaW5lciA9IGZhbHNlO1xuXG5cdFx0Ly8gVGhyb3R0bGUgZHJhZ2xlYXZlIGJlY2F1c2UgaXQncyBjYWxsZWQgd2hlbiBib3VuY2luZyBmcm9tIHNvbWUgZWxlbWVudHMgdG8gb3RoZXJzLlxuXHRcdF8uZGVsYXkoIF8uYmluZCggdGhpcy5yZWZyZXNoLCB0aGlzICksIDUwICk7XG5cdH0sXG5cblx0ZHJvcHpvbmVEcmFnb3ZlcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGlmICggdGhpcy5sb2NhbERyYWcgfHwgISB0aGlzLmlzRHJhZ2dpbmdGaWxlKCBldmVudCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMub3ZlckRyb3B6b25lID0gdHJ1ZTtcblx0XHR0aGlzLnJlZnJlc2goIGV2ZW50ICk7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdGRyb3B6b25lRHJhZ2xlYXZlOiBmdW5jdGlvbiggZSApIHtcblx0XHR0aGlzLm92ZXJEcm9wem9uZSA9IGZhbHNlO1xuXHRcdF8uZGVsYXkoIF8uYmluZCggdGhpcy5yZWZyZXNoLCB0aGlzLCBlICksIDUwICk7XG5cdH0sXG5cblx0Y2xpY2s6IGZ1bmN0aW9uKCBlICkge1xuXHRcdC8vIEluIHRoZSByYXJlIGNhc2Ugd2hlcmUgdGhlIGRyb3B6b25lIGdldHMgc3R1Y2ssIGhpZGUgaXQgb24gY2xpY2suXG5cdFx0dGhpcy5jb250YWluZXJEcmFnbGVhdmUoIGUgKTtcblx0XHR0aGlzLmRyb3B6b25lRHJhZ2xlYXZlKCBlICk7XG5cdFx0dGhpcy5sb2NhbERyYWcgPSBmYWxzZTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRWRpdG9yVXBsb2FkZXI7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuVXBsb2FkZXJJbmxpbmVcbiAqXG4gKiBUaGUgaW5saW5lIHVwbG9hZGVyIHRoYXQgc2hvd3MgdXAgaW4gdGhlICdVcGxvYWQgRmlsZXMnIHRhYi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFZpZXcgPSB3cC5tZWRpYS5WaWV3LFxuXHRVcGxvYWRlcklubGluZTtcblxuVXBsb2FkZXJJbmxpbmUgPSBWaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ2RpdicsXG5cdGNsYXNzTmFtZTogJ3VwbG9hZGVyLWlubGluZScsXG5cdHRlbXBsYXRlOiAgd3AudGVtcGxhdGUoJ3VwbG9hZGVyLWlubGluZScpLFxuXG5cdGV2ZW50czoge1xuXHRcdCdjbGljayAuY2xvc2UnOiAnaGlkZSdcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdG1lc3NhZ2U6ICcnLFxuXHRcdFx0c3RhdHVzOiAgdHJ1ZSxcblx0XHRcdGNhbkNsb3NlOiBmYWxzZVxuXHRcdH0pO1xuXG5cdFx0aWYgKCAhIHRoaXMub3B0aW9ucy4kYnJvd3NlciAmJiB0aGlzLmNvbnRyb2xsZXIudXBsb2FkZXIgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuJGJyb3dzZXIgPSB0aGlzLmNvbnRyb2xsZXIudXBsb2FkZXIuJGJyb3dzZXI7XG5cdFx0fVxuXG5cdFx0aWYgKCBfLmlzVW5kZWZpbmVkKCB0aGlzLm9wdGlvbnMucG9zdElkICkgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMucG9zdElkID0gd3AubWVkaWEudmlldy5zZXR0aW5ncy5wb3N0LmlkO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5vcHRpb25zLnN0YXR1cyApIHtcblx0XHRcdHRoaXMudmlld3Muc2V0KCAnLnVwbG9hZC1pbmxpbmUtc3RhdHVzJywgbmV3IHdwLm1lZGlhLnZpZXcuVXBsb2FkZXJTdGF0dXMoe1xuXHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXJcblx0XHRcdH0pICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZXBhcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzdWdnZXN0ZWRXaWR0aCA9IHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCgnc3VnZ2VzdGVkV2lkdGgnKSxcblx0XHRcdHN1Z2dlc3RlZEhlaWdodCA9IHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCgnc3VnZ2VzdGVkSGVpZ2h0JyksXG5cdFx0XHRkYXRhID0ge307XG5cblx0XHRkYXRhLm1lc3NhZ2UgPSB0aGlzLm9wdGlvbnMubWVzc2FnZTtcblx0XHRkYXRhLmNhbkNsb3NlID0gdGhpcy5vcHRpb25zLmNhbkNsb3NlO1xuXG5cdFx0aWYgKCBzdWdnZXN0ZWRXaWR0aCAmJiBzdWdnZXN0ZWRIZWlnaHQgKSB7XG5cdFx0XHRkYXRhLnN1Z2dlc3RlZFdpZHRoID0gc3VnZ2VzdGVkV2lkdGg7XG5cdFx0XHRkYXRhLnN1Z2dlc3RlZEhlaWdodCA9IHN1Z2dlc3RlZEhlaWdodDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlVwbG9hZGVySW5saW5lfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0ZGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLmRpc3Bvc2luZyApIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogY2FsbCAnZGlzcG9zZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzc1xuXHRcdFx0ICovXG5cdFx0XHRyZXR1cm4gVmlldy5wcm90b3R5cGUuZGlzcG9zZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fVxuXG5cdFx0Ly8gUnVuIHJlbW92ZSBvbiBgZGlzcG9zZWAsIHNvIHdlIGNhbiBiZSBzdXJlIHRvIHJlZnJlc2ggdGhlXG5cdFx0Ly8gdXBsb2FkZXIgd2l0aCBhIHZpZXctbGVzcyBET00uIFRyYWNrIHdoZXRoZXIgd2UncmUgZGlzcG9zaW5nXG5cdFx0Ly8gc28gd2UgZG9uJ3QgdHJpZ2dlciBhbiBpbmZpbml0ZSBsb29wLlxuXHRcdHRoaXMuZGlzcG9zaW5nID0gdHJ1ZTtcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmUoKTtcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlVwbG9hZGVySW5saW5lfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHQvKipcblx0XHQgKiBjYWxsICdyZW1vdmUnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHR2YXIgcmVzdWx0ID0gVmlldy5wcm90b3R5cGUucmVtb3ZlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdF8uZGVmZXIoIF8uYmluZCggdGhpcy5yZWZyZXNoLCB0aGlzICkgKTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdHJlZnJlc2g6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB1cGxvYWRlciA9IHRoaXMuY29udHJvbGxlci51cGxvYWRlcjtcblxuXHRcdGlmICggdXBsb2FkZXIgKSB7XG5cdFx0XHR1cGxvYWRlci5yZWZyZXNoKCk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuVXBsb2FkZXJJbmxpbmV9XG5cdCAqL1xuXHRyZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyICRicm93c2VyID0gdGhpcy5vcHRpb25zLiRicm93c2VyLFxuXHRcdFx0JHBsYWNlaG9sZGVyO1xuXG5cdFx0aWYgKCB0aGlzLmNvbnRyb2xsZXIudXBsb2FkZXIgKSB7XG5cdFx0XHQkcGxhY2Vob2xkZXIgPSB0aGlzLiQoJy5icm93c2VyJyk7XG5cblx0XHRcdC8vIENoZWNrIGlmIHdlJ3ZlIGFscmVhZHkgcmVwbGFjZWQgdGhlIHBsYWNlaG9sZGVyLlxuXHRcdFx0aWYgKCAkcGxhY2Vob2xkZXJbMF0gPT09ICRicm93c2VyWzBdICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdCRicm93c2VyLmRldGFjaCgpLnRleHQoICRwbGFjZWhvbGRlci50ZXh0KCkgKTtcblx0XHRcdCRicm93c2VyWzBdLmNsYXNzTmFtZSA9ICRwbGFjZWhvbGRlclswXS5jbGFzc05hbWU7XG5cdFx0XHQkcGxhY2Vob2xkZXIucmVwbGFjZVdpdGgoICRicm93c2VyLnNob3coKSApO1xuXHRcdH1cblxuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyggJ2hpZGRlbicgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoICdoaWRkZW4nICk7XG5cdH1cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVXBsb2FkZXJJbmxpbmU7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuVXBsb2FkZXJTdGF0dXNFcnJvclxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVXBsb2FkZXJTdGF0dXNFcnJvciA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAndXBsb2FkLWVycm9yJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgndXBsb2FkZXItc3RhdHVzLWVycm9yJylcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVwbG9hZGVyU3RhdHVzRXJyb3I7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuVXBsb2FkZXJTdGF0dXNcbiAqXG4gKiBBbiB1cGxvYWRlciBzdGF0dXMgZm9yIG9uLWdvaW5nIHVwbG9hZHMuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0VXBsb2FkZXJTdGF0dXM7XG5cblVwbG9hZGVyU3RhdHVzID0gVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdtZWRpYS11cGxvYWRlci1zdGF0dXMnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCd1cGxvYWRlci1zdGF0dXMnKSxcblxuXHRldmVudHM6IHtcblx0XHQnY2xpY2sgLnVwbG9hZC1kaXNtaXNzLWVycm9ycyc6ICdkaXNtaXNzJ1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucXVldWUgPSB3cC5VcGxvYWRlci5xdWV1ZTtcblx0XHR0aGlzLnF1ZXVlLm9uKCAnYWRkIHJlbW92ZSByZXNldCcsIHRoaXMudmlzaWJpbGl0eSwgdGhpcyApO1xuXHRcdHRoaXMucXVldWUub24oICdhZGQgcmVtb3ZlIHJlc2V0IGNoYW5nZTpwZXJjZW50JywgdGhpcy5wcm9ncmVzcywgdGhpcyApO1xuXHRcdHRoaXMucXVldWUub24oICdhZGQgcmVtb3ZlIHJlc2V0IGNoYW5nZTp1cGxvYWRpbmcnLCB0aGlzLmluZm8sIHRoaXMgKTtcblxuXHRcdHRoaXMuZXJyb3JzID0gd3AuVXBsb2FkZXIuZXJyb3JzO1xuXHRcdHRoaXMuZXJyb3JzLnJlc2V0KCk7XG5cdFx0dGhpcy5lcnJvcnMub24oICdhZGQgcmVtb3ZlIHJlc2V0JywgdGhpcy52aXNpYmlsaXR5LCB0aGlzICk7XG5cdFx0dGhpcy5lcnJvcnMub24oICdhZGQnLCB0aGlzLmVycm9yLCB0aGlzICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAZ2xvYmFsIHdwLlVwbG9hZGVyXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlVwbG9hZGVyU3RhdHVzfVxuXHQgKi9cblx0ZGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0d3AuVXBsb2FkZXIucXVldWUub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAnZGlzcG9zZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzc1xuXHRcdCAqL1xuXHRcdFZpZXcucHJvdG90eXBlLmRpc3Bvc2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHZpc2liaWxpdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnRvZ2dsZUNsYXNzKCAndXBsb2FkaW5nJywgISEgdGhpcy5xdWV1ZS5sZW5ndGggKTtcblx0XHR0aGlzLiRlbC50b2dnbGVDbGFzcyggJ2Vycm9ycycsICEhIHRoaXMuZXJyb3JzLmxlbmd0aCApO1xuXHRcdHRoaXMuJGVsLnRvZ2dsZSggISEgdGhpcy5xdWV1ZS5sZW5ndGggfHwgISEgdGhpcy5lcnJvcnMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVhZHk6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZWFjaCh7XG5cdFx0XHQnJGJhcic6ICAgICAgJy5tZWRpYS1wcm9ncmVzcy1iYXIgZGl2Jyxcblx0XHRcdCckaW5kZXgnOiAgICAnLnVwbG9hZC1pbmRleCcsXG5cdFx0XHQnJHRvdGFsJzogICAgJy51cGxvYWQtdG90YWwnLFxuXHRcdFx0JyRmaWxlbmFtZSc6ICcudXBsb2FkLWZpbGVuYW1lJ1xuXHRcdH0sIGZ1bmN0aW9uKCBzZWxlY3Rvciwga2V5ICkge1xuXHRcdFx0dGhpc1sga2V5IF0gPSB0aGlzLiQoIHNlbGVjdG9yICk7XG5cdFx0fSwgdGhpcyApO1xuXG5cdFx0dGhpcy52aXNpYmlsaXR5KCk7XG5cdFx0dGhpcy5wcm9ncmVzcygpO1xuXHRcdHRoaXMuaW5mbygpO1xuXHR9LFxuXG5cdHByb2dyZXNzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgcXVldWUgPSB0aGlzLnF1ZXVlLFxuXHRcdFx0JGJhciA9IHRoaXMuJGJhcjtcblxuXHRcdGlmICggISAkYmFyIHx8ICEgcXVldWUubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCRiYXIud2lkdGgoICggcXVldWUucmVkdWNlKCBmdW5jdGlvbiggbWVtbywgYXR0YWNobWVudCApIHtcblx0XHRcdGlmICggISBhdHRhY2htZW50LmdldCgndXBsb2FkaW5nJykgKSB7XG5cdFx0XHRcdHJldHVybiBtZW1vICsgMTAwO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcGVyY2VudCA9IGF0dGFjaG1lbnQuZ2V0KCdwZXJjZW50Jyk7XG5cdFx0XHRyZXR1cm4gbWVtbyArICggXy5pc051bWJlciggcGVyY2VudCApID8gcGVyY2VudCA6IDEwMCApO1xuXHRcdH0sIDAgKSAvIHF1ZXVlLmxlbmd0aCApICsgJyUnICk7XG5cdH0sXG5cblx0aW5mbzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHF1ZXVlID0gdGhpcy5xdWV1ZSxcblx0XHRcdGluZGV4ID0gMCwgYWN0aXZlO1xuXG5cdFx0aWYgKCAhIHF1ZXVlLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRhY3RpdmUgPSB0aGlzLnF1ZXVlLmZpbmQoIGZ1bmN0aW9uKCBhdHRhY2htZW50LCBpICkge1xuXHRcdFx0aW5kZXggPSBpO1xuXHRcdFx0cmV0dXJuIGF0dGFjaG1lbnQuZ2V0KCd1cGxvYWRpbmcnKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuJGluZGV4LnRleHQoIGluZGV4ICsgMSApO1xuXHRcdHRoaXMuJHRvdGFsLnRleHQoIHF1ZXVlLmxlbmd0aCApO1xuXHRcdHRoaXMuJGZpbGVuYW1lLmh0bWwoIGFjdGl2ZSA/IHRoaXMuZmlsZW5hbWUoIGFjdGl2ZS5nZXQoJ2ZpbGVuYW1lJykgKSA6ICcnICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZpbGVuYW1lOiBmdW5jdGlvbiggZmlsZW5hbWUgKSB7XG5cdFx0cmV0dXJuIF8uZXNjYXBlKCBmaWxlbmFtZSApO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gZXJyb3Jcblx0ICovXG5cdGVycm9yOiBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0dGhpcy52aWV3cy5hZGQoICcudXBsb2FkLWVycm9ycycsIG5ldyB3cC5tZWRpYS52aWV3LlVwbG9hZGVyU3RhdHVzRXJyb3Ioe1xuXHRcdFx0ZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUoIGVycm9yLmdldCgnZmlsZScpLm5hbWUgKSxcblx0XHRcdG1lc3NhZ2U6ICBlcnJvci5nZXQoJ21lc3NhZ2UnKVxuXHRcdH0pLCB7IGF0OiAwIH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAZ2xvYmFsIHdwLlVwbG9hZGVyXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0ZGlzbWlzczogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBlcnJvcnMgPSB0aGlzLnZpZXdzLmdldCgnLnVwbG9hZC1lcnJvcnMnKTtcblxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAoIGVycm9ycyApIHtcblx0XHRcdF8uaW52b2tlKCBlcnJvcnMsICdyZW1vdmUnICk7XG5cdFx0fVxuXHRcdHdwLlVwbG9hZGVyLmVycm9ycy5yZXNldCgpO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBVcGxvYWRlclN0YXR1cztcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5VcGxvYWRlcldpbmRvd1xuICpcbiAqIEFuIHVwbG9hZGVyIHdpbmRvdyB0aGF0IGFsbG93cyBmb3IgZHJhZ2dpbmcgYW5kIGRyb3BwaW5nIG1lZGlhLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gICAgICAgICAgICAgICAgICAgT3B0aW9ucyBoYXNoIHBhc3NlZCB0byB0aGUgdmlldy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy51cGxvYWRlcl0gICAgICAgICAgVXBsb2FkZXIgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB7alF1ZXJ5fSBbb3B0aW9ucy51cGxvYWRlci5icm93c2VyXVxuICogQHBhcmFtIHtqUXVlcnl9IFtvcHRpb25zLnVwbG9hZGVyLmRyb3B6b25lXSBqUXVlcnkgY29sbGVjdGlvbiBvZiB0aGUgZHJvcHpvbmUuXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMudXBsb2FkZXIucGFyYW1zXVxuICovXG52YXIgJCA9IGpRdWVyeSxcblx0VXBsb2FkZXJXaW5kb3c7XG5cblVwbG9hZGVyV2luZG93ID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdkaXYnLFxuXHRjbGFzc05hbWU6ICd1cGxvYWRlci13aW5kb3cnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCd1cGxvYWRlci13aW5kb3cnKSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdXBsb2FkZXI7XG5cblx0XHR0aGlzLiRicm93c2VyID0gJCgnPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJyb3dzZXJcIiAvPicpLmhpZGUoKS5hcHBlbmRUbygnYm9keScpO1xuXG5cdFx0dXBsb2FkZXIgPSB0aGlzLm9wdGlvbnMudXBsb2FkZXIgPSBfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMudXBsb2FkZXIgfHwge30sIHtcblx0XHRcdGRyb3B6b25lOiAgdGhpcy4kZWwsXG5cdFx0XHRicm93c2VyOiAgIHRoaXMuJGJyb3dzZXIsXG5cdFx0XHRwYXJhbXM6ICAgIHt9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnN1cmUgdGhlIGRyb3B6b25lIGlzIGEgalF1ZXJ5IGNvbGxlY3Rpb24uXG5cdFx0aWYgKCB1cGxvYWRlci5kcm9wem9uZSAmJiAhICh1cGxvYWRlci5kcm9wem9uZSBpbnN0YW5jZW9mICQpICkge1xuXHRcdFx0dXBsb2FkZXIuZHJvcHpvbmUgPSAkKCB1cGxvYWRlci5kcm9wem9uZSApO1xuXHRcdH1cblxuXHRcdHRoaXMuY29udHJvbGxlci5vbiggJ2FjdGl2YXRlJywgdGhpcy5yZWZyZXNoLCB0aGlzICk7XG5cblx0XHR0aGlzLmNvbnRyb2xsZXIub24oICdkZXRhY2gnLCBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuJGJyb3dzZXIucmVtb3ZlKCk7XG5cdFx0fSwgdGhpcyApO1xuXHR9LFxuXG5cdHJlZnJlc2g6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy51cGxvYWRlciApIHtcblx0XHRcdHRoaXMudXBsb2FkZXIucmVmcmVzaCgpO1xuXHRcdH1cblx0fSxcblxuXHRyZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHBvc3RJZCA9IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5pZCxcblx0XHRcdGRyb3B6b25lO1xuXG5cdFx0Ly8gSWYgdGhlIHVwbG9hZGVyIGFscmVhZHkgZXhpc3RzLCBiYWlsLlxuXHRcdGlmICggdGhpcy51cGxvYWRlciApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIHBvc3RJZCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy51cGxvYWRlci5wYXJhbXMucG9zdF9pZCA9IHBvc3RJZDtcblx0XHR9XG5cdFx0dGhpcy51cGxvYWRlciA9IG5ldyB3cC5VcGxvYWRlciggdGhpcy5vcHRpb25zLnVwbG9hZGVyICk7XG5cblx0XHRkcm9wem9uZSA9IHRoaXMudXBsb2FkZXIuZHJvcHpvbmU7XG5cdFx0ZHJvcHpvbmUub24oICdkcm9wem9uZTplbnRlcicsIF8uYmluZCggdGhpcy5zaG93LCB0aGlzICkgKTtcblx0XHRkcm9wem9uZS5vbiggJ2Ryb3B6b25lOmxlYXZlJywgXy5iaW5kKCB0aGlzLmhpZGUsIHRoaXMgKSApO1xuXG5cdFx0JCggdGhpcy51cGxvYWRlciApLm9uKCAndXBsb2FkZXI6cmVhZHknLCBfLmJpbmQoIHRoaXMuX3JlYWR5LCB0aGlzICkgKTtcblx0fSxcblxuXHRfcmVhZHk6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCAndXBsb2FkZXI6cmVhZHknICk7XG5cdH0sXG5cblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyICRlbCA9IHRoaXMuJGVsLnNob3coKTtcblxuXHRcdC8vIEVuc3VyZSB0aGF0IHRoZSBhbmltYXRpb24gaXMgdHJpZ2dlcmVkIGJ5IHdhaXRpbmcgdW50aWxcblx0XHQvLyB0aGUgdHJhbnNwYXJlbnQgZWxlbWVudCBpcyBwYWludGVkIGludG8gdGhlIERPTS5cblx0XHRfLmRlZmVyKCBmdW5jdGlvbigpIHtcblx0XHRcdCRlbC5jc3MoeyBvcGFjaXR5OiAxIH0pO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciAkZWwgPSB0aGlzLiRlbC5jc3MoeyBvcGFjaXR5OiAwIH0pO1xuXG5cdFx0d3AubWVkaWEudHJhbnNpdGlvbiggJGVsICkuZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBUcmFuc2l0aW9uIGVuZCBldmVudHMgYXJlIHN1YmplY3QgdG8gcmFjZSBjb25kaXRpb25zLlxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlIGlzIHNldCBhcyBpbnRlbmRlZC5cblx0XHRcdGlmICggJzAnID09PSAkZWwuY3NzKCdvcGFjaXR5JykgKSB7XG5cdFx0XHRcdCRlbC5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBodHRwczovL2NvcmUudHJhYy53b3JkcHJlc3Mub3JnL3RpY2tldC8yNzM0MVxuXHRcdF8uZGVsYXkoIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAnMCcgPT09ICRlbC5jc3MoJ29wYWNpdHknKSAmJiAkZWwuaXMoJzp2aXNpYmxlJykgKSB7XG5cdFx0XHRcdCRlbC5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSwgNTAwICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVwbG9hZGVyV2luZG93O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5WaWV3XG4gKlxuICogVGhlIGJhc2UgdmlldyBjbGFzcyBmb3IgbWVkaWEuXG4gKlxuICogVW5kZWxlZ2F0aW5nIGV2ZW50cywgcmVtb3ZpbmcgZXZlbnRzIGZyb20gdGhlIG1vZGVsLCBhbmRcbiAqIHJlbW92aW5nIGV2ZW50cyBmcm9tIHRoZSBjb250cm9sbGVyIG1pcnJvciB0aGUgY29kZSBmb3JcbiAqIGBCYWNrYm9uZS5WaWV3LmRpc3Bvc2VgIGluIEJhY2tib25lIDAuOS44IGRldmVsb3BtZW50LlxuICpcbiAqIFRoaXMgYmVoYXZpb3IgaGFzIHNpbmNlIGJlZW4gcmVtb3ZlZCwgYW5kIHNob3VsZCBub3QgYmUgdXNlZFxuICogb3V0c2lkZSBvZiB0aGUgbWVkaWEgbWFuYWdlci5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVmlldyA9IHdwLkJhY2tib25lLlZpZXcuZXh0ZW5kKHtcblx0Y29uc3RydWN0b3I6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdGlmICggb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRyb2xsZXIgKSB7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIgPSBvcHRpb25zLmNvbnRyb2xsZXI7XG5cdFx0fVxuXHRcdHdwLkJhY2tib25lLlZpZXcuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXHQvKipcblx0ICogQHRvZG8gVGhlIGludGVybmFsIGNvbW1lbnQgbWVudGlvbnMgdGhpcyBtaWdodCBoYXZlIGJlZW4gYSBzdG9wLWdhcFxuXHQgKiAgICAgICBiZWZvcmUgQmFja2JvbmUgMC45LjggY2FtZSBvdXQuIEZpZ3VyZSBvdXQgaWYgQmFja2JvbmUgY29yZSB0YWtlc1xuXHQgKiAgICAgICBjYXJlIG9mIHRoaXMgaW4gQmFja2JvbmUuVmlldyBub3cuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5WaWV3fSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0ZGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gVW5kZWxlZ2F0aW5nIGV2ZW50cywgcmVtb3ZpbmcgZXZlbnRzIGZyb20gdGhlIG1vZGVsLCBhbmRcblx0XHQvLyByZW1vdmluZyBldmVudHMgZnJvbSB0aGUgY29udHJvbGxlciBtaXJyb3IgdGhlIGNvZGUgZm9yXG5cdFx0Ly8gYEJhY2tib25lLlZpZXcuZGlzcG9zZWAgaW4gQmFja2JvbmUgMC45LjggZGV2ZWxvcG1lbnQuXG5cdFx0dGhpcy51bmRlbGVnYXRlRXZlbnRzKCk7XG5cblx0XHRpZiAoIHRoaXMubW9kZWwgJiYgdGhpcy5tb2RlbC5vZmYgKSB7XG5cdFx0XHR0aGlzLm1vZGVsLm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5vZmYgKSB7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24ub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0Ly8gVW5iaW5kIGNvbnRyb2xsZXIgZXZlbnRzLlxuXHRcdGlmICggdGhpcy5jb250cm9sbGVyICYmIHRoaXMuY29udHJvbGxlci5vZmYgKSB7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEuVmlld30gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kaXNwb3NlKCk7XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAncmVtb3ZlJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0cmV0dXJuIHdwLkJhY2tib25lLlZpZXcucHJvdG90eXBlLnJlbW92ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpZXc7XG4iXX0= -
src/wp-includes/js/underscore.js
1 // Underscore.js 1. 6.01 // Underscore.js 1.8.3 2 2 // http://underscorejs.org 3 // (c) 2009-201 4Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors3 // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 4 4 // Underscore may be freely distributed under the MIT license. 5 5 6 6 (function() { … … 14 14 // Save the previous value of the `_` variable. 15 15 var previousUnderscore = root._; 16 16 17 // Establish the object that gets returned to break out of a loop iteration.18 var breaker = {};19 20 17 // Save bytes in the minified (but not gzipped) version: 21 18 var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; 22 19 … … 24 21 var 25 22 push = ArrayProto.push, 26 23 slice = ArrayProto.slice, 27 concat = ArrayProto.concat,28 24 toString = ObjProto.toString, 29 25 hasOwnProperty = ObjProto.hasOwnProperty; 30 26 … … 31 27 // All **ECMAScript 5** native function implementations that we hope to use 32 28 // are declared here. 33 29 var 34 nativeForEach = ArrayProto.forEach,35 nativeMap = ArrayProto.map,36 nativeReduce = ArrayProto.reduce,37 nativeReduceRight = ArrayProto.reduceRight,38 nativeFilter = ArrayProto.filter,39 nativeEvery = ArrayProto.every,40 nativeSome = ArrayProto.some,41 nativeIndexOf = ArrayProto.indexOf,42 nativeLastIndexOf = ArrayProto.lastIndexOf,43 30 nativeIsArray = Array.isArray, 44 31 nativeKeys = Object.keys, 45 nativeBind = FuncProto.bind; 32 nativeBind = FuncProto.bind, 33 nativeCreate = Object.create; 46 34 35 // Naked function reference for surrogate-prototype-swapping. 36 var Ctor = function(){}; 37 47 38 // Create a safe reference to the Underscore object for use below. 48 39 var _ = function(obj) { 49 40 if (obj instanceof _) return obj; … … 53 44 54 45 // Export the Underscore object for **Node.js**, with 55 46 // backwards-compatibility for the old `require()` API. If we're in 56 // the browser, add `_` as a global object via a string identifier, 57 // for Closure Compiler "advanced" mode. 47 // the browser, add `_` as a global object. 58 48 if (typeof exports !== 'undefined') { 59 49 if (typeof module !== 'undefined' && module.exports) { 60 50 exports = module.exports = _; … … 65 55 } 66 56 67 57 // Current version. 68 _.VERSION = '1. 6.0';58 _.VERSION = '1.8.3'; 69 59 60 // Internal function that returns an efficient (for current engines) version 61 // of the passed-in callback, to be repeatedly applied in other Underscore 62 // functions. 63 var optimizeCb = function(func, context, argCount) { 64 if (context === void 0) return func; 65 switch (argCount == null ? 3 : argCount) { 66 case 1: return function(value) { 67 return func.call(context, value); 68 }; 69 case 2: return function(value, other) { 70 return func.call(context, value, other); 71 }; 72 case 3: return function(value, index, collection) { 73 return func.call(context, value, index, collection); 74 }; 75 case 4: return function(accumulator, value, index, collection) { 76 return func.call(context, accumulator, value, index, collection); 77 }; 78 } 79 return function() { 80 return func.apply(context, arguments); 81 }; 82 }; 83 84 // A mostly-internal function to generate callbacks that can be applied 85 // to each element in a collection, returning the desired result — either 86 // identity, an arbitrary callback, a property matcher, or a property accessor. 87 var cb = function(value, context, argCount) { 88 if (value == null) return _.identity; 89 if (_.isFunction(value)) return optimizeCb(value, context, argCount); 90 if (_.isObject(value)) return _.matcher(value); 91 return _.property(value); 92 }; 93 _.iteratee = function(value, context) { 94 return cb(value, context, Infinity); 95 }; 96 97 // An internal function for creating assigner functions. 98 var createAssigner = function(keysFunc, undefinedOnly) { 99 return function(obj) { 100 var length = arguments.length; 101 if (length < 2 || obj == null) return obj; 102 for (var index = 1; index < length; index++) { 103 var source = arguments[index], 104 keys = keysFunc(source), 105 l = keys.length; 106 for (var i = 0; i < l; i++) { 107 var key = keys[i]; 108 if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; 109 } 110 } 111 return obj; 112 }; 113 }; 114 115 // An internal function for creating a new object that inherits from another. 116 var baseCreate = function(prototype) { 117 if (!_.isObject(prototype)) return {}; 118 if (nativeCreate) return nativeCreate(prototype); 119 Ctor.prototype = prototype; 120 var result = new Ctor; 121 Ctor.prototype = null; 122 return result; 123 }; 124 125 var property = function(key) { 126 return function(obj) { 127 return obj == null ? void 0 : obj[key]; 128 }; 129 }; 130 131 // Helper for collection methods to determine whether a collection 132 // should be iterated as an array or as an object 133 // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength 134 // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 135 var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; 136 var getLength = property('length'); 137 var isArrayLike = function(collection) { 138 var length = getLength(collection); 139 return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; 140 }; 141 70 142 // Collection Functions 71 143 // -------------------- 72 144 73 145 // The cornerstone, an `each` implementation, aka `forEach`. 74 // Handles objects with the built-in `forEach`, arrays, and raw objects. 75 // Delegates to **ECMAScript 5**'s native `forEach` if available. 76 var each = _.each = _.forEach = function(obj, iterator, context) { 77 if (obj == null) return obj; 78 if (nativeForEach && obj.forEach === nativeForEach) { 79 obj.forEach(iterator, context); 80 } else if (obj.length === +obj.length) { 81 for (var i = 0, length = obj.length; i < length; i++) { 82 if (iterator.call(context, obj[i], i, obj) === breaker) return; 146 // Handles raw objects in addition to array-likes. Treats all 147 // sparse array-likes as if they were dense. 148 _.each = _.forEach = function(obj, iteratee, context) { 149 iteratee = optimizeCb(iteratee, context); 150 var i, length; 151 if (isArrayLike(obj)) { 152 for (i = 0, length = obj.length; i < length; i++) { 153 iteratee(obj[i], i, obj); 83 154 } 84 155 } else { 85 156 var keys = _.keys(obj); 86 for ( vari = 0, length = keys.length; i < length; i++) {87 i f (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;157 for (i = 0, length = keys.length; i < length; i++) { 158 iteratee(obj[keys[i]], keys[i], obj); 88 159 } 89 160 } 90 161 return obj; 91 162 }; 92 163 93 // Return the results of applying the iterator to each element. 94 // Delegates to **ECMAScript 5**'s native `map` if available. 95 _.map = _.collect = function(obj, iterator, context) { 96 var results = []; 97 if (obj == null) return results; 98 if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); 99 each(obj, function(value, index, list) { 100 results.push(iterator.call(context, value, index, list)); 101 }); 164 // Return the results of applying the iteratee to each element. 165 _.map = _.collect = function(obj, iteratee, context) { 166 iteratee = cb(iteratee, context); 167 var keys = !isArrayLike(obj) && _.keys(obj), 168 length = (keys || obj).length, 169 results = Array(length); 170 for (var index = 0; index < length; index++) { 171 var currentKey = keys ? keys[index] : index; 172 results[index] = iteratee(obj[currentKey], currentKey, obj); 173 } 102 174 return results; 103 175 }; 104 176 105 var reduceError = 'Reduce of empty array with no initial value'; 177 // Create a reducing function iterating left or right. 178 function createReduce(dir) { 179 // Optimized iterator function as using arguments.length 180 // in the main function will deoptimize the, see #1991. 181 function iterator(obj, iteratee, memo, keys, index, length) { 182 for (; index >= 0 && index < length; index += dir) { 183 var currentKey = keys ? keys[index] : index; 184 memo = iteratee(memo, obj[currentKey], currentKey, obj); 185 } 186 return memo; 187 } 106 188 107 // **Reduce** builds up a single result from a list of values, aka `inject`, 108 // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. 109 _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { 110 var initial = arguments.length > 2; 111 if (obj == null) obj = []; 112 if (nativeReduce && obj.reduce === nativeReduce) { 113 if (context) iterator = _.bind(iterator, context); 114 return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); 115 } 116 each(obj, function(value, index, list) { 117 if (!initial) { 118 memo = value; 119 initial = true; 120 } else { 121 memo = iterator.call(context, memo, value, index, list); 189 return function(obj, iteratee, memo, context) { 190 iteratee = optimizeCb(iteratee, context, 4); 191 var keys = !isArrayLike(obj) && _.keys(obj), 192 length = (keys || obj).length, 193 index = dir > 0 ? 0 : length - 1; 194 // Determine the initial value if none is provided. 195 if (arguments.length < 3) { 196 memo = obj[keys ? keys[index] : index]; 197 index += dir; 122 198 } 123 }); 124 if (!initial) throw new TypeError(reduceError); 125 return memo; 126 }; 199 return iterator(obj, iteratee, memo, keys, index, length); 200 }; 201 } 127 202 203 // **Reduce** builds up a single result from a list of values, aka `inject`, 204 // or `foldl`. 205 _.reduce = _.foldl = _.inject = createReduce(1); 206 128 207 // The right-associative version of reduce, also known as `foldr`. 129 // Delegates to **ECMAScript 5**'s native `reduceRight` if available. 130 _.reduceRight = _.foldr = function(obj, iterator, memo, context) { 131 var initial = arguments.length > 2; 132 if (obj == null) obj = []; 133 if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { 134 if (context) iterator = _.bind(iterator, context); 135 return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); 136 } 137 var length = obj.length; 138 if (length !== +length) { 139 var keys = _.keys(obj); 140 length = keys.length; 141 } 142 each(obj, function(value, index, list) { 143 index = keys ? keys[--length] : --length; 144 if (!initial) { 145 memo = obj[index]; 146 initial = true; 147 } else { 148 memo = iterator.call(context, memo, obj[index], index, list); 149 } 150 }); 151 if (!initial) throw new TypeError(reduceError); 152 return memo; 153 }; 208 _.reduceRight = _.foldr = createReduce(-1); 154 209 155 210 // Return the first value which passes a truth test. Aliased as `detect`. 156 211 _.find = _.detect = function(obj, predicate, context) { 157 var result; 158 any(obj, function(value, index, list) { 159 if (predicate.call(context, value, index, list)) { 160 result = value; 161 return true; 162 } 163 }); 164 return result; 212 var key; 213 if (isArrayLike(obj)) { 214 key = _.findIndex(obj, predicate, context); 215 } else { 216 key = _.findKey(obj, predicate, context); 217 } 218 if (key !== void 0 && key !== -1) return obj[key]; 165 219 }; 166 220 167 221 // Return all the elements that pass a truth test. 168 // Delegates to **ECMAScript 5**'s native `filter` if available.169 222 // Aliased as `select`. 170 223 _.filter = _.select = function(obj, predicate, context) { 171 224 var results = []; 172 if (obj == null) return results; 173 if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context); 174 each(obj, function(value, index, list) { 175 if (predicate.call(context, value, index, list)) results.push(value); 225 predicate = cb(predicate, context); 226 _.each(obj, function(value, index, list) { 227 if (predicate(value, index, list)) results.push(value); 176 228 }); 177 229 return results; 178 230 }; … … 179 231 180 232 // Return all the elements for which a truth test fails. 181 233 _.reject = function(obj, predicate, context) { 182 return _.filter(obj, function(value, index, list) { 183 return !predicate.call(context, value, index, list); 184 }, context); 234 return _.filter(obj, _.negate(cb(predicate)), context); 185 235 }; 186 236 187 237 // Determine whether all of the elements match a truth test. 188 // Delegates to **ECMAScript 5**'s native `every` if available.189 238 // Aliased as `all`. 190 239 _.every = _.all = function(obj, predicate, context) { 191 predicate || (predicate = _.identity);192 var result = true;193 if (obj == null) return result;194 if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context);195 each(obj, function(value, index, list) {196 if (! (result = result && predicate.call(context, value, index, list))) return breaker;197 } );198 return !!result;240 predicate = cb(predicate, context); 241 var keys = !isArrayLike(obj) && _.keys(obj), 242 length = (keys || obj).length; 243 for (var index = 0; index < length; index++) { 244 var currentKey = keys ? keys[index] : index; 245 if (!predicate(obj[currentKey], currentKey, obj)) return false; 246 } 247 return true; 199 248 }; 200 249 201 250 // Determine if at least one element in the object matches a truth test. 202 // Delegates to **ECMAScript 5**'s native `some` if available.203 251 // Aliased as `any`. 204 var any =_.some = _.any = function(obj, predicate, context) {205 predicate || (predicate = _.identity);206 var result = false;207 if (obj == null) return result;208 if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);209 each(obj, function(value, index, list) {210 if ( result || (result = predicate.call(context, value, index, list))) return breaker;211 } );212 return !!result;252 _.some = _.any = function(obj, predicate, context) { 253 predicate = cb(predicate, context); 254 var keys = !isArrayLike(obj) && _.keys(obj), 255 length = (keys || obj).length; 256 for (var index = 0; index < length; index++) { 257 var currentKey = keys ? keys[index] : index; 258 if (predicate(obj[currentKey], currentKey, obj)) return true; 259 } 260 return false; 213 261 }; 214 262 215 // Determine if the array or object contains a given value (using `===`). 216 // Aliased as `include`. 217 _.contains = _.include = function(obj, target) { 218 if (obj == null) return false; 219 if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; 220 return any(obj, function(value) { 221 return value === target; 222 }); 263 // Determine if the array or object contains a given item (using `===`). 264 // Aliased as `includes` and `include`. 265 _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { 266 if (!isArrayLike(obj)) obj = _.values(obj); 267 if (typeof fromIndex != 'number' || guard) fromIndex = 0; 268 return _.indexOf(obj, item, fromIndex) >= 0; 223 269 }; 224 270 225 271 // Invoke a method (with arguments) on every item in a collection. … … 227 273 var args = slice.call(arguments, 2); 228 274 var isFunc = _.isFunction(method); 229 275 return _.map(obj, function(value) { 230 return (isFunc ? method : value[method]).apply(value, args); 276 var func = isFunc ? method : value[method]; 277 return func == null ? func : func.apply(value, args); 231 278 }); 232 279 }; 233 280 … … 239 286 // Convenience version of a common use case of `filter`: selecting only objects 240 287 // containing specific `key:value` pairs. 241 288 _.where = function(obj, attrs) { 242 return _.filter(obj, _.matche s(attrs));289 return _.filter(obj, _.matcher(attrs)); 243 290 }; 244 291 245 292 // Convenience version of a common use case of `find`: getting the first object 246 293 // containing specific `key:value` pairs. 247 294 _.findWhere = function(obj, attrs) { 248 return _.find(obj, _.matche s(attrs));295 return _.find(obj, _.matcher(attrs)); 249 296 }; 250 297 251 // Return the maximum element or (element-based computation). 252 // Can't optimize arrays of integers longer than 65,535 elements. 253 // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797) 254 _.max = function(obj, iterator, context) { 255 if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { 256 return Math.max.apply(Math, obj); 298 // Return the maximum element (or element-based computation). 299 _.max = function(obj, iteratee, context) { 300 var result = -Infinity, lastComputed = -Infinity, 301 value, computed; 302 if (iteratee == null && obj != null) { 303 obj = isArrayLike(obj) ? obj : _.values(obj); 304 for (var i = 0, length = obj.length; i < length; i++) { 305 value = obj[i]; 306 if (value > result) { 307 result = value; 308 } 309 } 310 } else { 311 iteratee = cb(iteratee, context); 312 _.each(obj, function(value, index, list) { 313 computed = iteratee(value, index, list); 314 if (computed > lastComputed || computed === -Infinity && result === -Infinity) { 315 result = value; 316 lastComputed = computed; 317 } 318 }); 257 319 } 258 var result = -Infinity, lastComputed = -Infinity;259 each(obj, function(value, index, list) {260 var computed = iterator ? iterator.call(context, value, index, list) : value;261 if (computed > lastComputed) {262 result = value;263 lastComputed = computed;264 }265 });266 320 return result; 267 321 }; 268 322 269 323 // Return the minimum element (or element-based computation). 270 _.min = function(obj, iterator, context) { 271 if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { 272 return Math.min.apply(Math, obj); 324 _.min = function(obj, iteratee, context) { 325 var result = Infinity, lastComputed = Infinity, 326 value, computed; 327 if (iteratee == null && obj != null) { 328 obj = isArrayLike(obj) ? obj : _.values(obj); 329 for (var i = 0, length = obj.length; i < length; i++) { 330 value = obj[i]; 331 if (value < result) { 332 result = value; 333 } 334 } 335 } else { 336 iteratee = cb(iteratee, context); 337 _.each(obj, function(value, index, list) { 338 computed = iteratee(value, index, list); 339 if (computed < lastComputed || computed === Infinity && result === Infinity) { 340 result = value; 341 lastComputed = computed; 342 } 343 }); 273 344 } 274 var result = Infinity, lastComputed = Infinity;275 each(obj, function(value, index, list) {276 var computed = iterator ? iterator.call(context, value, index, list) : value;277 if (computed < lastComputed) {278 result = value;279 lastComputed = computed;280 }281 });282 345 return result; 283 346 }; 284 347 285 // Shuffle a n array, using the modern version of the348 // Shuffle a collection, using the modern version of the 286 349 // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). 287 350 _.shuffle = function(obj) { 288 var rand;289 var index = 0;290 var shuffled = [];291 each(obj, function(value) {292 rand = _.random( index++);293 shuffled[index - 1] = shuffled[rand];294 shuffled[rand] = value;295 } );351 var set = isArrayLike(obj) ? obj : _.values(obj); 352 var length = set.length; 353 var shuffled = Array(length); 354 for (var index = 0, rand; index < length; index++) { 355 rand = _.random(0, index); 356 if (rand !== index) shuffled[index] = shuffled[rand]; 357 shuffled[rand] = set[index]; 358 } 296 359 return shuffled; 297 360 }; 298 361 … … 301 364 // The internal `guard` argument allows it to work with `map`. 302 365 _.sample = function(obj, n, guard) { 303 366 if (n == null || guard) { 304 if ( obj.length !== +obj.length) obj = _.values(obj);367 if (!isArrayLike(obj)) obj = _.values(obj); 305 368 return obj[_.random(obj.length - 1)]; 306 369 } 307 370 return _.shuffle(obj).slice(0, Math.max(0, n)); 308 371 }; 309 372 310 // An internal function to generate lookup iterators. 311 var lookupIterator = function(value) { 312 if (value == null) return _.identity; 313 if (_.isFunction(value)) return value; 314 return _.property(value); 315 }; 316 317 // Sort the object's values by a criterion produced by an iterator. 318 _.sortBy = function(obj, iterator, context) { 319 iterator = lookupIterator(iterator); 373 // Sort the object's values by a criterion produced by an iteratee. 374 _.sortBy = function(obj, iteratee, context) { 375 iteratee = cb(iteratee, context); 320 376 return _.pluck(_.map(obj, function(value, index, list) { 321 377 return { 322 378 value: value, 323 379 index: index, 324 criteria: iterat or.call(context,value, index, list)380 criteria: iteratee(value, index, list) 325 381 }; 326 382 }).sort(function(left, right) { 327 383 var a = left.criteria; … … 336 392 337 393 // An internal function used for aggregate "group by" operations. 338 394 var group = function(behavior) { 339 return function(obj, iterat or, context) {395 return function(obj, iteratee, context) { 340 396 var result = {}; 341 iterat or = lookupIterator(iterator);342 each(obj, function(value, index) {343 var key = iterat or.call(context,value, index, obj);344 behavior(result, key, value);397 iteratee = cb(iteratee, context); 398 _.each(obj, function(value, index) { 399 var key = iteratee(value, index, obj); 400 behavior(result, value, key); 345 401 }); 346 402 return result; 347 403 }; … … 349 405 350 406 // Groups the object's values by a criterion. Pass either a string attribute 351 407 // to group by, or a function that returns the criterion. 352 _.groupBy = group(function(result, key, value) {353 _.has(result, key) ? result[key].push(value) :result[key] = [value];408 _.groupBy = group(function(result, value, key) { 409 if (_.has(result, key)) result[key].push(value); else result[key] = [value]; 354 410 }); 355 411 356 412 // Indexes the object's values by a criterion, similar to `groupBy`, but for 357 413 // when you know that your index values will be unique. 358 _.indexBy = group(function(result, key, value) {414 _.indexBy = group(function(result, value, key) { 359 415 result[key] = value; 360 416 }); 361 417 … … 362 418 // Counts instances of an object that group by a certain criterion. Pass 363 419 // either a string attribute to count by, or a function that returns the 364 420 // criterion. 365 _.countBy = group(function(result, key) {366 _.has(result, key) ? result[key]++ :result[key] = 1;421 _.countBy = group(function(result, value, key) { 422 if (_.has(result, key)) result[key]++; else result[key] = 1; 367 423 }); 368 424 369 // Use a comparator function to figure out the smallest index at which370 // an object should be inserted so as to maintain order. Uses binary search.371 _.sortedIndex = function(array, obj, iterator, context) {372 iterator = lookupIterator(iterator);373 var value = iterator.call(context, obj);374 var low = 0, high = array.length;375 while (low < high) {376 var mid = (low + high) >>> 1;377 iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;378 }379 return low;380 };381 382 425 // Safely create a real, live array from anything iterable. 383 426 _.toArray = function(obj) { 384 427 if (!obj) return []; 385 428 if (_.isArray(obj)) return slice.call(obj); 386 if ( obj.length === +obj.length) return _.map(obj, _.identity);429 if (isArrayLike(obj)) return _.map(obj, _.identity); 387 430 return _.values(obj); 388 431 }; 389 432 … … 390 433 // Return the number of elements in an object. 391 434 _.size = function(obj) { 392 435 if (obj == null) return 0; 393 return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;436 return isArrayLike(obj) ? obj.length : _.keys(obj).length; 394 437 }; 395 438 439 // Split a collection into two arrays: one whose elements all satisfy the given 440 // predicate, and one whose elements all do not satisfy the predicate. 441 _.partition = function(obj, predicate, context) { 442 predicate = cb(predicate, context); 443 var pass = [], fail = []; 444 _.each(obj, function(value, key, obj) { 445 (predicate(value, key, obj) ? pass : fail).push(value); 446 }); 447 return [pass, fail]; 448 }; 449 396 450 // Array Functions 397 451 // --------------- 398 452 … … 401 455 // allows it to work with `_.map`. 402 456 _.first = _.head = _.take = function(array, n, guard) { 403 457 if (array == null) return void 0; 404 if ((n == null) || guard) return array[0]; 405 if (n < 0) return []; 406 return slice.call(array, 0, n); 458 if (n == null || guard) return array[0]; 459 return _.initial(array, array.length - n); 407 460 }; 408 461 409 462 // Returns everything but the last entry of the array. Especially useful on 410 463 // the arguments object. Passing **n** will return all the values in 411 // the array, excluding the last N. The **guard** check allows it to work with 412 // `_.map`. 464 // the array, excluding the last N. 413 465 _.initial = function(array, n, guard) { 414 return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));466 return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); 415 467 }; 416 468 417 469 // Get the last element of an array. Passing **n** will return the last N 418 // values in the array. The **guard** check allows it to work with `_.map`.470 // values in the array. 419 471 _.last = function(array, n, guard) { 420 472 if (array == null) return void 0; 421 if ( (n == null)|| guard) return array[array.length - 1];422 return slice.call(array, Math.max(array.length - n, 0));473 if (n == null || guard) return array[array.length - 1]; 474 return _.rest(array, Math.max(0, array.length - n)); 423 475 }; 424 476 425 477 // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. 426 478 // Especially useful on the arguments object. Passing an **n** will return 427 // the rest N values in the array. The **guard** 428 // check allows it to work with `_.map`. 479 // the rest N values in the array. 429 480 _.rest = _.tail = _.drop = function(array, n, guard) { 430 return slice.call(array, (n == null)|| guard ? 1 : n);481 return slice.call(array, n == null || guard ? 1 : n); 431 482 }; 432 483 433 484 // Trim out all falsy values from an array. … … 436 487 }; 437 488 438 489 // Internal implementation of a recursive `flatten` function. 439 var flatten = function(input, shallow, output) { 440 if (shallow && _.every(input, _.isArray)) { 441 return concat.apply(output, input); 490 var flatten = function(input, shallow, strict, startIndex) { 491 var output = [], idx = 0; 492 for (var i = startIndex || 0, length = getLength(input); i < length; i++) { 493 var value = input[i]; 494 if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { 495 //flatten current level of array or arguments object 496 if (!shallow) value = flatten(value, shallow, strict); 497 var j = 0, len = value.length; 498 output.length += len; 499 while (j < len) { 500 output[idx++] = value[j++]; 501 } 502 } else if (!strict) { 503 output[idx++] = value; 504 } 442 505 } 443 each(input, function(value) {444 if (_.isArray(value) || _.isArguments(value)) {445 shallow ? push.apply(output, value) : flatten(value, shallow, output);446 } else {447 output.push(value);448 }449 });450 506 return output; 451 507 }; 452 508 453 509 // Flatten out an array, either recursively (by default), or just one level. 454 510 _.flatten = function(array, shallow) { 455 return flatten(array, shallow, []);511 return flatten(array, shallow, false); 456 512 }; 457 513 458 514 // Return a version of the array that does not contain the specified value(s). … … 460 516 return _.difference(array, slice.call(arguments, 1)); 461 517 }; 462 518 463 // Split an array into two arrays: one whose elements all satisfy the given464 // predicate, and one whose elements all do not satisfy the predicate.465 _.partition = function(array, predicate) {466 var pass = [], fail = [];467 each(array, function(elem) {468 (predicate(elem) ? pass : fail).push(elem);469 });470 return [pass, fail];471 };472 473 519 // Produce a duplicate-free version of the array. If the array has already 474 520 // been sorted, you have the option of using a faster algorithm. 475 521 // Aliased as `unique`. 476 _.uniq = _.unique = function(array, isSorted, iterat or, context) {477 if ( _.isFunction(isSorted)) {478 context = iterat or;479 iterat or= isSorted;522 _.uniq = _.unique = function(array, isSorted, iteratee, context) { 523 if (!_.isBoolean(isSorted)) { 524 context = iteratee; 525 iteratee = isSorted; 480 526 isSorted = false; 481 527 } 482 var initial = iterator ? _.map(array, iterator, context) : array;483 var result s= [];528 if (iteratee != null) iteratee = cb(iteratee, context); 529 var result = []; 484 530 var seen = []; 485 each(initial, function(value, index) { 486 if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) { 487 seen.push(value); 488 results.push(array[index]); 531 for (var i = 0, length = getLength(array); i < length; i++) { 532 var value = array[i], 533 computed = iteratee ? iteratee(value, i, array) : value; 534 if (isSorted) { 535 if (!i || seen !== computed) result.push(value); 536 seen = computed; 537 } else if (iteratee) { 538 if (!_.contains(seen, computed)) { 539 seen.push(computed); 540 result.push(value); 541 } 542 } else if (!_.contains(result, value)) { 543 result.push(value); 489 544 } 490 } );491 return result s;545 } 546 return result; 492 547 }; 493 548 494 549 // Produce an array that contains the union: each distinct element from all of 495 550 // the passed-in arrays. 496 551 _.union = function() { 497 return _.uniq( _.flatten(arguments, true));552 return _.uniq(flatten(arguments, true, true)); 498 553 }; 499 554 500 555 // Produce an array that contains every item shared between all the 501 556 // passed-in arrays. 502 557 _.intersection = function(array) { 503 var rest = slice.call(arguments, 1); 504 return _.filter(_.uniq(array), function(item) { 505 return _.every(rest, function(other) { 506 return _.contains(other, item); 507 }); 508 }); 558 var result = []; 559 var argsLength = arguments.length; 560 for (var i = 0, length = getLength(array); i < length; i++) { 561 var item = array[i]; 562 if (_.contains(result, item)) continue; 563 for (var j = 1; j < argsLength; j++) { 564 if (!_.contains(arguments[j], item)) break; 565 } 566 if (j === argsLength) result.push(item); 567 } 568 return result; 509 569 }; 510 570 511 571 // Take the difference between one array and a number of other arrays. 512 572 // Only the elements present in just the first array will remain. 513 573 _.difference = function(array) { 514 var rest = concat.apply(ArrayProto, slice.call(arguments, 1)); 515 return _.filter(array, function(value){ return !_.contains(rest, value); }); 574 var rest = flatten(arguments, true, true, 1); 575 return _.filter(array, function(value){ 576 return !_.contains(rest, value); 577 }); 516 578 }; 517 579 518 580 // Zip together multiple lists into a single array -- elements that share 519 581 // an index go together. 520 582 _.zip = function() { 521 var length = _.max(_.pluck(arguments, 'length').concat(0)); 522 var results = new Array(length); 523 for (var i = 0; i < length; i++) { 524 results[i] = _.pluck(arguments, '' + i); 583 return _.unzip(arguments); 584 }; 585 586 // Complement of _.zip. Unzip accepts an array of arrays and groups 587 // each array's elements on shared indices 588 _.unzip = function(array) { 589 var length = array && _.max(array, getLength).length || 0; 590 var result = Array(length); 591 592 for (var index = 0; index < length; index++) { 593 result[index] = _.pluck(array, index); 525 594 } 526 return result s;595 return result; 527 596 }; 528 597 529 598 // Converts lists into objects. Pass either a single array of `[key, value]` … … 530 599 // pairs, or two parallel arrays of the same length -- one of keys, and one of 531 600 // the corresponding values. 532 601 _.object = function(list, values) { 533 if (list == null) return {};534 602 var result = {}; 535 for (var i = 0, length = list.length; i < length; i++) {603 for (var i = 0, length = getLength(list); i < length; i++) { 536 604 if (values) { 537 605 result[list[i]] = values[i]; 538 606 } else { … … 542 610 return result; 543 611 }; 544 612 545 // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), 546 // we need this function. Return the position of the first occurrence of an 547 // item in an array, or -1 if the item is not included in the array. 548 // Delegates to **ECMAScript 5**'s native `indexOf` if available. 549 // If the array is large and already in sort order, pass `true` 550 // for **isSorted** to use binary search. 551 _.indexOf = function(array, item, isSorted) { 552 if (array == null) return -1; 553 var i = 0, length = array.length; 554 if (isSorted) { 555 if (typeof isSorted == 'number') { 556 i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted); 557 } else { 558 i = _.sortedIndex(array, item); 559 return array[i] === item ? i : -1; 613 // Generator function to create the findIndex and findLastIndex functions 614 function createPredicateIndexFinder(dir) { 615 return function(array, predicate, context) { 616 predicate = cb(predicate, context); 617 var length = getLength(array); 618 var index = dir > 0 ? 0 : length - 1; 619 for (; index >= 0 && index < length; index += dir) { 620 if (predicate(array[index], index, array)) return index; 560 621 } 561 } 562 if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); 563 for (; i < length; i++) if (array[i] === item) return i; 564 return -1; 565 }; 622 return -1; 623 }; 624 } 566 625 567 // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. 568 _.lastIndexOf = function(array, item, from) { 569 if (array == null) return -1; 570 var hasIndex = from != null; 571 if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { 572 return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); 626 // Returns the first index on an array-like that passes a predicate test 627 _.findIndex = createPredicateIndexFinder(1); 628 _.findLastIndex = createPredicateIndexFinder(-1); 629 630 // Use a comparator function to figure out the smallest index at which 631 // an object should be inserted so as to maintain order. Uses binary search. 632 _.sortedIndex = function(array, obj, iteratee, context) { 633 iteratee = cb(iteratee, context, 1); 634 var value = iteratee(obj); 635 var low = 0, high = getLength(array); 636 while (low < high) { 637 var mid = Math.floor((low + high) / 2); 638 if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; 573 639 } 574 var i = (hasIndex ? from : array.length); 575 while (i--) if (array[i] === item) return i; 576 return -1; 640 return low; 577 641 }; 578 642 643 // Generator function to create the indexOf and lastIndexOf functions 644 function createIndexFinder(dir, predicateFind, sortedIndex) { 645 return function(array, item, idx) { 646 var i = 0, length = getLength(array); 647 if (typeof idx == 'number') { 648 if (dir > 0) { 649 i = idx >= 0 ? idx : Math.max(idx + length, i); 650 } else { 651 length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; 652 } 653 } else if (sortedIndex && idx && length) { 654 idx = sortedIndex(array, item); 655 return array[idx] === item ? idx : -1; 656 } 657 if (item !== item) { 658 idx = predicateFind(slice.call(array, i, length), _.isNaN); 659 return idx >= 0 ? idx + i : -1; 660 } 661 for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { 662 if (array[idx] === item) return idx; 663 } 664 return -1; 665 }; 666 } 667 668 // Return the position of the first occurrence of an item in an array, 669 // or -1 if the item is not included in the array. 670 // If the array is large and already in sort order, pass `true` 671 // for **isSorted** to use binary search. 672 _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); 673 _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); 674 579 675 // Generate an integer Array containing an arithmetic progression. A port of 580 676 // the native Python `range()` function. See 581 677 // [the Python documentation](http://docs.python.org/library/functions.html#range). 582 678 _.range = function(start, stop, step) { 583 if ( arguments.length <= 1) {679 if (stop == null) { 584 680 stop = start || 0; 585 681 start = 0; 586 682 } 587 step = arguments[2]|| 1;683 step = step || 1; 588 684 589 685 var length = Math.max(Math.ceil((stop - start) / step), 0); 590 var idx = 0; 591 var range = new Array(length); 686 var range = Array(length); 592 687 593 while(idx < length) { 594 range[idx++] = start; 595 start += step; 688 for (var idx = 0; idx < length; idx++, start += step) { 689 range[idx] = start; 596 690 } 597 691 598 692 return range; … … 601 695 // Function (ahem) Functions 602 696 // ------------------ 603 697 604 // Reusable constructor function for prototype setting. 605 var ctor = function(){}; 698 // Determines whether to execute a function as a constructor 699 // or a normal function with the provided arguments 700 var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { 701 if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); 702 var self = baseCreate(sourceFunc.prototype); 703 var result = sourceFunc.apply(self, args); 704 if (_.isObject(result)) return result; 705 return self; 706 }; 606 707 607 708 // Create a function bound to a given object (assigning `this`, and arguments, 608 709 // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if 609 710 // available. 610 711 _.bind = function(func, context) { 611 var args, bound;612 712 if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); 613 if (!_.isFunction(func)) throw new TypeError; 614 args = slice.call(arguments, 2); 615 return bound = function() { 616 if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); 617 ctor.prototype = func.prototype; 618 var self = new ctor; 619 ctor.prototype = null; 620 var result = func.apply(self, args.concat(slice.call(arguments))); 621 if (Object(result) === result) return result; 622 return self; 713 if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); 714 var args = slice.call(arguments, 2); 715 var bound = function() { 716 return executeBound(func, bound, context, this, args.concat(slice.call(arguments))); 623 717 }; 718 return bound; 624 719 }; 625 720 626 721 // Partially apply a function by creating a version that has had some of its … … 628 723 // as a placeholder, allowing any combination of arguments to be pre-filled. 629 724 _.partial = function(func) { 630 725 var boundArgs = slice.call(arguments, 1); 631 returnfunction() {632 var position = 0 ;633 var args = boundArgs.slice();634 for (var i = 0 , length = args.length; i < length; i++) {635 if (args[i] === _) args[i] = arguments[position++];726 var bound = function() { 727 var position = 0, length = boundArgs.length; 728 var args = Array(length); 729 for (var i = 0; i < length; i++) { 730 args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i]; 636 731 } 637 732 while (position < arguments.length) args.push(arguments[position++]); 638 return func.apply(this, args);733 return executeBound(func, bound, this, this, args); 639 734 }; 735 return bound; 640 736 }; 641 737 642 738 // Bind a number of an object's methods to that object. Remaining arguments … … 643 739 // are the method names to be bound. Useful for ensuring that all callbacks 644 740 // defined on an object belong to it. 645 741 _.bindAll = function(obj) { 646 var funcs = slice.call(arguments, 1); 647 if (funcs.length === 0) throw new Error('bindAll must be passed function names'); 648 each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); 742 var i, length = arguments.length, key; 743 if (length <= 1) throw new Error('bindAll must be passed function names'); 744 for (i = 1; i < length; i++) { 745 key = arguments[i]; 746 obj[key] = _.bind(obj[key], obj); 747 } 649 748 return obj; 650 749 }; 651 750 652 751 // Memoize an expensive function by storing its results. 653 752 _.memoize = function(func, hasher) { 654 var memo = {};655 hasher || (hasher = _.identity);656 return function() {657 var key = hasher.apply(this, arguments);658 return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));753 var memoize = function(key) { 754 var cache = memoize.cache; 755 var address = '' + (hasher ? hasher.apply(this, arguments) : key); 756 if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); 757 return cache[address]; 659 758 }; 759 memoize.cache = {}; 760 return memoize; 660 761 }; 661 762 662 763 // Delays a function for the given number of milliseconds, and then calls … … 663 764 // it with the arguments supplied. 664 765 _.delay = function(func, wait) { 665 766 var args = slice.call(arguments, 2); 666 return setTimeout(function(){ return func.apply(null, args); }, wait); 767 return setTimeout(function(){ 768 return func.apply(null, args); 769 }, wait); 667 770 }; 668 771 669 772 // Defers a function, scheduling it to run after the current call stack has 670 773 // cleared. 671 _.defer = function(func) { 672 return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); 673 }; 774 _.defer = _.partial(_.delay, _, 1); 674 775 675 776 // Returns a function, that, when invoked, will only be triggered at most once 676 777 // during a given window of time. Normally, the throttled function will run … … 681 782 var context, args, result; 682 783 var timeout = null; 683 784 var previous = 0; 684 options || (options = {});785 if (!options) options = {}; 685 786 var later = function() { 686 787 previous = options.leading === false ? 0 : _.now(); 687 788 timeout = null; 688 789 result = func.apply(context, args); 689 context = args = null;790 if (!timeout) context = args = null; 690 791 }; 691 792 return function() { 692 793 var now = _.now(); … … 694 795 var remaining = wait - (now - previous); 695 796 context = this; 696 797 args = arguments; 697 if (remaining <= 0) { 698 clearTimeout(timeout); 699 timeout = null; 798 if (remaining <= 0 || remaining > wait) { 799 if (timeout) { 800 clearTimeout(timeout); 801 timeout = null; 802 } 700 803 previous = now; 701 804 result = func.apply(context, args); 702 context = args = null;805 if (!timeout) context = args = null; 703 806 } else if (!timeout && options.trailing !== false) { 704 807 timeout = setTimeout(later, remaining); 705 808 } … … 716 819 717 820 var later = function() { 718 821 var last = _.now() - timestamp; 719 if (last < wait) { 822 823 if (last < wait && last >= 0) { 720 824 timeout = setTimeout(later, wait - last); 721 825 } else { 722 826 timeout = null; 723 827 if (!immediate) { 724 828 result = func.apply(context, args); 725 context = args = null;829 if (!timeout) context = args = null; 726 830 } 727 831 } 728 832 }; … … 732 836 args = arguments; 733 837 timestamp = _.now(); 734 838 var callNow = immediate && !timeout; 735 if (!timeout) { 736 timeout = setTimeout(later, wait); 737 } 839 if (!timeout) timeout = setTimeout(later, wait); 738 840 if (callNow) { 739 841 result = func.apply(context, args); 740 842 context = args = null; … … 744 846 }; 745 847 }; 746 848 747 // Returns a function that will be executed at most one time, no matter how748 // often you call it. Useful for lazy initialization.749 _.once = function(func) {750 var ran = false, memo;751 return function() {752 if (ran) return memo;753 ran = true;754 memo = func.apply(this, arguments);755 func = null;756 return memo;757 };758 };759 760 849 // Returns the first function passed as an argument to the second, 761 850 // allowing you to adjust arguments, run code before and after, and 762 851 // conditionally execute the original function. … … 764 853 return _.partial(wrapper, func); 765 854 }; 766 855 856 // Returns a negated version of the passed-in predicate. 857 _.negate = function(predicate) { 858 return function() { 859 return !predicate.apply(this, arguments); 860 }; 861 }; 862 767 863 // Returns a function that is the composition of a list of functions, each 768 864 // consuming the return value of the function that follows. 769 865 _.compose = function() { 770 var funcs = arguments; 866 var args = arguments; 867 var start = args.length - 1; 771 868 return function() { 772 var args = arguments; 773 for (var i = funcs.length - 1; i >= 0; i--) { 774 args = [funcs[i].apply(this, args)]; 775 } 776 return args[0]; 869 var i = start; 870 var result = args[start].apply(this, arguments); 871 while (i--) result = args[i].call(this, result); 872 return result; 777 873 }; 778 874 }; 779 875 780 // Returns a function that will only be executed after being called N times.876 // Returns a function that will only be executed on and after the Nth call. 781 877 _.after = function(times, func) { 782 878 return function() { 783 879 if (--times < 1) { … … 786 882 }; 787 883 }; 788 884 885 // Returns a function that will only be executed up to (but not including) the Nth call. 886 _.before = function(times, func) { 887 var memo; 888 return function() { 889 if (--times > 0) { 890 memo = func.apply(this, arguments); 891 } 892 if (times <= 1) func = null; 893 return memo; 894 }; 895 }; 896 897 // Returns a function that will be executed at most one time, no matter how 898 // often you call it. Useful for lazy initialization. 899 _.once = _.partial(_.before, 2); 900 789 901 // Object Functions 790 902 // ---------------- 791 903 792 // Retrieve the names of an object's properties. 904 // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. 905 var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); 906 var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', 907 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; 908 909 function collectNonEnumProps(obj, keys) { 910 var nonEnumIdx = nonEnumerableProps.length; 911 var constructor = obj.constructor; 912 var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; 913 914 // Constructor is a special case. 915 var prop = 'constructor'; 916 if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); 917 918 while (nonEnumIdx--) { 919 prop = nonEnumerableProps[nonEnumIdx]; 920 if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { 921 keys.push(prop); 922 } 923 } 924 } 925 926 // Retrieve the names of an object's own properties. 793 927 // Delegates to **ECMAScript 5**'s native `Object.keys` 794 928 _.keys = function(obj) { 795 929 if (!_.isObject(obj)) return []; … … 796 930 if (nativeKeys) return nativeKeys(obj); 797 931 var keys = []; 798 932 for (var key in obj) if (_.has(obj, key)) keys.push(key); 933 // Ahem, IE < 9. 934 if (hasEnumBug) collectNonEnumProps(obj, keys); 799 935 return keys; 800 936 }; 801 937 938 // Retrieve all the property names of an object. 939 _.allKeys = function(obj) { 940 if (!_.isObject(obj)) return []; 941 var keys = []; 942 for (var key in obj) keys.push(key); 943 // Ahem, IE < 9. 944 if (hasEnumBug) collectNonEnumProps(obj, keys); 945 return keys; 946 }; 947 802 948 // Retrieve the values of an object's properties. 803 949 _.values = function(obj) { 804 950 var keys = _.keys(obj); 805 951 var length = keys.length; 806 var values = newArray(length);952 var values = Array(length); 807 953 for (var i = 0; i < length; i++) { 808 954 values[i] = obj[keys[i]]; 809 955 } … … 810 956 return values; 811 957 }; 812 958 959 // Returns the results of applying the iteratee to each element of the object 960 // In contrast to _.map it returns an object 961 _.mapObject = function(obj, iteratee, context) { 962 iteratee = cb(iteratee, context); 963 var keys = _.keys(obj), 964 length = keys.length, 965 results = {}, 966 currentKey; 967 for (var index = 0; index < length; index++) { 968 currentKey = keys[index]; 969 results[currentKey] = iteratee(obj[currentKey], currentKey, obj); 970 } 971 return results; 972 }; 973 813 974 // Convert an object into a list of `[key, value]` pairs. 814 975 _.pairs = function(obj) { 815 976 var keys = _.keys(obj); 816 977 var length = keys.length; 817 var pairs = newArray(length);978 var pairs = Array(length); 818 979 for (var i = 0; i < length; i++) { 819 980 pairs[i] = [keys[i], obj[keys[i]]]; 820 981 } … … 842 1003 }; 843 1004 844 1005 // Extend a given object with all the properties in passed-in object(s). 845 _.extend = function(obj) { 846 each(slice.call(arguments, 1), function(source) { 847 if (source) { 848 for (var prop in source) { 849 obj[prop] = source[prop]; 850 } 851 } 852 }); 853 return obj; 1006 _.extend = createAssigner(_.allKeys); 1007 1008 // Assigns a given object with all the own properties in the passed-in object(s) 1009 // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) 1010 _.extendOwn = _.assign = createAssigner(_.keys); 1011 1012 // Returns the first key on an object that passes a predicate test 1013 _.findKey = function(obj, predicate, context) { 1014 predicate = cb(predicate, context); 1015 var keys = _.keys(obj), key; 1016 for (var i = 0, length = keys.length; i < length; i++) { 1017 key = keys[i]; 1018 if (predicate(obj[key], key, obj)) return key; 1019 } 854 1020 }; 855 1021 856 1022 // Return a copy of the object only containing the whitelisted properties. 857 _.pick = function(obj) { 858 var copy = {}; 859 var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); 860 each(keys, function(key) { 861 if (key in obj) copy[key] = obj[key]; 862 }); 863 return copy; 1023 _.pick = function(object, oiteratee, context) { 1024 var result = {}, obj = object, iteratee, keys; 1025 if (obj == null) return result; 1026 if (_.isFunction(oiteratee)) { 1027 keys = _.allKeys(obj); 1028 iteratee = optimizeCb(oiteratee, context); 1029 } else { 1030 keys = flatten(arguments, false, false, 1); 1031 iteratee = function(value, key, obj) { return key in obj; }; 1032 obj = Object(obj); 1033 } 1034 for (var i = 0, length = keys.length; i < length; i++) { 1035 var key = keys[i]; 1036 var value = obj[key]; 1037 if (iteratee(value, key, obj)) result[key] = value; 1038 } 1039 return result; 864 1040 }; 865 1041 866 1042 // Return a copy of the object without the blacklisted properties. 867 _.omit = function(obj) { 868 var copy = {}; 869 var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); 870 for (var key in obj) { 871 if (!_.contains(keys, key)) copy[key] = obj[key]; 1043 _.omit = function(obj, iteratee, context) { 1044 if (_.isFunction(iteratee)) { 1045 iteratee = _.negate(iteratee); 1046 } else { 1047 var keys = _.map(flatten(arguments, false, false, 1), String); 1048 iteratee = function(value, key) { 1049 return !_.contains(keys, key); 1050 }; 872 1051 } 873 return copy;1052 return _.pick(obj, iteratee, context); 874 1053 }; 875 1054 876 1055 // Fill in a given object with default properties. 877 _.defaults = function(obj) {878 each(slice.call(arguments, 1), function(source) { 879 if (source) {880 for (var prop in source) {881 if (obj[prop] === void 0) obj[prop] = source[prop];882 }883 }884 });885 return obj;1056 _.defaults = createAssigner(_.allKeys, true); 1057 1058 // Creates an object that inherits from the given prototype object. 1059 // If additional properties are provided then they will be added to the 1060 // created object. 1061 _.create = function(prototype, props) { 1062 var result = baseCreate(prototype); 1063 if (props) _.extendOwn(result, props); 1064 return result; 886 1065 }; 887 1066 888 1067 // Create a (shallow-cloned) duplicate of an object. … … 899 1078 return obj; 900 1079 }; 901 1080 1081 // Returns whether an object has a given set of `key:value` pairs. 1082 _.isMatch = function(object, attrs) { 1083 var keys = _.keys(attrs), length = keys.length; 1084 if (object == null) return !length; 1085 var obj = Object(object); 1086 for (var i = 0; i < length; i++) { 1087 var key = keys[i]; 1088 if (attrs[key] !== obj[key] || !(key in obj)) return false; 1089 } 1090 return true; 1091 }; 1092 1093 902 1094 // Internal recursive comparison function for `isEqual`. 903 1095 var eq = function(a, b, aStack, bStack) { 904 1096 // Identical objects are equal. `0 === -0`, but they aren't identical. 905 1097 // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). 906 if (a === b) return a !== 0 || 1 / a == 1 / b;1098 if (a === b) return a !== 0 || 1 / a === 1 / b; 907 1099 // A strict comparison is necessary because `null == undefined`. 908 1100 if (a == null || b == null) return a === b; 909 1101 // Unwrap any wrapped objects. … … 911 1103 if (b instanceof _) b = b._wrapped; 912 1104 // Compare `[[Class]]` names. 913 1105 var className = toString.call(a); 914 if (className != toString.call(b)) return false;1106 if (className !== toString.call(b)) return false; 915 1107 switch (className) { 916 // Strings, numbers, dates, and booleans are compared by value. 1108 // Strings, numbers, regular expressions, dates, and booleans are compared by value. 1109 case '[object RegExp]': 1110 // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') 917 1111 case '[object String]': 918 1112 // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is 919 1113 // equivalent to `new String("5")`. 920 return a == String(b);1114 return '' + a === '' + b; 921 1115 case '[object Number]': 922 // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for 923 // other numeric values. 924 return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); 1116 // `NaN`s are equivalent, but non-reflexive. 1117 // Object(NaN) is equivalent to NaN 1118 if (+a !== +a) return +b !== +b; 1119 // An `egal` comparison is performed for other numeric values. 1120 return +a === 0 ? 1 / +a === 1 / b : +a === +b; 925 1121 case '[object Date]': 926 1122 case '[object Boolean]': 927 1123 // Coerce dates and booleans to numeric primitive values. Dates are compared by their 928 1124 // millisecond representations. Note that invalid dates with millisecond representations 929 1125 // of `NaN` are not equivalent. 930 return +a == +b; 931 // RegExps are compared by their source patterns and flags. 932 case '[object RegExp]': 933 return a.source == b.source && 934 a.global == b.global && 935 a.multiline == b.multiline && 936 a.ignoreCase == b.ignoreCase; 1126 return +a === +b; 937 1127 } 938 if (typeof a != 'object' || typeof b != 'object') return false; 1128 1129 var areArrays = className === '[object Array]'; 1130 if (!areArrays) { 1131 if (typeof a != 'object' || typeof b != 'object') return false; 1132 1133 // Objects with different constructors are not equivalent, but `Object`s or `Array`s 1134 // from different frames are. 1135 var aCtor = a.constructor, bCtor = b.constructor; 1136 if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && 1137 _.isFunction(bCtor) && bCtor instanceof bCtor) 1138 && ('constructor' in a && 'constructor' in b)) { 1139 return false; 1140 } 1141 } 939 1142 // Assume equality for cyclic structures. The algorithm for detecting cyclic 940 1143 // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. 1144 1145 // Initializing stack of traversed objects. 1146 // It's done here since we only need them for objects and arrays comparison. 1147 aStack = aStack || []; 1148 bStack = bStack || []; 941 1149 var length = aStack.length; 942 1150 while (length--) { 943 1151 // Linear search. Performance is inversely proportional to the number of 944 1152 // unique nested structures. 945 if (aStack[length] == a) return bStack[length]== b;1153 if (aStack[length] === a) return bStack[length] === b; 946 1154 } 947 // Objects with different constructors are not equivalent, but `Object`s 948 // from different frames are. 949 var aCtor = a.constructor, bCtor = b.constructor; 950 if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && 951 _.isFunction(bCtor) && (bCtor instanceof bCtor)) 952 && ('constructor' in a && 'constructor' in b)) { 953 return false; 954 } 1155 955 1156 // Add the first object to the stack of traversed objects. 956 1157 aStack.push(a); 957 1158 bStack.push(b); 958 var size = 0, result = true; 1159 959 1160 // Recursively compare objects and arrays. 960 if ( className == '[object Array]') {1161 if (areArrays) { 961 1162 // Compare array lengths to determine if a deep comparison is necessary. 962 size = a.length; 963 result = size == b.length; 964 if (result) { 965 // Deep compare the contents, ignoring non-numeric properties. 966 while (size--) { 967 if (!(result = eq(a[size], b[size], aStack, bStack))) break; 968 } 1163 length = a.length; 1164 if (length !== b.length) return false; 1165 // Deep compare the contents, ignoring non-numeric properties. 1166 while (length--) { 1167 if (!eq(a[length], b[length], aStack, bStack)) return false; 969 1168 } 970 1169 } else { 971 1170 // Deep compare objects. 972 for (var key in a) { 973 if (_.has(a, key)) { 974 // Count the expected number of properties. 975 size++; 976 // Deep compare each member. 977 if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; 978 } 1171 var keys = _.keys(a), key; 1172 length = keys.length; 1173 // Ensure that both objects contain the same number of properties before comparing deep equality. 1174 if (_.keys(b).length !== length) return false; 1175 while (length--) { 1176 // Deep compare each member 1177 key = keys[length]; 1178 if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; 979 1179 } 980 // Ensure that both objects contain the same number of properties.981 if (result) {982 for (key in b) {983 if (_.has(b, key) && !(size--)) break;984 }985 result = !size;986 }987 1180 } 988 1181 // Remove the first object from the stack of traversed objects. 989 1182 aStack.pop(); 990 1183 bStack.pop(); 991 return result;1184 return true; 992 1185 }; 993 1186 994 1187 // Perform a deep comparison to check if two objects are equal. 995 1188 _.isEqual = function(a, b) { 996 return eq(a, b , [], []);1189 return eq(a, b); 997 1190 }; 998 1191 999 1192 // Is a given array, string, or object empty? … … 1000 1193 // An "empty" object has no enumerable own-properties. 1001 1194 _.isEmpty = function(obj) { 1002 1195 if (obj == null) return true; 1003 if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; 1004 for (var key in obj) if (_.has(obj, key)) return false; 1005 return true; 1196 if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; 1197 return _.keys(obj).length === 0; 1006 1198 }; 1007 1199 1008 1200 // Is a given value a DOM element? … … 1013 1205 // Is a given value an array? 1014 1206 // Delegates to ECMA5's native Array.isArray 1015 1207 _.isArray = nativeIsArray || function(obj) { 1016 return toString.call(obj) == '[object Array]';1208 return toString.call(obj) === '[object Array]'; 1017 1209 }; 1018 1210 1019 1211 // Is a given variable an object? 1020 1212 _.isObject = function(obj) { 1021 return obj === Object(obj); 1213 var type = typeof obj; 1214 return type === 'function' || type === 'object' && !!obj; 1022 1215 }; 1023 1216 1024 // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp .1025 each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {1217 // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. 1218 _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) { 1026 1219 _['is' + name] = function(obj) { 1027 return toString.call(obj) == '[object ' + name + ']';1220 return toString.call(obj) === '[object ' + name + ']'; 1028 1221 }; 1029 1222 }); 1030 1223 1031 // Define a fallback version of the method in browsers (ahem, IE ), where1224 // Define a fallback version of the method in browsers (ahem, IE < 9), where 1032 1225 // there isn't any inspectable "Arguments" type. 1033 1226 if (!_.isArguments(arguments)) { 1034 1227 _.isArguments = function(obj) { 1035 return !!(obj && _.has(obj, 'callee'));1228 return _.has(obj, 'callee'); 1036 1229 }; 1037 1230 } 1038 1231 1039 // Optimize `isFunction` if appropriate. 1040 if (typeof (/./) !== 'function') { 1232 // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, 1233 // IE 11 (#1621), and in Safari 8 (#1929). 1234 if (typeof /./ != 'function' && typeof Int8Array != 'object') { 1041 1235 _.isFunction = function(obj) { 1042 return typeof obj == = 'function';1236 return typeof obj == 'function' || false; 1043 1237 }; 1044 1238 } 1045 1239 … … 1050 1244 1051 1245 // Is the given value `NaN`? (NaN is the only number which does not equal itself). 1052 1246 _.isNaN = function(obj) { 1053 return _.isNumber(obj) && obj != +obj;1247 return _.isNumber(obj) && obj !== +obj; 1054 1248 }; 1055 1249 1056 1250 // Is a given value a boolean? 1057 1251 _.isBoolean = function(obj) { 1058 return obj === true || obj === false || toString.call(obj) == '[object Boolean]';1252 return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; 1059 1253 }; 1060 1254 1061 1255 // Is a given value equal to null? … … 1071 1265 // Shortcut function for checking if an object has a given property directly 1072 1266 // on itself (in other words, not on a prototype). 1073 1267 _.has = function(obj, key) { 1074 return hasOwnProperty.call(obj, key);1268 return obj != null && hasOwnProperty.call(obj, key); 1075 1269 }; 1076 1270 1077 1271 // Utility Functions … … 1084 1278 return this; 1085 1279 }; 1086 1280 1087 // Keep the identity function around for default iterat ors.1281 // Keep the identity function around for default iteratees. 1088 1282 _.identity = function(value) { 1089 1283 return value; 1090 1284 }; 1091 1285 1286 // Predicate-generating functions. Often useful outside of Underscore. 1092 1287 _.constant = function(value) { 1093 return function () {1288 return function() { 1094 1289 return value; 1095 1290 }; 1096 1291 }; 1097 1292 1098 _.property = function(key) { 1099 return function(obj) { 1293 _.noop = function(){}; 1294 1295 _.property = property; 1296 1297 // Generates a function for a given object that returns a given property. 1298 _.propertyOf = function(obj) { 1299 return obj == null ? function(){} : function(key) { 1100 1300 return obj[key]; 1101 1301 }; 1102 1302 }; 1103 1303 1104 // Returns a predicate for checking whether an object has a given set of `key:value` pairs. 1105 _.matches = function(attrs) { 1304 // Returns a predicate for checking whether an object has a given set of 1305 // `key:value` pairs. 1306 _.matcher = _.matches = function(attrs) { 1307 attrs = _.extendOwn({}, attrs); 1106 1308 return function(obj) { 1107 if (obj === attrs) return true; //avoid comparing an object to itself. 1108 for (var key in attrs) { 1109 if (attrs[key] !== obj[key]) 1110 return false; 1111 } 1112 return true; 1113 } 1309 return _.isMatch(obj, attrs); 1310 }; 1114 1311 }; 1115 1312 1116 1313 // Run a function **n** times. 1117 _.times = function(n, iterat or, context) {1314 _.times = function(n, iteratee, context) { 1118 1315 var accum = Array(Math.max(0, n)); 1119 for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); 1316 iteratee = optimizeCb(iteratee, context, 1); 1317 for (var i = 0; i < n; i++) accum[i] = iteratee(i); 1120 1318 return accum; 1121 1319 }; 1122 1320 … … 1130 1328 }; 1131 1329 1132 1330 // A (possibly faster) way to get the current timestamp as an integer. 1133 _.now = Date.now || function() { return new Date().getTime(); }; 1134 1135 // List of HTML entities for escaping. 1136 var entityMap = { 1137 escape: { 1138 '&': '&', 1139 '<': '<', 1140 '>': '>', 1141 '"': '"', 1142 "'": ''' 1143 } 1331 _.now = Date.now || function() { 1332 return new Date().getTime(); 1144 1333 }; 1145 entityMap.unescape = _.invert(entityMap.escape);1146 1334 1147 // Regexes containing the keys and values listed immediately above. 1148 var entityRegexes = { 1149 escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), 1150 unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') 1335 // List of HTML entities for escaping. 1336 var escapeMap = { 1337 '&': '&', 1338 '<': '<', 1339 '>': '>', 1340 '"': '"', 1341 "'": ''', 1342 '`': '`' 1151 1343 }; 1344 var unescapeMap = _.invert(escapeMap); 1152 1345 1153 1346 // Functions for escaping and unescaping strings to/from HTML interpolation. 1154 _.each(['escape', 'unescape'], function(method) { 1155 _[method] = function(string) { 1156 if (string == null) return ''; 1157 return ('' + string).replace(entityRegexes[method], function(match) { 1158 return entityMap[method][match]; 1159 }); 1347 var createEscaper = function(map) { 1348 var escaper = function(match) { 1349 return map[match]; 1160 1350 }; 1161 }); 1351 // Regexes for identifying a key that needs to be escaped 1352 var source = '(?:' + _.keys(map).join('|') + ')'; 1353 var testRegexp = RegExp(source); 1354 var replaceRegexp = RegExp(source, 'g'); 1355 return function(string) { 1356 string = string == null ? '' : '' + string; 1357 return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; 1358 }; 1359 }; 1360 _.escape = createEscaper(escapeMap); 1361 _.unescape = createEscaper(unescapeMap); 1162 1362 1163 1363 // If the value of the named `property` is a function then invoke it with the 1164 1364 // `object` as context; otherwise, return it. 1165 _.result = function(object, property) { 1166 if (object == null) return void 0; 1167 var value = object[property]; 1365 _.result = function(object, property, fallback) { 1366 var value = object == null ? void 0 : object[property]; 1367 if (value === void 0) { 1368 value = fallback; 1369 } 1168 1370 return _.isFunction(value) ? value.call(object) : value; 1169 1371 }; 1170 1372 1171 // Add your own custom functions to the Underscore object.1172 _.mixin = function(obj) {1173 each(_.functions(obj), function(name) {1174 var func = _[name] = obj[name];1175 _.prototype[name] = function() {1176 var args = [this._wrapped];1177 push.apply(args, arguments);1178 return result.call(this, func.apply(_, args));1179 };1180 });1181 };1182 1183 1373 // Generate a unique integer id (unique within the entire client session). 1184 1374 // Useful for temporary DOM ids. 1185 1375 var idCounter = 0; … … 1208 1398 '\\': '\\', 1209 1399 '\r': 'r', 1210 1400 '\n': 'n', 1211 '\t': 't',1212 1401 '\u2028': 'u2028', 1213 1402 '\u2029': 'u2029' 1214 1403 }; 1215 1404 1216 var escaper = /\\|'|\r|\n|\ t|\u2028|\u2029/g;1405 var escaper = /\\|'|\r|\n|\u2028|\u2029/g; 1217 1406 1407 var escapeChar = function(match) { 1408 return '\\' + escapes[match]; 1409 }; 1410 1218 1411 // JavaScript micro-templating, similar to John Resig's implementation. 1219 1412 // Underscore templating handles arbitrary delimiters, preserves whitespace, 1220 1413 // and correctly escapes quotes within interpolated code. 1221 _.template = function(text, data, settings) { 1222 var render; 1414 // NB: `oldSettings` only exists for backwards compatibility. 1415 _.template = function(text, settings, oldSettings) { 1416 if (!settings && oldSettings) settings = oldSettings; 1223 1417 settings = _.defaults({}, settings, _.templateSettings); 1224 1418 1225 1419 // Combine delimiters into one regular expression via alternation. 1226 var matcher = newRegExp([1420 var matcher = RegExp([ 1227 1421 (settings.escape || noMatch).source, 1228 1422 (settings.interpolate || noMatch).source, 1229 1423 (settings.evaluate || noMatch).source … … 1233 1427 var index = 0; 1234 1428 var source = "__p+='"; 1235 1429 text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { 1236 source += text.slice(index, offset) 1237 .replace(escaper, function(match) { return '\\' + escapes[match]; });1430 source += text.slice(index, offset).replace(escaper, escapeChar); 1431 index = offset + match.length; 1238 1432 1239 1433 if (escape) { 1240 1434 source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; 1241 } 1242 if (interpolate) { 1435 } else if (interpolate) { 1243 1436 source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; 1244 } 1245 if (evaluate) { 1437 } else if (evaluate) { 1246 1438 source += "';\n" + evaluate + "\n__p+='"; 1247 1439 } 1248 index = offset + match.length; 1440 1441 // Adobe VMs need the match returned to produce the correct offest. 1249 1442 return match; 1250 1443 }); 1251 1444 source += "';\n"; … … 1255 1448 1256 1449 source = "var __t,__p='',__j=Array.prototype.join," + 1257 1450 "print=function(){__p+=__j.call(arguments,'');};\n" + 1258 source + "return __p;\n";1451 source + 'return __p;\n'; 1259 1452 1260 1453 try { 1261 render = new Function(settings.variable || 'obj', '_', source);1454 var render = new Function(settings.variable || 'obj', '_', source); 1262 1455 } catch (e) { 1263 1456 e.source = source; 1264 1457 throw e; 1265 1458 } 1266 1459 1267 if (data) return render(data, _);1268 1460 var template = function(data) { 1269 1461 return render.call(this, data, _); 1270 1462 }; 1271 1463 1272 // Provide the compiled function source as a convenience for precompilation. 1273 template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; 1464 // Provide the compiled source as a convenience for precompilation. 1465 var argument = settings.variable || 'obj'; 1466 template.source = 'function(' + argument + '){\n' + source + '}'; 1274 1467 1275 1468 return template; 1276 1469 }; 1277 1470 1278 // Add a "chain" function , which will delegate to the wrapper.1471 // Add a "chain" function. Start chaining a wrapped Underscore object. 1279 1472 _.chain = function(obj) { 1280 return _(obj).chain(); 1473 var instance = _(obj); 1474 instance._chain = true; 1475 return instance; 1281 1476 }; 1282 1477 1283 1478 // OOP … … 1287 1482 // underscore functions. Wrapped objects may be chained. 1288 1483 1289 1484 // Helper function to continue chaining intermediate results. 1290 var result = function( obj) {1291 return this._chain ? _(obj).chain() : obj;1485 var result = function(instance, obj) { 1486 return instance._chain ? _(obj).chain() : obj; 1292 1487 }; 1293 1488 1489 // Add your own custom functions to the Underscore object. 1490 _.mixin = function(obj) { 1491 _.each(_.functions(obj), function(name) { 1492 var func = _[name] = obj[name]; 1493 _.prototype[name] = function() { 1494 var args = [this._wrapped]; 1495 push.apply(args, arguments); 1496 return result(this, func.apply(_, args)); 1497 }; 1498 }); 1499 }; 1500 1294 1501 // Add all of the Underscore functions to the wrapper object. 1295 1502 _.mixin(_); 1296 1503 1297 1504 // Add all mutator Array functions to the wrapper. 1298 each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {1505 _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { 1299 1506 var method = ArrayProto[name]; 1300 1507 _.prototype[name] = function() { 1301 1508 var obj = this._wrapped; 1302 1509 method.apply(obj, arguments); 1303 if ((name == 'shift' || name== 'splice') && obj.length === 0) delete obj[0];1304 return result .call(this, obj);1510 if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; 1511 return result(this, obj); 1305 1512 }; 1306 1513 }); 1307 1514 1308 1515 // Add all accessor Array functions to the wrapper. 1309 each(['concat', 'join', 'slice'], function(name) {1516 _.each(['concat', 'join', 'slice'], function(name) { 1310 1517 var method = ArrayProto[name]; 1311 1518 _.prototype[name] = function() { 1312 return result .call(this, method.apply(this._wrapped, arguments));1519 return result(this, method.apply(this._wrapped, arguments)); 1313 1520 }; 1314 1521 }); 1315 1522 1316 _.extend(_.prototype, { 1523 // Extracts the result from a wrapped and chained object. 1524 _.prototype.value = function() { 1525 return this._wrapped; 1526 }; 1317 1527 1318 // Start chaining a wrapped Underscore object. 1319 chain: function() { 1320 this._chain = true; 1321 return this; 1322 }, 1528 // Provide unwrapping proxy for some methods used in engine operations 1529 // such as arithmetic and JSON stringification. 1530 _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; 1323 1531 1324 // Extracts the result from a wrapped and chained object. 1325 value: function() { 1326 return this._wrapped; 1327 } 1532 _.prototype.toString = function() { 1533 return '' + this._wrapped; 1534 }; 1328 1535 1329 });1330 1331 1536 // AMD registration happens at the end for compatibility with AMD loaders 1332 1537 // that may not enforce next-turn semantics on modules. Even though general 1333 1538 // practice for AMD registration is to be anonymous, underscore registers … … 1340 1545 return _; 1341 1546 }); 1342 1547 } 1343 } ).call(this);1548 }.call(this)); -
src/wp-includes/js/underscore.min.js
1 // Underscore.js 1. 6.01 // Underscore.js 1.8.3 2 2 // http://underscorejs.org 3 // (c) 2009-201 4Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors3 // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 4 4 // Underscore may be freely distributed under the MIT license. 5 (function(){ var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?void(this._wrapped=n):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.6.0";var A=j.each=j.forEach=function(n,t,e){if(null==n)return n;if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return;return n};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var O="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},j.find=j.detect=function(n,t,r){var e;return k(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var k=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:k(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,j.property(t))},j.where=function(n,t){return j.filter(n,j.matches(t))},j.findWhere=function(n,t){return j.find(n,j.matches(t))},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);var e=-1/0,u=-1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;o>u&&(e=n,u=o)}),e},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);var e=1/0,u=1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;u>o&&(e=n,u=o)}),e},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=j.values(n)),n[j.random(n.length-1)]):j.shuffle(n).slice(0,Math.max(0,t))};var E=function(n){return null==n?j.identity:j.isFunction(n)?n:j.property(n)};j.sortBy=function(n,t,r){return t=E(t),j.pluck(j.map(n,function(n,e,u){return{value:n,index:e,criteria:t.call(r,n,e,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=E(r),A(t,function(i,a){var o=r.call(e,i,a,t);n(u,o,i)}),u}};j.groupBy=F(function(n,t,r){j.has(n,t)?n[t].push(r):n[t]=[r]}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=E(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])<u?i=o+1:a=o}return i},j.toArray=function(n){return n?j.isArray(n)?o.call(n):n.length===+n.length?j.map(n,j.identity):j.values(n):[]},j.size=function(n){return null==n?0:n.length===+n.length?n.length:j.keys(n).length},j.first=j.head=j.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.partition=function(n,t){var r=[],e=[];return A(n,function(n){(t(n)?r:e).push(n)}),[r,e]},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.contains(t,n)})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===j&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:j.now(),a=null,i=n.apply(e,u),e=u=null};return function(){var l=j.now();o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u),e=u=null):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o,c=function(){var l=j.now()-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u),i=u=null))};return function(){i=this,u=arguments,a=j.now();var l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u),i=u=null),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return j.partial(t,n)},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=function(n){if(!j.isObject(n))return[];if(w)return w(n);var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o)&&"constructor"in n&&"constructor"in t)return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.constant=function(n){return function(){return n}},j.property=function(n){return function(t){return t[n]}},j.matches=function(n){return function(t){if(t===n)return!0;for(var r in n)if(n[r]!==t[r])return!1;return!0}},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},j.now=Date.now||function(){return(new Date).getTime()};var T={escape:{"&":"&","<":"<",">":">",'"':""","'":"'"}};T.unescape=j.invert(T.escape);var I={escape:new RegExp("["+j.keys(T.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(T.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(I[n],function(t){return T[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}}),"function"==typeof define&&define.amd&&define("underscore",[],function(){return j})}).call(this);5 (function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])<u?i=a+1:o=a}return i},m.indexOf=r(1,m.findIndex,m.sortedIndex),m.lastIndexOf=r(-1,m.findLastIndex),m.range=function(n,t,r){null==t&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e<arguments.length;)i.push(arguments[e++]);return E(n,r,this,this,i)};return r},m.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this);