From 23f1a8225a32e58686a42befe78edd21458a38bc Mon Sep 17 00:00:00 2001 From: Nabeel Shahzad Date: Thu, 3 May 2018 15:07:16 -0500 Subject: [PATCH] update livemap to use rivets.js bindings for data updates --- app/Http/Controllers/Api/PirepController.php | 20 ++ app/Http/Requests/Acars/PositionRequest.php | 1 + app/Http/Requests/Acars/PrefileRequest.php | 1 + app/Http/Resources/Acars.php | 14 +- app/Http/Resources/Pirep.php | 2 + app/Repositories/AcarsRepository.php | 2 +- app/Routes/api.php | 1 + app/Services/DatabaseService.php | 66 ++++--- public/assets/admin/js/app.js | 46 ++++- public/assets/frontend/css/now-ui-kit.css | 186 +++++++++--------- public/assets/frontend/css/styles.css | 10 + public/assets/frontend/js/app.js | 46 ++++- public/assets/installer/css/vendor.css | 186 +++++++++--------- public/assets/installer/js/app.js | 32 ++- public/mix-manifest.json | 14 +- resources/js/bootstrap.js | 2 + resources/js/common.js | 54 +++++ resources/js/maps/live_map.js | 68 +++---- resources/views/layouts/default/app.blade.php | 2 + .../layouts/default/flights/table.blade.php | 4 +- .../default/widgets/live_map.blade.php | 121 ++++++++---- 21 files changed, 557 insertions(+), 321 deletions(-) diff --git a/app/Http/Controllers/Api/PirepController.php b/app/Http/Controllers/Api/PirepController.php index da8db702..b15a3e68 100644 --- a/app/Http/Controllers/Api/PirepController.php +++ b/app/Http/Controllers/Api/PirepController.php @@ -97,6 +97,26 @@ class PirepController extends Controller } } + /** + * Get all the active PIREPs + * @param $id + * @return PirepResource + */ + public function index() + { + $active = []; + $pireps = $this->acarsRepo->getPositions(); + foreach($pireps as $pirep) { + if(\count($pirep->position) === 0) { + continue; + } + + $active[] = $pirep; + } + + return PirepResource::collection(collect($active)); + } + /** * @param $id * @return PirepResource diff --git a/app/Http/Requests/Acars/PositionRequest.php b/app/Http/Requests/Acars/PositionRequest.php index da800e7c..736d57ff 100644 --- a/app/Http/Requests/Acars/PositionRequest.php +++ b/app/Http/Requests/Acars/PositionRequest.php @@ -25,6 +25,7 @@ class PositionRequest extends FormRequest 'positions' => 'required|array', 'positions.*.lat' => 'required|numeric', 'positions.*.lon' => 'required|numeric', + 'positions.*.status' => 'nullable', 'positions.*.altitude' => 'nullable|numeric', 'positions.*.heading' => 'nullable|numeric|between:0,360', 'positions.*.vs' => 'nullable', diff --git a/app/Http/Requests/Acars/PrefileRequest.php b/app/Http/Requests/Acars/PrefileRequest.php index 2dce7e14..d01f9313 100644 --- a/app/Http/Requests/Acars/PrefileRequest.php +++ b/app/Http/Requests/Acars/PrefileRequest.php @@ -25,6 +25,7 @@ class PrefileRequest extends FormRequest 'arr_airport_id' => 'required', 'source_name' => 'required', + 'status' => 'nullable', 'level' => 'nullable|numeric', 'flight_type' => 'nullable', 'route_code' => 'nullable', diff --git a/app/Http/Resources/Acars.php b/app/Http/Resources/Acars.php index 4be289af..12b17ff0 100644 --- a/app/Http/Resources/Acars.php +++ b/app/Http/Resources/Acars.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; +use App\Support\Units\Distance; +use App\Support\Units\Fuel; use Illuminate\Http\Resources\Json\Resource; class Acars extends Resource @@ -14,6 +16,16 @@ class Acars extends Resource */ public function toArray($request) { - return parent::toArray($request); + $obj = parent::toArray($request); + + if ($this->distance instanceof Distance) { + $obj['distance'] = $this->distance->units; + } + + if ($this->fuel instanceof Fuel) { + $obj['fuel'] = $this->fuel->units; + } + + return $obj; } } diff --git a/app/Http/Resources/Pirep.php b/app/Http/Resources/Pirep.php index 1aa99a18..cd43304e 100644 --- a/app/Http/Resources/Pirep.php +++ b/app/Http/Resources/Pirep.php @@ -19,6 +19,8 @@ class Pirep extends Resource { $pirep = parent::toArray($request); + $pirep['ident'] = $this->ident; + if ($this->distance instanceof Distance) { $pirep['distance'] = $this->distance->units; } diff --git a/app/Repositories/AcarsRepository.php b/app/Repositories/AcarsRepository.php index ad8dd7ed..126665b8 100644 --- a/app/Repositories/AcarsRepository.php +++ b/app/Repositories/AcarsRepository.php @@ -55,7 +55,7 @@ class AcarsRepository extends Repository */ public function getPositions() { - return Pirep::with(['airline', 'position']) + return Pirep::with(['airline', 'position', 'aircraft']) ->where(['state' => PirepState::IN_PROGRESS]) ->get(); } diff --git a/app/Routes/api.php b/app/Routes/api.php index 1509416b..e266a9ff 100755 --- a/app/Routes/api.php +++ b/app/Routes/api.php @@ -5,6 +5,7 @@ */ Route::group([], function () { Route::get('acars', 'AcarsController@index'); + Route::get('pireps', 'PirepController@index'); Route::get('pireps/{pirep_id}', 'PirepController@get'); Route::get('pireps/{pirep_id}/acars/geojson', 'PirepController@acars_geojson'); diff --git a/app/Services/DatabaseService.php b/app/Services/DatabaseService.php index 49a102eb..c3c4ae3e 100644 --- a/app/Services/DatabaseService.php +++ b/app/Services/DatabaseService.php @@ -31,7 +31,7 @@ class DatabaseService extends Service */ protected function time(): string { - return Carbon::now('UTC')->format('Y-m-d H:i:s'); + return Carbon::now('UTC'); //->format('Y-m-d H:i:s'); } /** @@ -43,7 +43,6 @@ class DatabaseService extends Service public function seed_from_yaml_file($yaml_file, $ignore_errors = false): array { $yml = file_get_contents($yaml_file); - return $this->seed_from_yaml($yml, $ignore_errors); } @@ -61,39 +60,56 @@ class DatabaseService extends Service $imported[$table] = 0; foreach ($rows as $row) { - # see if this table uses a UUID as the PK - # if no ID is specified - if (in_array($table, $this->uuid_tables)) { - if (!array_key_exists('id', $row)) { - $row['id'] = Uuid::generate()->string; - } - } - - # encrypt any password fields - if (array_key_exists('password', $row)) { - $row['password'] = bcrypt($row['password']); - } - - # if any time fields are == to "now", then insert the right time - foreach ($this->time_fields as $tf) { - if (array_key_exists($tf, $row) && strtolower($row[$tf]) === 'now') { - $row[$tf] = $this->time(); - } - } - try { - DB::table($table)->insert($row); - ++$imported[$table]; - } catch (QueryException $e) { + $row = $this->insert_row($table, $row); + } catch(QueryException $e) { if ($ignore_errors) { continue; } throw $e; } + + ++$imported[$table]; } } return $imported; } + + /** + * @param $table + * @param $row + * @return mixed + * @throws \Exception + */ + public function insert_row($table, $row) { + # see if this table uses a UUID as the PK + # if no ID is specified + if (\in_array($table, $this->uuid_tables, true)) { + if (!array_key_exists('id', $row)) { + $row['id'] = Uuid::generate()->string; + } + } + + # encrypt any password fields + if (array_key_exists('password', $row)) { + $row['password'] = bcrypt($row['password']); + } + + # if any time fields are == to "now", then insert the right time + foreach($row as $column => $value) { + if(strtolower($value) === 'now') { + $row[$column] = $this->time(); + } + } + + try { + DB::table($table)->insert($row); + } catch (QueryException $e) { + throw $e; + } + + return $row; + } } diff --git a/public/assets/admin/js/app.js b/public/assets/admin/js/app.js index ec30596b..26e31b03 100644 --- a/public/assets/admin/js/app.js +++ b/public/assets/admin/js/app.js @@ -300,17 +300,45 @@ eval("// shim for using process in browser\nvar process = module.exports = {};\n /***/ }), +/***/ "./node_modules/rivets/dist/rivets.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Rivets.js\n// version: 0.9.6\n// author: Michael Richards\n// license: MIT\n(function() {\n var Rivets, bindMethod, jQuery, unbindMethod, _ref,\n __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n __slice = [].slice,\n __hasProp = {}.hasOwnProperty,\n __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n Rivets = {\n options: ['prefix', 'templateDelimiters', 'rootInterface', 'preloadData', 'handler', 'executeFunctions'],\n extensions: ['binders', 'formatters', 'components', 'adapters'],\n \"public\": {\n binders: {},\n components: {},\n formatters: {},\n adapters: {},\n prefix: 'rv',\n templateDelimiters: ['{', '}'],\n rootInterface: '.',\n preloadData: true,\n executeFunctions: false,\n iterationAlias: function(modelName) {\n return '%' + modelName + '%';\n },\n handler: function(context, ev, binding) {\n return this.call(context, ev, binding.view.models);\n },\n configure: function(options) {\n var descriptor, key, option, value;\n if (options == null) {\n options = {};\n }\n for (option in options) {\n value = options[option];\n if (option === 'binders' || option === 'components' || option === 'formatters' || option === 'adapters') {\n for (key in value) {\n descriptor = value[key];\n Rivets[option][key] = descriptor;\n }\n } else {\n Rivets[\"public\"][option] = value;\n }\n }\n },\n bind: function(el, models, options) {\n var view;\n if (models == null) {\n models = {};\n }\n if (options == null) {\n options = {};\n }\n view = new Rivets.View(el, models, options);\n view.bind();\n return view;\n },\n init: function(component, el, data) {\n var scope, template, view;\n if (data == null) {\n data = {};\n }\n if (el == null) {\n el = document.createElement('div');\n }\n component = Rivets[\"public\"].components[component];\n template = component.template.call(this, el);\n if (template instanceof HTMLElement) {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n el.appendChild(template);\n } else {\n el.innerHTML = template;\n }\n scope = component.initialize.call(this, el, data);\n view = new Rivets.View(el, scope);\n view.bind();\n return view;\n }\n }\n };\n\n if (window['jQuery'] || window['$']) {\n jQuery = window['jQuery'] || window['$'];\n _ref = 'on' in jQuery.prototype ? ['on', 'off'] : ['bind', 'unbind'], bindMethod = _ref[0], unbindMethod = _ref[1];\n Rivets.Util = {\n bindEvent: function(el, event, handler) {\n return jQuery(el)[bindMethod](event, handler);\n },\n unbindEvent: function(el, event, handler) {\n return jQuery(el)[unbindMethod](event, handler);\n },\n getInputValue: function(el) {\n var $el;\n $el = jQuery(el);\n if ($el.attr('type') === 'checkbox') {\n return $el.is(':checked');\n } else {\n return $el.val();\n }\n }\n };\n } else {\n Rivets.Util = {\n bindEvent: (function() {\n if ('addEventListener' in window) {\n return function(el, event, handler) {\n return el.addEventListener(event, handler, false);\n };\n }\n return function(el, event, handler) {\n return el.attachEvent('on' + event, handler);\n };\n })(),\n unbindEvent: (function() {\n if ('removeEventListener' in window) {\n return function(el, event, handler) {\n return el.removeEventListener(event, handler, false);\n };\n }\n return function(el, event, handler) {\n return el.detachEvent('on' + event, handler);\n };\n })(),\n getInputValue: function(el) {\n var o, _i, _len, _results;\n if (el.type === 'checkbox') {\n return el.checked;\n } else if (el.type === 'select-multiple') {\n _results = [];\n for (_i = 0, _len = el.length; _i < _len; _i++) {\n o = el[_i];\n if (o.selected) {\n _results.push(o.value);\n }\n }\n return _results;\n } else {\n return el.value;\n }\n }\n };\n }\n\n Rivets.TypeParser = (function() {\n function TypeParser() {}\n\n TypeParser.types = {\n primitive: 0,\n keypath: 1\n };\n\n TypeParser.parse = function(string) {\n if (/^'.*'$|^\".*\"$/.test(string)) {\n return {\n type: this.types.primitive,\n value: string.slice(1, -1)\n };\n } else if (string === 'true') {\n return {\n type: this.types.primitive,\n value: true\n };\n } else if (string === 'false') {\n return {\n type: this.types.primitive,\n value: false\n };\n } else if (string === 'null') {\n return {\n type: this.types.primitive,\n value: null\n };\n } else if (string === 'undefined') {\n return {\n type: this.types.primitive,\n value: void 0\n };\n } else if (string === '') {\n return {\n type: this.types.primitive,\n value: void 0\n };\n } else if (isNaN(Number(string)) === false) {\n return {\n type: this.types.primitive,\n value: Number(string)\n };\n } else {\n return {\n type: this.types.keypath,\n value: string\n };\n }\n };\n\n return TypeParser;\n\n })();\n\n Rivets.TextTemplateParser = (function() {\n function TextTemplateParser() {}\n\n TextTemplateParser.types = {\n text: 0,\n binding: 1\n };\n\n TextTemplateParser.parse = function(template, delimiters) {\n var index, lastIndex, lastToken, length, substring, tokens, value;\n tokens = [];\n length = template.length;\n index = 0;\n lastIndex = 0;\n while (lastIndex < length) {\n index = template.indexOf(delimiters[0], lastIndex);\n if (index < 0) {\n tokens.push({\n type: this.types.text,\n value: template.slice(lastIndex)\n });\n break;\n } else {\n if (index > 0 && lastIndex < index) {\n tokens.push({\n type: this.types.text,\n value: template.slice(lastIndex, index)\n });\n }\n lastIndex = index + delimiters[0].length;\n index = template.indexOf(delimiters[1], lastIndex);\n if (index < 0) {\n substring = template.slice(lastIndex - delimiters[1].length);\n lastToken = tokens[tokens.length - 1];\n if ((lastToken != null ? lastToken.type : void 0) === this.types.text) {\n lastToken.value += substring;\n } else {\n tokens.push({\n type: this.types.text,\n value: substring\n });\n }\n break;\n }\n value = template.slice(lastIndex, index).trim();\n tokens.push({\n type: this.types.binding,\n value: value\n });\n lastIndex = index + delimiters[1].length;\n }\n }\n return tokens;\n };\n\n return TextTemplateParser;\n\n })();\n\n Rivets.View = (function() {\n function View(els, models, options) {\n var k, option, v, _base, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5;\n this.els = els;\n this.models = models;\n if (options == null) {\n options = {};\n }\n this.update = __bind(this.update, this);\n this.publish = __bind(this.publish, this);\n this.sync = __bind(this.sync, this);\n this.unbind = __bind(this.unbind, this);\n this.bind = __bind(this.bind, this);\n this.select = __bind(this.select, this);\n this.traverse = __bind(this.traverse, this);\n this.build = __bind(this.build, this);\n this.buildBinding = __bind(this.buildBinding, this);\n this.bindingRegExp = __bind(this.bindingRegExp, this);\n this.options = __bind(this.options, this);\n if (!(this.els.jquery || this.els instanceof Array)) {\n this.els = [this.els];\n }\n _ref1 = Rivets.extensions;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n option = _ref1[_i];\n this[option] = {};\n if (options[option]) {\n _ref2 = options[option];\n for (k in _ref2) {\n v = _ref2[k];\n this[option][k] = v;\n }\n }\n _ref3 = Rivets[\"public\"][option];\n for (k in _ref3) {\n v = _ref3[k];\n if ((_base = this[option])[k] == null) {\n _base[k] = v;\n }\n }\n }\n _ref4 = Rivets.options;\n for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) {\n option = _ref4[_j];\n this[option] = (_ref5 = options[option]) != null ? _ref5 : Rivets[\"public\"][option];\n }\n this.build();\n }\n\n View.prototype.options = function() {\n var option, options, _i, _len, _ref1;\n options = {};\n _ref1 = Rivets.extensions.concat(Rivets.options);\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n option = _ref1[_i];\n options[option] = this[option];\n }\n return options;\n };\n\n View.prototype.bindingRegExp = function() {\n return new RegExp(\"^\" + this.prefix + \"-\");\n };\n\n View.prototype.buildBinding = function(binding, node, type, declaration) {\n var context, ctx, dependencies, keypath, options, pipe, pipes;\n options = {};\n pipes = (function() {\n var _i, _len, _ref1, _results;\n _ref1 = declaration.match(/((?:'[^']*')*(?:(?:[^\\|']*(?:'[^']*')+[^\\|']*)+|[^\\|]+))|^$/g);\n _results = [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n pipe = _ref1[_i];\n _results.push(pipe.trim());\n }\n return _results;\n })();\n context = (function() {\n var _i, _len, _ref1, _results;\n _ref1 = pipes.shift().split('<');\n _results = [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n ctx = _ref1[_i];\n _results.push(ctx.trim());\n }\n return _results;\n })();\n keypath = context.shift();\n options.formatters = pipes;\n if (dependencies = context.shift()) {\n options.dependencies = dependencies.split(/\\s+/);\n }\n return this.bindings.push(new Rivets[binding](this, node, type, keypath, options));\n };\n\n View.prototype.build = function() {\n var el, parse, _i, _len, _ref1;\n this.bindings = [];\n parse = (function(_this) {\n return function(node) {\n var block, childNode, delimiters, n, parser, text, token, tokens, _i, _j, _len, _len1, _ref1;\n if (node.nodeType === 3) {\n parser = Rivets.TextTemplateParser;\n if (delimiters = _this.templateDelimiters) {\n if ((tokens = parser.parse(node.data, delimiters)).length) {\n if (!(tokens.length === 1 && tokens[0].type === parser.types.text)) {\n for (_i = 0, _len = tokens.length; _i < _len; _i++) {\n token = tokens[_i];\n text = document.createTextNode(token.value);\n node.parentNode.insertBefore(text, node);\n if (token.type === 1) {\n _this.buildBinding('TextBinding', text, null, token.value);\n }\n }\n node.parentNode.removeChild(node);\n }\n }\n }\n } else if (node.nodeType === 1) {\n block = _this.traverse(node);\n }\n if (!block) {\n _ref1 = (function() {\n var _k, _len1, _ref1, _results;\n _ref1 = node.childNodes;\n _results = [];\n for (_k = 0, _len1 = _ref1.length; _k < _len1; _k++) {\n n = _ref1[_k];\n _results.push(n);\n }\n return _results;\n })();\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n childNode = _ref1[_j];\n parse(childNode);\n }\n }\n };\n })(this);\n _ref1 = this.els;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n el = _ref1[_i];\n parse(el);\n }\n this.bindings.sort(function(a, b) {\n var _ref2, _ref3;\n return (((_ref2 = b.binder) != null ? _ref2.priority : void 0) || 0) - (((_ref3 = a.binder) != null ? _ref3.priority : void 0) || 0);\n });\n };\n\n View.prototype.traverse = function(node) {\n var attribute, attributes, binder, bindingRegExp, block, identifier, regexp, type, value, _i, _j, _len, _len1, _ref1, _ref2, _ref3;\n bindingRegExp = this.bindingRegExp();\n block = node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE';\n _ref1 = node.attributes;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n attribute = _ref1[_i];\n if (bindingRegExp.test(attribute.name)) {\n type = attribute.name.replace(bindingRegExp, '');\n if (!(binder = this.binders[type])) {\n _ref2 = this.binders;\n for (identifier in _ref2) {\n value = _ref2[identifier];\n if (identifier !== '*' && identifier.indexOf('*') !== -1) {\n regexp = new RegExp(\"^\" + (identifier.replace(/\\*/g, '.+')) + \"$\");\n if (regexp.test(type)) {\n binder = value;\n }\n }\n }\n }\n binder || (binder = this.binders['*']);\n if (binder.block) {\n block = true;\n attributes = [attribute];\n }\n }\n }\n _ref3 = attributes || node.attributes;\n for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {\n attribute = _ref3[_j];\n if (bindingRegExp.test(attribute.name)) {\n type = attribute.name.replace(bindingRegExp, '');\n this.buildBinding('Binding', node, type, attribute.value);\n }\n }\n if (!block) {\n type = node.nodeName.toLowerCase();\n if (this.components[type] && !node._bound) {\n this.bindings.push(new Rivets.ComponentBinding(this, node, type));\n block = true;\n }\n }\n return block;\n };\n\n View.prototype.select = function(fn) {\n var binding, _i, _len, _ref1, _results;\n _ref1 = this.bindings;\n _results = [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n if (fn(binding)) {\n _results.push(binding);\n }\n }\n return _results;\n };\n\n View.prototype.bind = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n binding.bind();\n }\n };\n\n View.prototype.unbind = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n binding.unbind();\n }\n };\n\n View.prototype.sync = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n if (typeof binding.sync === \"function\") {\n binding.sync();\n }\n }\n };\n\n View.prototype.publish = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.select(function(b) {\n var _ref1;\n return (_ref1 = b.binder) != null ? _ref1.publishes : void 0;\n });\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n binding.publish();\n }\n };\n\n View.prototype.update = function(models) {\n var binding, key, model, _i, _len, _ref1;\n if (models == null) {\n models = {};\n }\n for (key in models) {\n model = models[key];\n this.models[key] = model;\n }\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n if (typeof binding.update === \"function\") {\n binding.update(models);\n }\n }\n };\n\n return View;\n\n })();\n\n Rivets.Binding = (function() {\n function Binding(view, el, type, keypath, options) {\n this.view = view;\n this.el = el;\n this.type = type;\n this.keypath = keypath;\n this.options = options != null ? options : {};\n this.getValue = __bind(this.getValue, this);\n this.update = __bind(this.update, this);\n this.unbind = __bind(this.unbind, this);\n this.bind = __bind(this.bind, this);\n this.publish = __bind(this.publish, this);\n this.sync = __bind(this.sync, this);\n this.set = __bind(this.set, this);\n this.eventHandler = __bind(this.eventHandler, this);\n this.formattedValue = __bind(this.formattedValue, this);\n this.parseFormatterArguments = __bind(this.parseFormatterArguments, this);\n this.parseTarget = __bind(this.parseTarget, this);\n this.observe = __bind(this.observe, this);\n this.setBinder = __bind(this.setBinder, this);\n this.formatters = this.options.formatters || [];\n this.dependencies = [];\n this.formatterObservers = {};\n this.model = void 0;\n this.setBinder();\n }\n\n Binding.prototype.setBinder = function() {\n var identifier, regexp, value, _ref1;\n if (!(this.binder = this.view.binders[this.type])) {\n _ref1 = this.view.binders;\n for (identifier in _ref1) {\n value = _ref1[identifier];\n if (identifier !== '*' && identifier.indexOf('*') !== -1) {\n regexp = new RegExp(\"^\" + (identifier.replace(/\\*/g, '.+')) + \"$\");\n if (regexp.test(this.type)) {\n this.binder = value;\n this.args = new RegExp(\"^\" + (identifier.replace(/\\*/g, '(.+)')) + \"$\").exec(this.type);\n this.args.shift();\n }\n }\n }\n }\n this.binder || (this.binder = this.view.binders['*']);\n if (this.binder instanceof Function) {\n return this.binder = {\n routine: this.binder\n };\n }\n };\n\n Binding.prototype.observe = function(obj, keypath, callback) {\n return Rivets.sightglass(obj, keypath, callback, {\n root: this.view.rootInterface,\n adapters: this.view.adapters\n });\n };\n\n Binding.prototype.parseTarget = function() {\n var token;\n token = Rivets.TypeParser.parse(this.keypath);\n if (token.type === Rivets.TypeParser.types.primitive) {\n return this.value = token.value;\n } else {\n this.observer = this.observe(this.view.models, this.keypath, this.sync);\n return this.model = this.observer.target;\n }\n };\n\n Binding.prototype.parseFormatterArguments = function(args, formatterIndex) {\n var ai, arg, observer, processedArgs, _base, _i, _len;\n args = (function() {\n var _i, _len, _results;\n _results = [];\n for (_i = 0, _len = args.length; _i < _len; _i++) {\n arg = args[_i];\n _results.push(Rivets.TypeParser.parse(arg));\n }\n return _results;\n })();\n processedArgs = [];\n for (ai = _i = 0, _len = args.length; _i < _len; ai = ++_i) {\n arg = args[ai];\n processedArgs.push(arg.type === Rivets.TypeParser.types.primitive ? arg.value : ((_base = this.formatterObservers)[formatterIndex] || (_base[formatterIndex] = {}), !(observer = this.formatterObservers[formatterIndex][ai]) ? (observer = this.observe(this.view.models, arg.value, this.sync), this.formatterObservers[formatterIndex][ai] = observer) : void 0, observer.value()));\n }\n return processedArgs;\n };\n\n Binding.prototype.formattedValue = function(value) {\n var args, fi, formatter, id, processedArgs, _i, _len, _ref1, _ref2;\n _ref1 = this.formatters;\n for (fi = _i = 0, _len = _ref1.length; _i < _len; fi = ++_i) {\n formatter = _ref1[fi];\n args = formatter.match(/[^\\s']+|'([^']|'[^\\s])*'|\"([^\"]|\"[^\\s])*\"/g);\n id = args.shift();\n formatter = this.view.formatters[id];\n processedArgs = this.parseFormatterArguments(args, fi);\n if ((formatter != null ? formatter.read : void 0) instanceof Function) {\n value = (_ref2 = formatter.read).call.apply(_ref2, [this.model, value].concat(__slice.call(processedArgs)));\n } else if (formatter instanceof Function) {\n value = formatter.call.apply(formatter, [this.model, value].concat(__slice.call(processedArgs)));\n }\n }\n return value;\n };\n\n Binding.prototype.eventHandler = function(fn) {\n var binding, handler;\n handler = (binding = this).view.handler;\n return function(ev) {\n return handler.call(fn, this, ev, binding);\n };\n };\n\n Binding.prototype.set = function(value) {\n var _ref1;\n value = value instanceof Function && !this.binder[\"function\"] && Rivets[\"public\"].executeFunctions ? this.formattedValue(value.call(this.model)) : this.formattedValue(value);\n return (_ref1 = this.binder.routine) != null ? _ref1.call(this, this.el, value) : void 0;\n };\n\n Binding.prototype.sync = function() {\n var dependency, observer;\n return this.set((function() {\n var _i, _j, _len, _len1, _ref1, _ref2, _ref3;\n if (this.observer) {\n if (this.model !== this.observer.target) {\n _ref1 = this.dependencies;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n observer = _ref1[_i];\n observer.unobserve();\n }\n this.dependencies = [];\n if (((this.model = this.observer.target) != null) && ((_ref2 = this.options.dependencies) != null ? _ref2.length : void 0)) {\n _ref3 = this.options.dependencies;\n for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {\n dependency = _ref3[_j];\n observer = this.observe(this.model, dependency, this.sync);\n this.dependencies.push(observer);\n }\n }\n }\n return this.observer.value();\n } else {\n return this.value;\n }\n }).call(this));\n };\n\n Binding.prototype.publish = function() {\n var args, fi, fiReversed, formatter, id, lastformatterIndex, processedArgs, value, _i, _len, _ref1, _ref2, _ref3;\n if (this.observer) {\n value = this.getValue(this.el);\n lastformatterIndex = this.formatters.length - 1;\n _ref1 = this.formatters.slice(0).reverse();\n for (fiReversed = _i = 0, _len = _ref1.length; _i < _len; fiReversed = ++_i) {\n formatter = _ref1[fiReversed];\n fi = lastformatterIndex - fiReversed;\n args = formatter.split(/\\s+/);\n id = args.shift();\n processedArgs = this.parseFormatterArguments(args, fi);\n if ((_ref2 = this.view.formatters[id]) != null ? _ref2.publish : void 0) {\n value = (_ref3 = this.view.formatters[id]).publish.apply(_ref3, [value].concat(__slice.call(processedArgs)));\n }\n }\n return this.observer.setValue(value);\n }\n };\n\n Binding.prototype.bind = function() {\n var dependency, observer, _i, _len, _ref1, _ref2, _ref3;\n this.parseTarget();\n if ((_ref1 = this.binder.bind) != null) {\n _ref1.call(this, this.el);\n }\n if ((this.model != null) && ((_ref2 = this.options.dependencies) != null ? _ref2.length : void 0)) {\n _ref3 = this.options.dependencies;\n for (_i = 0, _len = _ref3.length; _i < _len; _i++) {\n dependency = _ref3[_i];\n observer = this.observe(this.model, dependency, this.sync);\n this.dependencies.push(observer);\n }\n }\n if (this.view.preloadData) {\n return this.sync();\n }\n };\n\n Binding.prototype.unbind = function() {\n var ai, args, fi, observer, _i, _len, _ref1, _ref2, _ref3, _ref4;\n if ((_ref1 = this.binder.unbind) != null) {\n _ref1.call(this, this.el);\n }\n if ((_ref2 = this.observer) != null) {\n _ref2.unobserve();\n }\n _ref3 = this.dependencies;\n for (_i = 0, _len = _ref3.length; _i < _len; _i++) {\n observer = _ref3[_i];\n observer.unobserve();\n }\n this.dependencies = [];\n _ref4 = this.formatterObservers;\n for (fi in _ref4) {\n args = _ref4[fi];\n for (ai in args) {\n observer = args[ai];\n observer.unobserve();\n }\n }\n return this.formatterObservers = {};\n };\n\n Binding.prototype.update = function(models) {\n var _ref1, _ref2;\n if (models == null) {\n models = {};\n }\n this.model = (_ref1 = this.observer) != null ? _ref1.target : void 0;\n return (_ref2 = this.binder.update) != null ? _ref2.call(this, models) : void 0;\n };\n\n Binding.prototype.getValue = function(el) {\n if (this.binder && (this.binder.getValue != null)) {\n return this.binder.getValue.call(this, el);\n } else {\n return Rivets.Util.getInputValue(el);\n }\n };\n\n return Binding;\n\n })();\n\n Rivets.ComponentBinding = (function(_super) {\n __extends(ComponentBinding, _super);\n\n function ComponentBinding(view, el, type) {\n var attribute, bindingRegExp, propertyName, token, _i, _len, _ref1, _ref2;\n this.view = view;\n this.el = el;\n this.type = type;\n this.unbind = __bind(this.unbind, this);\n this.bind = __bind(this.bind, this);\n this.locals = __bind(this.locals, this);\n this.component = this.view.components[this.type];\n this[\"static\"] = {};\n this.observers = {};\n this.upstreamObservers = {};\n bindingRegExp = view.bindingRegExp();\n _ref1 = this.el.attributes || [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n attribute = _ref1[_i];\n if (!bindingRegExp.test(attribute.name)) {\n propertyName = this.camelCase(attribute.name);\n token = Rivets.TypeParser.parse(attribute.value);\n if (__indexOf.call((_ref2 = this.component[\"static\"]) != null ? _ref2 : [], propertyName) >= 0) {\n this[\"static\"][propertyName] = attribute.value;\n } else if (token.type === Rivets.TypeParser.types.primitive) {\n this[\"static\"][propertyName] = token.value;\n } else {\n this.observers[propertyName] = attribute.value;\n }\n }\n }\n }\n\n ComponentBinding.prototype.sync = function() {};\n\n ComponentBinding.prototype.update = function() {};\n\n ComponentBinding.prototype.publish = function() {};\n\n ComponentBinding.prototype.locals = function() {\n var key, observer, result, value, _ref1, _ref2;\n result = {};\n _ref1 = this[\"static\"];\n for (key in _ref1) {\n value = _ref1[key];\n result[key] = value;\n }\n _ref2 = this.observers;\n for (key in _ref2) {\n observer = _ref2[key];\n result[key] = observer.value();\n }\n return result;\n };\n\n ComponentBinding.prototype.camelCase = function(string) {\n return string.replace(/-([a-z])/g, function(grouped) {\n return grouped[1].toUpperCase();\n });\n };\n\n ComponentBinding.prototype.bind = function() {\n var k, key, keypath, observer, option, options, scope, v, _base, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7;\n if (!this.bound) {\n _ref1 = this.observers;\n for (key in _ref1) {\n keypath = _ref1[key];\n this.observers[key] = this.observe(this.view.models, keypath, ((function(_this) {\n return function(key) {\n return function() {\n return _this.componentView.models[key] = _this.observers[key].value();\n };\n };\n })(this)).call(this, key));\n }\n this.bound = true;\n }\n if (this.componentView != null) {\n this.componentView.bind();\n } else {\n this.el.innerHTML = this.component.template.call(this);\n scope = this.component.initialize.call(this, this.el, this.locals());\n this.el._bound = true;\n options = {};\n _ref2 = Rivets.extensions;\n for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n option = _ref2[_i];\n options[option] = {};\n if (this.component[option]) {\n _ref3 = this.component[option];\n for (k in _ref3) {\n v = _ref3[k];\n options[option][k] = v;\n }\n }\n _ref4 = this.view[option];\n for (k in _ref4) {\n v = _ref4[k];\n if ((_base = options[option])[k] == null) {\n _base[k] = v;\n }\n }\n }\n _ref5 = Rivets.options;\n for (_j = 0, _len1 = _ref5.length; _j < _len1; _j++) {\n option = _ref5[_j];\n options[option] = (_ref6 = this.component[option]) != null ? _ref6 : this.view[option];\n }\n this.componentView = new Rivets.View(Array.prototype.slice.call(this.el.childNodes), scope, options);\n this.componentView.bind();\n _ref7 = this.observers;\n for (key in _ref7) {\n observer = _ref7[key];\n this.upstreamObservers[key] = this.observe(this.componentView.models, key, ((function(_this) {\n return function(key, observer) {\n return function() {\n return observer.setValue(_this.componentView.models[key]);\n };\n };\n })(this)).call(this, key, observer));\n }\n }\n };\n\n ComponentBinding.prototype.unbind = function() {\n var key, observer, _ref1, _ref2, _ref3;\n _ref1 = this.upstreamObservers;\n for (key in _ref1) {\n observer = _ref1[key];\n observer.unobserve();\n }\n _ref2 = this.observers;\n for (key in _ref2) {\n observer = _ref2[key];\n observer.unobserve();\n }\n return (_ref3 = this.componentView) != null ? _ref3.unbind.call(this) : void 0;\n };\n\n return ComponentBinding;\n\n })(Rivets.Binding);\n\n Rivets.TextBinding = (function(_super) {\n __extends(TextBinding, _super);\n\n function TextBinding(view, el, type, keypath, options) {\n this.view = view;\n this.el = el;\n this.type = type;\n this.keypath = keypath;\n this.options = options != null ? options : {};\n this.sync = __bind(this.sync, this);\n this.formatters = this.options.formatters || [];\n this.dependencies = [];\n this.formatterObservers = {};\n }\n\n TextBinding.prototype.binder = {\n routine: function(node, value) {\n return node.data = value != null ? value : '';\n }\n };\n\n TextBinding.prototype.sync = function() {\n return TextBinding.__super__.sync.apply(this, arguments);\n };\n\n return TextBinding;\n\n })(Rivets.Binding);\n\n Rivets[\"public\"].binders.text = function(el, value) {\n if (el.textContent != null) {\n return el.textContent = value != null ? value : '';\n } else {\n return el.innerText = value != null ? value : '';\n }\n };\n\n Rivets[\"public\"].binders.html = function(el, value) {\n return el.innerHTML = value != null ? value : '';\n };\n\n Rivets[\"public\"].binders.show = function(el, value) {\n return el.style.display = value ? '' : 'none';\n };\n\n Rivets[\"public\"].binders.hide = function(el, value) {\n return el.style.display = value ? 'none' : '';\n };\n\n Rivets[\"public\"].binders.enabled = function(el, value) {\n return el.disabled = !value;\n };\n\n Rivets[\"public\"].binders.disabled = function(el, value) {\n return el.disabled = !!value;\n };\n\n Rivets[\"public\"].binders.checked = {\n publishes: true,\n priority: 2000,\n bind: function(el) {\n return Rivets.Util.bindEvent(el, 'change', this.publish);\n },\n unbind: function(el) {\n return Rivets.Util.unbindEvent(el, 'change', this.publish);\n },\n routine: function(el, value) {\n var _ref1;\n if (el.type === 'radio') {\n return el.checked = ((_ref1 = el.value) != null ? _ref1.toString() : void 0) === (value != null ? value.toString() : void 0);\n } else {\n return el.checked = !!value;\n }\n }\n };\n\n Rivets[\"public\"].binders.unchecked = {\n publishes: true,\n priority: 2000,\n bind: function(el) {\n return Rivets.Util.bindEvent(el, 'change', this.publish);\n },\n unbind: function(el) {\n return Rivets.Util.unbindEvent(el, 'change', this.publish);\n },\n routine: function(el, value) {\n var _ref1;\n if (el.type === 'radio') {\n return el.checked = ((_ref1 = el.value) != null ? _ref1.toString() : void 0) !== (value != null ? value.toString() : void 0);\n } else {\n return el.checked = !value;\n }\n }\n };\n\n Rivets[\"public\"].binders.value = {\n publishes: true,\n priority: 3000,\n bind: function(el) {\n if (!(el.tagName === 'INPUT' && el.type === 'radio')) {\n this.event = el.tagName === 'SELECT' ? 'change' : 'input';\n return Rivets.Util.bindEvent(el, this.event, this.publish);\n }\n },\n unbind: function(el) {\n if (!(el.tagName === 'INPUT' && el.type === 'radio')) {\n return Rivets.Util.unbindEvent(el, this.event, this.publish);\n }\n },\n routine: function(el, value) {\n var o, _i, _len, _ref1, _ref2, _ref3, _results;\n if (el.tagName === 'INPUT' && el.type === 'radio') {\n return el.setAttribute('value', value);\n } else if (window.jQuery != null) {\n el = jQuery(el);\n if ((value != null ? value.toString() : void 0) !== ((_ref1 = el.val()) != null ? _ref1.toString() : void 0)) {\n return el.val(value != null ? value : '');\n }\n } else {\n if (el.type === 'select-multiple') {\n if (value != null) {\n _results = [];\n for (_i = 0, _len = el.length; _i < _len; _i++) {\n o = el[_i];\n _results.push(o.selected = (_ref2 = o.value, __indexOf.call(value, _ref2) >= 0));\n }\n return _results;\n }\n } else if ((value != null ? value.toString() : void 0) !== ((_ref3 = el.value) != null ? _ref3.toString() : void 0)) {\n return el.value = value != null ? value : '';\n }\n }\n }\n };\n\n Rivets[\"public\"].binders[\"if\"] = {\n block: true,\n priority: 4000,\n bind: function(el) {\n var attr, declaration;\n if (this.marker == null) {\n attr = [this.view.prefix, this.type].join('-').replace('--', '-');\n declaration = el.getAttribute(attr);\n this.marker = document.createComment(\" rivets: \" + this.type + \" \" + declaration + \" \");\n this.bound = false;\n el.removeAttribute(attr);\n el.parentNode.insertBefore(this.marker, el);\n return el.parentNode.removeChild(el);\n }\n },\n unbind: function() {\n if (this.nested) {\n this.nested.unbind();\n return this.bound = false;\n }\n },\n routine: function(el, value) {\n var key, model, models, _ref1;\n if (!!value === !this.bound) {\n if (value) {\n models = {};\n _ref1 = this.view.models;\n for (key in _ref1) {\n model = _ref1[key];\n models[key] = model;\n }\n (this.nested || (this.nested = new Rivets.View(el, models, this.view.options()))).bind();\n this.marker.parentNode.insertBefore(el, this.marker.nextSibling);\n return this.bound = true;\n } else {\n el.parentNode.removeChild(el);\n this.nested.unbind();\n return this.bound = false;\n }\n }\n },\n update: function(models) {\n var _ref1;\n return (_ref1 = this.nested) != null ? _ref1.update(models) : void 0;\n }\n };\n\n Rivets[\"public\"].binders.unless = {\n block: true,\n priority: 4000,\n bind: function(el) {\n return Rivets[\"public\"].binders[\"if\"].bind.call(this, el);\n },\n unbind: function() {\n return Rivets[\"public\"].binders[\"if\"].unbind.call(this);\n },\n routine: function(el, value) {\n return Rivets[\"public\"].binders[\"if\"].routine.call(this, el, !value);\n },\n update: function(models) {\n return Rivets[\"public\"].binders[\"if\"].update.call(this, models);\n }\n };\n\n Rivets[\"public\"].binders['on-*'] = {\n \"function\": true,\n priority: 1000,\n unbind: function(el) {\n if (this.handler) {\n return Rivets.Util.unbindEvent(el, this.args[0], this.handler);\n }\n },\n routine: function(el, value) {\n if (this.handler) {\n Rivets.Util.unbindEvent(el, this.args[0], this.handler);\n }\n return Rivets.Util.bindEvent(el, this.args[0], this.handler = this.eventHandler(value));\n }\n };\n\n Rivets[\"public\"].binders['each-*'] = {\n block: true,\n priority: 4000,\n bind: function(el) {\n var attr, view, _i, _len, _ref1;\n if (this.marker == null) {\n attr = [this.view.prefix, this.type].join('-').replace('--', '-');\n this.marker = document.createComment(\" rivets: \" + this.type + \" \");\n this.iterated = [];\n el.removeAttribute(attr);\n el.parentNode.insertBefore(this.marker, el);\n el.parentNode.removeChild(el);\n } else {\n _ref1 = this.iterated;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n view = _ref1[_i];\n view.bind();\n }\n }\n },\n unbind: function(el) {\n var view, _i, _len, _ref1;\n if (this.iterated != null) {\n _ref1 = this.iterated;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n view = _ref1[_i];\n view.unbind();\n }\n }\n },\n routine: function(el, collection) {\n var binding, data, i, index, key, model, modelName, options, previous, template, view, _i, _j, _k, _len, _len1, _len2, _ref1, _ref2, _ref3;\n modelName = this.args[0];\n collection = collection || [];\n if (this.iterated.length > collection.length) {\n _ref1 = Array(this.iterated.length - collection.length);\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n i = _ref1[_i];\n view = this.iterated.pop();\n view.unbind();\n this.marker.parentNode.removeChild(view.els[0]);\n }\n }\n for (index = _j = 0, _len1 = collection.length; _j < _len1; index = ++_j) {\n model = collection[index];\n data = {\n index: index\n };\n data[Rivets[\"public\"].iterationAlias(modelName)] = index;\n data[modelName] = model;\n if (this.iterated[index] == null) {\n _ref2 = this.view.models;\n for (key in _ref2) {\n model = _ref2[key];\n if (data[key] == null) {\n data[key] = model;\n }\n }\n previous = this.iterated.length ? this.iterated[this.iterated.length - 1].els[0] : this.marker;\n options = this.view.options();\n options.preloadData = true;\n template = el.cloneNode(true);\n view = new Rivets.View(template, data, options);\n view.bind();\n this.iterated.push(view);\n this.marker.parentNode.insertBefore(template, previous.nextSibling);\n } else if (this.iterated[index].models[modelName] !== model) {\n this.iterated[index].update(data);\n }\n }\n if (el.nodeName === 'OPTION') {\n _ref3 = this.view.bindings;\n for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {\n binding = _ref3[_k];\n if (binding.el === this.marker.parentNode && binding.type === 'value') {\n binding.sync();\n }\n }\n }\n },\n update: function(models) {\n var data, key, model, view, _i, _len, _ref1;\n data = {};\n for (key in models) {\n model = models[key];\n if (key !== this.args[0]) {\n data[key] = model;\n }\n }\n _ref1 = this.iterated;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n view = _ref1[_i];\n view.update(data);\n }\n }\n };\n\n Rivets[\"public\"].binders['class-*'] = function(el, value) {\n var elClass;\n elClass = \" \" + el.className + \" \";\n if (!value === (elClass.indexOf(\" \" + this.args[0] + \" \") !== -1)) {\n return el.className = value ? \"\" + el.className + \" \" + this.args[0] : elClass.replace(\" \" + this.args[0] + \" \", ' ').trim();\n }\n };\n\n Rivets[\"public\"].binders['*'] = function(el, value) {\n if (value != null) {\n return el.setAttribute(this.type, value);\n } else {\n return el.removeAttribute(this.type);\n }\n };\n\n Rivets[\"public\"].formatters['call'] = function() {\n var args, value;\n value = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n return value.call.apply(value, [this].concat(__slice.call(args)));\n };\n\n Rivets[\"public\"].adapters['.'] = {\n id: '_rv',\n counter: 0,\n weakmap: {},\n weakReference: function(obj) {\n var id, _base, _name;\n if (!obj.hasOwnProperty(this.id)) {\n id = this.counter++;\n Object.defineProperty(obj, this.id, {\n value: id\n });\n }\n return (_base = this.weakmap)[_name = obj[this.id]] || (_base[_name] = {\n callbacks: {}\n });\n },\n cleanupWeakReference: function(ref, id) {\n if (!Object.keys(ref.callbacks).length) {\n if (!(ref.pointers && Object.keys(ref.pointers).length)) {\n return delete this.weakmap[id];\n }\n }\n },\n stubFunction: function(obj, fn) {\n var map, original, weakmap;\n original = obj[fn];\n map = this.weakReference(obj);\n weakmap = this.weakmap;\n return obj[fn] = function() {\n var callback, k, r, response, _i, _len, _ref1, _ref2, _ref3, _ref4;\n response = original.apply(obj, arguments);\n _ref1 = map.pointers;\n for (r in _ref1) {\n k = _ref1[r];\n _ref4 = (_ref2 = (_ref3 = weakmap[r]) != null ? _ref3.callbacks[k] : void 0) != null ? _ref2 : [];\n for (_i = 0, _len = _ref4.length; _i < _len; _i++) {\n callback = _ref4[_i];\n callback();\n }\n }\n return response;\n };\n },\n observeMutations: function(obj, ref, keypath) {\n var fn, functions, map, _base, _i, _len;\n if (Array.isArray(obj)) {\n map = this.weakReference(obj);\n if (map.pointers == null) {\n map.pointers = {};\n functions = ['push', 'pop', 'shift', 'unshift', 'sort', 'reverse', 'splice'];\n for (_i = 0, _len = functions.length; _i < _len; _i++) {\n fn = functions[_i];\n this.stubFunction(obj, fn);\n }\n }\n if ((_base = map.pointers)[ref] == null) {\n _base[ref] = [];\n }\n if (__indexOf.call(map.pointers[ref], keypath) < 0) {\n return map.pointers[ref].push(keypath);\n }\n }\n },\n unobserveMutations: function(obj, ref, keypath) {\n var idx, map, pointers;\n if (Array.isArray(obj) && (obj[this.id] != null)) {\n if (map = this.weakmap[obj[this.id]]) {\n if (pointers = map.pointers[ref]) {\n if ((idx = pointers.indexOf(keypath)) >= 0) {\n pointers.splice(idx, 1);\n }\n if (!pointers.length) {\n delete map.pointers[ref];\n }\n return this.cleanupWeakReference(map, obj[this.id]);\n }\n }\n }\n },\n observe: function(obj, keypath, callback) {\n var callbacks, desc, value;\n callbacks = this.weakReference(obj).callbacks;\n if (callbacks[keypath] == null) {\n callbacks[keypath] = [];\n desc = Object.getOwnPropertyDescriptor(obj, keypath);\n if (!((desc != null ? desc.get : void 0) || (desc != null ? desc.set : void 0))) {\n value = obj[keypath];\n Object.defineProperty(obj, keypath, {\n enumerable: true,\n get: function() {\n return value;\n },\n set: (function(_this) {\n return function(newValue) {\n var cb, map, _i, _len, _ref1;\n if (newValue !== value) {\n _this.unobserveMutations(value, obj[_this.id], keypath);\n value = newValue;\n if (map = _this.weakmap[obj[_this.id]]) {\n callbacks = map.callbacks;\n if (callbacks[keypath]) {\n _ref1 = callbacks[keypath].slice();\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n cb = _ref1[_i];\n if (__indexOf.call(callbacks[keypath], cb) >= 0) {\n cb();\n }\n }\n }\n return _this.observeMutations(newValue, obj[_this.id], keypath);\n }\n }\n };\n })(this)\n });\n }\n }\n if (__indexOf.call(callbacks[keypath], callback) < 0) {\n callbacks[keypath].push(callback);\n }\n return this.observeMutations(obj[keypath], obj[this.id], keypath);\n },\n unobserve: function(obj, keypath, callback) {\n var callbacks, idx, map;\n if (map = this.weakmap[obj[this.id]]) {\n if (callbacks = map.callbacks[keypath]) {\n if ((idx = callbacks.indexOf(callback)) >= 0) {\n callbacks.splice(idx, 1);\n if (!callbacks.length) {\n delete map.callbacks[keypath];\n this.unobserveMutations(obj[keypath], obj[this.id], keypath);\n }\n }\n return this.cleanupWeakReference(map, obj[this.id]);\n }\n }\n },\n get: function(obj, keypath) {\n return obj[keypath];\n },\n set: function(obj, keypath, value) {\n return obj[keypath] = value;\n }\n };\n\n Rivets.factory = function(sightglass) {\n Rivets.sightglass = sightglass;\n Rivets[\"public\"]._ = Rivets;\n return Rivets[\"public\"];\n };\n\n if (typeof (typeof module !== \"undefined\" && module !== null ? module.exports : void 0) === 'object') {\n module.exports = Rivets.factory(__webpack_require__(\"./node_modules/sightglass/index.js\"));\n } else if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(\"./node_modules/sightglass/index.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function(sightglass) {\n return this.rivets = Rivets.factory(sightglass);\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {\n this.rivets = Rivets.factory(sightglass);\n }\n\n}).call(this);\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(\"./node_modules/webpack/buildin/module.js\")(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcml2ZXRzL2Rpc3Qvcml2ZXRzLmpzP2ViMWIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjhDQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixtQkFBbUIsZ0NBQWdDLEdBQUcsRUFBRTtBQUN0RjtBQUNBLGtCQUFrQjtBQUNsQix5Q0FBeUMsMEJBQTBCLDJEQUEyRCxFQUFFLGtCQUFrQiwwQkFBMEIsRUFBRSxtQ0FBbUMsOEJBQThCLG9DQUFvQyxjQUFjLEVBQUU7QUFDblMsOENBQThDLGlDQUFpQyxPQUFPLE9BQU8sNkNBQTZDLEVBQUUsV0FBVzs7QUFFdko7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixrQkFBa0I7QUFDbEI7QUFDQSw2QkFBNkIsS0FBSztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxZQUFZO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFdBQVc7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxXQUFXO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsWUFBWTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiw4Q0FBOEMsWUFBWTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFlBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSwyQ0FBMkMsV0FBVztBQUN0RDtBQUNBLHlLQUF5SztBQUN6SztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFdBQVc7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFdBQVc7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFlBQVk7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsV0FBVztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxZQUFZO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxXQUFXO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNB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Ii8vIFJpdmV0cy5qc1xuLy8gdmVyc2lvbjogMC45LjZcbi8vIGF1dGhvcjogTWljaGFlbCBSaWNoYXJkc1xuLy8gbGljZW5zZTogTUlUXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBSaXZldHMsIGJpbmRNZXRob2QsIGpRdWVyeSwgdW5iaW5kTWV0aG9kLCBfcmVmLFxuICAgIF9fYmluZCA9IGZ1bmN0aW9uKGZuLCBtZSl7IHJldHVybiBmdW5jdGlvbigpeyByZXR1cm4gZm4uYXBwbHkobWUsIGFyZ3VtZW50cyk7IH07IH0sXG4gICAgX19zbGljZSA9IFtdLnNsaWNlLFxuICAgIF9faGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoX19oYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIF9faW5kZXhPZiA9IFtdLmluZGV4T2YgfHwgZnVuY3Rpb24oaXRlbSkgeyBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGlmIChpIGluIHRoaXMgJiYgdGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7IH0gcmV0dXJuIC0xOyB9O1xuXG4gIFJpdmV0cyA9IHtcbiAgICBvcHRpb25zOiBbJ3ByZWZpeCcsICd0ZW1wbGF0ZURlbGltaXRlcnMnLCAncm9vdEludGVyZmFjZScsICdwcmVsb2FkRGF0YScsICdoYW5kbGVyJywgJ2V4ZWN1dGVGdW5jdGlvbnMnXSxcbiAgICBleHRlbnNpb25zOiBbJ2JpbmRlcnMnLCAnZm9ybWF0dGVycycsICdjb21wb25lbnRzJywgJ2FkYXB0ZXJzJ10sXG4gICAgXCJwdWJsaWNcIjoge1xuICAgICAgYmluZGVyczoge30sXG4gICAgICBjb21wb25lbnRzOiB7fSxcbiAgICAgIGZvcm1hdHRlcnM6IHt9LFxuICAgICAgYWRhcHRlcnM6IHt9LFxuICAgICAgcHJlZml4OiAncnYnLFxuICAgICAgdGVtcGxhdGVEZWxpbWl0ZXJzOiBbJ3snLCAnfSddLFxuICAgICAgcm9vdEludGVyZmFjZTogJy4nLFxuICAgICAgcHJlbG9hZERhdGE6IHRydWUsXG4gICAgICBleGVjdXRlRnVuY3Rpb25zOiBmYWxzZSxcbiAgICAgIGl0ZXJhdGlvbkFsaWFzOiBmdW5jdGlvbihtb2RlbE5hbWUpIHtcbiAgICAgICAgcmV0dXJuICclJyArIG1vZGVsTmFtZSArICclJztcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbihjb250ZXh0LCBldiwgYmluZGluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKGNvbnRleHQsIGV2LCBiaW5kaW5nLnZpZXcubW9kZWxzKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IsIGtleSwgb3B0aW9uLCB2YWx1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgdmFsdWUgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgaWYgKG9wdGlvbiA9PT0gJ2JpbmRlcnMnIHx8IG9wdGlvbiA9PT0gJ2NvbXBvbmVudHMnIHx8IG9wdGlvbiA9PT0gJ2Zvcm1hdHRlcnMnIHx8IG9wdGlvbiA9PT0gJ2FkYXB0ZXJzJykge1xuICAgICAgICAgICAgZm9yIChrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHZhbHVlW2tleV07XG4gICAgICAgICAgICAgIFJpdmV0c1tvcHRpb25dW2tleV0gPSBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBSaXZldHNbXCJwdWJsaWNcIl1bb3B0aW9uXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGJpbmQ6IGZ1bmN0aW9uKGVsLCBtb2RlbHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHZpZXc7XG4gICAgICAgIGlmIChtb2RlbHMgPT0gbnVsbCkge1xuICAgICAgICAgIG1vZGVscyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdmlldyA9IG5ldyBSaXZldHMuVmlldyhlbCwgbW9kZWxzLCBvcHRpb25zKTtcbiAgICAgICAgdmlldy5iaW5kKCk7XG4gICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgfSxcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGNvbXBvbmVudCwgZWwsIGRhdGEpIHtcbiAgICAgICAgdmFyIHNjb3BlLCB0ZW1wbGF0ZSwgdmlldztcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgIGRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50ID0gUml2ZXRzW1wicHVibGljXCJdLmNvbXBvbmVudHNbY29tcG9uZW50XTtcbiAgICAgICAgdGVtcGxhdGUgPSBjb21wb25lbnQudGVtcGxhdGUuY2FsbCh0aGlzLCBlbCk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgd2hpbGUgKGVsLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwuaW5uZXJIVE1MID0gdGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUgPSBjb21wb25lbnQuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIGVsLCBkYXRhKTtcbiAgICAgICAgdmlldyA9IG5ldyBSaXZldHMuVmlldyhlbCwgc2NvcGUpO1xuICAgICAgICB2aWV3LmJpbmQoKTtcbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGlmICh3aW5kb3dbJ2pRdWVyeSddIHx8IHdpbmRvd1snJCddKSB7XG4gICAgalF1ZXJ5ID0gd2luZG93WydqUXVlcnknXSB8fCB3aW5kb3dbJyQnXTtcbiAgICBfcmVmID0gJ29uJyBpbiBqUXVlcnkucHJvdG90eXBlID8gWydvbicsICdvZmYnXSA6IFsnYmluZCcsICd1bmJpbmQnXSwgYmluZE1ldGhvZCA9IF9yZWZbMF0sIHVuYmluZE1ldGhvZCA9IF9yZWZbMV07XG4gICAgUml2ZXRzLlV0aWwgPSB7XG4gICAgICBiaW5kRXZlbnQ6IGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4galF1ZXJ5KGVsKVtiaW5kTWV0aG9kXShldmVudCwgaGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgdW5iaW5kRXZlbnQ6IGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4galF1ZXJ5KGVsKVt1bmJpbmRNZXRob2RdKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgIH0sXG4gICAgICBnZXRJbnB1dFZhbHVlOiBmdW5jdGlvbihlbCkge1xuICAgICAgICB2YXIgJGVsO1xuICAgICAgICAkZWwgPSBqUXVlcnkoZWwpO1xuICAgICAgICBpZiAoJGVsLmF0dHIoJ3R5cGUnKSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgIHJldHVybiAkZWwuaXMoJzpjaGVja2VkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICRlbC52YWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgUml2ZXRzLlV0aWwgPSB7XG4gICAgICBiaW5kRXZlbnQ6IChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCdhZGRFdmVudExpc3RlbmVyJyBpbiB3aW5kb3cpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZWwsIGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBlbC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfSkoKSxcbiAgICAgIHVuYmluZEV2ZW50OiAoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgncmVtb3ZlRXZlbnRMaXN0ZW5lcicgaW4gd2luZG93KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICAgICAgcmV0dXJuIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihlbCwgZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gZWwuZGV0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgIH0pKCksXG4gICAgICBnZXRJbnB1dFZhbHVlOiBmdW5jdGlvbihlbCkge1xuICAgICAgICB2YXIgbywgX2ksIF9sZW4sIF9yZXN1bHRzO1xuICAgICAgICBpZiAoZWwudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgIHJldHVybiBlbC5jaGVja2VkO1xuICAgICAgICB9IGVsc2UgaWYgKGVsLnR5cGUgPT09ICdzZWxlY3QtbXVsdGlwbGUnKSB7XG4gICAgICAgICAgX3Jlc3VsdHMgPSBbXTtcbiAgICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGVsLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICBvID0gZWxbX2ldO1xuICAgICAgICAgICAgaWYgKG8uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChvLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBSaXZldHMuVHlwZVBhcnNlciA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBUeXBlUGFyc2VyKCkge31cblxuICAgIFR5cGVQYXJzZXIudHlwZXMgPSB7XG4gICAgICBwcmltaXRpdmU6IDAsXG4gICAgICBrZXlwYXRoOiAxXG4gICAgfTtcblxuICAgIFR5cGVQYXJzZXIucGFyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIGlmICgvXicuKickfF5cIi4qXCIkLy50ZXN0KHN0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogc3RyaW5nLnNsaWNlKDEsIC0xKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzdHJpbmcgPT09ICd0cnVlJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMucHJpbWl0aXZlLFxuICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMucHJpbWl0aXZlLFxuICAgICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzdHJpbmcgPT09ICdudWxsJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMucHJpbWl0aXZlLFxuICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZyA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGlzTmFOKE51bWJlcihzdHJpbmcpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogTnVtYmVyKHN0cmluZylcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlcy5rZXlwYXRoLFxuICAgICAgICAgIHZhbHVlOiBzdHJpbmdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFR5cGVQYXJzZXI7XG5cbiAgfSkoKTtcblxuICBSaXZldHMuVGV4dFRlbXBsYXRlUGFyc2VyID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFRleHRUZW1wbGF0ZVBhcnNlcigpIHt9XG5cbiAgICBUZXh0VGVtcGxhdGVQYXJzZXIudHlwZXMgPSB7XG4gICAgICB0ZXh0OiAwLFxuICAgICAgYmluZGluZzogMVxuICAgIH07XG5cbiAgICBUZXh0VGVtcGxhdGVQYXJzZXIucGFyc2UgPSBmdW5jdGlvbih0ZW1wbGF0ZSwgZGVsaW1pdGVycykge1xuICAgICAgdmFyIGluZGV4LCBsYXN0SW5kZXgsIGxhc3RUb2tlbiwgbGVuZ3RoLCBzdWJzdHJpbmcsIHRva2VucywgdmFsdWU7XG4gICAgICB0b2tlbnMgPSBbXTtcbiAgICAgIGxlbmd0aCA9IHRlbXBsYXRlLmxlbmd0aDtcbiAgICAgIGluZGV4ID0gMDtcbiAgICAgIGxhc3RJbmRleCA9IDA7XG4gICAgICB3aGlsZSAobGFzdEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGluZGV4ID0gdGVtcGxhdGUuaW5kZXhPZihkZWxpbWl0ZXJzWzBdLCBsYXN0SW5kZXgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlcy50ZXh0LFxuICAgICAgICAgICAgdmFsdWU6IHRlbXBsYXRlLnNsaWNlKGxhc3RJbmRleClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIGxhc3RJbmRleCA8IGluZGV4KSB7XG4gICAgICAgICAgICB0b2tlbnMucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMudGV4dCxcbiAgICAgICAgICAgICAgdmFsdWU6IHRlbXBsYXRlLnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdEluZGV4ID0gaW5kZXggKyBkZWxpbWl0ZXJzWzBdLmxlbmd0aDtcbiAgICAgICAgICBpbmRleCA9IHRlbXBsYXRlLmluZGV4T2YoZGVsaW1pdGVyc1sxXSwgbGFzdEluZGV4KTtcbiAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICBzdWJzdHJpbmcgPSB0ZW1wbGF0ZS5zbGljZShsYXN0SW5kZXggLSBkZWxpbWl0ZXJzWzFdLmxlbmd0aCk7XG4gICAgICAgICAgICBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKChsYXN0VG9rZW4gIT0gbnVsbCA/IGxhc3RUb2tlbi50eXBlIDogdm9pZCAwKSA9PT0gdGhpcy50eXBlcy50ZXh0KSB7XG4gICAgICAgICAgICAgIGxhc3RUb2tlbi52YWx1ZSArPSBzdWJzdHJpbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlcy50ZXh0LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdWJzdHJpbmdcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSB0ZW1wbGF0ZS5zbGljZShsYXN0SW5kZXgsIGluZGV4KS50cmltKCk7XG4gICAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlcy5iaW5kaW5nLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGFzdEluZGV4ID0gaW5kZXggKyBkZWxpbWl0ZXJzWzFdLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRleHRUZW1wbGF0ZVBhcnNlcjtcblxuICB9KSgpO1xuXG4gIFJpdmV0cy5WaWV3ID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFZpZXcoZWxzLCBtb2RlbHMsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBrLCBvcHRpb24sIHYsIF9iYXNlLCBfaSwgX2osIF9sZW4sIF9sZW4xLCBfcmVmMSwgX3JlZjIsIF9yZWYzLCBfcmVmNCwgX3JlZjU7XG4gICAgICB0aGlzLmVscyA9IGVscztcbiAgICAgIHRoaXMubW9kZWxzID0gbW9kZWxzO1xuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZSA9IF9fYmluZCh0aGlzLnVwZGF0ZSwgdGhpcyk7XG4gICAgICB0aGlzLnB1Ymxpc2ggPSBfX2JpbmQodGhpcy5wdWJsaXNoLCB0aGlzKTtcbiAgICAgIHRoaXMuc3luYyA9IF9fYmluZCh0aGlzLnN5bmMsIHRoaXMpO1xuICAgICAgdGhpcy51bmJpbmQgPSBfX2JpbmQodGhpcy51bmJpbmQsIHRoaXMpO1xuICAgICAgdGhpcy5iaW5kID0gX19iaW5kKHRoaXMuYmluZCwgdGhpcyk7XG4gICAgICB0aGlzLnNlbGVjdCA9IF9fYmluZCh0aGlzLnNlbGVjdCwgdGhpcyk7XG4gICAgICB0aGlzLnRyYXZlcnNlID0gX19iaW5kKHRoaXMudHJhdmVyc2UsIHRoaXMpO1xuICAgICAgdGhpcy5idWlsZCA9IF9fYmluZCh0aGlzLmJ1aWxkLCB0aGlzKTtcbiAgICAgIHRoaXMuYnVpbGRCaW5kaW5nID0gX19iaW5kKHRoaXMuYnVpbGRCaW5kaW5nLCB0aGlzKTtcbiAgICAgIHRoaXMuYmluZGluZ1JlZ0V4cCA9IF9fYmluZCh0aGlzLmJpbmRpbmdSZWdFeHAsIHRoaXMpO1xuICAgICAgdGhpcy5vcHRpb25zID0gX19iaW5kKHRoaXMub3B0aW9ucywgdGhpcyk7XG4gICAgICBpZiAoISh0aGlzLmVscy5qcXVlcnkgfHwgdGhpcy5lbHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgdGhpcy5lbHMgPSBbdGhpcy5lbHNdO1xuICAgICAgfVxuICAgICAgX3JlZjEgPSBSaXZldHMuZXh0ZW5zaW9ucztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgb3B0aW9uID0gX3JlZjFbX2ldO1xuICAgICAgICB0aGlzW29wdGlvbl0gPSB7fTtcbiAgICAgICAgaWYgKG9wdGlvbnNbb3B0aW9uXSkge1xuICAgICAgICAgIF9yZWYyID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICAgIGZvciAoayBpbiBfcmVmMikge1xuICAgICAgICAgICAgdiA9IF9yZWYyW2tdO1xuICAgICAgICAgICAgdGhpc1tvcHRpb25dW2tdID0gdjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JlZjMgPSBSaXZldHNbXCJwdWJsaWNcIl1bb3B0aW9uXTtcbiAgICAgICAgZm9yIChrIGluIF9yZWYzKSB7XG4gICAgICAgICAgdiA9IF9yZWYzW2tdO1xuICAgICAgICAgIGlmICgoX2Jhc2UgPSB0aGlzW29wdGlvbl0pW2tdID09IG51bGwpIHtcbiAgICAgICAgICAgIF9iYXNlW2tdID0gdjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIF9yZWY0ID0gUml2ZXRzLm9wdGlvbnM7XG4gICAgICBmb3IgKF9qID0gMCwgX2xlbjEgPSBfcmVmNC5sZW5ndGg7IF9qIDwgX2xlbjE7IF9qKyspIHtcbiAgICAgICAgb3B0aW9uID0gX3JlZjRbX2pdO1xuICAgICAgICB0aGlzW29wdGlvbl0gPSAoX3JlZjUgPSBvcHRpb25zW29wdGlvbl0pICE9IG51bGwgPyBfcmVmNSA6IFJpdmV0c1tcInB1YmxpY1wiXVtvcHRpb25dO1xuICAgICAgfVxuICAgICAgdGhpcy5idWlsZCgpO1xuICAgIH1cblxuICAgIFZpZXcucHJvdG90eXBlLm9wdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb24sIG9wdGlvbnMsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIF9yZWYxID0gUml2ZXRzLmV4dGVuc2lvbnMuY29uY2F0KFJpdmV0cy5vcHRpb25zKTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgb3B0aW9uID0gX3JlZjFbX2ldO1xuICAgICAgICBvcHRpb25zW29wdGlvbl0gPSB0aGlzW29wdGlvbl07XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuYmluZGluZ1JlZ0V4cCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoXCJeXCIgKyB0aGlzLnByZWZpeCArIFwiLVwiKTtcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuYnVpbGRCaW5kaW5nID0gZnVuY3Rpb24oYmluZGluZywgbm9kZSwgdHlwZSwgZGVjbGFyYXRpb24pIHtcbiAgICAgIHZhciBjb250ZXh0LCBjdHgsIGRlcGVuZGVuY2llcywga2V5cGF0aCwgb3B0aW9ucywgcGlwZSwgcGlwZXM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgICBwaXBlcyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9pLCBfbGVuLCBfcmVmMSwgX3Jlc3VsdHM7XG4gICAgICAgIF9yZWYxID0gZGVjbGFyYXRpb24ubWF0Y2goLygoPzonW14nXSonKSooPzooPzpbXlxcfCddKig/OidbXiddKicpK1teXFx8J10qKSt8W15cXHxdKykpfF4kL2cpO1xuICAgICAgICBfcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgcGlwZSA9IF9yZWYxW19pXTtcbiAgICAgICAgICBfcmVzdWx0cy5wdXNoKHBpcGUudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Jlc3VsdHM7XG4gICAgICB9KSgpO1xuICAgICAgY29udGV4dCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9pLCBfbGVuLCBfcmVmMSwgX3Jlc3VsdHM7XG4gICAgICAgIF9yZWYxID0gcGlwZXMuc2hpZnQoKS5zcGxpdCgnPCcpO1xuICAgICAgICBfcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgY3R4ID0gX3JlZjFbX2ldO1xuICAgICAgICAgIF9yZXN1bHRzLnB1c2goY3R4LnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgfSkoKTtcbiAgICAgIGtleXBhdGggPSBjb250ZXh0LnNoaWZ0KCk7XG4gICAgICBvcHRpb25zLmZvcm1hdHRlcnMgPSBwaXBlcztcbiAgICAgIGlmIChkZXBlbmRlbmNpZXMgPSBjb250ZXh0LnNoaWZ0KCkpIHtcbiAgICAgICAgb3B0aW9ucy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuc3BsaXQoL1xccysvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzLnB1c2gobmV3IFJpdmV0c1tiaW5kaW5nXSh0aGlzLCBub2RlLCB0eXBlLCBrZXlwYXRoLCBvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZWwsIHBhcnNlLCBfaSwgX2xlbiwgX3JlZjE7XG4gICAgICB0aGlzLmJpbmRpbmdzID0gW107XG4gICAgICBwYXJzZSA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIHZhciBibG9jaywgY2hpbGROb2RlLCBkZWxpbWl0ZXJzLCBuLCBwYXJzZXIsIHRleHQsIHRva2VuLCB0b2tlbnMsIF9pLCBfaiwgX2xlbiwgX2xlbjEsIF9yZWYxO1xuICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICBwYXJzZXIgPSBSaXZldHMuVGV4dFRlbXBsYXRlUGFyc2VyO1xuICAgICAgICAgICAgaWYgKGRlbGltaXRlcnMgPSBfdGhpcy50ZW1wbGF0ZURlbGltaXRlcnMpIHtcbiAgICAgICAgICAgICAgaWYgKCh0b2tlbnMgPSBwYXJzZXIucGFyc2Uobm9kZS5kYXRhLCBkZWxpbWl0ZXJzKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodG9rZW5zLmxlbmd0aCA9PT0gMSAmJiB0b2tlbnNbMF0udHlwZSA9PT0gcGFyc2VyLnR5cGVzLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IHRva2Vucy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tfaV07XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0b2tlbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGV4dCwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMuYnVpbGRCaW5kaW5nKCdUZXh0QmluZGluZycsIHRleHQsIG51bGwsIHRva2VuLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgYmxvY2sgPSBfdGhpcy50cmF2ZXJzZShub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFibG9jaykge1xuICAgICAgICAgICAgX3JlZjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciBfaywgX2xlbjEsIF9yZWYxLCBfcmVzdWx0cztcbiAgICAgICAgICAgICAgX3JlZjEgPSBub2RlLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICAgIF9yZXN1bHRzID0gW107XG4gICAgICAgICAgICAgIGZvciAoX2sgPSAwLCBfbGVuMSA9IF9yZWYxLmxlbmd0aDsgX2sgPCBfbGVuMTsgX2srKykge1xuICAgICAgICAgICAgICAgIG4gPSBfcmVmMVtfa107XG4gICAgICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gX3Jlc3VsdHM7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgZm9yIChfaiA9IDAsIF9sZW4xID0gX3JlZjEubGVuZ3RoOyBfaiA8IF9sZW4xOyBfaisrKSB7XG4gICAgICAgICAgICAgIGNoaWxkTm9kZSA9IF9yZWYxW19qXTtcbiAgICAgICAgICAgICAgcGFyc2UoY2hpbGROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIF9yZWYxID0gdGhpcy5lbHM7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGVsID0gX3JlZjFbX2ldO1xuICAgICAgICBwYXJzZShlbCk7XG4gICAgICB9XG4gICAgICB0aGlzLmJpbmRpbmdzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICB2YXIgX3JlZjIsIF9yZWYzO1xuICAgICAgICByZXR1cm4gKCgoX3JlZjIgPSBiLmJpbmRlcikgIT0gbnVsbCA/IF9yZWYyLnByaW9yaXR5IDogdm9pZCAwKSB8fCAwKSAtICgoKF9yZWYzID0gYS5iaW5kZXIpICE9IG51bGwgPyBfcmVmMy5wcmlvcml0eSA6IHZvaWQgMCkgfHwgMCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUudHJhdmVyc2UgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgYXR0cmlidXRlLCBhdHRyaWJ1dGVzLCBiaW5kZXIsIGJpbmRpbmdSZWdFeHAsIGJsb2NrLCBpZGVudGlmaWVyLCByZWdleHAsIHR5cGUsIHZhbHVlLCBfaSwgX2osIF9sZW4sIF9sZW4xLCBfcmVmMSwgX3JlZjIsIF9yZWYzO1xuICAgICAgYmluZGluZ1JlZ0V4cCA9IHRoaXMuYmluZGluZ1JlZ0V4cCgpO1xuICAgICAgYmxvY2sgPSBub2RlLm5vZGVOYW1lID09PSAnU0NSSVBUJyB8fCBub2RlLm5vZGVOYW1lID09PSAnU1RZTEUnO1xuICAgICAgX3JlZjEgPSBub2RlLmF0dHJpYnV0ZXM7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGF0dHJpYnV0ZSA9IF9yZWYxW19pXTtcbiAgICAgICAgaWYgKGJpbmRpbmdSZWdFeHAudGVzdChhdHRyaWJ1dGUubmFtZSkpIHtcbiAgICAgICAgICB0eXBlID0gYXR0cmlidXRlLm5hbWUucmVwbGFjZShiaW5kaW5nUmVnRXhwLCAnJyk7XG4gICAgICAgICAgaWYgKCEoYmluZGVyID0gdGhpcy5iaW5kZXJzW3R5cGVdKSkge1xuICAgICAgICAgICAgX3JlZjIgPSB0aGlzLmJpbmRlcnM7XG4gICAgICAgICAgICBmb3IgKGlkZW50aWZpZXIgaW4gX3JlZjIpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBfcmVmMltpZGVudGlmaWVyXTtcbiAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgIT09ICcqJyAmJiBpZGVudGlmaWVyLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZWdleHAgPSBuZXcgUmVnRXhwKFwiXlwiICsgKGlkZW50aWZpZXIucmVwbGFjZSgvXFwqL2csICcuKycpKSArIFwiJFwiKTtcbiAgICAgICAgICAgICAgICBpZiAocmVnZXhwLnRlc3QodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIGJpbmRlciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBiaW5kZXIgfHwgKGJpbmRlciA9IHRoaXMuYmluZGVyc1snKiddKTtcbiAgICAgICAgICBpZiAoYmluZGVyLmJsb2NrKSB7XG4gICAgICAgICAgICBibG9jayA9IHRydWU7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzID0gW2F0dHJpYnV0ZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfcmVmMyA9IGF0dHJpYnV0ZXMgfHwgbm9kZS5hdHRyaWJ1dGVzO1xuICAgICAgZm9yIChfaiA9IDAsIF9sZW4xID0gX3JlZjMubGVuZ3RoOyBfaiA8IF9sZW4xOyBfaisrKSB7XG4gICAgICAgIGF0dHJpYnV0ZSA9IF9yZWYzW19qXTtcbiAgICAgICAgaWYgKGJpbmRpbmdSZWdFeHAudGVzdChhdHRyaWJ1dGUubmFtZSkpIHtcbiAgICAgICAgICB0eXBlID0gYXR0cmlidXRlLm5hbWUucmVwbGFjZShiaW5kaW5nUmVnRXhwLCAnJyk7XG4gICAgICAgICAgdGhpcy5idWlsZEJpbmRpbmcoJ0JpbmRpbmcnLCBub2RlLCB0eXBlLCBhdHRyaWJ1dGUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgIHR5cGUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbdHlwZV0gJiYgIW5vZGUuX2JvdW5kKSB7XG4gICAgICAgICAgdGhpcy5iaW5kaW5ncy5wdXNoKG5ldyBSaXZldHMuQ29tcG9uZW50QmluZGluZyh0aGlzLCBub2RlLCB0eXBlKSk7XG4gICAgICAgICAgYmxvY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYmxvY2s7XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICB2YXIgYmluZGluZywgX2ksIF9sZW4sIF9yZWYxLCBfcmVzdWx0cztcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIF9yZXN1bHRzID0gW107XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGJpbmRpbmcgPSBfcmVmMVtfaV07XG4gICAgICAgIGlmIChmbihiaW5kaW5nKSkge1xuICAgICAgICAgIF9yZXN1bHRzLnB1c2goYmluZGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBfcmVzdWx0cztcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJpbmRpbmcsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgYmluZGluZy5iaW5kKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnVuYmluZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJpbmRpbmcsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgYmluZGluZy51bmJpbmQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJpbmRpbmcsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgaWYgKHR5cGVvZiBiaW5kaW5nLnN5bmMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGJpbmRpbmcuc3luYygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnB1Ymxpc2ggPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBiaW5kaW5nLCBfaSwgX2xlbiwgX3JlZjE7XG4gICAgICBfcmVmMSA9IHRoaXMuc2VsZWN0KGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmFyIF9yZWYxO1xuICAgICAgICByZXR1cm4gKF9yZWYxID0gYi5iaW5kZXIpICE9IG51bGwgPyBfcmVmMS5wdWJsaXNoZXMgOiB2b2lkIDA7XG4gICAgICB9KTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgYmluZGluZy5wdWJsaXNoKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1vZGVscykge1xuICAgICAgdmFyIGJpbmRpbmcsIGtleSwgbW9kZWwsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIGlmIChtb2RlbHMgPT0gbnVsbCkge1xuICAgICAgICBtb2RlbHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGZvciAoa2V5IGluIG1vZGVscykge1xuICAgICAgICBtb2RlbCA9IG1vZGVsc1trZXldO1xuICAgICAgICB0aGlzLm1vZGVsc1trZXldID0gbW9kZWw7XG4gICAgICB9XG4gICAgICBfcmVmMSA9IHRoaXMuYmluZGluZ3M7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGJpbmRpbmcgPSBfcmVmMVtfaV07XG4gICAgICAgIGlmICh0eXBlb2YgYmluZGluZy51cGRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGJpbmRpbmcudXBkYXRlKG1vZGVscyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFZpZXc7XG5cbiAgfSkoKTtcblxuICBSaXZldHMuQmluZGluZyA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nKHZpZXcsIGVsLCB0eXBlLCBrZXlwYXRoLCBvcHRpb25zKSB7XG4gICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgIHRoaXMua2V5cGF0aCA9IGtleXBhdGg7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge307XG4gICAgICB0aGlzLmdldFZhbHVlID0gX19iaW5kKHRoaXMuZ2V0VmFsdWUsIHRoaXMpO1xuICAgICAgdGhpcy51cGRhdGUgPSBfX2JpbmQodGhpcy51cGRhdGUsIHRoaXMpO1xuICAgICAgdGhpcy51bmJpbmQgPSBfX2JpbmQodGhpcy51bmJpbmQsIHRoaXMpO1xuICAgICAgdGhpcy5iaW5kID0gX19iaW5kKHRoaXMuYmluZCwgdGhpcyk7XG4gICAgICB0aGlzLnB1Ymxpc2ggPSBfX2JpbmQodGhpcy5wdWJsaXNoLCB0aGlzKTtcbiAgICAgIHRoaXMuc3luYyA9IF9fYmluZCh0aGlzLnN5bmMsIHRoaXMpO1xuICAgICAgdGhpcy5zZXQgPSBfX2JpbmQodGhpcy5zZXQsIHRoaXMpO1xuICAgICAgdGhpcy5ldmVudEhhbmRsZXIgPSBfX2JpbmQodGhpcy5ldmVudEhhbmRsZXIsIHRoaXMpO1xuICAgICAgdGhpcy5mb3JtYXR0ZWRWYWx1ZSA9IF9fYmluZCh0aGlzLmZvcm1hdHRlZFZhbHVlLCB0aGlzKTtcbiAgICAgIHRoaXMucGFyc2VGb3JtYXR0ZXJBcmd1bWVudHMgPSBfX2JpbmQodGhpcy5wYXJzZUZvcm1hdHRlckFyZ3VtZW50cywgdGhpcyk7XG4gICAgICB0aGlzLnBhcnNlVGFyZ2V0ID0gX19iaW5kKHRoaXMucGFyc2VUYXJnZXQsIHRoaXMpO1xuICAgICAgdGhpcy5vYnNlcnZlID0gX19iaW5kKHRoaXMub2JzZXJ2ZSwgdGhpcyk7XG4gICAgICB0aGlzLnNldEJpbmRlciA9IF9fYmluZCh0aGlzLnNldEJpbmRlciwgdGhpcyk7XG4gICAgICB0aGlzLmZvcm1hdHRlcnMgPSB0aGlzLm9wdGlvbnMuZm9ybWF0dGVycyB8fCBbXTtcbiAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gW107XG4gICAgICB0aGlzLmZvcm1hdHRlck9ic2VydmVycyA9IHt9O1xuICAgICAgdGhpcy5tb2RlbCA9IHZvaWQgMDtcbiAgICAgIHRoaXMuc2V0QmluZGVyKCk7XG4gICAgfVxuXG4gICAgQmluZGluZy5wcm90b3R5cGUuc2V0QmluZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciwgcmVnZXhwLCB2YWx1ZSwgX3JlZjE7XG4gICAgICBpZiAoISh0aGlzLmJpbmRlciA9IHRoaXMudmlldy5iaW5kZXJzW3RoaXMudHlwZV0pKSB7XG4gICAgICAgIF9yZWYxID0gdGhpcy52aWV3LmJpbmRlcnM7XG4gICAgICAgIGZvciAoaWRlbnRpZmllciBpbiBfcmVmMSkge1xuICAgICAgICAgIHZhbHVlID0gX3JlZjFbaWRlbnRpZmllcl07XG4gICAgICAgICAgaWYgKGlkZW50aWZpZXIgIT09ICcqJyAmJiBpZGVudGlmaWVyLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IG5ldyBSZWdFeHAoXCJeXCIgKyAoaWRlbnRpZmllci5yZXBsYWNlKC9cXCovZywgJy4rJykpICsgXCIkXCIpO1xuICAgICAgICAgICAgaWYgKHJlZ2V4cC50ZXN0KHRoaXMudHlwZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5iaW5kZXIgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5hcmdzID0gbmV3IFJlZ0V4cChcIl5cIiArIChpZGVudGlmaWVyLnJlcGxhY2UoL1xcKi9nLCAnKC4rKScpKSArIFwiJFwiKS5leGVjKHRoaXMudHlwZSk7XG4gICAgICAgICAgICAgIHRoaXMuYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5iaW5kZXIgfHwgKHRoaXMuYmluZGVyID0gdGhpcy52aWV3LmJpbmRlcnNbJyonXSk7XG4gICAgICBpZiAodGhpcy5iaW5kZXIgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kZXIgPSB7XG4gICAgICAgICAgcm91dGluZTogdGhpcy5iaW5kZXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uKG9iaiwga2V5cGF0aCwgY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBSaXZldHMuc2lnaHRnbGFzcyhvYmosIGtleXBhdGgsIGNhbGxiYWNrLCB7XG4gICAgICAgIHJvb3Q6IHRoaXMudmlldy5yb290SW50ZXJmYWNlLFxuICAgICAgICBhZGFwdGVyczogdGhpcy52aWV3LmFkYXB0ZXJzXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUucGFyc2VUYXJnZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0b2tlbjtcbiAgICAgIHRva2VuID0gUml2ZXRzLlR5cGVQYXJzZXIucGFyc2UodGhpcy5rZXlwYXRoKTtcbiAgICAgIGlmICh0b2tlbi50eXBlID09PSBSaXZldHMuVHlwZVBhcnNlci50eXBlcy5wcmltaXRpdmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPSB0b2tlbi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmUodGhpcy52aWV3Lm1vZGVscywgdGhpcy5rZXlwYXRoLCB0aGlzLnN5bmMpO1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbCA9IHRoaXMub2JzZXJ2ZXIudGFyZ2V0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBCaW5kaW5nLnByb3RvdHlwZS5wYXJzZUZvcm1hdHRlckFyZ3VtZW50cyA9IGZ1bmN0aW9uKGFyZ3MsIGZvcm1hdHRlckluZGV4KSB7XG4gICAgICB2YXIgYWksIGFyZywgb2JzZXJ2ZXIsIHByb2Nlc3NlZEFyZ3MsIF9iYXNlLCBfaSwgX2xlbjtcbiAgICAgIGFyZ3MgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBfaSwgX2xlbiwgX3Jlc3VsdHM7XG4gICAgICAgIF9yZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gYXJncy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgIGFyZyA9IGFyZ3NbX2ldO1xuICAgICAgICAgIF9yZXN1bHRzLnB1c2goUml2ZXRzLlR5cGVQYXJzZXIucGFyc2UoYXJnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgfSkoKTtcbiAgICAgIHByb2Nlc3NlZEFyZ3MgPSBbXTtcbiAgICAgIGZvciAoYWkgPSBfaSA9IDAsIF9sZW4gPSBhcmdzLmxlbmd0aDsgX2kgPCBfbGVuOyBhaSA9ICsrX2kpIHtcbiAgICAgICAgYXJnID0gYXJnc1thaV07XG4gICAgICAgIHByb2Nlc3NlZEFyZ3MucHVzaChhcmcudHlwZSA9PT0gUml2ZXRzLlR5cGVQYXJzZXIudHlwZXMucHJpbWl0aXZlID8gYXJnLnZhbHVlIDogKChfYmFzZSA9IHRoaXMuZm9ybWF0dGVyT2JzZXJ2ZXJzKVtmb3JtYXR0ZXJJbmRleF0gfHwgKF9iYXNlW2Zvcm1hdHRlckluZGV4XSA9IHt9KSwgIShvYnNlcnZlciA9IHRoaXMuZm9ybWF0dGVyT2JzZXJ2ZXJzW2Zvcm1hdHRlckluZGV4XVthaV0pID8gKG9ic2VydmVyID0gdGhpcy5vYnNlcnZlKHRoaXMudmlldy5tb2RlbHMsIGFyZy52YWx1ZSwgdGhpcy5zeW5jKSwgdGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnNbZm9ybWF0dGVySW5kZXhdW2FpXSA9IG9ic2VydmVyKSA6IHZvaWQgMCwgb2JzZXJ2ZXIudmFsdWUoKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2Nlc3NlZEFyZ3M7XG4gICAgfTtcblxuICAgIEJpbmRpbmcucHJvdG90eXBlLmZvcm1hdHRlZFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBhcmdzLCBmaSwgZm9ybWF0dGVyLCBpZCwgcHJvY2Vzc2VkQXJncywgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMjtcbiAgICAgIF9yZWYxID0gdGhpcy5mb3JtYXR0ZXJzO1xuICAgICAgZm9yIChmaSA9IF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBmaSA9ICsrX2kpIHtcbiAgICAgICAgZm9ybWF0dGVyID0gX3JlZjFbZmldO1xuICAgICAgICBhcmdzID0gZm9ybWF0dGVyLm1hdGNoKC9bXlxccyddK3wnKFteJ118J1teXFxzXSkqJ3xcIihbXlwiXXxcIlteXFxzXSkqXCIvZyk7XG4gICAgICAgIGlkID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBmb3JtYXR0ZXIgPSB0aGlzLnZpZXcuZm9ybWF0dGVyc1tpZF07XG4gICAgICAgIHByb2Nlc3NlZEFyZ3MgPSB0aGlzLnBhcnNlRm9ybWF0dGVyQXJndW1lbnRzKGFyZ3MsIGZpKTtcbiAgICAgICAgaWYgKChmb3JtYXR0ZXIgIT0gbnVsbCA/IGZvcm1hdHRlci5yZWFkIDogdm9pZCAwKSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgdmFsdWUgPSAoX3JlZjIgPSBmb3JtYXR0ZXIucmVhZCkuY2FsbC5hcHBseShfcmVmMiwgW3RoaXMubW9kZWwsIHZhbHVlXS5jb25jYXQoX19zbGljZS5jYWxsKHByb2Nlc3NlZEFyZ3MpKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0dGVyIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICB2YWx1ZSA9IGZvcm1hdHRlci5jYWxsLmFwcGx5KGZvcm1hdHRlciwgW3RoaXMubW9kZWwsIHZhbHVlXS5jb25jYXQoX19zbGljZS5jYWxsKHByb2Nlc3NlZEFyZ3MpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUuZXZlbnRIYW5kbGVyID0gZnVuY3Rpb24oZm4pIHtcbiAgICAgIHZhciBiaW5kaW5nLCBoYW5kbGVyO1xuICAgICAgaGFuZGxlciA9IChiaW5kaW5nID0gdGhpcykudmlldy5oYW5kbGVyO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmNhbGwoZm4sIHRoaXMsIGV2LCBiaW5kaW5nKTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIEJpbmRpbmcucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgX3JlZjE7XG4gICAgICB2YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgIXRoaXMuYmluZGVyW1wiZnVuY3Rpb25cIl0gJiYgUml2ZXRzW1wicHVibGljXCJdLmV4ZWN1dGVGdW5jdGlvbnMgPyB0aGlzLmZvcm1hdHRlZFZhbHVlKHZhbHVlLmNhbGwodGhpcy5tb2RlbCkpIDogdGhpcy5mb3JtYXR0ZWRWYWx1ZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gKF9yZWYxID0gdGhpcy5iaW5kZXIucm91dGluZSkgIT0gbnVsbCA/IF9yZWYxLmNhbGwodGhpcywgdGhpcy5lbCwgdmFsdWUpIDogdm9pZCAwO1xuICAgIH07XG5cbiAgICBCaW5kaW5nLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZGVwZW5kZW5jeSwgb2JzZXJ2ZXI7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgX2ksIF9qLCBfbGVuLCBfbGVuMSwgX3JlZjEsIF9yZWYyLCBfcmVmMztcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5tb2RlbCAhPT0gdGhpcy5vYnNlcnZlci50YXJnZXQpIHtcbiAgICAgICAgICAgIF9yZWYxID0gdGhpcy5kZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyID0gX3JlZjFbX2ldO1xuICAgICAgICAgICAgICBvYnNlcnZlci51bm9ic2VydmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gW107XG4gICAgICAgICAgICBpZiAoKCh0aGlzLm1vZGVsID0gdGhpcy5vYnNlcnZlci50YXJnZXQpICE9IG51bGwpICYmICgoX3JlZjIgPSB0aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzKSAhPSBudWxsID8gX3JlZjIubGVuZ3RoIDogdm9pZCAwKSkge1xuICAgICAgICAgICAgICBfcmVmMyA9IHRoaXMub3B0aW9ucy5kZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgIGZvciAoX2ogPSAwLCBfbGVuMSA9IF9yZWYzLmxlbmd0aDsgX2ogPCBfbGVuMTsgX2orKykge1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgPSBfcmVmM1tfal07XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmUodGhpcy5tb2RlbCwgZGVwZW5kZW5jeSwgdGhpcy5zeW5jKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llcy5wdXNoKG9ic2VydmVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlci52YWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KS5jYWxsKHRoaXMpKTtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUucHVibGlzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGFyZ3MsIGZpLCBmaVJldmVyc2VkLCBmb3JtYXR0ZXIsIGlkLCBsYXN0Zm9ybWF0dGVySW5kZXgsIHByb2Nlc3NlZEFyZ3MsIHZhbHVlLCBfaSwgX2xlbiwgX3JlZjEsIF9yZWYyLCBfcmVmMztcbiAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSh0aGlzLmVsKTtcbiAgICAgICAgbGFzdGZvcm1hdHRlckluZGV4ID0gdGhpcy5mb3JtYXR0ZXJzLmxlbmd0aCAtIDE7XG4gICAgICAgIF9yZWYxID0gdGhpcy5mb3JtYXR0ZXJzLnNsaWNlKDApLnJldmVyc2UoKTtcbiAgICAgICAgZm9yIChmaVJldmVyc2VkID0gX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IGZpUmV2ZXJzZWQgPSArK19pKSB7XG4gICAgICAgICAgZm9ybWF0dGVyID0gX3JlZjFbZmlSZXZlcnNlZF07XG4gICAgICAgICAgZmkgPSBsYXN0Zm9ybWF0dGVySW5kZXggLSBmaVJldmVyc2VkO1xuICAgICAgICAgIGFyZ3MgPSBmb3JtYXR0ZXIuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICBwcm9jZXNzZWRBcmdzID0gdGhpcy5wYXJzZUZvcm1hdHRlckFyZ3VtZW50cyhhcmdzLCBmaSk7XG4gICAgICAgICAgaWYgKChfcmVmMiA9IHRoaXMudmlldy5mb3JtYXR0ZXJzW2lkXSkgIT0gbnVsbCA/IF9yZWYyLnB1Ymxpc2ggOiB2b2lkIDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gKF9yZWYzID0gdGhpcy52aWV3LmZvcm1hdHRlcnNbaWRdKS5wdWJsaXNoLmFwcGx5KF9yZWYzLCBbdmFsdWVdLmNvbmNhdChfX3NsaWNlLmNhbGwocHJvY2Vzc2VkQXJncykpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBCaW5kaW5nLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZGVwZW5kZW5jeSwgb2JzZXJ2ZXIsIF9pLCBfbGVuLCBfcmVmMSwgX3JlZjIsIF9yZWYzO1xuICAgICAgdGhpcy5wYXJzZVRhcmdldCgpO1xuICAgICAgaWYgKChfcmVmMSA9IHRoaXMuYmluZGVyLmJpbmQpICE9IG51bGwpIHtcbiAgICAgICAgX3JlZjEuY2FsbCh0aGlzLCB0aGlzLmVsKTtcbiAgICAgIH1cbiAgICAgIGlmICgodGhpcy5tb2RlbCAhPSBudWxsKSAmJiAoKF9yZWYyID0gdGhpcy5vcHRpb25zLmRlcGVuZGVuY2llcykgIT0gbnVsbCA/IF9yZWYyLmxlbmd0aCA6IHZvaWQgMCkpIHtcbiAgICAgICAgX3JlZjMgPSB0aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzO1xuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYzLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgZGVwZW5kZW5jeSA9IF9yZWYzW19pXTtcbiAgICAgICAgICBvYnNlcnZlciA9IHRoaXMub2JzZXJ2ZSh0aGlzLm1vZGVsLCBkZXBlbmRlbmN5LCB0aGlzLnN5bmMpO1xuICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLnB1c2gob2JzZXJ2ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52aWV3LnByZWxvYWREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUudW5iaW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYWksIGFyZ3MsIGZpLCBvYnNlcnZlciwgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZWY0O1xuICAgICAgaWYgKChfcmVmMSA9IHRoaXMuYmluZGVyLnVuYmluZCkgIT0gbnVsbCkge1xuICAgICAgICBfcmVmMS5jYWxsKHRoaXMsIHRoaXMuZWwpO1xuICAgICAgfVxuICAgICAgaWYgKChfcmVmMiA9IHRoaXMub2JzZXJ2ZXIpICE9IG51bGwpIHtcbiAgICAgICAgX3JlZjIudW5vYnNlcnZlKCk7XG4gICAgICB9XG4gICAgICBfcmVmMyA9IHRoaXMuZGVwZW5kZW5jaWVzO1xuICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICBvYnNlcnZlciA9IF9yZWYzW19pXTtcbiAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IFtdO1xuICAgICAgX3JlZjQgPSB0aGlzLmZvcm1hdHRlck9ic2VydmVycztcbiAgICAgIGZvciAoZmkgaW4gX3JlZjQpIHtcbiAgICAgICAgYXJncyA9IF9yZWY0W2ZpXTtcbiAgICAgICAgZm9yIChhaSBpbiBhcmdzKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIgPSBhcmdzW2FpXTtcbiAgICAgICAgICBvYnNlcnZlci51bm9ic2VydmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVyT2JzZXJ2ZXJzID0ge307XG4gICAgfTtcblxuICAgIEJpbmRpbmcucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1vZGVscykge1xuICAgICAgdmFyIF9yZWYxLCBfcmVmMjtcbiAgICAgIGlmIChtb2RlbHMgPT0gbnVsbCkge1xuICAgICAgICBtb2RlbHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIHRoaXMubW9kZWwgPSAoX3JlZjEgPSB0aGlzLm9ic2VydmVyKSAhPSBudWxsID8gX3JlZjEudGFyZ2V0IDogdm9pZCAwO1xuICAgICAgcmV0dXJuIChfcmVmMiA9IHRoaXMuYmluZGVyLnVwZGF0ZSkgIT0gbnVsbCA/IF9yZWYyLmNhbGwodGhpcywgbW9kZWxzKSA6IHZvaWQgMDtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbihlbCkge1xuICAgICAgaWYgKHRoaXMuYmluZGVyICYmICh0aGlzLmJpbmRlci5nZXRWYWx1ZSAhPSBudWxsKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kZXIuZ2V0VmFsdWUuY2FsbCh0aGlzLCBlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUml2ZXRzLlV0aWwuZ2V0SW5wdXRWYWx1ZShlbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBCaW5kaW5nO1xuXG4gIH0pKCk7XG5cbiAgUml2ZXRzLkNvbXBvbmVudEJpbmRpbmcgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbXBvbmVudEJpbmRpbmcsIF9zdXBlcik7XG5cbiAgICBmdW5jdGlvbiBDb21wb25lbnRCaW5kaW5nKHZpZXcsIGVsLCB0eXBlKSB7XG4gICAgICB2YXIgYXR0cmlidXRlLCBiaW5kaW5nUmVnRXhwLCBwcm9wZXJ0eU5hbWUsIHRva2VuLCBfaSwgX2xlbiwgX3JlZjEsIF9yZWYyO1xuICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICB0aGlzLnVuYmluZCA9IF9fYmluZCh0aGlzLnVuYmluZCwgdGhpcyk7XG4gICAgICB0aGlzLmJpbmQgPSBfX2JpbmQodGhpcy5iaW5kLCB0aGlzKTtcbiAgICAgIHRoaXMubG9jYWxzID0gX19iaW5kKHRoaXMubG9jYWxzLCB0aGlzKTtcbiAgICAgIHRoaXMuY29tcG9uZW50ID0gdGhpcy52aWV3LmNvbXBvbmVudHNbdGhpcy50eXBlXTtcbiAgICAgIHRoaXNbXCJzdGF0aWNcIl0gPSB7fTtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzID0ge307XG4gICAgICB0aGlzLnVwc3RyZWFtT2JzZXJ2ZXJzID0ge307XG4gICAgICBiaW5kaW5nUmVnRXhwID0gdmlldy5iaW5kaW5nUmVnRXhwKCk7XG4gICAgICBfcmVmMSA9IHRoaXMuZWwuYXR0cmlidXRlcyB8fCBbXTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYXR0cmlidXRlID0gX3JlZjFbX2ldO1xuICAgICAgICBpZiAoIWJpbmRpbmdSZWdFeHAudGVzdChhdHRyaWJ1dGUubmFtZSkpIHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSB0aGlzLmNhbWVsQ2FzZShhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgdG9rZW4gPSBSaXZldHMuVHlwZVBhcnNlci5wYXJzZShhdHRyaWJ1dGUudmFsdWUpO1xuICAgICAgICAgIGlmIChfX2luZGV4T2YuY2FsbCgoX3JlZjIgPSB0aGlzLmNvbXBvbmVudFtcInN0YXRpY1wiXSkgIT0gbnVsbCA/IF9yZWYyIDogW10sIHByb3BlcnR5TmFtZSkgPj0gMCkge1xuICAgICAgICAgICAgdGhpc1tcInN0YXRpY1wiXVtwcm9wZXJ0eU5hbWVdID0gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gUml2ZXRzLlR5cGVQYXJzZXIudHlwZXMucHJpbWl0aXZlKSB7XG4gICAgICAgICAgICB0aGlzW1wic3RhdGljXCJdW3Byb3BlcnR5TmFtZV0gPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnNbcHJvcGVydHlOYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb21wb25lbnRCaW5kaW5nLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7fTtcblxuICAgIENvbXBvbmVudEJpbmRpbmcucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge307XG5cbiAgICBDb21wb25lbnRCaW5kaW5nLnByb3RvdHlwZS5wdWJsaXNoID0gZnVuY3Rpb24oKSB7fTtcblxuICAgIENvbXBvbmVudEJpbmRpbmcucHJvdG90eXBlLmxvY2FscyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGtleSwgb2JzZXJ2ZXIsIHJlc3VsdCwgdmFsdWUsIF9yZWYxLCBfcmVmMjtcbiAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgX3JlZjEgPSB0aGlzW1wic3RhdGljXCJdO1xuICAgICAgZm9yIChrZXkgaW4gX3JlZjEpIHtcbiAgICAgICAgdmFsdWUgPSBfcmVmMVtrZXldO1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgX3JlZjIgPSB0aGlzLm9ic2VydmVycztcbiAgICAgIGZvciAoa2V5IGluIF9yZWYyKSB7XG4gICAgICAgIG9ic2VydmVyID0gX3JlZjJba2V5XTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBvYnNlcnZlci52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgQ29tcG9uZW50QmluZGluZy5wcm90b3R5cGUuY2FtZWxDYXNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLy0oW2Etel0pL2csIGZ1bmN0aW9uKGdyb3VwZWQpIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwZWRbMV0udG9VcHBlckNhc2UoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDb21wb25lbnRCaW5kaW5nLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaywga2V5LCBrZXlwYXRoLCBvYnNlcnZlciwgb3B0aW9uLCBvcHRpb25zLCBzY29wZSwgdiwgX2Jhc2UsIF9pLCBfaiwgX2xlbiwgX2xlbjEsIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZWY0LCBfcmVmNSwgX3JlZjYsIF9yZWY3O1xuICAgICAgaWYgKCF0aGlzLmJvdW5kKSB7XG4gICAgICAgIF9yZWYxID0gdGhpcy5vYnNlcnZlcnM7XG4gICAgICAgIGZvciAoa2V5IGluIF9yZWYxKSB7XG4gICAgICAgICAga2V5cGF0aCA9IF9yZWYxW2tleV07XG4gICAgICAgICAgdGhpcy5vYnNlcnZlcnNba2V5XSA9IHRoaXMub2JzZXJ2ZSh0aGlzLnZpZXcubW9kZWxzLCBrZXlwYXRoLCAoKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuY29tcG9uZW50Vmlldy5tb2RlbHNba2V5XSA9IF90aGlzLm9ic2VydmVyc1trZXldLnZhbHVlKCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKHRoaXMpKS5jYWxsKHRoaXMsIGtleSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm91bmQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50VmlldyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Vmlldy5iaW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsLmlubmVySFRNTCA9IHRoaXMuY29tcG9uZW50LnRlbXBsYXRlLmNhbGwodGhpcyk7XG4gICAgICAgIHNjb3BlID0gdGhpcy5jb21wb25lbnQuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMuZWwsIHRoaXMubG9jYWxzKCkpO1xuICAgICAgICB0aGlzLmVsLl9ib3VuZCA9IHRydWU7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgX3JlZjIgPSBSaXZldHMuZXh0ZW5zaW9ucztcbiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgIG9wdGlvbiA9IF9yZWYyW19pXTtcbiAgICAgICAgICBvcHRpb25zW29wdGlvbl0gPSB7fTtcbiAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRbb3B0aW9uXSkge1xuICAgICAgICAgICAgX3JlZjMgPSB0aGlzLmNvbXBvbmVudFtvcHRpb25dO1xuICAgICAgICAgICAgZm9yIChrIGluIF9yZWYzKSB7XG4gICAgICAgICAgICAgIHYgPSBfcmVmM1trXTtcbiAgICAgICAgICAgICAgb3B0aW9uc1tvcHRpb25dW2tdID0gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgX3JlZjQgPSB0aGlzLnZpZXdbb3B0aW9uXTtcbiAgICAgICAgICBmb3IgKGsgaW4gX3JlZjQpIHtcbiAgICAgICAgICAgIHYgPSBfcmVmNFtrXTtcbiAgICAgICAgICAgIGlmICgoX2Jhc2UgPSBvcHRpb25zW29wdGlvbl0pW2tdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgX2Jhc2Vba10gPSB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfcmVmNSA9IFJpdmV0cy5vcHRpb25zO1xuICAgICAgICBmb3IgKF9qID0gMCwgX2xlbjEgPSBfcmVmNS5sZW5ndGg7IF9qIDwgX2xlbjE7IF9qKyspIHtcbiAgICAgICAgICBvcHRpb24gPSBfcmVmNVtfal07XG4gICAgICAgICAgb3B0aW9uc1tvcHRpb25dID0gKF9yZWY2ID0gdGhpcy5jb21wb25lbnRbb3B0aW9uXSkgIT0gbnVsbCA/IF9yZWY2IDogdGhpcy52aWV3W29wdGlvbl07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21wb25lbnRWaWV3ID0gbmV3IFJpdmV0cy5WaWV3KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuZWwuY2hpbGROb2RlcyksIHNjb3BlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRWaWV3LmJpbmQoKTtcbiAgICAgICAgX3JlZjcgPSB0aGlzLm9ic2VydmVycztcbiAgICAgICAgZm9yIChrZXkgaW4gX3JlZjcpIHtcbiAgICAgICAgICBvYnNlcnZlciA9IF9yZWY3W2tleV07XG4gICAgICAgICAgdGhpcy51cHN0cmVhbU9ic2VydmVyc1trZXldID0gdGhpcy5vYnNlcnZlKHRoaXMuY29tcG9uZW50Vmlldy5tb2RlbHMsIGtleSwgKChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5zZXRWYWx1ZShfdGhpcy5jb21wb25lbnRWaWV3Lm1vZGVsc1trZXldKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkodGhpcykpLmNhbGwodGhpcywga2V5LCBvYnNlcnZlcikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIENvbXBvbmVudEJpbmRpbmcucHJvdG90eXBlLnVuYmluZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGtleSwgb2JzZXJ2ZXIsIF9yZWYxLCBfcmVmMiwgX3JlZjM7XG4gICAgICBfcmVmMSA9IHRoaXMudXBzdHJlYW1PYnNlcnZlcnM7XG4gICAgICBmb3IgKGtleSBpbiBfcmVmMSkge1xuICAgICAgICBvYnNlcnZlciA9IF9yZWYxW2tleV07XG4gICAgICAgIG9ic2VydmVyLnVub2JzZXJ2ZSgpO1xuICAgICAgfVxuICAgICAgX3JlZjIgPSB0aGlzLm9ic2VydmVycztcbiAgICAgIGZvciAoa2V5IGluIF9yZWYyKSB7XG4gICAgICAgIG9ic2VydmVyID0gX3JlZjJba2V5XTtcbiAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKF9yZWYzID0gdGhpcy5jb21wb25lbnRWaWV3KSAhPSBudWxsID8gX3JlZjMudW5iaW5kLmNhbGwodGhpcykgOiB2b2lkIDA7XG4gICAgfTtcblxuICAgIHJldHVybiBDb21wb25lbnRCaW5kaW5nO1xuXG4gIH0pKFJpdmV0cy5CaW5kaW5nKTtcblxuICBSaXZldHMuVGV4dEJpbmRpbmcgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRleHRCaW5kaW5nLCBfc3VwZXIpO1xuXG4gICAgZnVuY3Rpb24gVGV4dEJpbmRpbmcodmlldywgZWwsIHR5cGUsIGtleXBhdGgsIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICB0aGlzLmVsID0gZWw7XG4gICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgdGhpcy5rZXlwYXRoID0ga2V5cGF0aDtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMgOiB7fTtcbiAgICAgIHRoaXMuc3luYyA9IF9fYmluZCh0aGlzLnN5bmMsIHRoaXMpO1xuICAgICAgdGhpcy5mb3JtYXR0ZXJzID0gdGhpcy5vcHRpb25zLmZvcm1hdHRlcnMgfHwgW107XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IFtdO1xuICAgICAgdGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnMgPSB7fTtcbiAgICB9XG5cbiAgICBUZXh0QmluZGluZy5wcm90b3R5cGUuYmluZGVyID0ge1xuICAgICAgcm91dGluZTogZnVuY3Rpb24obm9kZSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuZGF0YSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICcnO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBUZXh0QmluZGluZy5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIFRleHRCaW5kaW5nLl9fc3VwZXJfXy5zeW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIHJldHVybiBUZXh0QmluZGluZztcblxuICB9KShSaXZldHMuQmluZGluZyk7XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnMudGV4dCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgIGlmIChlbC50ZXh0Q29udGVudCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZWwudGV4dENvbnRlbnQgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsLmlubmVyVGV4dCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICcnO1xuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy5odG1sID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGVsLmlubmVySFRNTCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICcnO1xuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzLnNob3cgPSBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICByZXR1cm4gZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gJycgOiAnbm9uZSc7XG4gIH07XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnMuaGlkZSA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgIHJldHVybiBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyAnbm9uZScgOiAnJztcbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy5lbmFibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGVsLmRpc2FibGVkID0gIXZhbHVlO1xuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGVsLmRpc2FibGVkID0gISF2YWx1ZTtcbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy5jaGVja2VkID0ge1xuICAgIHB1Ymxpc2hlczogdHJ1ZSxcbiAgICBwcmlvcml0eTogMjAwMCxcbiAgICBiaW5kOiBmdW5jdGlvbihlbCkge1xuICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLmJpbmRFdmVudChlbCwgJ2NoYW5nZScsIHRoaXMucHVibGlzaCk7XG4gICAgfSxcbiAgICB1bmJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICByZXR1cm4gUml2ZXRzLlV0aWwudW5iaW5kRXZlbnQoZWwsICdjaGFuZ2UnLCB0aGlzLnB1Ymxpc2gpO1xuICAgIH0sXG4gICAgcm91dGluZTogZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgICB2YXIgX3JlZjE7XG4gICAgICBpZiAoZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWwuY2hlY2tlZCA9ICgoX3JlZjEgPSBlbC52YWx1ZSkgIT0gbnVsbCA/IF9yZWYxLnRvU3RyaW5nKCkgOiB2b2lkIDApID09PSAodmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiB2b2lkIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsLmNoZWNrZWQgPSAhIXZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy51bmNoZWNrZWQgPSB7XG4gICAgcHVibGlzaGVzOiB0cnVlLFxuICAgIHByaW9yaXR5OiAyMDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICByZXR1cm4gUml2ZXRzLlV0aWwuYmluZEV2ZW50KGVsLCAnY2hhbmdlJywgdGhpcy5wdWJsaXNoKTtcbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIHJldHVybiBSaXZldHMuVXRpbC51bmJpbmRFdmVudChlbCwgJ2NoYW5nZScsIHRoaXMucHVibGlzaCk7XG4gICAgfSxcbiAgICByb3V0aW5lOiBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICAgIHZhciBfcmVmMTtcbiAgICAgIGlmIChlbC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbC5jaGVja2VkID0gKChfcmVmMSA9IGVsLnZhbHVlKSAhPSBudWxsID8gX3JlZjEudG9TdHJpbmcoKSA6IHZvaWQgMCkgIT09ICh2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHZvaWQgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWwuY2hlY2tlZCA9ICF2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnMudmFsdWUgPSB7XG4gICAgcHVibGlzaGVzOiB0cnVlLFxuICAgIHByaW9yaXR5OiAzMDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICBpZiAoIShlbC50YWdOYW1lID09PSAnSU5QVVQnICYmIGVsLnR5cGUgPT09ICdyYWRpbycpKSB7XG4gICAgICAgIHRoaXMuZXZlbnQgPSBlbC50YWdOYW1lID09PSAnU0VMRUNUJyA/ICdjaGFuZ2UnIDogJ2lucHV0JztcbiAgICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLmJpbmRFdmVudChlbCwgdGhpcy5ldmVudCwgdGhpcy5wdWJsaXNoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIGlmICghKGVsLnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZWwudHlwZSA9PT0gJ3JhZGlvJykpIHtcbiAgICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLnVuYmluZEV2ZW50KGVsLCB0aGlzLmV2ZW50LCB0aGlzLnB1Ymxpc2gpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcm91dGluZTogZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgICB2YXIgbywgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZXN1bHRzO1xuICAgICAgaWYgKGVsLnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWwuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAod2luZG93LmpRdWVyeSAhPSBudWxsKSB7XG4gICAgICAgIGVsID0galF1ZXJ5KGVsKTtcbiAgICAgICAgaWYgKCh2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHZvaWQgMCkgIT09ICgoX3JlZjEgPSBlbC52YWwoKSkgIT0gbnVsbCA/IF9yZWYxLnRvU3RyaW5nKCkgOiB2b2lkIDApKSB7XG4gICAgICAgICAgcmV0dXJuIGVsLnZhbCh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChlbC50eXBlID09PSAnc2VsZWN0LW11bHRpcGxlJykge1xuICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBfcmVzdWx0cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBlbC5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICBvID0gZWxbX2ldO1xuICAgICAgICAgICAgICBfcmVzdWx0cy5wdXNoKG8uc2VsZWN0ZWQgPSAoX3JlZjIgPSBvLnZhbHVlLCBfX2luZGV4T2YuY2FsbCh2YWx1ZSwgX3JlZjIpID49IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfcmVzdWx0cztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogdm9pZCAwKSAhPT0gKChfcmVmMyA9IGVsLnZhbHVlKSAhPSBudWxsID8gX3JlZjMudG9TdHJpbmcoKSA6IHZvaWQgMCkpIHtcbiAgICAgICAgICByZXR1cm4gZWwudmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVyc1tcImlmXCJdID0ge1xuICAgIGJsb2NrOiB0cnVlLFxuICAgIHByaW9yaXR5OiA0MDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICB2YXIgYXR0ciwgZGVjbGFyYXRpb247XG4gICAgICBpZiAodGhpcy5tYXJrZXIgPT0gbnVsbCkge1xuICAgICAgICBhdHRyID0gW3RoaXMudmlldy5wcmVmaXgsIHRoaXMudHlwZV0uam9pbignLScpLnJlcGxhY2UoJy0tJywgJy0nKTtcbiAgICAgICAgZGVjbGFyYXRpb24gPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cik7XG4gICAgICAgIHRoaXMubWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIiByaXZldHM6IFwiICsgdGhpcy50eXBlICsgXCIgXCIgKyBkZWNsYXJhdGlvbiArIFwiIFwiKTtcbiAgICAgICAgdGhpcy5ib3VuZCA9IGZhbHNlO1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICAgIGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubWFya2VyLCBlbCk7XG4gICAgICAgIHJldHVybiBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5uZXN0ZWQpIHtcbiAgICAgICAgdGhpcy5uZXN0ZWQudW5iaW5kKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmJvdW5kID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgICByb3V0aW5lOiBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICAgIHZhciBrZXksIG1vZGVsLCBtb2RlbHMsIF9yZWYxO1xuICAgICAgaWYgKCEhdmFsdWUgPT09ICF0aGlzLmJvdW5kKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIG1vZGVscyA9IHt9O1xuICAgICAgICAgIF9yZWYxID0gdGhpcy52aWV3Lm1vZGVscztcbiAgICAgICAgICBmb3IgKGtleSBpbiBfcmVmMSkge1xuICAgICAgICAgICAgbW9kZWwgPSBfcmVmMVtrZXldO1xuICAgICAgICAgICAgbW9kZWxzW2tleV0gPSBtb2RlbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgKHRoaXMubmVzdGVkIHx8ICh0aGlzLm5lc3RlZCA9IG5ldyBSaXZldHMuVmlldyhlbCwgbW9kZWxzLCB0aGlzLnZpZXcub3B0aW9ucygpKSkpLmJpbmQoKTtcbiAgICAgICAgICB0aGlzLm1hcmtlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbCwgdGhpcy5tYXJrZXIubmV4dFNpYmxpbmcpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmJvdW5kID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICB0aGlzLm5lc3RlZC51bmJpbmQoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ib3VuZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGU6IGZ1bmN0aW9uKG1vZGVscykge1xuICAgICAgdmFyIF9yZWYxO1xuICAgICAgcmV0dXJuIChfcmVmMSA9IHRoaXMubmVzdGVkKSAhPSBudWxsID8gX3JlZjEudXBkYXRlKG1vZGVscykgOiB2b2lkIDA7XG4gICAgfVxuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzLnVubGVzcyA9IHtcbiAgICBibG9jazogdHJ1ZSxcbiAgICBwcmlvcml0eTogNDAwMCxcbiAgICBiaW5kOiBmdW5jdGlvbihlbCkge1xuICAgICAgcmV0dXJuIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzW1wiaWZcIl0uYmluZC5jYWxsKHRoaXMsIGVsKTtcbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnNbXCJpZlwiXS51bmJpbmQuY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIHJvdXRpbmU6IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzW1wiaWZcIl0ucm91dGluZS5jYWxsKHRoaXMsIGVsLCAhdmFsdWUpO1xuICAgIH0sXG4gICAgdXBkYXRlOiBmdW5jdGlvbihtb2RlbHMpIHtcbiAgICAgIHJldHVybiBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVyc1tcImlmXCJdLnVwZGF0ZS5jYWxsKHRoaXMsIG1vZGVscyk7XG4gICAgfVxuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzWydvbi0qJ10gPSB7XG4gICAgXCJmdW5jdGlvblwiOiB0cnVlLFxuICAgIHByaW9yaXR5OiAxMDAwLFxuICAgIHVuYmluZDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIGlmICh0aGlzLmhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLnVuYmluZEV2ZW50KGVsLCB0aGlzLmFyZ3NbMF0sIHRoaXMuaGFuZGxlcik7XG4gICAgICB9XG4gICAgfSxcbiAgICByb3V0aW5lOiBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmhhbmRsZXIpIHtcbiAgICAgICAgUml2ZXRzLlV0aWwudW5iaW5kRXZlbnQoZWwsIHRoaXMuYXJnc1swXSwgdGhpcy5oYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSaXZldHMuVXRpbC5iaW5kRXZlbnQoZWwsIHRoaXMuYXJnc1swXSwgdGhpcy5oYW5kbGVyID0gdGhpcy5ldmVudEhhbmRsZXIodmFsdWUpKTtcbiAgICB9XG4gIH07XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnNbJ2VhY2gtKiddID0ge1xuICAgIGJsb2NrOiB0cnVlLFxuICAgIHByaW9yaXR5OiA0MDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICB2YXIgYXR0ciwgdmlldywgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgaWYgKHRoaXMubWFya2VyID09IG51bGwpIHtcbiAgICAgICAgYXR0ciA9IFt0aGlzLnZpZXcucHJlZml4LCB0aGlzLnR5cGVdLmpvaW4oJy0nKS5yZXBsYWNlKCctLScsICctJyk7XG4gICAgICAgIHRoaXMubWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIiByaXZldHM6IFwiICsgdGhpcy50eXBlICsgXCIgXCIpO1xuICAgICAgICB0aGlzLml0ZXJhdGVkID0gW107XG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5tYXJrZXIsIGVsKTtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfcmVmMSA9IHRoaXMuaXRlcmF0ZWQ7XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICB2aWV3ID0gX3JlZjFbX2ldO1xuICAgICAgICAgIHZpZXcuYmluZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB1bmJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICB2YXIgdmlldywgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgaWYgKHRoaXMuaXRlcmF0ZWQgIT0gbnVsbCkge1xuICAgICAgICBfcmVmMSA9IHRoaXMuaXRlcmF0ZWQ7XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICB2aWV3ID0gX3JlZjFbX2ldO1xuICAgICAgICAgIHZpZXcudW5iaW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHJvdXRpbmU6IGZ1bmN0aW9uKGVsLCBjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgYmluZGluZywgZGF0YSwgaSwgaW5kZXgsIGtleSwgbW9kZWwsIG1vZGVsTmFtZSwgb3B0aW9ucywgcHJldmlvdXMsIHRlbXBsYXRlLCB2aWV3LCBfaSwgX2osIF9rLCBfbGVuLCBfbGVuMSwgX2xlbjIsIF9yZWYxLCBfcmVmMiwgX3JlZjM7XG4gICAgICBtb2RlbE5hbWUgPSB0aGlzLmFyZ3NbMF07XG4gICAgICBjb2xsZWN0aW9uID0gY29sbGVjdGlvbiB8fCBbXTtcbiAgICAgIGlmICh0aGlzLml0ZXJhdGVkLmxlbmd0aCA+IGNvbGxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgIF9yZWYxID0gQXJyYXkodGhpcy5pdGVyYXRlZC5sZW5ndGggLSBjb2xsZWN0aW9uLmxlbmd0aCk7XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICBpID0gX3JlZjFbX2ldO1xuICAgICAgICAgIHZpZXcgPSB0aGlzLml0ZXJhdGVkLnBvcCgpO1xuICAgICAgICAgIHZpZXcudW5iaW5kKCk7XG4gICAgICAgICAgdGhpcy5tYXJrZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2aWV3LmVsc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoaW5kZXggPSBfaiA9IDAsIF9sZW4xID0gY29sbGVjdGlvbi5sZW5ndGg7IF9qIDwgX2xlbjE7IGluZGV4ID0gKytfaikge1xuICAgICAgICBtb2RlbCA9IGNvbGxlY3Rpb25baW5kZXhdO1xuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICB9O1xuICAgICAgICBkYXRhW1JpdmV0c1tcInB1YmxpY1wiXS5pdGVyYXRpb25BbGlhcyhtb2RlbE5hbWUpXSA9IGluZGV4O1xuICAgICAgICBkYXRhW21vZGVsTmFtZV0gPSBtb2RlbDtcbiAgICAgICAgaWYgKHRoaXMuaXRlcmF0ZWRbaW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICBfcmVmMiA9IHRoaXMudmlldy5tb2RlbHM7XG4gICAgICAgICAgZm9yIChrZXkgaW4gX3JlZjIpIHtcbiAgICAgICAgICAgIG1vZGVsID0gX3JlZjJba2V5XTtcbiAgICAgICAgICAgIGlmIChkYXRhW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICBkYXRhW2tleV0gPSBtb2RlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcHJldmlvdXMgPSB0aGlzLml0ZXJhdGVkLmxlbmd0aCA/IHRoaXMuaXRlcmF0ZWRbdGhpcy5pdGVyYXRlZC5sZW5ndGggLSAxXS5lbHNbMF0gOiB0aGlzLm1hcmtlcjtcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy52aWV3Lm9wdGlvbnMoKTtcbiAgICAgICAgICBvcHRpb25zLnByZWxvYWREYXRhID0gdHJ1ZTtcbiAgICAgICAgICB0ZW1wbGF0ZSA9IGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICB2aWV3ID0gbmV3IFJpdmV0cy5WaWV3KHRlbXBsYXRlLCBkYXRhLCBvcHRpb25zKTtcbiAgICAgICAgICB2aWV3LmJpbmQoKTtcbiAgICAgICAgICB0aGlzLml0ZXJhdGVkLnB1c2godmlldyk7XG4gICAgICAgICAgdGhpcy5tYXJrZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGVtcGxhdGUsIHByZXZpb3VzLm5leHRTaWJsaW5nKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLml0ZXJhdGVkW2luZGV4XS5tb2RlbHNbbW9kZWxOYW1lXSAhPT0gbW9kZWwpIHtcbiAgICAgICAgICB0aGlzLml0ZXJhdGVkW2luZGV4XS51cGRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgX3JlZjMgPSB0aGlzLnZpZXcuYmluZGluZ3M7XG4gICAgICAgIGZvciAoX2sgPSAwLCBfbGVuMiA9IF9yZWYzLmxlbmd0aDsgX2sgPCBfbGVuMjsgX2srKykge1xuICAgICAgICAgIGJpbmRpbmcgPSBfcmVmM1tfa107XG4gICAgICAgICAgaWYgKGJpbmRpbmcuZWwgPT09IHRoaXMubWFya2VyLnBhcmVudE5vZGUgJiYgYmluZGluZy50eXBlID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBiaW5kaW5nLnN5bmMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZTogZnVuY3Rpb24obW9kZWxzKSB7XG4gICAgICB2YXIgZGF0YSwga2V5LCBtb2RlbCwgdmlldywgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgZGF0YSA9IHt9O1xuICAgICAgZm9yIChrZXkgaW4gbW9kZWxzKSB7XG4gICAgICAgIG1vZGVsID0gbW9kZWxzW2tleV07XG4gICAgICAgIGlmIChrZXkgIT09IHRoaXMuYXJnc1swXSkge1xuICAgICAgICAgIGRhdGFba2V5XSA9IG1vZGVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfcmVmMSA9IHRoaXMuaXRlcmF0ZWQ7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIHZpZXcgPSBfcmVmMVtfaV07XG4gICAgICAgIHZpZXcudXBkYXRlKGRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVyc1snY2xhc3MtKiddID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgdmFyIGVsQ2xhc3M7XG4gICAgZWxDbGFzcyA9IFwiIFwiICsgZWwuY2xhc3NOYW1lICsgXCIgXCI7XG4gICAgaWYgKCF2YWx1ZSA9PT0gKGVsQ2xhc3MuaW5kZXhPZihcIiBcIiArIHRoaXMuYXJnc1swXSArIFwiIFwiKSAhPT0gLTEpKSB7XG4gICAgICByZXR1cm4gZWwuY2xhc3NOYW1lID0gdmFsdWUgPyBcIlwiICsgZWwuY2xhc3NOYW1lICsgXCIgXCIgKyB0aGlzLmFyZ3NbMF0gOiBlbENsYXNzLnJlcGxhY2UoXCIgXCIgKyB0aGlzLmFyZ3NbMF0gKyBcIiBcIiwgJyAnKS50cmltKCk7XG4gICAgfVxuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzWycqJ10gPSBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsLnNldEF0dHJpYnV0ZSh0aGlzLnR5cGUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLnR5cGUpO1xuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uZm9ybWF0dGVyc1snY2FsbCddID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MsIHZhbHVlO1xuICAgIHZhbHVlID0gYXJndW1lbnRzWzBdLCBhcmdzID0gMiA8PSBhcmd1bWVudHMubGVuZ3RoID8gX19zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkgOiBbXTtcbiAgICByZXR1cm4gdmFsdWUuY2FsbC5hcHBseSh2YWx1ZSwgW3RoaXNdLmNvbmNhdChfX3NsaWNlLmNhbGwoYXJncykpKTtcbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYWRhcHRlcnNbJy4nXSA9IHtcbiAgICBpZDogJ19ydicsXG4gICAgY291bnRlcjogMCxcbiAgICB3ZWFrbWFwOiB7fSxcbiAgICB3ZWFrUmVmZXJlbmNlOiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHZhciBpZCwgX2Jhc2UsIF9uYW1lO1xuICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkodGhpcy5pZCkpIHtcbiAgICAgICAgaWQgPSB0aGlzLmNvdW50ZXIrKztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgdGhpcy5pZCwge1xuICAgICAgICAgIHZhbHVlOiBpZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoX2Jhc2UgPSB0aGlzLndlYWttYXApW19uYW1lID0gb2JqW3RoaXMuaWRdXSB8fCAoX2Jhc2VbX25hbWVdID0ge1xuICAgICAgICBjYWxsYmFja3M6IHt9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNsZWFudXBXZWFrUmVmZXJlbmNlOiBmdW5jdGlvbihyZWYsIGlkKSB7XG4gICAgICBpZiAoIU9iamVjdC5rZXlzKHJlZi5jYWxsYmFja3MpLmxlbmd0aCkge1xuICAgICAgICBpZiAoIShyZWYucG9pbnRlcnMgJiYgT2JqZWN0LmtleXMocmVmLnBvaW50ZXJzKS5sZW5ndGgpKSB7XG4gICAgICAgICAgcmV0dXJuIGRlbGV0ZSB0aGlzLndlYWttYXBbaWRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzdHViRnVuY3Rpb246IGZ1bmN0aW9uKG9iaiwgZm4pIHtcbiAgICAgIHZhciBtYXAsIG9yaWdpbmFsLCB3ZWFrbWFwO1xuICAgICAgb3JpZ2luYWwgPSBvYmpbZm5dO1xuICAgICAgbWFwID0gdGhpcy53ZWFrUmVmZXJlbmNlKG9iaik7XG4gICAgICB3ZWFrbWFwID0gdGhpcy53ZWFrbWFwO1xuICAgICAgcmV0dXJuIG9ialtmbl0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrLCBrLCByLCByZXNwb25zZSwgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZWY0O1xuICAgICAgICByZXNwb25zZSA9IG9yaWdpbmFsLmFwcGx5KG9iaiwgYXJndW1lbnRzKTtcbiAgICAgICAgX3JlZjEgPSBtYXAucG9pbnRlcnM7XG4gICAgICAgIGZvciAociBpbiBfcmVmMSkge1xuICAgICAgICAgIGsgPSBfcmVmMVtyXTtcbiAgICAgICAgICBfcmVmNCA9IChfcmVmMiA9IChfcmVmMyA9IHdlYWttYXBbcl0pICE9IG51bGwgPyBfcmVmMy5jYWxsYmFja3Nba10gOiB2b2lkIDApICE9IG51bGwgPyBfcmVmMiA6IFtdO1xuICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjQubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gX3JlZjRbX2ldO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfTtcbiAgICB9LFxuICAgIG9ic2VydmVNdXRhdGlvbnM6IGZ1bmN0aW9uKG9iaiwgcmVmLCBrZXlwYXRoKSB7XG4gICAgICB2YXIgZm4sIGZ1bmN0aW9ucywgbWFwLCBfYmFzZSwgX2ksIF9sZW47XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIG1hcCA9IHRoaXMud2Vha1JlZmVyZW5jZShvYmopO1xuICAgICAgICBpZiAobWFwLnBvaW50ZXJzID09IG51bGwpIHtcbiAgICAgICAgICBtYXAucG9pbnRlcnMgPSB7fTtcbiAgICAgICAgICBmdW5jdGlvbnMgPSBbJ3B1c2gnLCAncG9wJywgJ3NoaWZ0JywgJ3Vuc2hpZnQnLCAnc29ydCcsICdyZXZlcnNlJywgJ3NwbGljZSddO1xuICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gZnVuY3Rpb25zLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICBmbiA9IGZ1bmN0aW9uc1tfaV07XG4gICAgICAgICAgICB0aGlzLnN0dWJGdW5jdGlvbihvYmosIGZuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChfYmFzZSA9IG1hcC5wb2ludGVycylbcmVmXSA9PSBudWxsKSB7XG4gICAgICAgICAgX2Jhc2VbcmVmXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfX2luZGV4T2YuY2FsbChtYXAucG9pbnRlcnNbcmVmXSwga2V5cGF0aCkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcC5wb2ludGVyc1tyZWZdLnB1c2goa2V5cGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHVub2JzZXJ2ZU11dGF0aW9uczogZnVuY3Rpb24ob2JqLCByZWYsIGtleXBhdGgpIHtcbiAgICAgIHZhciBpZHgsIG1hcCwgcG9pbnRlcnM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopICYmIChvYmpbdGhpcy5pZF0gIT0gbnVsbCkpIHtcbiAgICAgICAgaWYgKG1hcCA9IHRoaXMud2Vha21hcFtvYmpbdGhpcy5pZF1dKSB7XG4gICAgICAgICAgaWYgKHBvaW50ZXJzID0gbWFwLnBvaW50ZXJzW3JlZl0pIHtcbiAgICAgICAgICAgIGlmICgoaWR4ID0gcG9pbnRlcnMuaW5kZXhPZihrZXlwYXRoKSkgPj0gMCkge1xuICAgICAgICAgICAgICBwb2ludGVycy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcG9pbnRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBtYXAucG9pbnRlcnNbcmVmXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBXZWFrUmVmZXJlbmNlKG1hcCwgb2JqW3RoaXMuaWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIG9ic2VydmU6IGZ1bmN0aW9uKG9iaiwga2V5cGF0aCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBjYWxsYmFja3MsIGRlc2MsIHZhbHVlO1xuICAgICAgY2FsbGJhY2tzID0gdGhpcy53ZWFrUmVmZXJlbmNlKG9iaikuY2FsbGJhY2tzO1xuICAgICAgaWYgKGNhbGxiYWNrc1trZXlwYXRoXSA9PSBudWxsKSB7XG4gICAgICAgIGNhbGxiYWNrc1trZXlwYXRoXSA9IFtdO1xuICAgICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleXBhdGgpO1xuICAgICAgICBpZiAoISgoZGVzYyAhPSBudWxsID8gZGVzYy5nZXQgOiB2b2lkIDApIHx8IChkZXNjICE9IG51bGwgPyBkZXNjLnNldCA6IHZvaWQgMCkpKSB7XG4gICAgICAgICAgdmFsdWUgPSBvYmpba2V5cGF0aF07XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5cGF0aCwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2IsIG1hcCwgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLnVub2JzZXJ2ZU11dGF0aW9ucyh2YWx1ZSwgb2JqW190aGlzLmlkXSwga2V5cGF0aCk7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgaWYgKG1hcCA9IF90aGlzLndlYWttYXBbb2JqW190aGlzLmlkXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gbWFwLmNhbGxiYWNrcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1trZXlwYXRoXSkge1xuICAgICAgICAgICAgICAgICAgICAgIF9yZWYxID0gY2FsbGJhY2tzW2tleXBhdGhdLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2IgPSBfcmVmMVtfaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19pbmRleE9mLmNhbGwoY2FsbGJhY2tzW2tleXBhdGhdLCBjYikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMub2JzZXJ2ZU11dGF0aW9ucyhuZXdWYWx1ZSwgb2JqW190aGlzLmlkXSwga2V5cGF0aCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKGNhbGxiYWNrc1trZXlwYXRoXSwgY2FsbGJhY2spIDwgMCkge1xuICAgICAgICBjYWxsYmFja3Nba2V5cGF0aF0ucHVzaChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vYnNlcnZlTXV0YXRpb25zKG9ialtrZXlwYXRoXSwgb2JqW3RoaXMuaWRdLCBrZXlwYXRoKTtcbiAgICB9LFxuICAgIHVub2JzZXJ2ZTogZnVuY3Rpb24ob2JqLCBrZXlwYXRoLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGNhbGxiYWNrcywgaWR4LCBtYXA7XG4gICAgICBpZiAobWFwID0gdGhpcy53ZWFrbWFwW29ialt0aGlzLmlkXV0pIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrcyA9IG1hcC5jYWxsYmFja3Nba2V5cGF0aF0pIHtcbiAgICAgICAgICBpZiAoKGlkeCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKSkgPj0gMCkge1xuICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBtYXAuY2FsbGJhY2tzW2tleXBhdGhdO1xuICAgICAgICAgICAgICB0aGlzLnVub2JzZXJ2ZU11dGF0aW9ucyhvYmpba2V5cGF0aF0sIG9ialt0aGlzLmlkXSwga2V5cGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBXZWFrUmVmZXJlbmNlKG1hcCwgb2JqW3RoaXMuaWRdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbihvYmosIGtleXBhdGgpIHtcbiAgICAgIHJldHVybiBvYmpba2V5cGF0aF07XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKG9iaiwga2V5cGF0aCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5cGF0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgUml2ZXRzLmZhY3RvcnkgPSBmdW5jdGlvbihzaWdodGdsYXNzKSB7XG4gICAgUml2ZXRzLnNpZ2h0Z2xhc3MgPSBzaWdodGdsYXNzO1xuICAgIFJpdmV0c1tcInB1YmxpY1wiXS5fID0gUml2ZXRzO1xuICAgIHJldHVybiBSaXZldHNbXCJwdWJsaWNcIl07XG4gIH07XG5cbiAgaWYgKHR5cGVvZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUgIT09IG51bGwgPyBtb2R1bGUuZXhwb3J0cyA6IHZvaWQgMCkgPT09ICdvYmplY3QnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBSaXZldHMuZmFjdG9yeShyZXF1aXJlKCdzaWdodGdsYXNzJykpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbJ3NpZ2h0Z2xhc3MnXSwgZnVuY3Rpb24oc2lnaHRnbGFzcykge1xuICAgICAgcmV0dXJuIHRoaXMucml2ZXRzID0gUml2ZXRzLmZhY3Rvcnkoc2lnaHRnbGFzcyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yaXZldHMgPSBSaXZldHMuZmFjdG9yeShzaWdodGdsYXNzKTtcbiAgfVxuXG59KS5jYWxsKHRoaXMpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcml2ZXRzL2Rpc3Qvcml2ZXRzLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9yaXZldHMvZGlzdC9yaXZldHMuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/rivets/dist/rivets.js\n"); + +/***/ }), + +/***/ "./node_modules/sightglass/index.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function() {\n // Public sightglass interface.\n function sightglass(obj, keypath, callback, options) {\n return new Observer(obj, keypath, callback, options)\n }\n\n // Batteries not included.\n sightglass.adapters = {}\n\n // Constructs a new keypath observer and kicks things off.\n function Observer(obj, keypath, callback, options) {\n this.options = options || {}\n this.options.adapters = this.options.adapters || {}\n this.obj = obj\n this.keypath = keypath\n this.callback = callback\n this.objectPath = []\n this.update = this.update.bind(this)\n this.parse()\n\n if (isObject(this.target = this.realize())) {\n this.set(true, this.key, this.target, this.callback)\n }\n }\n\n // Tokenizes the provided keypath string into interface + path tokens for the\n // observer to work with.\n Observer.tokenize = function(keypath, interfaces, root) {\n var tokens = []\n var current = {i: root, path: ''}\n var index, chr\n\n for (index = 0; index < keypath.length; index++) {\n chr = keypath.charAt(index)\n\n if (!!~interfaces.indexOf(chr)) {\n tokens.push(current)\n current = {i: chr, path: ''}\n } else {\n current.path += chr\n }\n }\n\n tokens.push(current)\n return tokens\n }\n\n // Parses the keypath using the interfaces defined on the view. Sets variables\n // for the tokenized keypath as well as the end key.\n Observer.prototype.parse = function() {\n var interfaces = this.interfaces()\n var root, path\n\n if (!interfaces.length) {\n error('Must define at least one adapter interface.')\n }\n\n if (!!~interfaces.indexOf(this.keypath[0])) {\n root = this.keypath[0]\n path = this.keypath.substr(1)\n } else {\n if (typeof (root = this.options.root || sightglass.root) === 'undefined') {\n error('Must define a default root adapter.')\n }\n\n path = this.keypath\n }\n\n this.tokens = Observer.tokenize(path, interfaces, root)\n this.key = this.tokens.pop()\n }\n\n // Realizes the full keypath, attaching observers for every key and correcting\n // old observers to any changed objects in the keypath.\n Observer.prototype.realize = function() {\n var current = this.obj\n var unreached = false\n var prev\n\n this.tokens.forEach(function(token, index) {\n if (isObject(current)) {\n if (typeof this.objectPath[index] !== 'undefined') {\n if (current !== (prev = this.objectPath[index])) {\n this.set(false, token, prev, this.update)\n this.set(true, token, current, this.update)\n this.objectPath[index] = current\n }\n } else {\n this.set(true, token, current, this.update)\n this.objectPath[index] = current\n }\n\n current = this.get(token, current)\n } else {\n if (unreached === false) {\n unreached = index\n }\n\n if (prev = this.objectPath[index]) {\n this.set(false, token, prev, this.update)\n }\n }\n }, this)\n\n if (unreached !== false) {\n this.objectPath.splice(unreached)\n }\n\n return current\n }\n\n // Updates the keypath. This is called when any intermediary key is changed.\n Observer.prototype.update = function() {\n var next, oldValue\n\n if ((next = this.realize()) !== this.target) {\n if (isObject(this.target)) {\n this.set(false, this.key, this.target, this.callback)\n }\n\n if (isObject(next)) {\n this.set(true, this.key, next, this.callback)\n }\n\n oldValue = this.value()\n this.target = next\n\n // Always call callback if value is a function. If not a function, call callback only if value changed\n if (this.value() instanceof Function || this.value() !== oldValue) this.callback()\n }\n }\n\n // Reads the current end value of the observed keypath. Returns undefined if\n // the full keypath is unreachable.\n Observer.prototype.value = function() {\n if (isObject(this.target)) {\n return this.get(this.key, this.target)\n }\n }\n\n // Sets the current end value of the observed keypath. Calling setValue when\n // the full keypath is unreachable is a no-op.\n Observer.prototype.setValue = function(value) {\n if (isObject(this.target)) {\n this.adapter(this.key).set(this.target, this.key.path, value)\n }\n }\n\n // Gets the provided key on an object.\n Observer.prototype.get = function(key, obj) {\n return this.adapter(key).get(obj, key.path)\n }\n\n // Observes or unobserves a callback on the object using the provided key.\n Observer.prototype.set = function(active, key, obj, callback) {\n var action = active ? 'observe' : 'unobserve'\n this.adapter(key)[action](obj, key.path, callback)\n }\n\n // Returns an array of all unique adapter interfaces available.\n Observer.prototype.interfaces = function() {\n var interfaces = Object.keys(this.options.adapters)\n\n Object.keys(sightglass.adapters).forEach(function(i) {\n if (!~interfaces.indexOf(i)) {\n interfaces.push(i)\n }\n })\n\n return interfaces\n }\n\n // Convenience function to grab the adapter for a specific key.\n Observer.prototype.adapter = function(key) {\n return this.options.adapters[key.i] ||\n sightglass.adapters[key.i]\n }\n\n // Unobserves the entire keypath.\n Observer.prototype.unobserve = function() {\n var obj\n\n this.tokens.forEach(function(token, index) {\n if (obj = this.objectPath[index]) {\n this.set(false, token, obj, this.update)\n }\n }, this)\n\n if (isObject(this.target)) {\n this.set(false, this.key, this.target, this.callback)\n }\n }\n\n // Check if a value is an object than can be observed.\n function isObject(obj) {\n return typeof obj === 'object' && obj !== null\n }\n\n // Error thrower.\n function error(message) {\n throw new Error('[sightglass] ' + message)\n }\n\n // Export module for Node and the browser.\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = sightglass\n } else if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n return this.sightglass = sightglass\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n } else {\n this.sightglass = sightglass\n }\n}).call(this);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnaHRnbGFzcy9pbmRleC5qcz85NjA1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQSxtQkFBbUIsd0JBQXdCO0FBQzNDOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkIsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUFBO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3NpZ2h0Z2xhc3MvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKSB7XG4gIC8vIFB1YmxpYyBzaWdodGdsYXNzIGludGVyZmFjZS5cbiAgZnVuY3Rpb24gc2lnaHRnbGFzcyhvYmosIGtleXBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZlcihvYmosIGtleXBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKVxuICB9XG5cbiAgLy8gQmF0dGVyaWVzIG5vdCBpbmNsdWRlZC5cbiAgc2lnaHRnbGFzcy5hZGFwdGVycyA9IHt9XG5cbiAgLy8gQ29uc3RydWN0cyBhIG5ldyBrZXlwYXRoIG9ic2VydmVyIGFuZCBraWNrcyB0aGluZ3Mgb2ZmLlxuICBmdW5jdGlvbiBPYnNlcnZlcihvYmosIGtleXBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgIHRoaXMub3B0aW9ucy5hZGFwdGVycyA9IHRoaXMub3B0aW9ucy5hZGFwdGVycyB8fCB7fVxuICAgIHRoaXMub2JqID0gb2JqXG4gICAgdGhpcy5rZXlwYXRoID0ga2V5cGF0aFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMub2JqZWN0UGF0aCA9IFtdXG4gICAgdGhpcy51cGRhdGUgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5wYXJzZSgpXG5cbiAgICBpZiAoaXNPYmplY3QodGhpcy50YXJnZXQgPSB0aGlzLnJlYWxpemUoKSkpIHtcbiAgICAgIHRoaXMuc2V0KHRydWUsIHRoaXMua2V5LCB0aGlzLnRhcmdldCwgdGhpcy5jYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICAvLyBUb2tlbml6ZXMgdGhlIHByb3ZpZGVkIGtleXBhdGggc3RyaW5nIGludG8gaW50ZXJmYWNlICsgcGF0aCB0b2tlbnMgZm9yIHRoZVxuICAvLyBvYnNlcnZlciB0byB3b3JrIHdpdGguXG4gIE9ic2VydmVyLnRva2VuaXplID0gZnVuY3Rpb24oa2V5cGF0aCwgaW50ZXJmYWNlcywgcm9vdCkge1xuICAgIHZhciB0b2tlbnMgPSBbXVxuICAgIHZhciBjdXJyZW50ID0ge2k6IHJvb3QsIHBhdGg6ICcnfVxuICAgIHZhciBpbmRleCwgY2hyXG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBrZXlwYXRoLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY2hyID0ga2V5cGF0aC5jaGFyQXQoaW5kZXgpXG5cbiAgICAgIGlmICghIX5pbnRlcmZhY2VzLmluZGV4T2YoY2hyKSkge1xuICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50KVxuICAgICAgICBjdXJyZW50ID0ge2k6IGNociwgcGF0aDogJyd9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50LnBhdGggKz0gY2hyXG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9rZW5zLnB1c2goY3VycmVudClcbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIGtleXBhdGggdXNpbmcgdGhlIGludGVyZmFjZXMgZGVmaW5lZCBvbiB0aGUgdmlldy4gU2V0cyB2YXJpYWJsZXNcbiAgLy8gZm9yIHRoZSB0b2tlbml6ZWQga2V5cGF0aCBhcyB3ZWxsIGFzIHRoZSBlbmQga2V5LlxuICBPYnNlcnZlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW50ZXJmYWNlcyA9IHRoaXMuaW50ZXJmYWNlcygpXG4gICAgdmFyIHJvb3QsIHBhdGhcblxuICAgIGlmICghaW50ZXJmYWNlcy5sZW5ndGgpIHtcbiAgICAgIGVycm9yKCdNdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgYWRhcHRlciBpbnRlcmZhY2UuJylcbiAgICB9XG5cbiAgICBpZiAoISF+aW50ZXJmYWNlcy5pbmRleE9mKHRoaXMua2V5cGF0aFswXSkpIHtcbiAgICAgIHJvb3QgPSB0aGlzLmtleXBhdGhbMF1cbiAgICAgIHBhdGggPSB0aGlzLmtleXBhdGguc3Vic3RyKDEpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgKHJvb3QgPSB0aGlzLm9wdGlvbnMucm9vdCB8fCBzaWdodGdsYXNzLnJvb3QpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBlcnJvcignTXVzdCBkZWZpbmUgYSBkZWZhdWx0IHJvb3QgYWRhcHRlci4nKVxuICAgICAgfVxuXG4gICAgICBwYXRoID0gdGhpcy5rZXlwYXRoXG4gICAgfVxuXG4gICAgdGhpcy50b2tlbnMgPSBPYnNlcnZlci50b2tlbml6ZShwYXRoLCBpbnRlcmZhY2VzLCByb290KVxuICAgIHRoaXMua2V5ID0gdGhpcy50b2tlbnMucG9wKClcbiAgfVxuXG4gIC8vIFJlYWxpemVzIHRoZSBmdWxsIGtleXBhdGgsIGF0dGFjaGluZyBvYnNlcnZlcnMgZm9yIGV2ZXJ5IGtleSBhbmQgY29ycmVjdGluZ1xuICAvLyBvbGQgb2JzZXJ2ZXJzIHRvIGFueSBjaGFuZ2VkIG9iamVjdHMgaW4gdGhlIGtleXBhdGguXG4gIE9ic2VydmVyLnByb3RvdHlwZS5yZWFsaXplID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLm9ialxuICAgIHZhciB1bnJlYWNoZWQgPSBmYWxzZVxuICAgIHZhciBwcmV2XG5cbiAgICB0aGlzLnRva2Vucy5mb3JFYWNoKGZ1bmN0aW9uKHRva2VuLCBpbmRleCkge1xuICAgICAgaWYgKGlzT2JqZWN0KGN1cnJlbnQpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vYmplY3RQYXRoW2luZGV4XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gKHByZXYgPSB0aGlzLm9iamVjdFBhdGhbaW5kZXhdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoZmFsc2UsIHRva2VuLCBwcmV2LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICAgIHRoaXMuc2V0KHRydWUsIHRva2VuLCBjdXJyZW50LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICAgIHRoaXMub2JqZWN0UGF0aFtpbmRleF0gPSBjdXJyZW50XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0KHRydWUsIHRva2VuLCBjdXJyZW50LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICB0aGlzLm9iamVjdFBhdGhbaW5kZXhdID0gY3VycmVudFxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCA9IHRoaXMuZ2V0KHRva2VuLCBjdXJyZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHVucmVhY2hlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB1bnJlYWNoZWQgPSBpbmRleFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXYgPSB0aGlzLm9iamVjdFBhdGhbaW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5zZXQoZmFsc2UsIHRva2VuLCBwcmV2LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHRoaXMpXG5cbiAgICBpZiAodW5yZWFjaGVkICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vYmplY3RQYXRoLnNwbGljZSh1bnJlYWNoZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRcbiAgfVxuXG4gIC8vIFVwZGF0ZXMgdGhlIGtleXBhdGguIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW55IGludGVybWVkaWFyeSBrZXkgaXMgY2hhbmdlZC5cbiAgT2JzZXJ2ZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuZXh0LCBvbGRWYWx1ZVxuXG4gICAgaWYgKChuZXh0ID0gdGhpcy5yZWFsaXplKCkpICE9PSB0aGlzLnRhcmdldCkge1xuICAgICAgaWYgKGlzT2JqZWN0KHRoaXMudGFyZ2V0KSkge1xuICAgICAgICB0aGlzLnNldChmYWxzZSwgdGhpcy5rZXksIHRoaXMudGFyZ2V0LCB0aGlzLmNhbGxiYWNrKVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3QobmV4dCkpIHtcbiAgICAgICAgdGhpcy5zZXQodHJ1ZSwgdGhpcy5rZXksIG5leHQsIHRoaXMuY2FsbGJhY2spXG4gICAgICB9XG5cbiAgICAgIG9sZFZhbHVlID0gdGhpcy52YWx1ZSgpXG4gICAgICB0aGlzLnRhcmdldCA9IG5leHRcblxuICAgICAgLy8gQWx3YXlzIGNhbGwgY2FsbGJhY2sgaWYgdmFsdWUgaXMgYSBmdW5jdGlvbi4gSWYgbm90IGEgZnVuY3Rpb24sIGNhbGwgY2FsbGJhY2sgb25seSBpZiB2YWx1ZSBjaGFuZ2VkXG4gICAgICBpZiAodGhpcy52YWx1ZSgpIGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdGhpcy52YWx1ZSgpICE9PSBvbGRWYWx1ZSkgdGhpcy5jYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgLy8gUmVhZHMgdGhlIGN1cnJlbnQgZW5kIHZhbHVlIG9mIHRoZSBvYnNlcnZlZCBrZXlwYXRoLiBSZXR1cm5zIHVuZGVmaW5lZCBpZlxuICAvLyB0aGUgZnVsbCBrZXlwYXRoIGlzIHVucmVhY2hhYmxlLlxuICBPYnNlcnZlci5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoaXNPYmplY3QodGhpcy50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQodGhpcy5rZXksIHRoaXMudGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8vIFNldHMgdGhlIGN1cnJlbnQgZW5kIHZhbHVlIG9mIHRoZSBvYnNlcnZlZCBrZXlwYXRoLiBDYWxsaW5nIHNldFZhbHVlIHdoZW5cbiAgLy8gdGhlIGZ1bGwga2V5cGF0aCBpcyB1bnJlYWNoYWJsZSBpcyBhIG5vLW9wLlxuICBPYnNlcnZlci5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChpc09iamVjdCh0aGlzLnRhcmdldCkpIHtcbiAgICAgIHRoaXMuYWRhcHRlcih0aGlzLmtleSkuc2V0KHRoaXMudGFyZ2V0LCB0aGlzLmtleS5wYXRoLCB2YWx1ZSlcbiAgICB9XG4gIH1cblxuICAvLyBHZXRzIHRoZSBwcm92aWRlZCBrZXkgb24gYW4gb2JqZWN0LlxuICBPYnNlcnZlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5LCBvYmopIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyKGtleSkuZ2V0KG9iaiwga2V5LnBhdGgpXG4gIH1cblxuICAvLyBPYnNlcnZlcyBvciB1bm9ic2VydmVzIGEgY2FsbGJhY2sgb24gdGhlIG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQga2V5LlxuICBPYnNlcnZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oYWN0aXZlLCBrZXksIG9iaiwgY2FsbGJhY2spIHtcbiAgICB2YXIgYWN0aW9uID0gYWN0aXZlID8gJ29ic2VydmUnIDogJ3Vub2JzZXJ2ZSdcbiAgICB0aGlzLmFkYXB0ZXIoa2V5KVthY3Rpb25dKG9iaiwga2V5LnBhdGgsIGNhbGxiYWNrKVxuICB9XG5cbiAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdW5pcXVlIGFkYXB0ZXIgaW50ZXJmYWNlcyBhdmFpbGFibGUuXG4gIE9ic2VydmVyLnByb3RvdHlwZS5pbnRlcmZhY2VzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGludGVyZmFjZXMgPSBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMuYWRhcHRlcnMpXG5cbiAgICBPYmplY3Qua2V5cyhzaWdodGdsYXNzLmFkYXB0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIGlmICghfmludGVyZmFjZXMuaW5kZXhPZihpKSkge1xuICAgICAgICBpbnRlcmZhY2VzLnB1c2goaSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIGludGVyZmFjZXNcbiAgfVxuXG4gIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGdyYWIgdGhlIGFkYXB0ZXIgZm9yIGEgc3BlY2lmaWMga2V5LlxuICBPYnNlcnZlci5wcm90b3R5cGUuYWRhcHRlciA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYWRhcHRlcnNba2V5LmldIHx8XG4gICAgICBzaWdodGdsYXNzLmFkYXB0ZXJzW2tleS5pXVxuICB9XG5cbiAgLy8gVW5vYnNlcnZlcyB0aGUgZW50aXJlIGtleXBhdGguXG4gIE9ic2VydmVyLnByb3RvdHlwZS51bm9ic2VydmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JqXG5cbiAgICB0aGlzLnRva2Vucy5mb3JFYWNoKGZ1bmN0aW9uKHRva2VuLCBpbmRleCkge1xuICAgICAgaWYgKG9iaiA9IHRoaXMub2JqZWN0UGF0aFtpbmRleF0pIHtcbiAgICAgICAgdGhpcy5zZXQoZmFsc2UsIHRva2VuLCBvYmosIHRoaXMudXBkYXRlKVxuICAgICAgfVxuICAgIH0sIHRoaXMpXG5cbiAgICBpZiAoaXNPYmplY3QodGhpcy50YXJnZXQpKSB7XG4gICAgICB0aGlzLnNldChmYWxzZSwgdGhpcy5rZXksIHRoaXMudGFyZ2V0LCB0aGlzLmNhbGxiYWNrKVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gb2JqZWN0IHRoYW4gY2FuIGJlIG9ic2VydmVkLlxuICBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsXG4gIH1cblxuICAvLyBFcnJvciB0aHJvd2VyLlxuICBmdW5jdGlvbiBlcnJvcihtZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc2lnaHRnbGFzc10gJyArIG1lc3NhZ2UpXG4gIH1cblxuICAvLyBFeHBvcnQgbW9kdWxlIGZvciBOb2RlIGFuZCB0aGUgYnJvd3Nlci5cbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzaWdodGdsYXNzXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ2h0Z2xhc3MgPSBzaWdodGdsYXNzXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnNpZ2h0Z2xhc3MgPSBzaWdodGdsYXNzXG4gIH1cbn0pLmNhbGwodGhpcyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zaWdodGdsYXNzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9zaWdodGdsYXNzL2luZGV4LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/sightglass/index.js\n"); + +/***/ }), + +/***/ "./node_modules/webpack/buildin/module.js": +/***/ (function(module, exports) { + +eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xyXG5cdGlmKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XHJcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcclxuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xyXG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XHJcblx0XHRpZighbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/module.js\n"); + +/***/ }), + /***/ "./resources/js/admin/app.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\r\n * Admin stuff needed\r\n */\n\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vYXBwLmpzP2ExNzUiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsIm1hcCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQSxtQkFBQUEsQ0FBUSw2QkFBUjs7QUFFQTtBQUNBQyxPQUFPQyxNQUFQLENBQWNDLEdBQWQsR0FBb0IsbUJBQUFILENBQVEsOEJBQVIsQ0FBcEIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWRtaW4vYXBwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEFkbWluIHN0dWZmIG5lZWRlZFxyXG4gKi9cclxuXHJcbnJlcXVpcmUoJy4vLi4vYm9vdHN0cmFwJyk7XHJcblxyXG4vLyBJbXBvcnQgdGhlIG1hcHBpbmcgZnVuY3Rpb25cclxud2luZG93LnBocHZtcy5tYXAgPSByZXF1aXJlKCcuLi9tYXBzL2luZGV4Jyk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9hZG1pbi9hcHAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/admin/app.js\n"); +eval("/**\n * Admin stuff needed\n */\n\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vYXBwLmpzP2ExNzUiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsIm1hcCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQSxtQkFBQUEsQ0FBUSw2QkFBUjs7QUFFQTtBQUNBQyxPQUFPQyxNQUFQLENBQWNDLEdBQWQsR0FBb0IsbUJBQUFILENBQVEsOEJBQVIsQ0FBcEIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWRtaW4vYXBwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZG1pbiBzdHVmZiBuZWVkZWRcbiAqL1xuXG5yZXF1aXJlKCcuLy4uL2Jvb3RzdHJhcCcpO1xuXG4vLyBJbXBvcnQgdGhlIG1hcHBpbmcgZnVuY3Rpb25cbndpbmRvdy5waHB2bXMubWFwID0gcmVxdWlyZSgnLi4vbWFwcy9pbmRleCcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2FkbWluL2FwcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/admin/app.js\n"); /***/ }), /***/ "./resources/js/bootstrap.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\r\n * Bootstrap any Javascript libraries required\r\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\r\n * Container for phpVMS specific functions\r\n */\nwindow.phpvms = {};\n\n/**\r\n * Configure Axios with both the csrf token and the API key\r\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\r\n 'X-CSRF-TOKEN': token.content\r\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQm9vdHN0cmFwIGFueSBKYXZhc2NyaXB0IGxpYnJhcmllcyByZXF1aXJlZFxyXG4gKi9cclxuXHJcbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XHJcblxyXG4vKipcclxuICogQ29udGFpbmVyIGZvciBwaHBWTVMgc3BlY2lmaWMgZnVuY3Rpb25zXHJcbiAqL1xyXG53aW5kb3cucGhwdm1zID0ge307XHJcblxyXG4vKipcclxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcclxuICovXHJcblxyXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcclxuaWYoYmFzZV91cmwpIHtcclxuICB3aW5kb3cuYXhpb3MuZGVmYXVsdC5iYXNlVVJMID0gYmFzZV91cmw7XHJcbn1cclxuXHJcbndpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JztcclxuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcclxuXHJcbmlmICh0b2tlbikge1xyXG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XHJcbiAgLyp3aW5kb3cuanF1ZXJ5LmFqYXhTZXR1cCh7XHJcbiAgICAnWC1DU1JGLVRPS0VOJzogdG9rZW4uY29udGVudFxyXG4gIH0pKi9cclxufSBlbHNlIHtcclxuICBjb25zb2xlLmVycm9yKCdDU1JGIHRva2VuIG5vdCBmb3VuZDogaHR0cHM6Ly9sYXJhdmVsLmNvbS9kb2NzL2NzcmYjY3NyZi14LWNzcmYtdG9rZW4nKVxyXG59XHJcblxyXG5jb25zdCBhcGlfa2V5ID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJhcGkta2V5XCJdJyk7XHJcbmlmIChhcGlfa2V5KSB7XHJcbiAgd2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWyd4LWFwaS1rZXknXSA9IGFwaV9rZXkuY29udGVudDtcclxuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGFwaV9rZXkuY29udGVudFxyXG59IGVsc2Uge1xyXG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gZmFsc2U7XHJcbiAgY29uc29sZS5lcnJvcignQVBJIEtleSBub3QgZm91bmQhJylcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); +eval("/**\n * Bootstrap any Javascript libraries required\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {};\n\n/**\n * Configure Axios with both the csrf token and the API key\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\n 'X-CSRF-TOKEN': token.content\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRDs7QUFFRCxtQkFBQWQsQ0FBUSwwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJvb3RzdHJhcCBhbnkgSmF2YXNjcmlwdCBsaWJyYXJpZXMgcmVxdWlyZWRcbiAqL1xuXG53aW5kb3cuYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuXG4vKipcbiAqIENvbnRhaW5lciBmb3IgcGhwVk1TIHNwZWNpZmljIGZ1bmN0aW9uc1xuICovXG53aW5kb3cucGhwdm1zID0ge307XG5cbi8qKlxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcbiAqL1xuXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmlmKGJhc2VfdXJsKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0LmJhc2VVUkwgPSBiYXNlX3VybDtcbn1cblxud2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnO1xuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcblxuaWYgKHRva2VuKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XG4gIC8qd2luZG93LmpxdWVyeS5hamF4U2V0dXAoe1xuICAgICdYLUNTUkYtVE9LRU4nOiB0b2tlbi5jb250ZW50XG4gIH0pKi9cbn0gZWxzZSB7XG4gIGNvbnNvbGUuZXJyb3IoJ0NTUkYgdG9rZW4gbm90IGZvdW5kOiBodHRwczovL2xhcmF2ZWwuY29tL2RvY3MvY3NyZiNjc3JmLXgtY3NyZi10b2tlbicpXG59XG5cbmNvbnN0IGFwaV9rZXkgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImFwaS1rZXlcIl0nKTtcbmlmIChhcGlfa2V5KSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsneC1hcGkta2V5J10gPSBhcGlfa2V5LmNvbnRlbnQ7XG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gYXBpX2tleS5jb250ZW50XG59IGVsc2Uge1xuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGZhbHNlO1xuICBjb25zb2xlLmVycm9yKCdBUEkgS2V5IG5vdCBmb3VuZCEnKVxufVxuXG5yZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); + +/***/ }), + +/***/ "./resources/js/common.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVMsbUJBQUFDLENBQVEsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ2xELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0gsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBU0QsS0FBVCxFQUFnQjtBQUN4QyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFPRSxRQUFRLElBQVIsR0FBZUcsSUFBZixHQUFzQixHQUE3QjtBQUNILENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCVyxFQUFsQixHQUF1QixVQUFDVCxLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCWSxFQUFsQixHQUF1QixVQUFDVixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKlxuICovXG5cbmNvbnN0IHJpdmV0cyA9IHJlcXVpcmUoJ3JpdmV0cycpO1xuXG4vKipcbiAqIEdlbmVyaWMgZm9ybWF0dGVyIHRvIHByZXBlbmRcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHByZXBlbmRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5wcmVwZW5kID0gZnVuY3Rpb24gKHZhbHVlLCBwcmVwZW5kKSB7XG4gICAgcmV0dXJuIHByZXBlbmQgKyB2YWx1ZVxufTtcblxuLyoqXG4gKiBGb3JtYXQgbWludXRlcyBpbnRvIEhIaCBNTW1cbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjApO1xuICAgIGNvbnN0IG1pbnMgPSB2YWx1ZSAlIDYwO1xuICAgIHJldHVybiBob3VycyArICdoICcgKyBtaW5zICsgJ20nO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMuZ3QgPSAodmFsdWUsIGxlbikgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBsZW47XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5sdCA9ICh2YWx1ZSwgbGVuKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8IGxlbjtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmVxID0gKHZhbHVlLCBsZW4pID0+IHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9jb21tb24uanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); /***/ }), @@ -318,7 +346,7 @@ eval("/**\r\n * Bootstrap any Javascript libraries required\r\n */\n\nwindow.axi /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\r\n * Render a map with the airspace, etc around a given set of coords\r\n * e.g, the airport map\r\n * @param opts\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZW5kZXJfZWxlbSIsIm92ZXJsYXlfZWxlbSIsImxhdCIsImxvbiIsInpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwibWFya2VyX3BvcHVwIiwibWV0YXJfd21zIiwidXJsIiwicGFyYW1zIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImNvb3JkcyIsImNvbnNvbGUiLCJsb2ciLCJzZXRWaWV3IiwibWFya2VyIiwiYWRkVG8iLCJiaW5kUG9wdXAiLCJhZGRXTVNMYXllciJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTtBQUN2QkEsU0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ25CQyxpQkFBYSxLQURNO0FBRW5CQyxrQkFBYyxFQUZLO0FBR25CQyxTQUFLLENBSGM7QUFJbkJDLFNBQUssQ0FKYztBQUtuQkMsVUFBTSxFQUxhO0FBTW5CQyxZQUFRLEVBTlc7QUFPbkJDLGdCQUFZLElBUE87QUFRbkJDLGtCQUFjLEVBUks7O0FBVW5CO0FBQ0FDLGVBQVc7QUFDUEMsV0FBSyxFQURFO0FBRVBDLGNBQVE7QUFGRDtBQVhRLEdBQWQsRUFlSmIsSUFmSSxDQUFQOztBQWlCQSxNQUFJYyxNQUFNLGtFQUFBQyxDQUFjZixJQUFkLENBQVY7QUFDQSxNQUFNZ0IsU0FBUyxDQUFDaEIsS0FBS0ssR0FBTixFQUFXTCxLQUFLTSxHQUFoQixDQUFmO0FBQ0FXLFVBQVFDLEdBQVIsQ0FBWSxpQkFBWixFQUErQkYsTUFBL0I7O0FBRUFGLE1BQUlLLE9BQUosQ0FBWUgsTUFBWixFQUFvQmhCLEtBQUtPLElBQXpCO0FBQ0EsTUFBSVAsS0FBS1MsVUFBTCxLQUFvQixJQUF4QixFQUE4QjtBQUM1QlgsWUFBUXNCLE1BQVIsQ0FBZUosTUFBZixFQUF1QkssS0FBdkIsQ0FBNkJQLEdBQTdCLEVBQWtDUSxTQUFsQyxDQUE0Q3RCLEtBQUtVLFlBQWpEO0FBQ0Q7O0FBRUQsTUFBR1YsS0FBS1csU0FBTCxDQUFlQyxHQUFmLEtBQXVCLEVBQTFCLEVBQThCO0FBQzFCVyxJQUFBLHFFQUFBQSxDQUFZVCxHQUFaLEVBQWlCZCxLQUFLVyxTQUF0QjtBQUNIOztBQUVELFNBQU9HLEdBQVA7QUFDRCxDQWhDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5cclxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcclxuaW1wb3J0IHsgYWRkV01TTGF5ZXIgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlciBhIG1hcCB3aXRoIHRoZSBhaXJzcGFjZSwgZXRjIGFyb3VuZCBhIGdpdmVuIHNldCBvZiBjb29yZHNcclxuICogZS5nLCB0aGUgYWlycG9ydCBtYXBcclxuICogQHBhcmFtIG9wdHNcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XHJcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgcmVuZGVyX2VsZW06ICdtYXAnLFxyXG4gICAgb3ZlcmxheV9lbGVtOiAnJyxcclxuICAgIGxhdDogMCxcclxuICAgIGxvbjogMCxcclxuICAgIHpvb206IDEyLFxyXG4gICAgbGF5ZXJzOiBbXSxcclxuICAgIHNldF9tYXJrZXI6IHRydWUsXHJcbiAgICBtYXJrZXJfcG9wdXA6ICcnLFxyXG5cclxuICAgIC8vIFBhc3NlZCBmcm9tIHRoZSBjb25maWcvbWFwcy5waHAgZmlsZVxyXG4gICAgbWV0YXJfd21zOiB7XHJcbiAgICAgICAgdXJsOiAnJyxcclxuICAgICAgICBwYXJhbXM6IHt9XHJcbiAgICB9LFxyXG4gIH0sIG9wdHMpO1xyXG5cclxuICBsZXQgbWFwID0gZHJhd19iYXNlX21hcChvcHRzKTtcclxuICBjb25zdCBjb29yZHMgPSBbb3B0cy5sYXQsIG9wdHMubG9uXTtcclxuICBjb25zb2xlLmxvZygnQXBwbHlpbmcgY29vcmRzJywgY29vcmRzKTtcclxuXHJcbiAgbWFwLnNldFZpZXcoY29vcmRzLCBvcHRzLnpvb20pO1xyXG4gIGlmIChvcHRzLnNldF9tYXJrZXIgPT09IHRydWUpIHtcclxuICAgIGxlYWZsZXQubWFya2VyKGNvb3JkcykuYWRkVG8obWFwKS5iaW5kUG9wdXAob3B0cy5tYXJrZXJfcG9wdXApO1xyXG4gIH1cclxuXHJcbiAgaWYob3B0cy5tZXRhcl93bXMudXJsICE9PSAnJykge1xyXG4gICAgICBhZGRXTVNMYXllcihtYXAsIG9wdHMubWV0YXJfd21zKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBtYXA7XHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\n * Render a map with the airspace, etc around a given set of coords\n * e.g, the airport map\n * @param opts\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZW5kZXJfZWxlbSIsIm92ZXJsYXlfZWxlbSIsImxhdCIsImxvbiIsInpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwibWFya2VyX3BvcHVwIiwibWV0YXJfd21zIiwidXJsIiwicGFyYW1zIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImNvb3JkcyIsImNvbnNvbGUiLCJsb2ciLCJzZXRWaWV3IiwibWFya2VyIiwiYWRkVG8iLCJiaW5kUG9wdXAiLCJhZGRXTVNMYXllciJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTtBQUN2QkEsU0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ25CQyxpQkFBYSxLQURNO0FBRW5CQyxrQkFBYyxFQUZLO0FBR25CQyxTQUFLLENBSGM7QUFJbkJDLFNBQUssQ0FKYztBQUtuQkMsVUFBTSxFQUxhO0FBTW5CQyxZQUFRLEVBTlc7QUFPbkJDLGdCQUFZLElBUE87QUFRbkJDLGtCQUFjLEVBUks7O0FBVW5CO0FBQ0FDLGVBQVc7QUFDUEMsV0FBSyxFQURFO0FBRVBDLGNBQVE7QUFGRDtBQVhRLEdBQWQsRUFlSmIsSUFmSSxDQUFQOztBQWlCQSxNQUFJYyxNQUFNLGtFQUFBQyxDQUFjZixJQUFkLENBQVY7QUFDQSxNQUFNZ0IsU0FBUyxDQUFDaEIsS0FBS0ssR0FBTixFQUFXTCxLQUFLTSxHQUFoQixDQUFmO0FBQ0FXLFVBQVFDLEdBQVIsQ0FBWSxpQkFBWixFQUErQkYsTUFBL0I7O0FBRUFGLE1BQUlLLE9BQUosQ0FBWUgsTUFBWixFQUFvQmhCLEtBQUtPLElBQXpCO0FBQ0EsTUFBSVAsS0FBS1MsVUFBTCxLQUFvQixJQUF4QixFQUE4QjtBQUM1QlgsWUFBUXNCLE1BQVIsQ0FBZUosTUFBZixFQUF1QkssS0FBdkIsQ0FBNkJQLEdBQTdCLEVBQWtDUSxTQUFsQyxDQUE0Q3RCLEtBQUtVLFlBQWpEO0FBQ0Q7O0FBRUQsTUFBR1YsS0FBS1csU0FBTCxDQUFlQyxHQUFmLEtBQXVCLEVBQTFCLEVBQThCO0FBQzFCVyxJQUFBLHFFQUFBQSxDQUFZVCxHQUFaLEVBQWlCZCxLQUFLVyxTQUF0QjtBQUNIOztBQUVELFNBQU9HLEdBQVA7QUFDRCxDQWhDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcblxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcbmltcG9ydCB7IGFkZFdNU0xheWVyIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuLyoqXG4gKiBSZW5kZXIgYSBtYXAgd2l0aCB0aGUgYWlyc3BhY2UsIGV0YyBhcm91bmQgYSBnaXZlbiBzZXQgb2YgY29vcmRzXG4gKiBlLmcsIHRoZSBhaXJwb3J0IG1hcFxuICogQHBhcmFtIG9wdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICBvdmVybGF5X2VsZW06ICcnLFxuICAgIGxhdDogMCxcbiAgICBsb246IDAsXG4gICAgem9vbTogMTIsXG4gICAgbGF5ZXJzOiBbXSxcbiAgICBzZXRfbWFya2VyOiB0cnVlLFxuICAgIG1hcmtlcl9wb3B1cDogJycsXG5cbiAgICAvLyBQYXNzZWQgZnJvbSB0aGUgY29uZmlnL21hcHMucGhwIGZpbGVcbiAgICBtZXRhcl93bXM6IHtcbiAgICAgICAgdXJsOiAnJyxcbiAgICAgICAgcGFyYW1zOiB7fVxuICAgIH0sXG4gIH0sIG9wdHMpO1xuXG4gIGxldCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICBjb25zdCBjb29yZHMgPSBbb3B0cy5sYXQsIG9wdHMubG9uXTtcbiAgY29uc29sZS5sb2coJ0FwcGx5aW5nIGNvb3JkcycsIGNvb3Jkcyk7XG5cbiAgbWFwLnNldFZpZXcoY29vcmRzLCBvcHRzLnpvb20pO1xuICBpZiAob3B0cy5zZXRfbWFya2VyID09PSB0cnVlKSB7XG4gICAgbGVhZmxldC5tYXJrZXIoY29vcmRzKS5hZGRUbyhtYXApLmJpbmRQb3B1cChvcHRzLm1hcmtlcl9wb3B1cCk7XG4gIH1cblxuICBpZihvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgICBhZGRXTVNMYXllcihtYXAsIG9wdHMubWV0YXJfd21zKTtcbiAgfVxuXG4gIHJldHVybiBtYXA7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvYWlyc3BhY2VfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); /***/ }), @@ -326,7 +354,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("var leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false\n }, opts);\n\n var feature_groups = [];\n /*var openaip_airspace_labels = new leaflet.TileLayer.WMS(\r\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\r\n maxZoom: 14,\r\n minZoom: 12,\r\n layers: 'openaip_approved_airspaces_labels',\r\n tileSize: 1024,\r\n detectRetina: true,\r\n subdomains: '12',\r\n format: 'image/png',\r\n transparent: true\r\n });\r\n openaip_airspace_labels.addTo(map);*/\n\n var opencyclemap_phys_osm = new leaflet.TileLayer('http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=f09a38fa87514de4890fc96e7fe8ecb1', {\n maxZoom: 14,\n minZoom: 4,\n format: 'image/png',\n transparent: true\n });\n\n feature_groups.push(opencyclemap_phys_osm);\n\n /*const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\r\n maxZoom: 14,\r\n minZoom: 4,\r\n tms: true,\r\n detectRetina: true,\r\n subdomains: '12',\r\n format: 'image/png',\r\n transparent: true\r\n });\r\n feature_groups.push(openaip_cached_basemap);\r\n */\n\n var openaip_basemap_phys_osm = leaflet.featureGroup(feature_groups);\n\n var map = leaflet.map('map', {\n layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n var attrib = leaflet.control.attribution({ position: 'bottomleft' });\n attrib.addAttribution('Thunderforest');\n attrib.addAttribution('openAIP');\n attrib.addAttribution('OpenStreetMap contributors');\n attrib.addAttribution('OpenWeatherMap');\n\n attrib.addTo(map);\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwiY2VudGVyIiwiem9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwiZmVhdHVyZV9ncm91cHMiLCJvcGVuY3ljbGVtYXBfcGh5c19vc20iLCJUaWxlTGF5ZXIiLCJtaW5ab29tIiwiZm9ybWF0IiwidHJhbnNwYXJlbnQiLCJwdXNoIiwib3BlbmFpcF9iYXNlbWFwX3BoeXNfb3NtIiwiZmVhdHVyZUdyb3VwIiwibWFwIiwic2Nyb2xsV2hlZWxab29tIiwiYXR0cmliIiwiY29udHJvbCIsImF0dHJpYnV0aW9uIiwicG9zaXRpb24iLCJhZGRBdHRyaWJ1dGlvbiIsImFkZFRvIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxVQUFVLG1CQUFBQyxDQUFRLDRDQUFSLENBQWhCOztBQUVBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMscUJBQWEsS0FESTtBQUVqQkMsZ0JBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRlM7QUFHakJDLGNBQU0sQ0FIVztBQUlqQkMsaUJBQVMsRUFKUTtBQUtqQkMsZ0JBQVEsRUFMUztBQU1qQkMsb0JBQVk7QUFOSyxLQUFkLEVBT0pSLElBUEksQ0FBUDs7QUFTQSxRQUFJUyxpQkFBaUIsRUFBckI7QUFDQTs7Ozs7Ozs7Ozs7OztBQWNBLFFBQU1DLHdCQUF3QixJQUFJWixRQUFRYSxTQUFaLENBQzFCLHFHQUQwQixFQUM2RTtBQUNuR0wsaUJBQVMsRUFEMEY7QUFFbkdNLGlCQUFTLENBRjBGO0FBR25HQyxnQkFBUSxXQUgyRjtBQUluR0MscUJBQWE7QUFKc0YsS0FEN0UsQ0FBOUI7O0FBUUFMLG1CQUFlTSxJQUFmLENBQW9CTCxxQkFBcEI7O0FBRUE7Ozs7Ozs7Ozs7OztBQWFBLFFBQU1NLDJCQUEyQmxCLFFBQVFtQixZQUFSLENBQXFCUixjQUFyQixDQUFqQzs7QUFFQSxRQUFJUyxNQUFNcEIsUUFBUW9CLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQ3pCWCxnQkFBUSxDQUFDUyx3QkFBRCxDQURpQjtBQUV6QlosZ0JBQVFKLEtBQUtJLE1BRlk7QUFHekJDLGNBQU1MLEtBQUtLLElBSGM7QUFJekJjLHlCQUFpQjtBQUpRLEtBQW5CLENBQVY7O0FBT0EsUUFBTUMsU0FBU3RCLFFBQVF1QixPQUFSLENBQWdCQyxXQUFoQixDQUE0QixFQUFDQyxVQUFVLFlBQVgsRUFBNUIsQ0FBZjtBQUNBSCxXQUFPSSxjQUFQLENBQXNCLG9GQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLHdFQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLDJHQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLHNGQUF0Qjs7QUFFQUosV0FBT0ssS0FBUCxDQUFhUCxHQUFiOztBQUVBLFdBQU9BLEdBQVA7QUFDSCxDQW5FRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XHJcblxyXG4gICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcclxuICAgICAgICBjZW50ZXI6IFsyOS45ODEzOSwgLTk1LjMzMzc0XSxcclxuICAgICAgICB6b29tOiA1LFxyXG4gICAgICAgIG1heFpvb206IDEwLFxyXG4gICAgICAgIGxheWVyczogW10sXHJcbiAgICAgICAgc2V0X21hcmtlcjogZmFsc2UsXHJcbiAgICB9LCBvcHRzKTtcclxuXHJcbiAgICBsZXQgZmVhdHVyZV9ncm91cHMgPSBbXTtcclxuICAgIC8qdmFyIG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyLldNUyhcclxuICAgICAgICBcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2Uvd21zXCIsIHtcclxuICAgICAgICAgICAgbWF4Wm9vbTogMTQsXHJcbiAgICAgICAgICAgIG1pblpvb206IDEyLFxyXG4gICAgICAgICAgICBsYXllcnM6ICdvcGVuYWlwX2FwcHJvdmVkX2FpcnNwYWNlc19sYWJlbHMnLFxyXG4gICAgICAgICAgICB0aWxlU2l6ZTogMTAyNCxcclxuICAgICAgICAgICAgZGV0ZWN0UmV0aW5hOiB0cnVlLFxyXG4gICAgICAgICAgICBzdWJkb21haW5zOiAnMTInLFxyXG4gICAgICAgICAgICBmb3JtYXQ6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzLmFkZFRvKG1hcCk7Ki9cclxuXHJcbiAgICBjb25zdCBvcGVuY3ljbGVtYXBfcGh5c19vc20gPSBuZXcgbGVhZmxldC5UaWxlTGF5ZXIoXHJcbiAgICAgICAgJ2h0dHA6Ly97c30udGlsZS50aHVuZGVyZm9yZXN0LmNvbS9sYW5kc2NhcGUve3p9L3t4fS97eX0ucG5nP2FwaWtleT1mMDlhMzhmYTg3NTE0ZGU0ODkwZmM5NmU3ZmU4ZWNiMScsIHtcclxuICAgICAgICAgICAgbWF4Wm9vbTogMTQsXHJcbiAgICAgICAgICAgIG1pblpvb206IDQsXHJcbiAgICAgICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5jeWNsZW1hcF9waHlzX29zbSlcclxuXHJcbiAgICAvKmNvbnN0IG9wZW5haXBfY2FjaGVkX2Jhc2VtYXAgPSBuZXcgbGVhZmxldC5UaWxlTGF5ZXIoXCJodHRwOi8ve3N9LnRpbGUubWFwcy5vcGVuYWlwLm5ldC9nZW93ZWJjYWNoZS9zZXJ2aWNlL3Rtcy8xLjAuMC9vcGVuYWlwX2Jhc2VtYXBARVBTRyUzQTkwMDkxM0Bwbmcve3p9L3t4fS97eX0ucG5nXCIsIHtcclxuICAgICAgICBtYXhab29tOiAxNCxcclxuICAgICAgICBtaW5ab29tOiA0LFxyXG4gICAgICAgIHRtczogdHJ1ZSxcclxuICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXHJcbiAgICAgICAgc3ViZG9tYWluczogJzEyJyxcclxuICAgICAgICBmb3JtYXQ6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5haXBfY2FjaGVkX2Jhc2VtYXApO1xyXG4gICAgKi9cclxuXHJcbiAgICBjb25zdCBvcGVuYWlwX2Jhc2VtYXBfcGh5c19vc20gPSBsZWFmbGV0LmZlYXR1cmVHcm91cChmZWF0dXJlX2dyb3Vwcyk7XHJcblxyXG4gICAgbGV0IG1hcCA9IGxlYWZsZXQubWFwKCdtYXAnLCB7XHJcbiAgICAgICAgbGF5ZXJzOiBbb3BlbmFpcF9iYXNlbWFwX3BoeXNfb3NtXSxcclxuICAgICAgICBjZW50ZXI6IG9wdHMuY2VudGVyLFxyXG4gICAgICAgIHpvb206IG9wdHMuem9vbSxcclxuICAgICAgICBzY3JvbGxXaGVlbFpvb206IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgYXR0cmliID0gbGVhZmxldC5jb250cm9sLmF0dHJpYnV0aW9uKHtwb3NpdGlvbjogJ2JvdHRvbWxlZnQnfSlcclxuICAgIGF0dHJpYi5hZGRBdHRyaWJ1dGlvbignPGEgaHJlZj1cImh0dHBzOi8vd3d3LnRodW5kZXJmb3Jlc3QuY29tXCIgdGFyZ2V0PVwiX2JsYW5rXCIgc3R5bGU9XCJcIj5UaHVuZGVyZm9yZXN0PC9hPicpXHJcbiAgICBhdHRyaWIuYWRkQXR0cmlidXRpb24oJzxhIGhyZWY9XCJodHRwczovL3d3dy5vcGVuYWlwLm5ldFwiIHRhcmdldD1cIl9ibGFua1wiIHN0eWxlPVwiXCI+b3BlbkFJUDwvYT4nKVxyXG4gICAgYXR0cmliLmFkZEF0dHJpYnV0aW9uKCc8YSBocmVmPVwiaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCIgdGFyZ2V0PVwiX2JsYW5rXCIgc3R5bGU9XCJcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnKVxyXG4gICAgYXR0cmliLmFkZEF0dHJpYnV0aW9uKCc8YSBocmVmPVwiaHR0cHM6Ly93d3cub3BlbndlYXRoZXJtYXAub3JnXCIgdGFyZ2V0PVwiX2JsYW5rXCIgc3R5bGU9XCJcIj5PcGVuV2VhdGhlck1hcDwvYT4nKVxyXG5cclxuICAgIGF0dHJpYi5hZGRUbyhtYXApXHJcblxyXG4gICAgcmV0dXJuIG1hcFxyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); +eval("var leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false\n }, opts);\n\n var feature_groups = [];\n /*var openaip_airspace_labels = new leaflet.TileLayer.WMS(\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\n maxZoom: 14,\n minZoom: 12,\n layers: 'openaip_approved_airspaces_labels',\n tileSize: 1024,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n openaip_airspace_labels.addTo(map);*/\n\n var opencyclemap_phys_osm = new leaflet.TileLayer('http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=f09a38fa87514de4890fc96e7fe8ecb1', {\n maxZoom: 14,\n minZoom: 4,\n format: 'image/png',\n transparent: true\n });\n\n feature_groups.push(opencyclemap_phys_osm);\n\n /*const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\n maxZoom: 14,\n minZoom: 4,\n tms: true,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n feature_groups.push(openaip_cached_basemap);\n */\n\n var openaip_basemap_phys_osm = leaflet.featureGroup(feature_groups);\n\n var map = leaflet.map('map', {\n layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n var attrib = leaflet.control.attribution({ position: 'bottomleft' });\n attrib.addAttribution('Thunderforest');\n attrib.addAttribution('openAIP');\n attrib.addAttribution('OpenStreetMap contributors');\n attrib.addAttribution('OpenWeatherMap');\n\n attrib.addTo(map);\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwiY2VudGVyIiwiem9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwiZmVhdHVyZV9ncm91cHMiLCJvcGVuY3ljbGVtYXBfcGh5c19vc20iLCJUaWxlTGF5ZXIiLCJtaW5ab29tIiwiZm9ybWF0IiwidHJhbnNwYXJlbnQiLCJwdXNoIiwib3BlbmFpcF9iYXNlbWFwX3BoeXNfb3NtIiwiZmVhdHVyZUdyb3VwIiwibWFwIiwic2Nyb2xsV2hlZWxab29tIiwiYXR0cmliIiwiY29udHJvbCIsImF0dHJpYnV0aW9uIiwicG9zaXRpb24iLCJhZGRBdHRyaWJ1dGlvbiIsImFkZFRvIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxVQUFVLG1CQUFBQyxDQUFRLDRDQUFSLENBQWhCOztBQUVBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMscUJBQWEsS0FESTtBQUVqQkMsZ0JBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRlM7QUFHakJDLGNBQU0sQ0FIVztBQUlqQkMsaUJBQVMsRUFKUTtBQUtqQkMsZ0JBQVEsRUFMUztBQU1qQkMsb0JBQVk7QUFOSyxLQUFkLEVBT0pSLElBUEksQ0FBUDs7QUFTQSxRQUFJUyxpQkFBaUIsRUFBckI7QUFDQTs7Ozs7Ozs7Ozs7OztBQWNBLFFBQU1DLHdCQUF3QixJQUFJWixRQUFRYSxTQUFaLENBQzFCLHFHQUQwQixFQUM2RTtBQUNuR0wsaUJBQVMsRUFEMEY7QUFFbkdNLGlCQUFTLENBRjBGO0FBR25HQyxnQkFBUSxXQUgyRjtBQUluR0MscUJBQWE7QUFKc0YsS0FEN0UsQ0FBOUI7O0FBUUFMLG1CQUFlTSxJQUFmLENBQW9CTCxxQkFBcEI7O0FBRUE7Ozs7Ozs7Ozs7OztBQWFBLFFBQU1NLDJCQUEyQmxCLFFBQVFtQixZQUFSLENBQXFCUixjQUFyQixDQUFqQzs7QUFFQSxRQUFJUyxNQUFNcEIsUUFBUW9CLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQ3pCWCxnQkFBUSxDQUFDUyx3QkFBRCxDQURpQjtBQUV6QlosZ0JBQVFKLEtBQUtJLE1BRlk7QUFHekJDLGNBQU1MLEtBQUtLLElBSGM7QUFJekJjLHlCQUFpQjtBQUpRLEtBQW5CLENBQVY7O0FBT0EsUUFBTUMsU0FBU3RCLFFBQVF1QixPQUFSLENBQWdCQyxXQUFoQixDQUE0QixFQUFDQyxVQUFVLFlBQVgsRUFBNUIsQ0FBZjtBQUNBSCxXQUFPSSxjQUFQLENBQXNCLG9GQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLHdFQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLDJHQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLHNGQUF0Qjs7QUFFQUosV0FBT0ssS0FBUCxDQUFhUCxHQUFiOztBQUVBLFdBQU9BLEdBQVA7QUFDSCxDQW5FRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcblxuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcblxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcmVuZGVyX2VsZW06ICdtYXAnLFxuICAgICAgICBjZW50ZXI6IFsyOS45ODEzOSwgLTk1LjMzMzc0XSxcbiAgICAgICAgem9vbTogNSxcbiAgICAgICAgbWF4Wm9vbTogMTAsXG4gICAgICAgIGxheWVyczogW10sXG4gICAgICAgIHNldF9tYXJrZXI6IGZhbHNlLFxuICAgIH0sIG9wdHMpO1xuXG4gICAgbGV0IGZlYXR1cmVfZ3JvdXBzID0gW107XG4gICAgLyp2YXIgb3BlbmFpcF9haXJzcGFjZV9sYWJlbHMgPSBuZXcgbGVhZmxldC5UaWxlTGF5ZXIuV01TKFxuICAgICAgICBcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2Uvd21zXCIsIHtcbiAgICAgICAgICAgIG1heFpvb206IDE0LFxuICAgICAgICAgICAgbWluWm9vbTogMTIsXG4gICAgICAgICAgICBsYXllcnM6ICdvcGVuYWlwX2FwcHJvdmVkX2FpcnNwYWNlc19sYWJlbHMnLFxuICAgICAgICAgICAgdGlsZVNpemU6IDEwMjQsXG4gICAgICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXG4gICAgICAgICAgICBzdWJkb21haW5zOiAnMTInLFxuICAgICAgICAgICAgZm9ybWF0OiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgb3BlbmFpcF9haXJzcGFjZV9sYWJlbHMuYWRkVG8obWFwKTsqL1xuXG4gICAgY29uc3Qgb3BlbmN5Y2xlbWFwX3BoeXNfb3NtID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyKFxuICAgICAgICAnaHR0cDovL3tzfS50aWxlLnRodW5kZXJmb3Jlc3QuY29tL2xhbmRzY2FwZS97en0ve3h9L3t5fS5wbmc/YXBpa2V5PWYwOWEzOGZhODc1MTRkZTQ4OTBmYzk2ZTdmZThlY2IxJywge1xuICAgICAgICAgICAgbWF4Wm9vbTogMTQsXG4gICAgICAgICAgICBtaW5ab29tOiA0LFxuICAgICAgICAgICAgZm9ybWF0OiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5jeWNsZW1hcF9waHlzX29zbSlcblxuICAgIC8qY29uc3Qgb3BlbmFpcF9jYWNoZWRfYmFzZW1hcCA9IG5ldyBsZWFmbGV0LlRpbGVMYXllcihcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2UvdG1zLzEuMC4wL29wZW5haXBfYmFzZW1hcEBFUFNHJTNBOTAwOTEzQHBuZy97en0ve3h9L3t5fS5wbmdcIiwge1xuICAgICAgICBtYXhab29tOiAxNCxcbiAgICAgICAgbWluWm9vbTogNCxcbiAgICAgICAgdG1zOiB0cnVlLFxuICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXG4gICAgICAgIHN1YmRvbWFpbnM6ICcxMicsXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gICAgfSk7XG5cbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5haXBfY2FjaGVkX2Jhc2VtYXApO1xuICAgICovXG5cbiAgICBjb25zdCBvcGVuYWlwX2Jhc2VtYXBfcGh5c19vc20gPSBsZWFmbGV0LmZlYXR1cmVHcm91cChmZWF0dXJlX2dyb3Vwcyk7XG5cbiAgICBsZXQgbWFwID0gbGVhZmxldC5tYXAoJ21hcCcsIHtcbiAgICAgICAgbGF5ZXJzOiBbb3BlbmFpcF9iYXNlbWFwX3BoeXNfb3NtXSxcbiAgICAgICAgY2VudGVyOiBvcHRzLmNlbnRlcixcbiAgICAgICAgem9vbTogb3B0cy56b29tLFxuICAgICAgICBzY3JvbGxXaGVlbFpvb206IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXR0cmliID0gbGVhZmxldC5jb250cm9sLmF0dHJpYnV0aW9uKHtwb3NpdGlvbjogJ2JvdHRvbWxlZnQnfSlcbiAgICBhdHRyaWIuYWRkQXR0cmlidXRpb24oJzxhIGhyZWY9XCJodHRwczovL3d3dy50aHVuZGVyZm9yZXN0LmNvbVwiIHRhcmdldD1cIl9ibGFua1wiIHN0eWxlPVwiXCI+VGh1bmRlcmZvcmVzdDwvYT4nKVxuICAgIGF0dHJpYi5hZGRBdHRyaWJ1dGlvbignPGEgaHJlZj1cImh0dHBzOi8vd3d3Lm9wZW5haXAubmV0XCIgdGFyZ2V0PVwiX2JsYW5rXCIgc3R5bGU9XCJcIj5vcGVuQUlQPC9hPicpXG4gICAgYXR0cmliLmFkZEF0dHJpYnV0aW9uKCc8YSBocmVmPVwiaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCIgdGFyZ2V0PVwiX2JsYW5rXCIgc3R5bGU9XCJcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnKVxuICAgIGF0dHJpYi5hZGRBdHRyaWJ1dGlvbignPGEgaHJlZj1cImh0dHBzOi8vd3d3Lm9wZW53ZWF0aGVybWFwLm9yZ1wiIHRhcmdldD1cIl9ibGFua1wiIHN0eWxlPVwiXCI+T3BlbldlYXRoZXJNYXA8L2E+JylcblxuICAgIGF0dHJpYi5hZGRUbyhtYXApXG5cbiAgICByZXR1cm4gbWFwXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvYmFzZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); /***/ }), @@ -334,7 +362,7 @@ eval("var leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-sr /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758',\n ACTUAL_ROUTE_COLOR = '#067ec1',\n CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiOzs7QUFBTyxJQUNIQSxtQkFBbUIsU0FEaEI7QUFBQSxJQUVIQyxxQkFBcUIsU0FGbEI7QUFBQSxJQUdIQyxlQUFlLFNBSFoiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbGV0XHJcbiAgICBQTEFOX1JPVVRFX0NPTE9SID0gJyMwNDM3NTgnLFxyXG4gICAgQUNUVUFMX1JPVVRFX0NPTE9SID0gJyMwNjdlYzEnLFxyXG4gICAgQ0lSQ0xFX0NPTE9SID0gJyMwNTYwOTMnO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); +eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758',\n ACTUAL_ROUTE_COLOR = '#067ec1',\n CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiOzs7QUFBTyxJQUNIQSxtQkFBbUIsU0FEaEI7QUFBQSxJQUVIQyxxQkFBcUIsU0FGbEI7QUFBQSxJQUdIQyxlQUFlLFNBSFoiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbGV0XG4gICAgUExBTl9ST1VURV9DT0xPUiA9ICcjMDQzNzU4JyxcbiAgICBBQ1RVQUxfUk9VVEVfQ09MT1IgPSAnIzA2N2VjMScsXG4gICAgQ0lSQ0xFX0NPTE9SID0gJyMwNTYwOTMnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvY29uZmlnLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); /***/ }), @@ -342,7 +370,7 @@ eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\r\n * Add a WMS layer to a map. opts must be:\r\n * {\r\n * url: '',\r\n * params: {}\r\n * }\r\n * @param map\r\n * @param opts\r\n */\nfunction addWMSLayer(map, opts) {\n\n if (opts.url === '') {\n return;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\r\n * Show a popup\r\n * @param feature\r\n * @param layer\r\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTs7Ozs7Ozs7O0FBU08sU0FBU0MsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEJDLElBQTFCLEVBQWdDOztBQUVuQyxRQUFHQSxLQUFLQyxHQUFMLEtBQWEsRUFBaEIsRUFBb0I7QUFDaEI7QUFDSDs7QUFFREQsU0FBS0UsTUFBTCxHQUFjQyxPQUFPQyxNQUFQLENBQWM7QUFDeEJDLGdCQUFRLFdBRGdCO0FBRXhCQyxxQkFBYSxJQUZXO0FBR3hCQyxpQkFBUyxFQUhlO0FBSXhCQyxpQkFBUztBQUplLEtBQWQsRUFLWFIsS0FBS0UsTUFMTSxDQUFkOztBQU9BLFFBQU1PLFNBQVNiLFFBQVFjLFNBQVIsQ0FBa0JDLEdBQWxCLENBQ1hYLEtBQUtDLEdBRE0sRUFDREQsS0FBS0UsTUFESixDQUFmOztBQUlBTyxXQUFPRyxLQUFQLENBQWFiLEdBQWI7O0FBRUEsV0FBT1UsTUFBUDtBQUNIOztBQUVEOzs7OztBQUtPLFNBQVNJLGdCQUFULENBQTBCQyxPQUExQixFQUFtQ0MsS0FBbkMsRUFBMEM7QUFDN0MsUUFBSUMsYUFBYSxFQUFqQjtBQUNBLFFBQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2hERixzQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDSDs7QUFFREgsVUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDSCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBBZGQgYSBXTVMgbGF5ZXIgdG8gYSBtYXAuIG9wdHMgbXVzdCBiZTpcclxuICoge1xyXG4gKiAgdXJsOiAnJyxcclxuICogIHBhcmFtczoge31cclxuICogIH1cclxuICogQHBhcmFtIG1hcFxyXG4gKiBAcGFyYW0gb3B0c1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdNU0xheWVyKG1hcCwgb3B0cykge1xyXG5cclxuICAgIGlmKG9wdHMudXJsID09PSAnJykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBvcHRzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgbWF4Wm9vbTogMTQsXHJcbiAgICAgICAgbWluWm9vbTogNCxcclxuICAgIH0sIG9wdHMucGFyYW1zKTtcclxuXHJcbiAgICBjb25zdCBtbGF5ZXIgPSBsZWFmbGV0LnRpbGVMYXllci53bXMoXHJcbiAgICAgICAgb3B0cy51cmwsIG9wdHMucGFyYW1zXHJcbiAgICApO1xyXG5cclxuICAgIG1sYXllci5hZGRUbyhtYXApO1xyXG5cclxuICAgIHJldHVybiBtbGF5ZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaG93IGEgcG9wdXBcclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxheWVyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2hvd0ZlYXR1cmVQb3B1cChmZWF0dXJlLCBsYXllcikge1xyXG4gICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcclxuICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XHJcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcclxuICAgIH1cclxuXHJcbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); +eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Add a WMS layer to a map. opts must be:\n * {\n * url: '',\n * params: {}\n * }\n * @param map\n * @param opts\n */\nfunction addWMSLayer(map, opts) {\n\n if (opts.url === '') {\n return;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\n * Show a popup\n * @param feature\n * @param layer\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTs7Ozs7Ozs7O0FBU08sU0FBU0MsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEJDLElBQTFCLEVBQWdDOztBQUVuQyxRQUFHQSxLQUFLQyxHQUFMLEtBQWEsRUFBaEIsRUFBb0I7QUFDaEI7QUFDSDs7QUFFREQsU0FBS0UsTUFBTCxHQUFjQyxPQUFPQyxNQUFQLENBQWM7QUFDeEJDLGdCQUFRLFdBRGdCO0FBRXhCQyxxQkFBYSxJQUZXO0FBR3hCQyxpQkFBUyxFQUhlO0FBSXhCQyxpQkFBUztBQUplLEtBQWQsRUFLWFIsS0FBS0UsTUFMTSxDQUFkOztBQU9BLFFBQU1PLFNBQVNiLFFBQVFjLFNBQVIsQ0FBa0JDLEdBQWxCLENBQ1hYLEtBQUtDLEdBRE0sRUFDREQsS0FBS0UsTUFESixDQUFmOztBQUlBTyxXQUFPRyxLQUFQLENBQWFiLEdBQWI7O0FBRUEsV0FBT1UsTUFBUDtBQUNIOztBQUVEOzs7OztBQUtPLFNBQVNJLGdCQUFULENBQTBCQyxPQUExQixFQUFtQ0MsS0FBbkMsRUFBMEM7QUFDN0MsUUFBSUMsYUFBYSxFQUFqQjtBQUNBLFFBQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2hERixzQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDSDs7QUFFREgsVUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDSCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5cbi8qKlxuICogQWRkIGEgV01TIGxheWVyIHRvIGEgbWFwLiBvcHRzIG11c3QgYmU6XG4gKiB7XG4gKiAgdXJsOiAnJyxcbiAqICBwYXJhbXM6IHt9XG4gKiAgfVxuICogQHBhcmFtIG1hcFxuICogQHBhcmFtIG9wdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFdNU0xheWVyKG1hcCwgb3B0cykge1xuXG4gICAgaWYob3B0cy51cmwgPT09ICcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBmb3JtYXQ6ICdpbWFnZS9wbmcnLFxuICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgbWF4Wm9vbTogMTQsXG4gICAgICAgIG1pblpvb206IDQsXG4gICAgfSwgb3B0cy5wYXJhbXMpO1xuXG4gICAgY29uc3QgbWxheWVyID0gbGVhZmxldC50aWxlTGF5ZXIud21zKFxuICAgICAgICBvcHRzLnVybCwgb3B0cy5wYXJhbXNcbiAgICApO1xuXG4gICAgbWxheWVyLmFkZFRvKG1hcCk7XG5cbiAgICByZXR1cm4gbWxheWVyO1xufVxuXG4vKipcbiAqIFNob3cgYSBwb3B1cFxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXllclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvd0ZlYXR1cmVQb3B1cChmZWF0dXJlLCBsYXllcikge1xuICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcbiAgICB9XG5cbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); /***/ }), @@ -350,7 +378,7 @@ eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer; /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\r\n * All of the functionality required for maps\r\n */\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbIndpbmRvdyIsIkwiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUFBOzs7O0FBSUFBLE9BQU9DLENBQVAsR0FBVyxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFYO0FBQ0EsbUJBQUFBLENBQVEscURBQVI7QUFDQSxtQkFBQUEsQ0FBUSwrREFBUjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBbGwgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgZm9yIG1hcHNcclxuICovXHJcblxyXG53aW5kb3cuTCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcclxucmVxdWlyZSgnTGVhZmxldC5HZW9kZXNpYycpO1xyXG5yZXF1aXJlKCdsZWFmbGV0LXJvdGF0ZWRtYXJrZXInKTtcclxuXHJcbmltcG9ydCByZW5kZXJfYWlyc3BhY2VfbWFwIGZyb20gJy4vYWlyc3BhY2VfbWFwJ1xyXG5pbXBvcnQgcmVuZGVyX2xpdmVfbWFwIGZyb20gJy4vbGl2ZV9tYXAnXHJcbmltcG9ydCByZW5kZXJfcm91dGVfbWFwIGZyb20gJy4vcm91dGVfbWFwJ1xyXG5cclxuZXhwb3J0IHtcclxuICByZW5kZXJfYWlyc3BhY2VfbWFwLFxyXG4gIHJlbmRlcl9saXZlX21hcCxcclxuICByZW5kZXJfcm91dGVfbWFwLFxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\n * All of the functionality required for maps\n */\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbIndpbmRvdyIsIkwiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUFBOzs7O0FBSUFBLE9BQU9DLENBQVAsR0FBVyxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFYO0FBQ0EsbUJBQUFBLENBQVEscURBQVI7QUFDQSxtQkFBQUEsQ0FBUSwrREFBUjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIGZvciBtYXBzXG4gKi9cblxud2luZG93LkwgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5yZXF1aXJlKCdMZWFmbGV0Lkdlb2Rlc2ljJyk7XG5yZXF1aXJlKCdsZWFmbGV0LXJvdGF0ZWRtYXJrZXInKTtcblxuaW1wb3J0IHJlbmRlcl9haXJzcGFjZV9tYXAgZnJvbSAnLi9haXJzcGFjZV9tYXAnXG5pbXBvcnQgcmVuZGVyX2xpdmVfbWFwIGZyb20gJy4vbGl2ZV9tYXAnXG5pbXBvcnQgcmVuZGVyX3JvdXRlX21hcCBmcm9tICcuL3JvdXRlX21hcCdcblxuZXhwb3J0IHtcbiAgcmVuZGVyX2FpcnNwYWNlX21hcCxcbiAgcmVuZGVyX2xpdmVfbWFwLFxuICByZW5kZXJfcm91dGVfbWFwLFxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); /***/ }), @@ -358,7 +386,7 @@ eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true } /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\r\n * Render the live map\r\n * @param opts\r\n * @private\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var pannedToCenter = false;\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n\n /**\r\n * When a flight is clicked on, show the path, etc for that flight\r\n * @param feature\r\n * @param layer\r\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var link_uri = opts.pirep_link_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + \"/acars/geojson\";\n\n var pirep_info = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flight_route = $.ajax({\n url: geojson_uri,\n dataType: 'json',\n error: console.log\n });\n\n // Load up the PIREP info\n $.when(flight_route).done(function (routeJson) {\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(routeJson.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n map.panTo({ lat: routeJson.position.lat, lng: routeJson.position.lon });\n pannedToCenter = true;\n }\n });\n\n //\n // When the PIREP info is done loading, show the bottom bar\n //\n $.when(pirep_info).done(function (pirep) {\n pirep = pirep.data;\n\n var dist = void 0,\n planned_dist = void 0;\n if (opts.units === 'nmi') {\n dist = pirep.distance.nmi;\n planned_dist = pirep.planned_distance.nmi;\n } else if (opts.units === 'mi') {\n dist = pirep.distance.mi;\n planned_dist = pirep.planned_distance.mi;\n } else if (opts.units === 'km') {\n dist = pirep.distance.km;\n planned_dist = pirep.planned_distance.km;\n }\n\n // Parse flight time\n var hours = Math.floor(pirep.flight_time / 60);\n var mins = pirep.flight_time % 60;\n\n $('#map_flight_id').html('' + pirep.airline.icao + pirep.flight_number + '');\n\n $('#map_flight_info').text(pirep.dpt_airport.name + ' (' + pirep.dpt_airport.icao + ') to ' + pirep.arr_airport.name + ' (' + pirep.arr_airport.icao + ')');\n\n $('#map_flight_stats_middle').html('Status: ' + pirep.status_text + '
' + 'Flight Time: ' + hours + 'h ' + mins + 'm
' + 'Distance: ' + dist + ' / ' + planned_dist + opts.units + '
');\n\n // Show flight stat info\n $('#map_flight_stats_right').html('Ground Speed: ' + pirep.position.gs + '
' + 'Altitude: ' + pirep.position.altitude + '
' + 'Heading: ' + pirep.position.heading + '');\n\n $('#map-info-bar').show();\n });\n };\n\n var updateMap = function updateMap() {\n\n console.log('reloading flights from acars...');\n\n /**\r\n * AJAX UPDATE\r\n */\n\n var flights = $.ajax({\n url: opts.update_uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(flights).done(function (flightGeoJson) {\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n click: function click(e) {\n pannedToCenter = false;\n onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n };\n\n updateMap();\n setInterval(updateMap, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInVwZGF0ZV91cmkiLCJwaXJlcF91cmkiLCJwaXJlcF9saW5rX3VyaSIsInBvc2l0aW9ucyIsInJlbmRlcl9lbGVtIiwiYWlyY3JhZnRfaWNvbiIsInVuaXRzIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImFpcmNyYWZ0SWNvbiIsImljb24iLCJpY29uVXJsIiwiaWNvblNpemUiLCJpY29uQW5jaG9yIiwicGFubmVkVG9DZW50ZXIiLCJsYXllckZsaWdodHMiLCJsYXllclNlbEZsaWdodCIsImxheWVyU2VsRmxpZ2h0RmVhdHVyZSIsImxheWVyU2VsRmxpZ2h0TGF5ZXIiLCJvbkZsaWdodENsaWNrIiwiZmVhdHVyZSIsImxheWVyIiwicmVwbGFjZSIsInByb3BlcnRpZXMiLCJwaXJlcF9pZCIsImxpbmtfdXJpIiwiZ2VvanNvbl91cmkiLCJwaXJlcF9pbmZvIiwiJCIsImFqYXgiLCJ1cmwiLCJkYXRhVHlwZSIsImVycm9yIiwiY29uc29sZSIsImxvZyIsImZsaWdodF9yb3V0ZSIsIndoZW4iLCJkb25lIiwicm91dGVKc29uIiwicmVtb3ZlTGF5ZXIiLCJnZW9kZXNpYyIsIndlaWdodCIsIm9wYWNpdHkiLCJjb2xvciIsIndyYXAiLCJhZGRUbyIsImdlb0pzb24iLCJsaW5lIiwicGFuVG8iLCJsYXQiLCJwb3NpdGlvbiIsImxuZyIsImxvbiIsInBpcmVwIiwiZGF0YSIsImRpc3QiLCJwbGFubmVkX2Rpc3QiLCJkaXN0YW5jZSIsIm5taSIsInBsYW5uZWRfZGlzdGFuY2UiLCJtaSIsImttIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJmbGlnaHRfdGltZSIsIm1pbnMiLCJodG1sIiwiYWlybGluZSIsImljYW8iLCJmbGlnaHRfbnVtYmVyIiwidGV4dCIsImRwdF9haXJwb3J0IiwibmFtZSIsImFycl9haXJwb3J0Iiwic3RhdHVzX3RleHQiLCJncyIsImFsdGl0dWRlIiwiaGVhZGluZyIsInNob3ciLCJ1cGRhdGVNYXAiLCJmbGlnaHRzIiwiZmxpZ2h0R2VvSnNvbiIsImNsZWFyTGF5ZXJzIiwiZ2VvSlNPTiIsIm9uRWFjaEZlYXR1cmUiLCJvbiIsImNsaWNrIiwiZSIsInBvcHVwX2h0bWwiLCJwb3B1cCIsInVuZGVmaW5lZCIsImJpbmRQb3B1cCIsInBvaW50VG9MYXllciIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJzZXRJbnRlcnZhbCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUEsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMsb0JBQVksWUFESztBQUVqQkMsbUJBQVcsa0JBRk07QUFHakJDLHdCQUFnQixjQUhDO0FBSWpCQyxtQkFBVyxJQUpNO0FBS2pCQyxxQkFBYSxLQUxJO0FBTWpCQyx1QkFBZSxnQ0FORTtBQU9qQkMsZUFBTztBQVBVLEtBQWQsRUFRSlQsSUFSSSxDQUFQOztBQVVBLFFBQU1VLE1BQU0sa0VBQUFDLENBQWNYLElBQWQsQ0FBWjtBQUNBLFFBQU1ZLGVBQWVkLFFBQVFlLElBQVIsQ0FBYTtBQUM5QkMsaUJBQVNkLEtBQUtRLGFBRGdCO0FBRTlCTyxrQkFBVSxDQUFDLEVBQUQsRUFBSyxFQUFMLENBRm9CO0FBRzlCQyxvQkFBWSxDQUFDLEVBQUQsRUFBSyxFQUFMO0FBSGtCLEtBQWIsQ0FBckI7O0FBTUEsUUFBSUMsaUJBQWlCLEtBQXJCO0FBQ0EsUUFBSUMsZUFBZSxJQUFuQjtBQUNBLFFBQUlDLGlCQUFpQixJQUFyQjtBQUNBLFFBQUlDLHdCQUF3QixJQUE1QjtBQUNBLFFBQUlDLHNCQUFzQixJQUExQjs7QUFFQTs7Ozs7QUFLQSxRQUFNQyxnQkFBZ0IsU0FBaEJB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aUIsZ0JBQVlqQixTQUFaLEVBQXVCLEtBQXZCO0FBQ0gsQ0EvS0QiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XHJcblxyXG5pbXBvcnQgZHJhd19iYXNlX21hcCBmcm9tICcuL2Jhc2VfbWFwJ1xyXG5pbXBvcnQge0FDVFVBTF9ST1VURV9DT0xPUn0gZnJvbSAnLi9jb25maWcnXHJcblxyXG4vKipcclxuICogUmVuZGVyIHRoZSBsaXZlIG1hcFxyXG4gKiBAcGFyYW0gb3B0c1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcclxuXHJcbiAgICBvcHRzID0gT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgdXBkYXRlX3VyaTogJy9hcGkvYWNhcnMnLFxyXG4gICAgICAgIHBpcmVwX3VyaTogJy9hcGkvcGlyZXBzL3tpZH0nLFxyXG4gICAgICAgIHBpcmVwX2xpbmtfdXJpOiAnL3BpcmVwcy97aWR9JyxcclxuICAgICAgICBwb3NpdGlvbnM6IG51bGwsXHJcbiAgICAgICAgcmVuZGVyX2VsZW06ICdtYXAnLFxyXG4gICAgICAgIGFpcmNyYWZ0X2ljb246ICcvYXNzZXRzL2ltZy9hY2Fycy9haXJjcmFmdC5wbmcnLFxyXG4gICAgICAgIHVuaXRzOiAnbm1pJyxcclxuICAgIH0sIG9wdHMpO1xyXG5cclxuICAgIGNvbnN0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XHJcbiAgICBjb25zdCBhaXJjcmFmdEljb24gPSBsZWFmbGV0Lmljb24oe1xyXG4gICAgICAgIGljb25Vcmw6IG9wdHMuYWlyY3JhZnRfaWNvbixcclxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXHJcbiAgICAgICAgaWNvbkFuY2hvcjogWzIxLCAyMV0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgcGFubmVkVG9DZW50ZXIgPSBmYWxzZTtcclxuICAgIGxldCBsYXllckZsaWdodHMgPSBudWxsO1xyXG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0ID0gbnVsbDtcclxuICAgIGxldCBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBudWxsO1xyXG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBhIGZsaWdodCBpcyBjbGlja2VkIG9uLCBzaG93IHRoZSBwYXRoLCBldGMgZm9yIHRoYXQgZmxpZ2h0XHJcbiAgICAgKiBAcGFyYW0gZmVhdHVyZVxyXG4gICAgICogQHBhcmFtIGxheWVyXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG9uRmxpZ2h0Q2xpY2sgPSAoZmVhdHVyZSwgbGF5ZXIpID0+IHtcclxuXHJcbiAgICAgICAgY29uc3QgcGlyZXBfdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsIGZlYXR1cmUucHJvcGVydGllcy5waXJlcF9pZCk7XHJcbiAgICAgICAgY29uc3QgbGlua191cmkgPSBvcHRzLnBpcmVwX2xpbmtfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpO1xyXG4gICAgICAgIGNvbnN0IGdlb2pzb25fdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsIGZlYXR1cmUucHJvcGVydGllcy5waXJlcF9pZCkgKyBcIi9hY2Fycy9nZW9qc29uXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHBpcmVwX2luZm8gPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IHBpcmVwX3VyaSxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZsaWdodF9yb3V0ZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogZ2VvanNvbl91cmksXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBMb2FkIHVwIHRoZSBQSVJFUCBpbmZvXHJcbiAgICAgICAgJC53aGVuKGZsaWdodF9yb3V0ZSkuZG9uZSgocm91dGVKc29uKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChsYXllclNlbEZsaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRmxpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHQgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XHJcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDUsXHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjksXHJcbiAgICAgICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxyXG4gICAgICAgICAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pLmFkZFRvKG1hcCk7XHJcblxyXG4gICAgICAgICAgICBsYXllclNlbEZsaWdodC5nZW9Kc29uKHJvdXRlSnNvbi5saW5lKTtcclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRGZWF0dXJlID0gZmVhdHVyZTtcclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRMYXllciA9IGxheWVyO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2VudGVyIG9uIGl0LCBidXQgb25seSBkbyBpdCBvbmNlLCBpbiBjYXNlIHRoZSBtYXAgaXMgbW92ZWRcclxuICAgICAgICAgICAgaWYoIXBhbm5lZFRvQ2VudGVyKSB7XHJcbiAgICAgICAgICAgICAgICBtYXAucGFuVG8oe2xhdDogcm91dGVKc29uLnBvc2l0aW9uLmxhdCwgbG5nOiByb3V0ZUpzb24ucG9zaXRpb24ubG9ufSk7XHJcbiAgICAgICAgICAgICAgICBwYW5uZWRUb0NlbnRlciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBXaGVuIHRoZSBQSVJFUCBpbmZvIGlzIGRvbmUgbG9hZGluZywgc2hvdyB0aGUgYm90dG9tIGJhclxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJC53aGVuKHBpcmVwX2luZm8pLmRvbmUocGlyZXAgPT4geyBwaXJlcCA9IHBpcmVwLmRhdGE7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGlzdCwgcGxhbm5lZF9kaXN0O1xyXG4gICAgICAgICAgICBpZihvcHRzLnVuaXRzID09PSAnbm1pJykge1xyXG4gICAgICAgICAgICAgICAgZGlzdCA9IHBpcmVwLmRpc3RhbmNlLm5taTtcclxuICAgICAgICAgICAgICAgIHBsYW5uZWRfZGlzdCA9IHBpcmVwLnBsYW5uZWRfZGlzdGFuY2Uubm1pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYob3B0cy51bml0cyA9PT0gJ21pJykge1xyXG4gICAgICAgICAgICAgICAgZGlzdCA9IHBpcmVwLmRpc3RhbmNlLm1pO1xyXG4gICAgICAgICAgICAgICAgcGxhbm5lZF9kaXN0ID0gcGlyZXAucGxhbm5lZF9kaXN0YW5jZS5taTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmKG9wdHMudW5pdHMgPT09ICdrbScpIHtcclxuICAgICAgICAgICAgICAgIGRpc3QgPSBwaXJlcC5kaXN0YW5jZS5rbTtcclxuICAgICAgICAgICAgICAgIHBsYW5uZWRfZGlzdCA9IHBpcmVwLnBsYW5uZWRfZGlzdGFuY2Uua207XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFBhcnNlIGZsaWdodCB0aW1lXHJcbiAgICAgICAgICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihwaXJlcC5mbGlnaHRfdGltZSAvIDYwKTtcclxuICAgICAgICAgICAgY29uc3QgbWlucyA9IHBpcmVwLmZsaWdodF90aW1lICUgNjA7XHJcblxyXG4gICAgICAgICAgICAkKCcjbWFwX2ZsaWdodF9pZCcpLmh0bWwoXHJcbiAgICAgICAgICAgICAgICAnPGEgaHJlZj1cIicgKyBsaW5rX3VyaSAgKyAnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JyArXHJcbiAgICAgICAgICAgICAgICBwaXJlcC5haXJsaW5lLmljYW8gKyBwaXJlcC5mbGlnaHRfbnVtYmVyICtcclxuICAgICAgICAgICAgICAgICc8L2E+J1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgJCgnI21hcF9mbGlnaHRfaW5mbycpLnRleHQoXHJcbiAgICAgICAgICAgICAgICBwaXJlcC5kcHRfYWlycG9ydC5uYW1lICsgJyAoJyArIHBpcmVwLmRwdF9haXJwb3J0LmljYW8gKyAnKSB0byAnICtcclxuICAgICAgICAgICAgICAgIHBpcmVwLmFycl9haXJwb3J0Lm5hbWUgKyAnICgnICsgcGlyZXAuYXJyX2FpcnBvcnQuaWNhbyArICcpJ1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgJCgnI21hcF9mbGlnaHRfc3RhdHNfbWlkZGxlJykuaHRtbChcclxuICAgICAgICAgICAgICAgICdTdGF0dXM6IDxzdHJvbmc+JyArIHBpcmVwLnN0YXR1c190ZXh0ICsgJzwvc3Ryb25nPjxiciAvPicgK1xyXG4gICAgICAgICAgICAgICAgJ0ZsaWdodCBUaW1lOiA8c3Ryb25nPicgKyBob3VycyArICdoICcgKyBtaW5zICsgJ208L3N0cm9uZz48YnIgLz4nICtcclxuICAgICAgICAgICAgICAgICdEaXN0YW5jZTogPHN0cm9uZz4nICsgZGlzdCArICc8L3N0cm9uZz4gLyAnICsgcGxhbm5lZF9kaXN0ICsgb3B0cy51bml0cyArICc8YnIgLz4nXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAvLyBTaG93IGZsaWdodCBzdGF0IGluZm9cclxuICAgICAgICAgICAgJCgnI21hcF9mbGlnaHRfc3RhdHNfcmlnaHQnKS5odG1sKFxyXG4gICAgICAgICAgICAgICAgJ0dyb3VuZCBTcGVlZDogPHN0cm9uZz4nICsgcGlyZXAucG9zaXRpb24uZ3MgKyAnPC9zdHJvbmc+PGJyIC8+JyArXHJcbiAgICAgICAgICAgICAgICAnQWx0aXR1ZGU6IDxzdHJvbmc+JyArIHBpcmVwLnBvc2l0aW9uLmFsdGl0dWRlICsgJzwvc3Ryb25nPjxiciAvPicgICtcclxuICAgICAgICAgICAgICAgICdIZWFkaW5nOiA8c3Ryb25nPicgKyBwaXJlcC5wb3NpdGlvbi5oZWFkaW5nICsgJzwvc3Ryb25nPidcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICQoJyNtYXAtaW5mby1iYXInKS5zaG93KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZU1hcCA9ICgpID0+IHtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coJ3JlbG9hZGluZyBmbGlnaHRzIGZyb20gYWNhcnMuLi4nKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQUpBWCBVUERBVEVcclxuICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgbGV0IGZsaWdodHMgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IG9wdHMudXBkYXRlX3VyaSxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQud2hlbihmbGlnaHRzKS5kb25lKGZ1bmN0aW9uIChmbGlnaHRHZW9Kc29uKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAobGF5ZXJGbGlnaHRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsYXllckZsaWdodHMuY2xlYXJMYXllcnMoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsYXllckZsaWdodHMgPSBsZWFmbGV0Lmdlb0pTT04oZmxpZ2h0R2VvSnNvbiwge1xyXG4gICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogKGZlYXR1cmUsIGxheWVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIub24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZsaWdodENsaWNrKGZlYXR1cmUsIGxheWVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3B1cF9odG1sID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSAnJyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXAgIT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChwb3B1cF9odG1sKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBmdW5jdGlvbiAoZmVhdHVyZSwgbGF0bG9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBhaXJjcmFmdEljb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uQW5nbGU6IGZlYXR1cmUucHJvcGVydGllcy5oZWFkaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsYXllckZsaWdodHMuYWRkVG8obWFwKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgY2xpY2tlZC1mbGlnaHQgaW5mb3JtYXRpb25cclxuICAgICAgICAgICAgaWYgKGxheWVyU2VsRmxpZ2h0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBvbkZsaWdodENsaWNrKGxheWVyU2VsRmxpZ2h0RmVhdHVyZSwgbGF5ZXJTZWxGbGlnaHRMYXllcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9O1xyXG5cclxuICAgIHVwZGF0ZU1hcCgpO1xyXG4gICAgc2V0SW50ZXJ2YWwodXBkYXRlTWFwLCAxMDAwMClcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n\n\n\n/**\n * Render the live map\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var pannedToCenter = false;\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n\n var r_map_view = rivets.bind($('#map-info-box'), { pirep: {} });\n var r_table_view = rivets.bind($('#live_flights'), { pireps: [] });\n\n /**\n * When a flight is clicked on, show the path, etc for that flight\n * @param feature\n * @param layer\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + \"/acars/geojson\";\n\n var pirep_info = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flight_route = $.ajax({\n url: geojson_uri,\n dataType: 'json',\n error: console.log\n });\n\n // Load up the PIREP info\n $.when(flight_route).done(function (routeJson) {\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(routeJson.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n map.panTo({ lat: routeJson.position.lat, lng: routeJson.position.lon });\n pannedToCenter = true;\n }\n });\n\n //\n // When the PIREP info is done loading, show the bottom bar\n //\n $.when(pirep_info).done(function (pirep) {\n r_map_view.update({ pirep: pirep.data });\n $('#map-info-box').show();\n });\n };\n\n var updateMap = function updateMap() {\n\n console.log('reloading flights from acars...');\n\n /**\n * AJAX UPDATE\n */\n var pirep_uri = opts.pirep_uri.replace('{id}', '');\n var pireps = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flights = $.ajax({\n url: opts.update_uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(flights).done(function (flightGeoJson) {\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n click: function click(e) {\n pannedToCenter = false;\n onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n\n $.when(pireps).done(function (pireps) {\n r_table_view.update({\n pireps: pireps.data,\n has_data: pireps.data.length > 0\n });\n });\n };\n\n updateMap();\n setInterval(updateMap, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwicml2ZXRzIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInVwZGF0ZV91cmkiLCJwaXJlcF91cmkiLCJwaXJlcF9saW5rX3VyaSIsInBvc2l0aW9ucyIsInJlbmRlcl9lbGVtIiwiYWlyY3JhZnRfaWNvbiIsInVuaXRzIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImFpcmNyYWZ0SWNvbiIsImljb24iLCJpY29uVXJsIiwiaWNvblNpemUiLCJpY29uQW5jaG9yIiwicGFubmVkVG9DZW50ZXIiLCJsYXllckZsaWdodHMiLCJsYXllclNlbEZsaWdodCIsImxheWVyU2VsRmxpZ2h0RmVhdHVyZSIsImxheWVyU2VsRmxpZ2h0TGF5ZXIiLCJyX21hcF92aWV3IiwiYmluZCIsIiQiLCJwaXJlcCIsInJfdGFibGVfdmlldyIsInBpcmVwcyIsIm9uRmxpZ2h0Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJyZXBsYWNlIiwicHJvcGVydGllcyIsInBpcmVwX2lkIiwiZ2VvanNvbl91cmkiLCJwaXJlcF9pbmZvIiwiYWpheCIsInVybCIsImRhdGFUeXBlIiwiZXJyb3IiLCJjb25zb2xlIiwibG9nIiwiZmxpZ2h0X3JvdXRlIiwid2hlbiIsImRvbmUiLCJyb3V0ZUpzb24iLCJyZW1vdmVMYXllciIsImdlb2Rlc2ljIiwid2VpZ2h0Iiwib3BhY2l0eSIsImNvbG9yIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImxpbmUiLCJwYW5UbyIsImxhdCIsInBvc2l0aW9uIiwibG5nIiwibG9uIiwidXBkYXRlIiwiZGF0YSIsInNob3ciLCJ1cGRhdGVNYXAiLCJmbGlnaHRzIiwiY2xlYXJMYXllcnMiLCJnZW9KU09OIiwiZmxpZ2h0R2VvSnNvbiIsIm9uRWFjaEZlYXR1cmUiLCJvbiIsImNsaWNrIiwiZSIsInBvcHVwX2h0bWwiLCJwb3B1cCIsInVuZGVmaW5lZCIsImJpbmRQb3B1cCIsInBvaW50VG9MYXllciIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJoZWFkaW5nIiwiaGFzX2RhdGEiLCJsZW5ndGgiLCJzZXRJbnRlcnZhbCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUEsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjtBQUNBLElBQU1DLFNBQVMsbUJBQUFELENBQVEsc0NBQVIsQ0FBZjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNFLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMsb0JBQVksWUFESztBQUVqQkMsbUJBQVcsa0JBRk07QUFHakJDLHdCQUFnQixjQUhDO0FBSWpCQyxtQkFBVyxJQUpNO0FBS2pCQyxxQkFBYSxLQUxJO0FBTWpCQyx1QkFBZSxnQ0FORTtBQU9qQkMsZUFBTztBQVBVLEtBQWQsRUFRSlQsSUFSSSxDQUFQOztBQVVBLFFBQU1VLE1BQU0sa0VBQUFDLENBQWNYLElBQWQsQ0FBWjtBQUNBLFFBQU1ZLGVBQWVmLFFBQVFnQixJQUFSLENBQWE7QUFDOUJDLGlCQUFTZCxLQUFLUSxhQURnQjtBQUU5Qk8sa0JBQVUsQ0FBQyxFQUFELEVBQUssRUFBTCxDQUZvQjtBQUc5QkMsb0JBQVksQ0FBQyxFQUFELEVBQUssRUFBTDtBQUhrQixLQUFiLENBQXJCOztBQU1BLFFBQUlDLGlCQUFpQixLQUFyQjtBQUNBLFFBQUlDLGVBQWUsSUFBbkI7QUFDQSxRQUFJQyxpQkFBaUIsSUFBckI7QUFDQSxRQUFJQyx3QkFBd0IsSUFBNUI7QUFDQSxRQUFJQyxzQkFBc0IsSUFBMUI7O0FBRUEsUUFBTUMsYUFBYXZCLE9BQU93QixJQUFQLENBQVlDLEVBQUUsZUFBRixDQUFaLEVBQWdDLEVBQUNDLE9BQU8sRUFBUixFQUFoQyxDQUFuQjtBQUNBLFFBQU1DLGVBQWUzQixPQUFPd0IsSUFBUCxDQUFZQyxFQUFFLGVBQUYsQ0FBWixFQUFnQyxFQUFD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QUF2QjtBQUNILENBdEpEIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuY29uc3Qgcml2ZXRzID0gcmVxdWlyZSgncml2ZXRzJyk7XG5cbmltcG9ydCBkcmF3X2Jhc2VfbWFwIGZyb20gJy4vYmFzZV9tYXAnXG5pbXBvcnQge0FDVFVBTF9ST1VURV9DT0xPUn0gZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogUmVuZGVyIHRoZSBsaXZlIG1hcFxuICogQHBhcmFtIG9wdHNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XG5cbiAgICBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHVwZGF0ZV91cmk6ICcvYXBpL2FjYXJzJyxcbiAgICAgICAgcGlyZXBfdXJpOiAnL2FwaS9waXJlcHMve2lkfScsXG4gICAgICAgIHBpcmVwX2xpbmtfdXJpOiAnL3BpcmVwcy97aWR9JyxcbiAgICAgICAgcG9zaXRpb25zOiBudWxsLFxuICAgICAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgICAgIGFpcmNyYWZ0X2ljb246ICcvYXNzZXRzL2ltZy9hY2Fycy9haXJjcmFmdC5wbmcnLFxuICAgICAgICB1bml0czogJ25taScsXG4gICAgfSwgb3B0cyk7XG5cbiAgICBjb25zdCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICAgIGNvbnN0IGFpcmNyYWZ0SWNvbiA9IGxlYWZsZXQuaWNvbih7XG4gICAgICAgIGljb25Vcmw6IG9wdHMuYWlyY3JhZnRfaWNvbixcbiAgICAgICAgaWNvblNpemU6IFs0MiwgNDJdLFxuICAgICAgICBpY29uQW5jaG9yOiBbMjEsIDIxXSxcbiAgICB9KTtcblxuICAgIGxldCBwYW5uZWRUb0NlbnRlciA9IGZhbHNlO1xuICAgIGxldCBsYXllckZsaWdodHMgPSBudWxsO1xuICAgIGxldCBsYXllclNlbEZsaWdodCA9IG51bGw7XG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0RmVhdHVyZSA9IG51bGw7XG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBudWxsO1xuXG4gICAgY29uc3Qgcl9tYXBfdmlldyA9IHJpdmV0cy5iaW5kKCQoJyNtYXAtaW5mby1ib3gnKSwge3BpcmVwOiB7fX0pO1xuICAgIGNvbnN0IHJfdGFibGVfdmlldyA9IHJpdmV0cy5iaW5kKCQoJyNsaXZlX2ZsaWdodHMnKSwge3BpcmVwczogW119KTtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gYSBmbGlnaHQgaXMgY2xpY2tlZCBvbiwgc2hvdyB0aGUgcGF0aCwgZXRjIGZvciB0aGF0IGZsaWdodFxuICAgICAqIEBwYXJhbSBmZWF0dXJlXG4gICAgICogQHBhcmFtIGxheWVyXG4gICAgICovXG4gICAgY29uc3Qgb25GbGlnaHRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xuXG4gICAgICAgIGNvbnN0IHBpcmVwX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpO1xuICAgICAgICBjb25zdCBnZW9qc29uX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpICsgXCIvYWNhcnMvZ2VvanNvblwiO1xuXG4gICAgICAgIGNvbnN0IHBpcmVwX2luZm8gPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBwaXJlcF91cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZsaWdodF9yb3V0ZSA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IGdlb2pzb25fdXJpLFxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBMb2FkIHVwIHRoZSBQSVJFUCBpbmZvXG4gICAgICAgICQud2hlbihmbGlnaHRfcm91dGUpLmRvbmUoKHJvdXRlSnNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGxheWVyU2VsRmxpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRmxpZ2h0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHQgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XG4gICAgICAgICAgICAgICAgd2VpZ2h0OiA1LFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuOSxcbiAgICAgICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxuICAgICAgICAgICAgICAgIHdyYXA6IGZhbHNlLFxuICAgICAgICAgICAgfSkuYWRkVG8obWFwKTtcblxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHQuZ2VvSnNvbihyb3V0ZUpzb24ubGluZSk7XG4gICAgICAgICAgICBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBmZWF0dXJlO1xuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRMYXllciA9IGxheWVyO1xuXG4gICAgICAgICAgICAvLyBDZW50ZXIgb24gaXQsIGJ1dCBvbmx5IGRvIGl0IG9uY2UsIGluIGNhc2UgdGhlIG1hcCBpcyBtb3ZlZFxuICAgICAgICAgICAgaWYoIXBhbm5lZFRvQ2VudGVyKSB7XG4gICAgICAgICAgICAgICAgbWFwLnBhblRvKHtsYXQ6IHJvdXRlSnNvbi5wb3NpdGlvbi5sYXQsIGxuZzogcm91dGVKc29uLnBvc2l0aW9uLmxvbn0pO1xuICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgUElSRVAgaW5mbyBpcyBkb25lIGxvYWRpbmcsIHNob3cgdGhlIGJvdHRvbSBiYXJcbiAgICAgICAgLy9cbiAgICAgICAgJC53aGVuKHBpcmVwX2luZm8pLmRvbmUocGlyZXAgPT4ge1xuICAgICAgICAgICAgcl9tYXBfdmlldy51cGRhdGUoe3BpcmVwOnBpcmVwLmRhdGF9KTtcbiAgICAgICAgICAgICQoJyNtYXAtaW5mby1ib3gnKS5zaG93KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVNYXAgPSAoKSA9PiB7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ3JlbG9hZGluZyBmbGlnaHRzIGZyb20gYWNhcnMuLi4nKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQUpBWCBVUERBVEVcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHBpcmVwX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCAnJyk7XG4gICAgICAgIGxldCBwaXJlcHMgPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBwaXJlcF91cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBmbGlnaHRzID0gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogb3B0cy51cGRhdGVfdXJpLFxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xuICAgICAgICB9KTtcblxuICAgICAgICAkLndoZW4oZmxpZ2h0cykuZG9uZShmbGlnaHRHZW9Kc29uID0+IHtcblxuICAgICAgICAgICAgaWYgKGxheWVyRmxpZ2h0cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxheWVyRmxpZ2h0cy5jbGVhckxheWVycygpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxheWVyRmxpZ2h0cyA9IGxlYWZsZXQuZ2VvSlNPTihmbGlnaHRHZW9Kc29uLCB7XG4gICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogKGZlYXR1cmUsIGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLm9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GbGlnaHRDbGljayhmZWF0dXJlLCBsYXllcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSAnJyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXAgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwX2h0bWwgKz0gZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuYmluZFBvcHVwKHBvcHVwX2h0bWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGF5ZXJGbGlnaHRzLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgY2xpY2tlZC1mbGlnaHQgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGlmIChsYXllclNlbEZsaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2sobGF5ZXJTZWxGbGlnaHRGZWF0dXJlLCBsYXllclNlbEZsaWdodExheWVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkLndoZW4ocGlyZXBzKS5kb25lKHBpcmVwcyA9PiB7XG4gICAgICAgICAgICByX3RhYmxlX3ZpZXcudXBkYXRlKHtcbiAgICAgICAgICAgICAgICBwaXJlcHM6IHBpcmVwcy5kYXRhLFxuICAgICAgICAgICAgICAgIGhhc19kYXRhOiAocGlyZXBzLmRhdGEubGVuZ3RoID4gMCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHVwZGF0ZU1hcCgpO1xuICAgIHNldEludGVydmFsKHVwZGF0ZU1hcCwgMTAwMDApXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); /***/ }), @@ -366,7 +394,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n\n\n/**\r\n * Show some popup text when a feature is clicked on\r\n * @param feature\r\n * @param layer\r\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\r\n * Show each point as a marker\r\n * @param feature\r\n * @param latlng\r\n * @returns {*}\r\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_2__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\r\n *\r\n * @param opts\r\n * @private\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var geodesicLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n geodesicLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\r\n * draw the actual route\r\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var _geodesicLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n _geodesicLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(_geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\r\n *\r\n */\n var liveFlight = function liveFlight() {\n var uri = opts.pirep_uri;\n var live_route = $.ajax({\n url: uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(live_route).done(function (routeJson) {\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicm91dGVfcG9pbnRzIiwicGxhbm5lZF9yb3V0ZV9saW5lIiwiYWN0dWFsX3JvdXRlX3BvaW50cyIsImFjdHVhbF9yb3V0ZV9saW5lIiwicmVuZGVyX2VsZW0iLCJsaXZlX21hcCIsImFpcmNyYWZ0X2ljb24iLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsImdlb2Rlc2ljTGF5ZXIiLCJnZW9kZXNpYyIsInN0ZXBzIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImZpdEJvdW5kcyIsImdldEJvdW5kcyIsImUiLCJjb25zb2xlIiwibG9nIiwiZ2VvSlNPTiIsIm9uRWFjaEZlYXR1cmUiLCJzdHlsZSIsImZlYXR1cmVzIiwibGVuZ3RoIiwibGl2ZUZsaWdodCIsInVyaSIsInBpcmVwX3VyaSIsImxpdmVfcm91dGUiLCIkIiwiYWpheCIsImRhdGFUeXBlIiwiZXJyb3IiLCJ3aGVuIiwiZG9uZSIsInJvdXRlSnNvbiIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJoZWFkaW5nIiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3Mi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QVUsVUFBRUksSUFBRixDQUFPTCxVQUFQLEVBQW1CTSxJQUFuQixDQUF3QixVQUFDQyxTQUFELEVBQWU7QUFDbkM1Qiw4QkFBa0J0QyxRQUFRbUQsT0FBUixDQUFnQmUsU0FBaEIsRUFBMkI7QUFDekN6RCw4QkFBYyxzQkFBVU4sT0FBVixFQUFtQmdFLE1BQW5CLEVBQTJCO0FBQ3JDLDJCQUFPbkUsUUFBUW9FLE1BQVIsQ0FBZUQsTUFBZixFQUF1QjtBQUMxQm5DLDhCQUFNRCxZQURvQjtBQUUxQnNDLHVDQUFlbEUsUUFBUUcsVUFBUixDQUFtQmdFO0FBRlIscUJBQXZCLENBQVA7QUFJSDtBQU53QyxhQUEzQixDQUFsQjs7QUFTQWhDLDRCQUFnQk0sS0FBaEIsQ0FBc0JSLEdBQXRCO0FBQ0gsU0FYRDtBQVlILEtBcEJEOztBQXNCQW1DLGdCQUFZZixVQUFaLEVBQXdCLEtBQXhCO0FBQ0gsQ0EzSEQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5cclxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcclxuaW1wb3J0IHthZGRXTVNMYXllcn0gZnJvbSAnLi9oZWxwZXJzJztcclxuXHJcbmltcG9ydCB7QUNUVUFMX1JPVVRFX0NPTE9SLCBDSVJDTEVfQ09MT1IsIFBMQU5fUk9VVEVfQ09MT1J9IGZyb20gJy4vY29uZmlnJ1xyXG5cclxuLyoqXHJcbiAqIFNob3cgc29tZSBwb3B1cCB0ZXh0IHdoZW4gYSBmZWF0dXJlIGlzIGNsaWNrZWQgb25cclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxheWVyXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb25GZWF0dXJlUG9pbnRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xyXG4gICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcclxuICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XHJcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcclxuICAgIH1cclxuXHJcbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93IGVhY2ggcG9pbnQgYXMgYSBtYXJrZXJcclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxhdGxuZ1xyXG4gKiBAcmV0dXJucyB7Kn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb2ludFRvTGF5ZXIgPSAoZmVhdHVyZSwgbGF0bG5nKSA9PiB7XHJcbiAgICByZXR1cm4gbGVhZmxldC5jaXJjbGVNYXJrZXIobGF0bG5nLCB7XHJcbiAgICAgICAgcmFkaXVzOiA1LFxyXG4gICAgICAgIGZpbGxDb2xvcjogQ0lSQ0xFX0NPTE9SLFxyXG4gICAgICAgIGNvbG9yOiAnIzAwMCcsXHJcbiAgICAgICAgd2VpZ2h0OiAxLFxyXG4gICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgZmlsbE9wYWNpdHk6IDAuOFxyXG4gICAgfSlcclxufVxyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBvcHRzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAob3B0cykgPT4ge1xyXG5cclxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcclxuXHJcbiAgICAgICAgcm91dGVfcG9pbnRzOiBudWxsLFxyXG4gICAgICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcclxuICAgICAgICBhY3R1YWxfcm91dGVfcG9pbnRzOiBudWxsLFxyXG4gICAgICAgIGFjdHVhbF9yb3V0ZV9saW5lOiBudWxsLFxyXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcclxuICAgICAgICBsaXZlX21hcDogZmFsc2UsXHJcbiAgICAgICAgYWlyY3JhZnRfaWNvbjogJy9hc3NldHMvaW1nL2FjYXJzL2FpcmNyYWZ0LnBuZycsXHJcbiAgICAgICAgbWV0YXJfd21zOiB7XHJcbiAgICAgICAgICAgIHVybDogJycsXHJcbiAgICAgICAgICAgIHBhcmFtczoge31cclxuICAgICAgICB9LFxyXG4gICAgfSwgb3B0cyk7XHJcblxyXG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcclxuICAgICAgICBpY29uVXJsOiBvcHRzLmFpcmNyYWZ0X2ljb24sXHJcbiAgICAgICAgaWNvblNpemU6IFs0MiwgNDJdLFxyXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XHJcbiAgICBsZXQgbGF5ZXJMaXZlRmxpZ2h0O1xyXG5cclxuICAgIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XHJcbiAgICAgICAgYWRkV01TTGF5ZXIobWFwLCBvcHRzLm1ldGFyX3dtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGdlb2Rlc2ljTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XHJcbiAgICAgICAgd2VpZ2h0OiA0LFxyXG4gICAgICAgIG9wYWNpdHk6IDAuOSxcclxuICAgICAgICBjb2xvcjogUExBTl9ST1VURV9DT0xPUixcclxuICAgICAgICBzdGVwczogNTAsXHJcbiAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICB9KS5hZGRUbyhtYXApO1xyXG5cclxuICAgIGdlb2Rlc2ljTGF5ZXIuZ2VvSnNvbihvcHRzLnBsYW5uZWRfcm91dGVfbGluZSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZSlcclxuICAgIH1cclxuXHJcbiAgICAvLyBEcmF3IHRoZSByb3V0ZSBwb2ludHMgYWZ0ZXJcclxuICAgIGlmIChvcHRzLnJvdXRlX3BvaW50cyAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5yb3V0ZV9wb2ludHMsIHtcclxuICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogb25GZWF0dXJlUG9pbnRDbGljayxcclxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXHJcbiAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAnY29sb3InOiBQTEFOX1JPVVRFX0NPTE9SLFxyXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMsXHJcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6IDAuNjUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJvdXRlX3BvaW50cy5hZGRUbyhtYXApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZHJhdyB0aGUgYWN0dWFsIHJvdXRlXHJcbiAgICAgKi9cclxuXHJcbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfbGluZSAhPT0gbnVsbCAmJiBvcHRzLmFjdHVhbF9yb3V0ZV9saW5lLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgZ2VvZGVzaWNMYXllciA9IGxlYWZsZXQuZ2VvZGVzaWMoW10sIHtcclxuICAgICAgICAgICAgd2VpZ2h0OiAzLFxyXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjksXHJcbiAgICAgICAgICAgIGNvbG9yOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXHJcbiAgICAgICAgICAgIHN0ZXBzOiA1MCxcclxuICAgICAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICAgICAgfSkuYWRkVG8obWFwKTtcclxuXHJcbiAgICAgICAgZ2VvZGVzaWNMYXllci5nZW9Kc29uKG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX3BvaW50cy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHJvdXRlX3BvaW50cyA9IGxlYWZsZXQuZ2VvSlNPTihvcHRzLmFjdHVhbF9yb3V0ZV9wb2ludHMsIHtcclxuICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogb25GZWF0dXJlUG9pbnRDbGljayxcclxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXHJcbiAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAnY29sb3InOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXHJcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMyxcclxuICAgICAgICAgICAgICAgICdvcGFjaXR5JzogMC42NSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcm91dGVfcG9pbnRzLmFkZFRvKG1hcClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGxpdmVGbGlnaHQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXJpID0gb3B0cy5waXJlcF91cmk7XHJcbiAgICAgICAgY29uc3QgbGl2ZV9yb3V0ZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogdXJpLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5sb2dcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJC53aGVuKGxpdmVfcm91dGUpLmRvbmUoKHJvdXRlSnNvbikgPT4ge1xyXG4gICAgICAgICAgICBsYXllckxpdmVGbGlnaHQgPSBsZWFmbGV0Lmdlb0pTT04ocm91dGVKc29uLCB7XHJcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVhZmxldC5tYXJrZXIobGF0bG9uLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGFpcmNyYWZ0SWNvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyTGl2ZUZsaWdodC5hZGRUbyhtYXApXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHNldEludGVydmFsKGxpdmVGbGlnaHQsIDEwMDAwKTtcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvcm91dGVfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); +eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n\n\n/**\n * Show some popup text when a feature is clicked on\n * @param feature\n * @param layer\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\n * Show each point as a marker\n * @param feature\n * @param latlng\n * @returns {*}\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_2__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\n *\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var geodesicLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n geodesicLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\n * draw the actual route\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var _geodesicLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n _geodesicLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(_geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\n *\n */\n var liveFlight = function liveFlight() {\n var uri = opts.pirep_uri;\n var live_route = $.ajax({\n url: uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(live_route).done(function (routeJson) {\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicm91dGVfcG9pbnRzIiwicGxhbm5lZF9yb3V0ZV9saW5lIiwiYWN0dWFsX3JvdXRlX3BvaW50cyIsImFjdHVhbF9yb3V0ZV9saW5lIiwicmVuZGVyX2VsZW0iLCJsaXZlX21hcCIsImFpcmNyYWZ0X2ljb24iLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsImdlb2Rlc2ljTGF5ZXIiLCJnZW9kZXNpYyIsInN0ZXBzIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImZpdEJvdW5kcyIsImdldEJvdW5kcyIsImUiLCJjb25zb2xlIiwibG9nIiwiZ2VvSlNPTiIsIm9uRWFjaEZlYXR1cmUiLCJzdHlsZSIsImZlYXR1cmVzIiwibGVuZ3RoIiwibGl2ZUZsaWdodCIsInVyaSIsInBpcmVwX3VyaSIsImxpdmVfcm91dGUiLCIkIiwiYWpheCIsImRhdGFUeXBlIiwiZXJyb3IiLCJ3aGVuIiwiZG9uZSIsInJvdXRlSnNvbiIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJoZWFkaW5nIiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3Mi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QVUsVUFBRUksSUFBRixDQUFPTCxVQUFQLEVBQW1CTSxJQUFuQixDQUF3QixVQUFDQyxTQUFELEVBQWU7QUFDbkM1Qiw4QkFBa0J0QyxRQUFRbUQsT0FBUixDQUFnQmUsU0FBaEIsRUFBMkI7QUFDekN6RCw4QkFBYyxzQkFBVU4sT0FBVixFQUFtQmdFLE1BQW5CLEVBQTJCO0FBQ3JDLDJCQUFPbkUsUUFBUW9FLE1BQVIsQ0FBZUQsTUFBZixFQUF1QjtBQUMxQm5DLDhCQUFNRCxZQURvQjtBQUUxQnNDLHVDQUFlbEUsUUFBUUcsVUFBUixDQUFtQmdFO0FBRlIscUJBQXZCLENBQVA7QUFJSDtBQU53QyxhQUEzQixDQUFsQjs7QUFTQWhDLDRCQUFnQk0sS0FBaEIsQ0FBc0JSLEdBQXRCO0FBQ0gsU0FYRDtBQVlILEtBcEJEOztBQXNCQW1DLGdCQUFZZixVQUFaLEVBQXdCLEtBQXhCO0FBQ0gsQ0EzSEQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuXG5pbXBvcnQgZHJhd19iYXNlX21hcCBmcm9tICcuL2Jhc2VfbWFwJ1xuaW1wb3J0IHthZGRXTVNMYXllcn0gZnJvbSAnLi9oZWxwZXJzJztcblxuaW1wb3J0IHtBQ1RVQUxfUk9VVEVfQ09MT1IsIENJUkNMRV9DT0xPUiwgUExBTl9ST1VURV9DT0xPUn0gZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogU2hvdyBzb21lIHBvcHVwIHRleHQgd2hlbiBhIGZlYXR1cmUgaXMgY2xpY2tlZCBvblxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXllclxuICovXG5leHBvcnQgY29uc3Qgb25GZWF0dXJlUG9pbnRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xuICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcbiAgICB9XG5cbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcbn07XG5cbi8qKlxuICogU2hvdyBlYWNoIHBvaW50IGFzIGEgbWFya2VyXG4gKiBAcGFyYW0gZmVhdHVyZVxuICogQHBhcmFtIGxhdGxuZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBjb25zdCBwb2ludFRvTGF5ZXIgPSAoZmVhdHVyZSwgbGF0bG5nKSA9PiB7XG4gICAgcmV0dXJuIGxlYWZsZXQuY2lyY2xlTWFya2VyKGxhdGxuZywge1xuICAgICAgICByYWRpdXM6IDUsXG4gICAgICAgIGZpbGxDb2xvcjogQ0lSQ0xFX0NPTE9SLFxuICAgICAgICBjb2xvcjogJyMwMDAnLFxuICAgICAgICB3ZWlnaHQ6IDEsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGZpbGxPcGFjaXR5OiAwLjhcbiAgICB9KVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gb3B0c1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcblxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcblxuICAgICAgICByb3V0ZV9wb2ludHM6IG51bGwsXG4gICAgICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX3BvaW50czogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX2xpbmU6IG51bGwsXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICAgICAgbGl2ZV9tYXA6IGZhbHNlLFxuICAgICAgICBhaXJjcmFmdF9pY29uOiAnL2Fzc2V0cy9pbWcvYWNhcnMvYWlyY3JhZnQucG5nJyxcbiAgICAgICAgbWV0YXJfd21zOiB7XG4gICAgICAgICAgICB1cmw6ICcnLFxuICAgICAgICAgICAgcGFyYW1zOiB7fVxuICAgICAgICB9LFxuICAgIH0sIG9wdHMpO1xuXG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcbiAgICAgICAgaWNvblVybDogb3B0cy5haXJjcmFmdF9pY29uLFxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxuICAgIH0pO1xuXG4gICAgbGV0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XG4gICAgbGV0IGxheWVyTGl2ZUZsaWdodDtcblxuICAgIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgICAgIGFkZFdNU0xheWVyKG1hcCwgb3B0cy5tZXRhcl93bXMpO1xuICAgIH1cblxuICAgIGxldCBnZW9kZXNpY0xheWVyID0gbGVhZmxldC5nZW9kZXNpYyhbXSwge1xuICAgICAgICB3ZWlnaHQ6IDQsXG4gICAgICAgIG9wYWNpdHk6IDAuOSxcbiAgICAgICAgY29sb3I6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgIHN0ZXBzOiA1MCxcbiAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgfSkuYWRkVG8obWFwKTtcblxuICAgIGdlb2Rlc2ljTGF5ZXIuZ2VvSnNvbihvcHRzLnBsYW5uZWRfcm91dGVfbGluZSk7XG5cbiAgICB0cnkge1xuICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKVxuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIHJvdXRlIHBvaW50cyBhZnRlclxuICAgIGlmIChvcHRzLnJvdXRlX3BvaW50cyAhPT0gbnVsbCkge1xuICAgICAgICBsZXQgcm91dGVfcG9pbnRzID0gbGVhZmxldC5nZW9KU09OKG9wdHMucm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMsXG4gICAgICAgICAgICAgICAgJ29wYWNpdHknOiAwLjY1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcm91dGVfcG9pbnRzLmFkZFRvKG1hcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZHJhdyB0aGUgYWN0dWFsIHJvdXRlXG4gICAgICovXG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfbGluZSAhPT0gbnVsbCAmJiBvcHRzLmFjdHVhbF9yb3V0ZV9saW5lLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGdlb2Rlc2ljTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XG4gICAgICAgICAgICB3ZWlnaHQ6IDMsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjksXG4gICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxuICAgICAgICAgICAgc3RlcHM6IDUwLFxuICAgICAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgICAgIH0pLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgZ2VvZGVzaWNMYXllci5nZW9Kc29uKG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX3BvaW50cy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IEFDVFVBTF9ST1VURV9DT0xPUixcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMyxcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6IDAuNjUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICByb3V0ZV9wb2ludHMuYWRkVG8obWFwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgY29uc3QgbGl2ZUZsaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdXJpID0gb3B0cy5waXJlcF91cmk7XG4gICAgICAgIGNvbnN0IGxpdmVfcm91dGUgPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB1cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQud2hlbihsaXZlX3JvdXRlKS5kb25lKChyb3V0ZUpzb24pID0+IHtcbiAgICAgICAgICAgIGxheWVyTGl2ZUZsaWdodCA9IGxlYWZsZXQuZ2VvSlNPTihyb3V0ZUpzb24sIHtcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGF5ZXJMaXZlRmxpZ2h0LmFkZFRvKG1hcClcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldEludGVydmFsKGxpdmVGbGlnaHQsIDEwMDAwKTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); /***/ }), diff --git a/public/assets/frontend/css/now-ui-kit.css b/public/assets/frontend/css/now-ui-kit.css index b8e20a7c..a253d6c9 100644 --- a/public/assets/frontend/css/now-ui-kit.css +++ b/public/assets/frontend/css/now-ui-kit.css @@ -1,28 +1,28 @@ -/*! - - ========================================================= - * Now-ui-kit - v1.0.0 - ========================================================= - - * Product Page: http://www.creative-tim.com/product/now-ui-kit - * Copyright 2017 Creative Tim (http://www.creative-tim.com) - * Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md) - - * Designed by www.invisionapp.com Coded by www.creative-tim.com - - ========================================================= - - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - +/*! + + ========================================================= + * Now-ui-kit - v1.0.0 + ========================================================= + + * Product Page: http://www.creative-tim.com/product/now-ui-kit + * Copyright 2017 Creative Tim (http://www.creative-tim.com) + * Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md) + + * Designed by www.invisionapp.com Coded by www.creative-tim.com + + ========================================================= + + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + */ /* brand Colors */ /* light colors */ -/* ======================================================================== - * bootstrap-switch - v3.3.2 - * http://www.bootstrap-switch.org - * ======================================================================== - * Copyright 2012-2013 Mattia Larentis - * http://www.apache.org/licenses/LICENSE-2.0 +/* ======================================================================== + * bootstrap-switch - v3.3.2 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * http://www.apache.org/licenses/LICENSE-2.0 */ .bootstrap-switch { display: inline-block; @@ -293,9 +293,9 @@ } /*! nouislider - 9.1.0 - 2016-12-10 16:00:32 */ -/* Functional styling; - * These styles are required for noUiSlider to function. - * You don't need to change these rules to apply your design. +/* Functional styling; + * These styles are required for noUiSlider to function. + * You don't need to change these rules to apply your design. */ .noUi-target, .noUi-target * { @@ -353,8 +353,8 @@ cursor: inherit !important; } -/* Painting and performance; - * Browsers can paint handles in their own layer. +/* Painting and performance; + * Browsers can paint handles in their own layer. */ .noUi-base, .noUi-handle { @@ -362,7 +362,7 @@ transform: translate3d(0, 0, 0); } -/* Slider size and handle placement; +/* Slider size and handle placement; */ .noUi-horizontal { height: 1px; @@ -391,7 +391,7 @@ top: -17px; } -/* Styling; +/* Styling; */ .noUi-target { background-color: rgba(182, 182, 182, 0.3); @@ -405,7 +405,7 @@ transition: background 450ms; } -/* Handles and cursors; +/* Handles and cursors; */ .noUi-draggable { cursor: ew-resize; @@ -419,8 +419,8 @@ border-radius: 3px; background: #FFF; cursor: default; - -webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; - box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; + -webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; + box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; -webkit-transition: 300ms ease 0s; -moz-transition: 300ms ease 0s; -ms-transition: 300ms ease 0s; @@ -433,7 +433,7 @@ transform: scale3d(1.5, 1.5, 1); } -/* Disabled state; +/* Disabled state; */ [disabled] .noUi-connect { background: #B8B8B8; @@ -445,8 +445,8 @@ cursor: not-allowed; } -/* Base; - * +/* Base; + * */ .noUi-pips, .noUi-pips * { @@ -459,8 +459,8 @@ color: #999; } -/* Values; - * +/* Values; + * */ .noUi-value { position: absolute; @@ -472,8 +472,8 @@ font-size: 10px; } -/* Markings; - * +/* Markings; + * */ .noUi-marker { position: absolute; @@ -488,8 +488,8 @@ background: #AAA; } -/* Horizontal layout; - * +/* Horizontal layout; + * */ .noUi-pips-horizontal { padding: 10px 0; @@ -518,8 +518,8 @@ height: 15px; } -/* Vertical layout; - * +/* Vertical layout; + * */ .noUi-pips-vertical { padding: 0 10px; @@ -645,10 +645,10 @@ background-color: #FF3636; } -/*! - * Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker) - * - * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) +/*! + * Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) */ .datepicker { padding: 8px 6px; @@ -2198,17 +2198,17 @@ fieldset[disabled] background-color: #E3E3E3; } -/*.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { - border-right: 0 none; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child) { - border-left: 0 none; +/*.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-right: 0 none; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-left: 0 none; }*/ .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #E3E3E3; @@ -3755,12 +3755,12 @@ img { box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); } -/* -------------------------------- - -Nucleo Outline Web Font - nucleoapp.com/ -License - nucleoapp.com/license/ -Created using IcoMoon - icomoon.io - +/* -------------------------------- + +Nucleo Outline Web Font - nucleoapp.com/ +License - nucleoapp.com/license/ +Created using IcoMoon - icomoon.io + -------------------------------- */ @font-face { font-family: 'Nucleo Outline'; @@ -3770,8 +3770,8 @@ Created using IcoMoon - icomoon.io font-style: normal; } -/*------------------------ - base class definition +/*------------------------ + base class definition -------------------------*/ .now-ui-icons { display: inline-block; @@ -3784,11 +3784,11 @@ Created using IcoMoon - icomoon.io -moz-osx-font-smoothing: grayscale; } -/*------------------------ - change icon size +/*------------------------ + change icon size -------------------------*/ -/*---------------------------------- - add a square/circle background +/*---------------------------------- + add a square/circle background -----------------------------------*/ .now-ui-icons.circle { padding: 0.33333333em; @@ -3800,8 +3800,8 @@ Created using IcoMoon - icomoon.io border-radius: 50%; } -/*------------------------ - list icons +/*------------------------ + list icons -------------------------*/ .nc-icon-ul { padding-left: 0; @@ -3825,8 +3825,8 @@ Created using IcoMoon - icomoon.io left: -1.9047619em; } -/*------------------------ - spinning icons +/*------------------------ + spinning icons -------------------------*/ .now-ui-icons.spin { -webkit-animation: nc-icon-spin 2s infinite linear; @@ -3853,11 +3853,11 @@ Created using IcoMoon - icomoon.io } } -/*------------------------ - rotated/flipped icons +/*------------------------ + rotated/flipped icons -------------------------*/ -/*------------------------ - font icons +/*------------------------ + font icons -------------------------*/ .now-ui-icons.ui-1_check:before { content: "\EA22"; @@ -5668,21 +5668,21 @@ Created using IcoMoon - icomoon.io } } -/*.separator{ - content: "Separator"; - color: #FFFFFF; - display: block; - width: 100%; - padding: 20px; -} -.separator-line{ - background-color: #EEE; - height: 1px; - width: 100%; - display: block; -} -.separator.separator-gray{ - background-color: #EEEEEE; +/*.separator{ + content: "Separator"; + color: #FFFFFF; + display: block; + width: 100%; + padding: 20px; +} +.separator-line{ + background-color: #EEE; + height: 1px; + width: 100%; + display: block; +} +.separator.separator-gray{ + background-color: #EEEEEE; }*/ .social-buttons-demo .btn { margin-right: 5px; diff --git a/public/assets/frontend/css/styles.css b/public/assets/frontend/css/styles.css index 6b1a52a9..dacd2b7d 100644 --- a/public/assets/frontend/css/styles.css +++ b/public/assets/frontend/css/styles.css @@ -5,6 +5,16 @@ margin-top: 2px; } +.map-info-box { + display: none; + position: absolute; + bottom: 0; + padding: 20px; + height: 100px; + z-index: 9999; + background-color: rgba(232, 232, 232, 0.9); +} + .dashboard-box { background: #067ec1; color: #FFF; diff --git a/public/assets/frontend/js/app.js b/public/assets/frontend/js/app.js index e9754659..ffb5e550 100644 --- a/public/assets/frontend/js/app.js +++ b/public/assets/frontend/js/app.js @@ -300,17 +300,45 @@ eval("// shim for using process in browser\nvar process = module.exports = {};\n /***/ }), +/***/ "./node_modules/rivets/dist/rivets.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Rivets.js\n// version: 0.9.6\n// author: Michael Richards\n// license: MIT\n(function() {\n var Rivets, bindMethod, jQuery, unbindMethod, _ref,\n __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n __slice = [].slice,\n __hasProp = {}.hasOwnProperty,\n __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n Rivets = {\n options: ['prefix', 'templateDelimiters', 'rootInterface', 'preloadData', 'handler', 'executeFunctions'],\n extensions: ['binders', 'formatters', 'components', 'adapters'],\n \"public\": {\n binders: {},\n components: {},\n formatters: {},\n adapters: {},\n prefix: 'rv',\n templateDelimiters: ['{', '}'],\n rootInterface: '.',\n preloadData: true,\n executeFunctions: false,\n iterationAlias: function(modelName) {\n return '%' + modelName + '%';\n },\n handler: function(context, ev, binding) {\n return this.call(context, ev, binding.view.models);\n },\n configure: function(options) {\n var descriptor, key, option, value;\n if (options == null) {\n options = {};\n }\n for (option in options) {\n value = options[option];\n if (option === 'binders' || option === 'components' || option === 'formatters' || option === 'adapters') {\n for (key in value) {\n descriptor = value[key];\n Rivets[option][key] = descriptor;\n }\n } else {\n Rivets[\"public\"][option] = value;\n }\n }\n },\n bind: function(el, models, options) {\n var view;\n if (models == null) {\n models = {};\n }\n if (options == null) {\n options = {};\n }\n view = new Rivets.View(el, models, options);\n view.bind();\n return view;\n },\n init: function(component, el, data) {\n var scope, template, view;\n if (data == null) {\n data = {};\n }\n if (el == null) {\n el = document.createElement('div');\n }\n component = Rivets[\"public\"].components[component];\n template = component.template.call(this, el);\n if (template instanceof HTMLElement) {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n el.appendChild(template);\n } else {\n el.innerHTML = template;\n }\n scope = component.initialize.call(this, el, data);\n view = new Rivets.View(el, scope);\n view.bind();\n return view;\n }\n }\n };\n\n if (window['jQuery'] || window['$']) {\n jQuery = window['jQuery'] || window['$'];\n _ref = 'on' in jQuery.prototype ? ['on', 'off'] : ['bind', 'unbind'], bindMethod = _ref[0], unbindMethod = _ref[1];\n Rivets.Util = {\n bindEvent: function(el, event, handler) {\n return jQuery(el)[bindMethod](event, handler);\n },\n unbindEvent: function(el, event, handler) {\n return jQuery(el)[unbindMethod](event, handler);\n },\n getInputValue: function(el) {\n var $el;\n $el = jQuery(el);\n if ($el.attr('type') === 'checkbox') {\n return $el.is(':checked');\n } else {\n return $el.val();\n }\n }\n };\n } else {\n Rivets.Util = {\n bindEvent: (function() {\n if ('addEventListener' in window) {\n return function(el, event, handler) {\n return el.addEventListener(event, handler, false);\n };\n }\n return function(el, event, handler) {\n return el.attachEvent('on' + event, handler);\n };\n })(),\n unbindEvent: (function() {\n if ('removeEventListener' in window) {\n return function(el, event, handler) {\n return el.removeEventListener(event, handler, false);\n };\n }\n return function(el, event, handler) {\n return el.detachEvent('on' + event, handler);\n };\n })(),\n getInputValue: function(el) {\n var o, _i, _len, _results;\n if (el.type === 'checkbox') {\n return el.checked;\n } else if (el.type === 'select-multiple') {\n _results = [];\n for (_i = 0, _len = el.length; _i < _len; _i++) {\n o = el[_i];\n if (o.selected) {\n _results.push(o.value);\n }\n }\n return _results;\n } else {\n return el.value;\n }\n }\n };\n }\n\n Rivets.TypeParser = (function() {\n function TypeParser() {}\n\n TypeParser.types = {\n primitive: 0,\n keypath: 1\n };\n\n TypeParser.parse = function(string) {\n if (/^'.*'$|^\".*\"$/.test(string)) {\n return {\n type: this.types.primitive,\n value: string.slice(1, -1)\n };\n } else if (string === 'true') {\n return {\n type: this.types.primitive,\n value: true\n };\n } else if (string === 'false') {\n return {\n type: this.types.primitive,\n value: false\n };\n } else if (string === 'null') {\n return {\n type: this.types.primitive,\n value: null\n };\n } else if (string === 'undefined') {\n return {\n type: this.types.primitive,\n value: void 0\n };\n } else if (string === '') {\n return {\n type: this.types.primitive,\n value: void 0\n };\n } else if (isNaN(Number(string)) === false) {\n return {\n type: this.types.primitive,\n value: Number(string)\n };\n } else {\n return {\n type: this.types.keypath,\n value: string\n };\n }\n };\n\n return TypeParser;\n\n })();\n\n Rivets.TextTemplateParser = (function() {\n function TextTemplateParser() {}\n\n TextTemplateParser.types = {\n text: 0,\n binding: 1\n };\n\n TextTemplateParser.parse = function(template, delimiters) {\n var index, lastIndex, lastToken, length, substring, tokens, value;\n tokens = [];\n length = template.length;\n index = 0;\n lastIndex = 0;\n while (lastIndex < length) {\n index = template.indexOf(delimiters[0], lastIndex);\n if (index < 0) {\n tokens.push({\n type: this.types.text,\n value: template.slice(lastIndex)\n });\n break;\n } else {\n if (index > 0 && lastIndex < index) {\n tokens.push({\n type: this.types.text,\n value: template.slice(lastIndex, index)\n });\n }\n lastIndex = index + delimiters[0].length;\n index = template.indexOf(delimiters[1], lastIndex);\n if (index < 0) {\n substring = template.slice(lastIndex - delimiters[1].length);\n lastToken = tokens[tokens.length - 1];\n if ((lastToken != null ? lastToken.type : void 0) === this.types.text) {\n lastToken.value += substring;\n } else {\n tokens.push({\n type: this.types.text,\n value: substring\n });\n }\n break;\n }\n value = template.slice(lastIndex, index).trim();\n tokens.push({\n type: this.types.binding,\n value: value\n });\n lastIndex = index + delimiters[1].length;\n }\n }\n return tokens;\n };\n\n return TextTemplateParser;\n\n })();\n\n Rivets.View = (function() {\n function View(els, models, options) {\n var k, option, v, _base, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5;\n this.els = els;\n this.models = models;\n if (options == null) {\n options = {};\n }\n this.update = __bind(this.update, this);\n this.publish = __bind(this.publish, this);\n this.sync = __bind(this.sync, this);\n this.unbind = __bind(this.unbind, this);\n this.bind = __bind(this.bind, this);\n this.select = __bind(this.select, this);\n this.traverse = __bind(this.traverse, this);\n this.build = __bind(this.build, this);\n this.buildBinding = __bind(this.buildBinding, this);\n this.bindingRegExp = __bind(this.bindingRegExp, this);\n this.options = __bind(this.options, this);\n if (!(this.els.jquery || this.els instanceof Array)) {\n this.els = [this.els];\n }\n _ref1 = Rivets.extensions;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n option = _ref1[_i];\n this[option] = {};\n if (options[option]) {\n _ref2 = options[option];\n for (k in _ref2) {\n v = _ref2[k];\n this[option][k] = v;\n }\n }\n _ref3 = Rivets[\"public\"][option];\n for (k in _ref3) {\n v = _ref3[k];\n if ((_base = this[option])[k] == null) {\n _base[k] = v;\n }\n }\n }\n _ref4 = Rivets.options;\n for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) {\n option = _ref4[_j];\n this[option] = (_ref5 = options[option]) != null ? _ref5 : Rivets[\"public\"][option];\n }\n this.build();\n }\n\n View.prototype.options = function() {\n var option, options, _i, _len, _ref1;\n options = {};\n _ref1 = Rivets.extensions.concat(Rivets.options);\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n option = _ref1[_i];\n options[option] = this[option];\n }\n return options;\n };\n\n View.prototype.bindingRegExp = function() {\n return new RegExp(\"^\" + this.prefix + \"-\");\n };\n\n View.prototype.buildBinding = function(binding, node, type, declaration) {\n var context, ctx, dependencies, keypath, options, pipe, pipes;\n options = {};\n pipes = (function() {\n var _i, _len, _ref1, _results;\n _ref1 = declaration.match(/((?:'[^']*')*(?:(?:[^\\|']*(?:'[^']*')+[^\\|']*)+|[^\\|]+))|^$/g);\n _results = [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n pipe = _ref1[_i];\n _results.push(pipe.trim());\n }\n return _results;\n })();\n context = (function() {\n var _i, _len, _ref1, _results;\n _ref1 = pipes.shift().split('<');\n _results = [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n ctx = _ref1[_i];\n _results.push(ctx.trim());\n }\n return _results;\n })();\n keypath = context.shift();\n options.formatters = pipes;\n if (dependencies = context.shift()) {\n options.dependencies = dependencies.split(/\\s+/);\n }\n return this.bindings.push(new Rivets[binding](this, node, type, keypath, options));\n };\n\n View.prototype.build = function() {\n var el, parse, _i, _len, _ref1;\n this.bindings = [];\n parse = (function(_this) {\n return function(node) {\n var block, childNode, delimiters, n, parser, text, token, tokens, _i, _j, _len, _len1, _ref1;\n if (node.nodeType === 3) {\n parser = Rivets.TextTemplateParser;\n if (delimiters = _this.templateDelimiters) {\n if ((tokens = parser.parse(node.data, delimiters)).length) {\n if (!(tokens.length === 1 && tokens[0].type === parser.types.text)) {\n for (_i = 0, _len = tokens.length; _i < _len; _i++) {\n token = tokens[_i];\n text = document.createTextNode(token.value);\n node.parentNode.insertBefore(text, node);\n if (token.type === 1) {\n _this.buildBinding('TextBinding', text, null, token.value);\n }\n }\n node.parentNode.removeChild(node);\n }\n }\n }\n } else if (node.nodeType === 1) {\n block = _this.traverse(node);\n }\n if (!block) {\n _ref1 = (function() {\n var _k, _len1, _ref1, _results;\n _ref1 = node.childNodes;\n _results = [];\n for (_k = 0, _len1 = _ref1.length; _k < _len1; _k++) {\n n = _ref1[_k];\n _results.push(n);\n }\n return _results;\n })();\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n childNode = _ref1[_j];\n parse(childNode);\n }\n }\n };\n })(this);\n _ref1 = this.els;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n el = _ref1[_i];\n parse(el);\n }\n this.bindings.sort(function(a, b) {\n var _ref2, _ref3;\n return (((_ref2 = b.binder) != null ? _ref2.priority : void 0) || 0) - (((_ref3 = a.binder) != null ? _ref3.priority : void 0) || 0);\n });\n };\n\n View.prototype.traverse = function(node) {\n var attribute, attributes, binder, bindingRegExp, block, identifier, regexp, type, value, _i, _j, _len, _len1, _ref1, _ref2, _ref3;\n bindingRegExp = this.bindingRegExp();\n block = node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE';\n _ref1 = node.attributes;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n attribute = _ref1[_i];\n if (bindingRegExp.test(attribute.name)) {\n type = attribute.name.replace(bindingRegExp, '');\n if (!(binder = this.binders[type])) {\n _ref2 = this.binders;\n for (identifier in _ref2) {\n value = _ref2[identifier];\n if (identifier !== '*' && identifier.indexOf('*') !== -1) {\n regexp = new RegExp(\"^\" + (identifier.replace(/\\*/g, '.+')) + \"$\");\n if (regexp.test(type)) {\n binder = value;\n }\n }\n }\n }\n binder || (binder = this.binders['*']);\n if (binder.block) {\n block = true;\n attributes = [attribute];\n }\n }\n }\n _ref3 = attributes || node.attributes;\n for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {\n attribute = _ref3[_j];\n if (bindingRegExp.test(attribute.name)) {\n type = attribute.name.replace(bindingRegExp, '');\n this.buildBinding('Binding', node, type, attribute.value);\n }\n }\n if (!block) {\n type = node.nodeName.toLowerCase();\n if (this.components[type] && !node._bound) {\n this.bindings.push(new Rivets.ComponentBinding(this, node, type));\n block = true;\n }\n }\n return block;\n };\n\n View.prototype.select = function(fn) {\n var binding, _i, _len, _ref1, _results;\n _ref1 = this.bindings;\n _results = [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n if (fn(binding)) {\n _results.push(binding);\n }\n }\n return _results;\n };\n\n View.prototype.bind = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n binding.bind();\n }\n };\n\n View.prototype.unbind = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n binding.unbind();\n }\n };\n\n View.prototype.sync = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n if (typeof binding.sync === \"function\") {\n binding.sync();\n }\n }\n };\n\n View.prototype.publish = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.select(function(b) {\n var _ref1;\n return (_ref1 = b.binder) != null ? _ref1.publishes : void 0;\n });\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n binding.publish();\n }\n };\n\n View.prototype.update = function(models) {\n var binding, key, model, _i, _len, _ref1;\n if (models == null) {\n models = {};\n }\n for (key in models) {\n model = models[key];\n this.models[key] = model;\n }\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n if (typeof binding.update === \"function\") {\n binding.update(models);\n }\n }\n };\n\n return View;\n\n })();\n\n Rivets.Binding = (function() {\n function Binding(view, el, type, keypath, options) {\n this.view = view;\n this.el = el;\n this.type = type;\n this.keypath = keypath;\n this.options = options != null ? options : {};\n this.getValue = __bind(this.getValue, this);\n this.update = __bind(this.update, this);\n this.unbind = __bind(this.unbind, this);\n this.bind = __bind(this.bind, this);\n this.publish = __bind(this.publish, this);\n this.sync = __bind(this.sync, this);\n this.set = __bind(this.set, this);\n this.eventHandler = __bind(this.eventHandler, this);\n this.formattedValue = __bind(this.formattedValue, this);\n this.parseFormatterArguments = __bind(this.parseFormatterArguments, this);\n this.parseTarget = __bind(this.parseTarget, this);\n this.observe = __bind(this.observe, this);\n this.setBinder = __bind(this.setBinder, this);\n this.formatters = this.options.formatters || [];\n this.dependencies = [];\n this.formatterObservers = {};\n this.model = void 0;\n this.setBinder();\n }\n\n Binding.prototype.setBinder = function() {\n var identifier, regexp, value, _ref1;\n if (!(this.binder = this.view.binders[this.type])) {\n _ref1 = this.view.binders;\n for (identifier in _ref1) {\n value = _ref1[identifier];\n if (identifier !== '*' && identifier.indexOf('*') !== -1) {\n regexp = new RegExp(\"^\" + (identifier.replace(/\\*/g, '.+')) + \"$\");\n if (regexp.test(this.type)) {\n this.binder = value;\n this.args = new RegExp(\"^\" + (identifier.replace(/\\*/g, '(.+)')) + \"$\").exec(this.type);\n this.args.shift();\n }\n }\n }\n }\n this.binder || (this.binder = this.view.binders['*']);\n if (this.binder instanceof Function) {\n return this.binder = {\n routine: this.binder\n };\n }\n };\n\n Binding.prototype.observe = function(obj, keypath, callback) {\n return Rivets.sightglass(obj, keypath, callback, {\n root: this.view.rootInterface,\n adapters: this.view.adapters\n });\n };\n\n Binding.prototype.parseTarget = function() {\n var token;\n token = Rivets.TypeParser.parse(this.keypath);\n if (token.type === Rivets.TypeParser.types.primitive) {\n return this.value = token.value;\n } else {\n this.observer = this.observe(this.view.models, this.keypath, this.sync);\n return this.model = this.observer.target;\n }\n };\n\n Binding.prototype.parseFormatterArguments = function(args, formatterIndex) {\n var ai, arg, observer, processedArgs, _base, _i, _len;\n args = (function() {\n var _i, _len, _results;\n _results = [];\n for (_i = 0, _len = args.length; _i < _len; _i++) {\n arg = args[_i];\n _results.push(Rivets.TypeParser.parse(arg));\n }\n return _results;\n })();\n processedArgs = [];\n for (ai = _i = 0, _len = args.length; _i < _len; ai = ++_i) {\n arg = args[ai];\n processedArgs.push(arg.type === Rivets.TypeParser.types.primitive ? arg.value : ((_base = this.formatterObservers)[formatterIndex] || (_base[formatterIndex] = {}), !(observer = this.formatterObservers[formatterIndex][ai]) ? (observer = this.observe(this.view.models, arg.value, this.sync), this.formatterObservers[formatterIndex][ai] = observer) : void 0, observer.value()));\n }\n return processedArgs;\n };\n\n Binding.prototype.formattedValue = function(value) {\n var args, fi, formatter, id, processedArgs, _i, _len, _ref1, _ref2;\n _ref1 = this.formatters;\n for (fi = _i = 0, _len = _ref1.length; _i < _len; fi = ++_i) {\n formatter = _ref1[fi];\n args = formatter.match(/[^\\s']+|'([^']|'[^\\s])*'|\"([^\"]|\"[^\\s])*\"/g);\n id = args.shift();\n formatter = this.view.formatters[id];\n processedArgs = this.parseFormatterArguments(args, fi);\n if ((formatter != null ? formatter.read : void 0) instanceof Function) {\n value = (_ref2 = formatter.read).call.apply(_ref2, [this.model, value].concat(__slice.call(processedArgs)));\n } else if (formatter instanceof Function) {\n value = formatter.call.apply(formatter, [this.model, value].concat(__slice.call(processedArgs)));\n }\n }\n return value;\n };\n\n Binding.prototype.eventHandler = function(fn) {\n var binding, handler;\n handler = (binding = this).view.handler;\n return function(ev) {\n return handler.call(fn, this, ev, binding);\n };\n };\n\n Binding.prototype.set = function(value) {\n var _ref1;\n value = value instanceof Function && !this.binder[\"function\"] && Rivets[\"public\"].executeFunctions ? this.formattedValue(value.call(this.model)) : this.formattedValue(value);\n return (_ref1 = this.binder.routine) != null ? _ref1.call(this, this.el, value) : void 0;\n };\n\n Binding.prototype.sync = function() {\n var dependency, observer;\n return this.set((function() {\n var _i, _j, _len, _len1, _ref1, _ref2, _ref3;\n if (this.observer) {\n if (this.model !== this.observer.target) {\n _ref1 = this.dependencies;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n observer = _ref1[_i];\n observer.unobserve();\n }\n this.dependencies = [];\n if (((this.model = this.observer.target) != null) && ((_ref2 = this.options.dependencies) != null ? _ref2.length : void 0)) {\n _ref3 = this.options.dependencies;\n for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {\n dependency = _ref3[_j];\n observer = this.observe(this.model, dependency, this.sync);\n this.dependencies.push(observer);\n }\n }\n }\n return this.observer.value();\n } else {\n return this.value;\n }\n }).call(this));\n };\n\n Binding.prototype.publish = function() {\n var args, fi, fiReversed, formatter, id, lastformatterIndex, processedArgs, value, _i, _len, _ref1, _ref2, _ref3;\n if (this.observer) {\n value = this.getValue(this.el);\n lastformatterIndex = this.formatters.length - 1;\n _ref1 = this.formatters.slice(0).reverse();\n for (fiReversed = _i = 0, _len = _ref1.length; _i < _len; fiReversed = ++_i) {\n formatter = _ref1[fiReversed];\n fi = lastformatterIndex - fiReversed;\n args = formatter.split(/\\s+/);\n id = args.shift();\n processedArgs = this.parseFormatterArguments(args, fi);\n if ((_ref2 = this.view.formatters[id]) != null ? _ref2.publish : void 0) {\n value = (_ref3 = this.view.formatters[id]).publish.apply(_ref3, [value].concat(__slice.call(processedArgs)));\n }\n }\n return this.observer.setValue(value);\n }\n };\n\n Binding.prototype.bind = function() {\n var dependency, observer, _i, _len, _ref1, _ref2, _ref3;\n this.parseTarget();\n if ((_ref1 = this.binder.bind) != null) {\n _ref1.call(this, this.el);\n }\n if ((this.model != null) && ((_ref2 = this.options.dependencies) != null ? _ref2.length : void 0)) {\n _ref3 = this.options.dependencies;\n for (_i = 0, _len = _ref3.length; _i < _len; _i++) {\n dependency = _ref3[_i];\n observer = this.observe(this.model, dependency, this.sync);\n this.dependencies.push(observer);\n }\n }\n if (this.view.preloadData) {\n return this.sync();\n }\n };\n\n Binding.prototype.unbind = function() {\n var ai, args, fi, observer, _i, _len, _ref1, _ref2, _ref3, _ref4;\n if ((_ref1 = this.binder.unbind) != null) {\n _ref1.call(this, this.el);\n }\n if ((_ref2 = this.observer) != null) {\n _ref2.unobserve();\n }\n _ref3 = this.dependencies;\n for (_i = 0, _len = _ref3.length; _i < _len; _i++) {\n observer = _ref3[_i];\n observer.unobserve();\n }\n this.dependencies = [];\n _ref4 = this.formatterObservers;\n for (fi in _ref4) {\n args = _ref4[fi];\n for (ai in args) {\n observer = args[ai];\n observer.unobserve();\n }\n }\n return this.formatterObservers = {};\n };\n\n Binding.prototype.update = function(models) {\n var _ref1, _ref2;\n if (models == null) {\n models = {};\n }\n this.model = (_ref1 = this.observer) != null ? _ref1.target : void 0;\n return (_ref2 = this.binder.update) != null ? _ref2.call(this, models) : void 0;\n };\n\n Binding.prototype.getValue = function(el) {\n if (this.binder && (this.binder.getValue != null)) {\n return this.binder.getValue.call(this, el);\n } else {\n return Rivets.Util.getInputValue(el);\n }\n };\n\n return Binding;\n\n })();\n\n Rivets.ComponentBinding = (function(_super) {\n __extends(ComponentBinding, _super);\n\n function ComponentBinding(view, el, type) {\n var attribute, bindingRegExp, propertyName, token, _i, _len, _ref1, _ref2;\n this.view = view;\n this.el = el;\n this.type = type;\n this.unbind = __bind(this.unbind, this);\n this.bind = __bind(this.bind, this);\n this.locals = __bind(this.locals, this);\n this.component = this.view.components[this.type];\n this[\"static\"] = {};\n this.observers = {};\n this.upstreamObservers = {};\n bindingRegExp = view.bindingRegExp();\n _ref1 = this.el.attributes || [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n attribute = _ref1[_i];\n if (!bindingRegExp.test(attribute.name)) {\n propertyName = this.camelCase(attribute.name);\n token = Rivets.TypeParser.parse(attribute.value);\n if (__indexOf.call((_ref2 = this.component[\"static\"]) != null ? _ref2 : [], propertyName) >= 0) {\n this[\"static\"][propertyName] = attribute.value;\n } else if (token.type === Rivets.TypeParser.types.primitive) {\n this[\"static\"][propertyName] = token.value;\n } else {\n this.observers[propertyName] = attribute.value;\n }\n }\n }\n }\n\n ComponentBinding.prototype.sync = function() {};\n\n ComponentBinding.prototype.update = function() {};\n\n ComponentBinding.prototype.publish = function() {};\n\n ComponentBinding.prototype.locals = function() {\n var key, observer, result, value, _ref1, _ref2;\n result = {};\n _ref1 = this[\"static\"];\n for (key in _ref1) {\n value = _ref1[key];\n result[key] = value;\n }\n _ref2 = this.observers;\n for (key in _ref2) {\n observer = _ref2[key];\n result[key] = observer.value();\n }\n return result;\n };\n\n ComponentBinding.prototype.camelCase = function(string) {\n return string.replace(/-([a-z])/g, function(grouped) {\n return grouped[1].toUpperCase();\n });\n };\n\n ComponentBinding.prototype.bind = function() {\n var k, key, keypath, observer, option, options, scope, v, _base, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7;\n if (!this.bound) {\n _ref1 = this.observers;\n for (key in _ref1) {\n keypath = _ref1[key];\n this.observers[key] = this.observe(this.view.models, keypath, ((function(_this) {\n return function(key) {\n return function() {\n return _this.componentView.models[key] = _this.observers[key].value();\n };\n };\n })(this)).call(this, key));\n }\n this.bound = true;\n }\n if (this.componentView != null) {\n this.componentView.bind();\n } else {\n this.el.innerHTML = this.component.template.call(this);\n scope = this.component.initialize.call(this, this.el, this.locals());\n this.el._bound = true;\n options = {};\n _ref2 = Rivets.extensions;\n for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n option = _ref2[_i];\n options[option] = {};\n if (this.component[option]) {\n _ref3 = this.component[option];\n for (k in _ref3) {\n v = _ref3[k];\n options[option][k] = v;\n }\n }\n _ref4 = this.view[option];\n for (k in _ref4) {\n v = _ref4[k];\n if ((_base = options[option])[k] == null) {\n _base[k] = v;\n }\n }\n }\n _ref5 = Rivets.options;\n for (_j = 0, _len1 = _ref5.length; _j < _len1; _j++) {\n option = _ref5[_j];\n options[option] = (_ref6 = this.component[option]) != null ? _ref6 : this.view[option];\n }\n this.componentView = new Rivets.View(Array.prototype.slice.call(this.el.childNodes), scope, options);\n this.componentView.bind();\n _ref7 = this.observers;\n for (key in _ref7) {\n observer = _ref7[key];\n this.upstreamObservers[key] = this.observe(this.componentView.models, key, ((function(_this) {\n return function(key, observer) {\n return function() {\n return observer.setValue(_this.componentView.models[key]);\n };\n };\n })(this)).call(this, key, observer));\n }\n }\n };\n\n ComponentBinding.prototype.unbind = function() {\n var key, observer, _ref1, _ref2, _ref3;\n _ref1 = this.upstreamObservers;\n for (key in _ref1) {\n observer = _ref1[key];\n observer.unobserve();\n }\n _ref2 = this.observers;\n for (key in _ref2) {\n observer = _ref2[key];\n observer.unobserve();\n }\n return (_ref3 = this.componentView) != null ? _ref3.unbind.call(this) : void 0;\n };\n\n return ComponentBinding;\n\n })(Rivets.Binding);\n\n Rivets.TextBinding = (function(_super) {\n __extends(TextBinding, _super);\n\n function TextBinding(view, el, type, keypath, options) {\n this.view = view;\n this.el = el;\n this.type = type;\n this.keypath = keypath;\n this.options = options != null ? options : {};\n this.sync = __bind(this.sync, this);\n this.formatters = this.options.formatters || [];\n this.dependencies = [];\n this.formatterObservers = {};\n }\n\n TextBinding.prototype.binder = {\n routine: function(node, value) {\n return node.data = value != null ? value : '';\n }\n };\n\n TextBinding.prototype.sync = function() {\n return TextBinding.__super__.sync.apply(this, arguments);\n };\n\n return TextBinding;\n\n })(Rivets.Binding);\n\n Rivets[\"public\"].binders.text = function(el, value) {\n if (el.textContent != null) {\n return el.textContent = value != null ? value : '';\n } else {\n return el.innerText = value != null ? value : '';\n }\n };\n\n Rivets[\"public\"].binders.html = function(el, value) {\n return el.innerHTML = value != null ? value : '';\n };\n\n Rivets[\"public\"].binders.show = function(el, value) {\n return el.style.display = value ? '' : 'none';\n };\n\n Rivets[\"public\"].binders.hide = function(el, value) {\n return el.style.display = value ? 'none' : '';\n };\n\n Rivets[\"public\"].binders.enabled = function(el, value) {\n return el.disabled = !value;\n };\n\n Rivets[\"public\"].binders.disabled = function(el, value) {\n return el.disabled = !!value;\n };\n\n Rivets[\"public\"].binders.checked = {\n publishes: true,\n priority: 2000,\n bind: function(el) {\n return Rivets.Util.bindEvent(el, 'change', this.publish);\n },\n unbind: function(el) {\n return Rivets.Util.unbindEvent(el, 'change', this.publish);\n },\n routine: function(el, value) {\n var _ref1;\n if (el.type === 'radio') {\n return el.checked = ((_ref1 = el.value) != null ? _ref1.toString() : void 0) === (value != null ? value.toString() : void 0);\n } else {\n return el.checked = !!value;\n }\n }\n };\n\n Rivets[\"public\"].binders.unchecked = {\n publishes: true,\n priority: 2000,\n bind: function(el) {\n return Rivets.Util.bindEvent(el, 'change', this.publish);\n },\n unbind: function(el) {\n return Rivets.Util.unbindEvent(el, 'change', this.publish);\n },\n routine: function(el, value) {\n var _ref1;\n if (el.type === 'radio') {\n return el.checked = ((_ref1 = el.value) != null ? _ref1.toString() : void 0) !== (value != null ? value.toString() : void 0);\n } else {\n return el.checked = !value;\n }\n }\n };\n\n Rivets[\"public\"].binders.value = {\n publishes: true,\n priority: 3000,\n bind: function(el) {\n if (!(el.tagName === 'INPUT' && el.type === 'radio')) {\n this.event = el.tagName === 'SELECT' ? 'change' : 'input';\n return Rivets.Util.bindEvent(el, this.event, this.publish);\n }\n },\n unbind: function(el) {\n if (!(el.tagName === 'INPUT' && el.type === 'radio')) {\n return Rivets.Util.unbindEvent(el, this.event, this.publish);\n }\n },\n routine: function(el, value) {\n var o, _i, _len, _ref1, _ref2, _ref3, _results;\n if (el.tagName === 'INPUT' && el.type === 'radio') {\n return el.setAttribute('value', value);\n } else if (window.jQuery != null) {\n el = jQuery(el);\n if ((value != null ? value.toString() : void 0) !== ((_ref1 = el.val()) != null ? _ref1.toString() : void 0)) {\n return el.val(value != null ? value : '');\n }\n } else {\n if (el.type === 'select-multiple') {\n if (value != null) {\n _results = [];\n for (_i = 0, _len = el.length; _i < _len; _i++) {\n o = el[_i];\n _results.push(o.selected = (_ref2 = o.value, __indexOf.call(value, _ref2) >= 0));\n }\n return _results;\n }\n } else if ((value != null ? value.toString() : void 0) !== ((_ref3 = el.value) != null ? _ref3.toString() : void 0)) {\n return el.value = value != null ? value : '';\n }\n }\n }\n };\n\n Rivets[\"public\"].binders[\"if\"] = {\n block: true,\n priority: 4000,\n bind: function(el) {\n var attr, declaration;\n if (this.marker == null) {\n attr = [this.view.prefix, this.type].join('-').replace('--', '-');\n declaration = el.getAttribute(attr);\n this.marker = document.createComment(\" rivets: \" + this.type + \" \" + declaration + \" \");\n this.bound = false;\n el.removeAttribute(attr);\n el.parentNode.insertBefore(this.marker, el);\n return el.parentNode.removeChild(el);\n }\n },\n unbind: function() {\n if (this.nested) {\n this.nested.unbind();\n return this.bound = false;\n }\n },\n routine: function(el, value) {\n var key, model, models, _ref1;\n if (!!value === !this.bound) {\n if (value) {\n models = {};\n _ref1 = this.view.models;\n for (key in _ref1) {\n model = _ref1[key];\n models[key] = model;\n }\n (this.nested || (this.nested = new Rivets.View(el, models, this.view.options()))).bind();\n this.marker.parentNode.insertBefore(el, this.marker.nextSibling);\n return this.bound = true;\n } else {\n el.parentNode.removeChild(el);\n this.nested.unbind();\n return this.bound = false;\n }\n }\n },\n update: function(models) {\n var _ref1;\n return (_ref1 = this.nested) != null ? _ref1.update(models) : void 0;\n }\n };\n\n Rivets[\"public\"].binders.unless = {\n block: true,\n priority: 4000,\n bind: function(el) {\n return Rivets[\"public\"].binders[\"if\"].bind.call(this, el);\n },\n unbind: function() {\n return Rivets[\"public\"].binders[\"if\"].unbind.call(this);\n },\n routine: function(el, value) {\n return Rivets[\"public\"].binders[\"if\"].routine.call(this, el, !value);\n },\n update: function(models) {\n return Rivets[\"public\"].binders[\"if\"].update.call(this, models);\n }\n };\n\n Rivets[\"public\"].binders['on-*'] = {\n \"function\": true,\n priority: 1000,\n unbind: function(el) {\n if (this.handler) {\n return Rivets.Util.unbindEvent(el, this.args[0], this.handler);\n }\n },\n routine: function(el, value) {\n if (this.handler) {\n Rivets.Util.unbindEvent(el, this.args[0], this.handler);\n }\n return Rivets.Util.bindEvent(el, this.args[0], this.handler = this.eventHandler(value));\n }\n };\n\n Rivets[\"public\"].binders['each-*'] = {\n block: true,\n priority: 4000,\n bind: function(el) {\n var attr, view, _i, _len, _ref1;\n if (this.marker == null) {\n attr = [this.view.prefix, this.type].join('-').replace('--', '-');\n this.marker = document.createComment(\" rivets: \" + this.type + \" \");\n this.iterated = [];\n el.removeAttribute(attr);\n el.parentNode.insertBefore(this.marker, el);\n el.parentNode.removeChild(el);\n } else {\n _ref1 = this.iterated;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n view = _ref1[_i];\n view.bind();\n }\n }\n },\n unbind: function(el) {\n var view, _i, _len, _ref1;\n if (this.iterated != null) {\n _ref1 = this.iterated;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n view = _ref1[_i];\n view.unbind();\n }\n }\n },\n routine: function(el, collection) {\n var binding, data, i, index, key, model, modelName, options, previous, template, view, _i, _j, _k, _len, _len1, _len2, _ref1, _ref2, _ref3;\n modelName = this.args[0];\n collection = collection || [];\n if (this.iterated.length > collection.length) {\n _ref1 = Array(this.iterated.length - collection.length);\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n i = _ref1[_i];\n view = this.iterated.pop();\n view.unbind();\n this.marker.parentNode.removeChild(view.els[0]);\n }\n }\n for (index = _j = 0, _len1 = collection.length; _j < _len1; index = ++_j) {\n model = collection[index];\n data = {\n index: index\n };\n data[Rivets[\"public\"].iterationAlias(modelName)] = index;\n data[modelName] = model;\n if (this.iterated[index] == null) {\n _ref2 = this.view.models;\n for (key in _ref2) {\n model = _ref2[key];\n if (data[key] == null) {\n data[key] = model;\n }\n }\n previous = this.iterated.length ? this.iterated[this.iterated.length - 1].els[0] : this.marker;\n options = this.view.options();\n options.preloadData = true;\n template = el.cloneNode(true);\n view = new Rivets.View(template, data, options);\n view.bind();\n this.iterated.push(view);\n this.marker.parentNode.insertBefore(template, previous.nextSibling);\n } else if (this.iterated[index].models[modelName] !== model) {\n this.iterated[index].update(data);\n }\n }\n if (el.nodeName === 'OPTION') {\n _ref3 = this.view.bindings;\n for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {\n binding = _ref3[_k];\n if (binding.el === this.marker.parentNode && binding.type === 'value') {\n binding.sync();\n }\n }\n }\n },\n update: function(models) {\n var data, key, model, view, _i, _len, _ref1;\n data = {};\n for (key in models) {\n model = models[key];\n if (key !== this.args[0]) {\n data[key] = model;\n }\n }\n _ref1 = this.iterated;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n view = _ref1[_i];\n view.update(data);\n }\n }\n };\n\n Rivets[\"public\"].binders['class-*'] = function(el, value) {\n var elClass;\n elClass = \" \" + el.className + \" \";\n if (!value === (elClass.indexOf(\" \" + this.args[0] + \" \") !== -1)) {\n return el.className = value ? \"\" + el.className + \" \" + this.args[0] : elClass.replace(\" \" + this.args[0] + \" \", ' ').trim();\n }\n };\n\n Rivets[\"public\"].binders['*'] = function(el, value) {\n if (value != null) {\n return el.setAttribute(this.type, value);\n } else {\n return el.removeAttribute(this.type);\n }\n };\n\n Rivets[\"public\"].formatters['call'] = function() {\n var args, value;\n value = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n return value.call.apply(value, [this].concat(__slice.call(args)));\n };\n\n Rivets[\"public\"].adapters['.'] = {\n id: '_rv',\n counter: 0,\n weakmap: {},\n weakReference: function(obj) {\n var id, _base, _name;\n if (!obj.hasOwnProperty(this.id)) {\n id = this.counter++;\n Object.defineProperty(obj, this.id, {\n value: id\n });\n }\n return (_base = this.weakmap)[_name = obj[this.id]] || (_base[_name] = {\n callbacks: {}\n });\n },\n cleanupWeakReference: function(ref, id) {\n if (!Object.keys(ref.callbacks).length) {\n if (!(ref.pointers && Object.keys(ref.pointers).length)) {\n return delete this.weakmap[id];\n }\n }\n },\n stubFunction: function(obj, fn) {\n var map, original, weakmap;\n original = obj[fn];\n map = this.weakReference(obj);\n weakmap = this.weakmap;\n return obj[fn] = function() {\n var callback, k, r, response, _i, _len, _ref1, _ref2, _ref3, _ref4;\n response = original.apply(obj, arguments);\n _ref1 = map.pointers;\n for (r in _ref1) {\n k = _ref1[r];\n _ref4 = (_ref2 = (_ref3 = weakmap[r]) != null ? _ref3.callbacks[k] : void 0) != null ? _ref2 : [];\n for (_i = 0, _len = _ref4.length; _i < _len; _i++) {\n callback = _ref4[_i];\n callback();\n }\n }\n return response;\n };\n },\n observeMutations: function(obj, ref, keypath) {\n var fn, functions, map, _base, _i, _len;\n if (Array.isArray(obj)) {\n map = this.weakReference(obj);\n if (map.pointers == null) {\n map.pointers = {};\n functions = ['push', 'pop', 'shift', 'unshift', 'sort', 'reverse', 'splice'];\n for (_i = 0, _len = functions.length; _i < _len; _i++) {\n fn = functions[_i];\n this.stubFunction(obj, fn);\n }\n }\n if ((_base = map.pointers)[ref] == null) {\n _base[ref] = [];\n }\n if (__indexOf.call(map.pointers[ref], keypath) < 0) {\n return map.pointers[ref].push(keypath);\n }\n }\n },\n unobserveMutations: function(obj, ref, keypath) {\n var idx, map, pointers;\n if (Array.isArray(obj) && (obj[this.id] != null)) {\n if (map = this.weakmap[obj[this.id]]) {\n if (pointers = map.pointers[ref]) {\n if ((idx = pointers.indexOf(keypath)) >= 0) {\n pointers.splice(idx, 1);\n }\n if (!pointers.length) {\n delete map.pointers[ref];\n }\n return this.cleanupWeakReference(map, obj[this.id]);\n }\n }\n }\n },\n observe: function(obj, keypath, callback) {\n var callbacks, desc, value;\n callbacks = this.weakReference(obj).callbacks;\n if (callbacks[keypath] == null) {\n callbacks[keypath] = [];\n desc = Object.getOwnPropertyDescriptor(obj, keypath);\n if (!((desc != null ? desc.get : void 0) || (desc != null ? desc.set : void 0))) {\n value = obj[keypath];\n Object.defineProperty(obj, keypath, {\n enumerable: true,\n get: function() {\n return value;\n },\n set: (function(_this) {\n return function(newValue) {\n var cb, map, _i, _len, _ref1;\n if (newValue !== value) {\n _this.unobserveMutations(value, obj[_this.id], keypath);\n value = newValue;\n if (map = _this.weakmap[obj[_this.id]]) {\n callbacks = map.callbacks;\n if (callbacks[keypath]) {\n _ref1 = callbacks[keypath].slice();\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n cb = _ref1[_i];\n if (__indexOf.call(callbacks[keypath], cb) >= 0) {\n cb();\n }\n }\n }\n return _this.observeMutations(newValue, obj[_this.id], keypath);\n }\n }\n };\n })(this)\n });\n }\n }\n if (__indexOf.call(callbacks[keypath], callback) < 0) {\n callbacks[keypath].push(callback);\n }\n return this.observeMutations(obj[keypath], obj[this.id], keypath);\n },\n unobserve: function(obj, keypath, callback) {\n var callbacks, idx, map;\n if (map = this.weakmap[obj[this.id]]) {\n if (callbacks = map.callbacks[keypath]) {\n if ((idx = callbacks.indexOf(callback)) >= 0) {\n callbacks.splice(idx, 1);\n if (!callbacks.length) {\n delete map.callbacks[keypath];\n this.unobserveMutations(obj[keypath], obj[this.id], keypath);\n }\n }\n return this.cleanupWeakReference(map, obj[this.id]);\n }\n }\n },\n get: function(obj, keypath) {\n return obj[keypath];\n },\n set: function(obj, keypath, value) {\n return obj[keypath] = value;\n }\n };\n\n Rivets.factory = function(sightglass) {\n Rivets.sightglass = sightglass;\n Rivets[\"public\"]._ = Rivets;\n return Rivets[\"public\"];\n };\n\n if (typeof (typeof module !== \"undefined\" && module !== null ? module.exports : void 0) === 'object') {\n module.exports = Rivets.factory(__webpack_require__(\"./node_modules/sightglass/index.js\"));\n } else if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(\"./node_modules/sightglass/index.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function(sightglass) {\n return this.rivets = Rivets.factory(sightglass);\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {\n this.rivets = Rivets.factory(sightglass);\n }\n\n}).call(this);\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(\"./node_modules/webpack/buildin/module.js\")(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcml2ZXRzL2Rpc3Qvcml2ZXRzLmpzP2ViMWIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjhDQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixtQkFBbUIsZ0NBQWdDLEdBQUcsRUFBRTtBQUN0RjtBQUNBLGtCQUFrQjtBQUNsQix5Q0FBeUMsMEJBQTBCLDJEQUEyRCxFQUFFLGtCQUFrQiwwQkFBMEIsRUFBRSxtQ0FBbUMsOEJBQThCLG9DQUFvQyxjQUFjLEVBQUU7QUFDblMsOENBQThDLGlDQUFpQyxPQUFPLE9BQU8sNkNBQTZDLEVBQUUsV0FBVzs7QUFFdko7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixrQkFBa0I7QUFDbEI7QUFDQSw2QkFBNkIsS0FBSztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxZQUFZO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFdBQVc7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxXQUFXO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsWUFBWTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiw4Q0FBOEMsWUFBWTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFlBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSwyQ0FBMkMsV0FBVztBQUN0RDtBQUNBLHlLQUF5SztBQUN6SztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFdBQVc7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFdBQVc7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFlBQVk7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsV0FBVztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxZQUFZO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxXQUFXO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNB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Ii8vIFJpdmV0cy5qc1xuLy8gdmVyc2lvbjogMC45LjZcbi8vIGF1dGhvcjogTWljaGFlbCBSaWNoYXJkc1xuLy8gbGljZW5zZTogTUlUXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBSaXZldHMsIGJpbmRNZXRob2QsIGpRdWVyeSwgdW5iaW5kTWV0aG9kLCBfcmVmLFxuICAgIF9fYmluZCA9IGZ1bmN0aW9uKGZuLCBtZSl7IHJldHVybiBmdW5jdGlvbigpeyByZXR1cm4gZm4uYXBwbHkobWUsIGFyZ3VtZW50cyk7IH07IH0sXG4gICAgX19zbGljZSA9IFtdLnNsaWNlLFxuICAgIF9faGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoX19oYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIF9faW5kZXhPZiA9IFtdLmluZGV4T2YgfHwgZnVuY3Rpb24oaXRlbSkgeyBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGlmIChpIGluIHRoaXMgJiYgdGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7IH0gcmV0dXJuIC0xOyB9O1xuXG4gIFJpdmV0cyA9IHtcbiAgICBvcHRpb25zOiBbJ3ByZWZpeCcsICd0ZW1wbGF0ZURlbGltaXRlcnMnLCAncm9vdEludGVyZmFjZScsICdwcmVsb2FkRGF0YScsICdoYW5kbGVyJywgJ2V4ZWN1dGVGdW5jdGlvbnMnXSxcbiAgICBleHRlbnNpb25zOiBbJ2JpbmRlcnMnLCAnZm9ybWF0dGVycycsICdjb21wb25lbnRzJywgJ2FkYXB0ZXJzJ10sXG4gICAgXCJwdWJsaWNcIjoge1xuICAgICAgYmluZGVyczoge30sXG4gICAgICBjb21wb25lbnRzOiB7fSxcbiAgICAgIGZvcm1hdHRlcnM6IHt9LFxuICAgICAgYWRhcHRlcnM6IHt9LFxuICAgICAgcHJlZml4OiAncnYnLFxuICAgICAgdGVtcGxhdGVEZWxpbWl0ZXJzOiBbJ3snLCAnfSddLFxuICAgICAgcm9vdEludGVyZmFjZTogJy4nLFxuICAgICAgcHJlbG9hZERhdGE6IHRydWUsXG4gICAgICBleGVjdXRlRnVuY3Rpb25zOiBmYWxzZSxcbiAgICAgIGl0ZXJhdGlvbkFsaWFzOiBmdW5jdGlvbihtb2RlbE5hbWUpIHtcbiAgICAgICAgcmV0dXJuICclJyArIG1vZGVsTmFtZSArICclJztcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbihjb250ZXh0LCBldiwgYmluZGluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKGNvbnRleHQsIGV2LCBiaW5kaW5nLnZpZXcubW9kZWxzKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IsIGtleSwgb3B0aW9uLCB2YWx1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgdmFsdWUgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgaWYgKG9wdGlvbiA9PT0gJ2JpbmRlcnMnIHx8IG9wdGlvbiA9PT0gJ2NvbXBvbmVudHMnIHx8IG9wdGlvbiA9PT0gJ2Zvcm1hdHRlcnMnIHx8IG9wdGlvbiA9PT0gJ2FkYXB0ZXJzJykge1xuICAgICAgICAgICAgZm9yIChrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHZhbHVlW2tleV07XG4gICAgICAgICAgICAgIFJpdmV0c1tvcHRpb25dW2tleV0gPSBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBSaXZldHNbXCJwdWJsaWNcIl1bb3B0aW9uXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGJpbmQ6IGZ1bmN0aW9uKGVsLCBtb2RlbHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHZpZXc7XG4gICAgICAgIGlmIChtb2RlbHMgPT0gbnVsbCkge1xuICAgICAgICAgIG1vZGVscyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdmlldyA9IG5ldyBSaXZldHMuVmlldyhlbCwgbW9kZWxzLCBvcHRpb25zKTtcbiAgICAgICAgdmlldy5iaW5kKCk7XG4gICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgfSxcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGNvbXBvbmVudCwgZWwsIGRhdGEpIHtcbiAgICAgICAgdmFyIHNjb3BlLCB0ZW1wbGF0ZSwgdmlldztcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgIGRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50ID0gUml2ZXRzW1wicHVibGljXCJdLmNvbXBvbmVudHNbY29tcG9uZW50XTtcbiAgICAgICAgdGVtcGxhdGUgPSBjb21wb25lbnQudGVtcGxhdGUuY2FsbCh0aGlzLCBlbCk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgd2hpbGUgKGVsLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwuaW5uZXJIVE1MID0gdGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUgPSBjb21wb25lbnQuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIGVsLCBkYXRhKTtcbiAgICAgICAgdmlldyA9IG5ldyBSaXZldHMuVmlldyhlbCwgc2NvcGUpO1xuICAgICAgICB2aWV3LmJpbmQoKTtcbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGlmICh3aW5kb3dbJ2pRdWVyeSddIHx8IHdpbmRvd1snJCddKSB7XG4gICAgalF1ZXJ5ID0gd2luZG93WydqUXVlcnknXSB8fCB3aW5kb3dbJyQnXTtcbiAgICBfcmVmID0gJ29uJyBpbiBqUXVlcnkucHJvdG90eXBlID8gWydvbicsICdvZmYnXSA6IFsnYmluZCcsICd1bmJpbmQnXSwgYmluZE1ldGhvZCA9IF9yZWZbMF0sIHVuYmluZE1ldGhvZCA9IF9yZWZbMV07XG4gICAgUml2ZXRzLlV0aWwgPSB7XG4gICAgICBiaW5kRXZlbnQ6IGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4galF1ZXJ5KGVsKVtiaW5kTWV0aG9kXShldmVudCwgaGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgdW5iaW5kRXZlbnQ6IGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4galF1ZXJ5KGVsKVt1bmJpbmRNZXRob2RdKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgIH0sXG4gICAgICBnZXRJbnB1dFZhbHVlOiBmdW5jdGlvbihlbCkge1xuICAgICAgICB2YXIgJGVsO1xuICAgICAgICAkZWwgPSBqUXVlcnkoZWwpO1xuICAgICAgICBpZiAoJGVsLmF0dHIoJ3R5cGUnKSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgIHJldHVybiAkZWwuaXMoJzpjaGVja2VkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICRlbC52YWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgUml2ZXRzLlV0aWwgPSB7XG4gICAgICBiaW5kRXZlbnQ6IChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCdhZGRFdmVudExpc3RlbmVyJyBpbiB3aW5kb3cpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZWwsIGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBlbC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfSkoKSxcbiAgICAgIHVuYmluZEV2ZW50OiAoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgncmVtb3ZlRXZlbnRMaXN0ZW5lcicgaW4gd2luZG93KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICAgICAgcmV0dXJuIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihlbCwgZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gZWwuZGV0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgIH0pKCksXG4gICAgICBnZXRJbnB1dFZhbHVlOiBmdW5jdGlvbihlbCkge1xuICAgICAgICB2YXIgbywgX2ksIF9sZW4sIF9yZXN1bHRzO1xuICAgICAgICBpZiAoZWwudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgIHJldHVybiBlbC5jaGVja2VkO1xuICAgICAgICB9IGVsc2UgaWYgKGVsLnR5cGUgPT09ICdzZWxlY3QtbXVsdGlwbGUnKSB7XG4gICAgICAgICAgX3Jlc3VsdHMgPSBbXTtcbiAgICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGVsLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICBvID0gZWxbX2ldO1xuICAgICAgICAgICAgaWYgKG8uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChvLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBSaXZldHMuVHlwZVBhcnNlciA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBUeXBlUGFyc2VyKCkge31cblxuICAgIFR5cGVQYXJzZXIudHlwZXMgPSB7XG4gICAgICBwcmltaXRpdmU6IDAsXG4gICAgICBrZXlwYXRoOiAxXG4gICAgfTtcblxuICAgIFR5cGVQYXJzZXIucGFyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIGlmICgvXicuKickfF5cIi4qXCIkLy50ZXN0KHN0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogc3RyaW5nLnNsaWNlKDEsIC0xKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzdHJpbmcgPT09ICd0cnVlJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMucHJpbWl0aXZlLFxuICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMucHJpbWl0aXZlLFxuICAgICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzdHJpbmcgPT09ICdudWxsJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMucHJpbWl0aXZlLFxuICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZyA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGlzTmFOKE51bWJlcihzdHJpbmcpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogTnVtYmVyKHN0cmluZylcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlcy5rZXlwYXRoLFxuICAgICAgICAgIHZhbHVlOiBzdHJpbmdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFR5cGVQYXJzZXI7XG5cbiAgfSkoKTtcblxuICBSaXZldHMuVGV4dFRlbXBsYXRlUGFyc2VyID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFRleHRUZW1wbGF0ZVBhcnNlcigpIHt9XG5cbiAgICBUZXh0VGVtcGxhdGVQYXJzZXIudHlwZXMgPSB7XG4gICAgICB0ZXh0OiAwLFxuICAgICAgYmluZGluZzogMVxuICAgIH07XG5cbiAgICBUZXh0VGVtcGxhdGVQYXJzZXIucGFyc2UgPSBmdW5jdGlvbih0ZW1wbGF0ZSwgZGVsaW1pdGVycykge1xuICAgICAgdmFyIGluZGV4LCBsYXN0SW5kZXgsIGxhc3RUb2tlbiwgbGVuZ3RoLCBzdWJzdHJpbmcsIHRva2VucywgdmFsdWU7XG4gICAgICB0b2tlbnMgPSBbXTtcbiAgICAgIGxlbmd0aCA9IHRlbXBsYXRlLmxlbmd0aDtcbiAgICAgIGluZGV4ID0gMDtcbiAgICAgIGxhc3RJbmRleCA9IDA7XG4gICAgICB3aGlsZSAobGFzdEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGluZGV4ID0gdGVtcGxhdGUuaW5kZXhPZihkZWxpbWl0ZXJzWzBdLCBsYXN0SW5kZXgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlcy50ZXh0LFxuICAgICAgICAgICAgdmFsdWU6IHRlbXBsYXRlLnNsaWNlKGxhc3RJbmRleClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIGxhc3RJbmRleCA8IGluZGV4KSB7XG4gICAgICAgICAgICB0b2tlbnMucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMudGV4dCxcbiAgICAgICAgICAgICAgdmFsdWU6IHRlbXBsYXRlLnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdEluZGV4ID0gaW5kZXggKyBkZWxpbWl0ZXJzWzBdLmxlbmd0aDtcbiAgICAgICAgICBpbmRleCA9IHRlbXBsYXRlLmluZGV4T2YoZGVsaW1pdGVyc1sxXSwgbGFzdEluZGV4KTtcbiAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICBzdWJzdHJpbmcgPSB0ZW1wbGF0ZS5zbGljZShsYXN0SW5kZXggLSBkZWxpbWl0ZXJzWzFdLmxlbmd0aCk7XG4gICAgICAgICAgICBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKChsYXN0VG9rZW4gIT0gbnVsbCA/IGxhc3RUb2tlbi50eXBlIDogdm9pZCAwKSA9PT0gdGhpcy50eXBlcy50ZXh0KSB7XG4gICAgICAgICAgICAgIGxhc3RUb2tlbi52YWx1ZSArPSBzdWJzdHJpbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlcy50ZXh0LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdWJzdHJpbmdcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSB0ZW1wbGF0ZS5zbGljZShsYXN0SW5kZXgsIGluZGV4KS50cmltKCk7XG4gICAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlcy5iaW5kaW5nLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGFzdEluZGV4ID0gaW5kZXggKyBkZWxpbWl0ZXJzWzFdLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRleHRUZW1wbGF0ZVBhcnNlcjtcblxuICB9KSgpO1xuXG4gIFJpdmV0cy5WaWV3ID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFZpZXcoZWxzLCBtb2RlbHMsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBrLCBvcHRpb24sIHYsIF9iYXNlLCBfaSwgX2osIF9sZW4sIF9sZW4xLCBfcmVmMSwgX3JlZjIsIF9yZWYzLCBfcmVmNCwgX3JlZjU7XG4gICAgICB0aGlzLmVscyA9IGVscztcbiAgICAgIHRoaXMubW9kZWxzID0gbW9kZWxzO1xuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZSA9IF9fYmluZCh0aGlzLnVwZGF0ZSwgdGhpcyk7XG4gICAgICB0aGlzLnB1Ymxpc2ggPSBfX2JpbmQodGhpcy5wdWJsaXNoLCB0aGlzKTtcbiAgICAgIHRoaXMuc3luYyA9IF9fYmluZCh0aGlzLnN5bmMsIHRoaXMpO1xuICAgICAgdGhpcy51bmJpbmQgPSBfX2JpbmQodGhpcy51bmJpbmQsIHRoaXMpO1xuICAgICAgdGhpcy5iaW5kID0gX19iaW5kKHRoaXMuYmluZCwgdGhpcyk7XG4gICAgICB0aGlzLnNlbGVjdCA9IF9fYmluZCh0aGlzLnNlbGVjdCwgdGhpcyk7XG4gICAgICB0aGlzLnRyYXZlcnNlID0gX19iaW5kKHRoaXMudHJhdmVyc2UsIHRoaXMpO1xuICAgICAgdGhpcy5idWlsZCA9IF9fYmluZCh0aGlzLmJ1aWxkLCB0aGlzKTtcbiAgICAgIHRoaXMuYnVpbGRCaW5kaW5nID0gX19iaW5kKHRoaXMuYnVpbGRCaW5kaW5nLCB0aGlzKTtcbiAgICAgIHRoaXMuYmluZGluZ1JlZ0V4cCA9IF9fYmluZCh0aGlzLmJpbmRpbmdSZWdFeHAsIHRoaXMpO1xuICAgICAgdGhpcy5vcHRpb25zID0gX19iaW5kKHRoaXMub3B0aW9ucywgdGhpcyk7XG4gICAgICBpZiAoISh0aGlzLmVscy5qcXVlcnkgfHwgdGhpcy5lbHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgdGhpcy5lbHMgPSBbdGhpcy5lbHNdO1xuICAgICAgfVxuICAgICAgX3JlZjEgPSBSaXZldHMuZXh0ZW5zaW9ucztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgb3B0aW9uID0gX3JlZjFbX2ldO1xuICAgICAgICB0aGlzW29wdGlvbl0gPSB7fTtcbiAgICAgICAgaWYgKG9wdGlvbnNbb3B0aW9uXSkge1xuICAgICAgICAgIF9yZWYyID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICAgIGZvciAoayBpbiBfcmVmMikge1xuICAgICAgICAgICAgdiA9IF9yZWYyW2tdO1xuICAgICAgICAgICAgdGhpc1tvcHRpb25dW2tdID0gdjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JlZjMgPSBSaXZldHNbXCJwdWJsaWNcIl1bb3B0aW9uXTtcbiAgICAgICAgZm9yIChrIGluIF9yZWYzKSB7XG4gICAgICAgICAgdiA9IF9yZWYzW2tdO1xuICAgICAgICAgIGlmICgoX2Jhc2UgPSB0aGlzW29wdGlvbl0pW2tdID09IG51bGwpIHtcbiAgICAgICAgICAgIF9iYXNlW2tdID0gdjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIF9yZWY0ID0gUml2ZXRzLm9wdGlvbnM7XG4gICAgICBmb3IgKF9qID0gMCwgX2xlbjEgPSBfcmVmNC5sZW5ndGg7IF9qIDwgX2xlbjE7IF9qKyspIHtcbiAgICAgICAgb3B0aW9uID0gX3JlZjRbX2pdO1xuICAgICAgICB0aGlzW29wdGlvbl0gPSAoX3JlZjUgPSBvcHRpb25zW29wdGlvbl0pICE9IG51bGwgPyBfcmVmNSA6IFJpdmV0c1tcInB1YmxpY1wiXVtvcHRpb25dO1xuICAgICAgfVxuICAgICAgdGhpcy5idWlsZCgpO1xuICAgIH1cblxuICAgIFZpZXcucHJvdG90eXBlLm9wdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb24sIG9wdGlvbnMsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIF9yZWYxID0gUml2ZXRzLmV4dGVuc2lvbnMuY29uY2F0KFJpdmV0cy5vcHRpb25zKTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgb3B0aW9uID0gX3JlZjFbX2ldO1xuICAgICAgICBvcHRpb25zW29wdGlvbl0gPSB0aGlzW29wdGlvbl07XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuYmluZGluZ1JlZ0V4cCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoXCJeXCIgKyB0aGlzLnByZWZpeCArIFwiLVwiKTtcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuYnVpbGRCaW5kaW5nID0gZnVuY3Rpb24oYmluZGluZywgbm9kZSwgdHlwZSwgZGVjbGFyYXRpb24pIHtcbiAgICAgIHZhciBjb250ZXh0LCBjdHgsIGRlcGVuZGVuY2llcywga2V5cGF0aCwgb3B0aW9ucywgcGlwZSwgcGlwZXM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgICBwaXBlcyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9pLCBfbGVuLCBfcmVmMSwgX3Jlc3VsdHM7XG4gICAgICAgIF9yZWYxID0gZGVjbGFyYXRpb24ubWF0Y2goLygoPzonW14nXSonKSooPzooPzpbXlxcfCddKig/OidbXiddKicpK1teXFx8J10qKSt8W15cXHxdKykpfF4kL2cpO1xuICAgICAgICBfcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgcGlwZSA9IF9yZWYxW19pXTtcbiAgICAgICAgICBfcmVzdWx0cy5wdXNoKHBpcGUudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Jlc3VsdHM7XG4gICAgICB9KSgpO1xuICAgICAgY29udGV4dCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9pLCBfbGVuLCBfcmVmMSwgX3Jlc3VsdHM7XG4gICAgICAgIF9yZWYxID0gcGlwZXMuc2hpZnQoKS5zcGxpdCgnPCcpO1xuICAgICAgICBfcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgY3R4ID0gX3JlZjFbX2ldO1xuICAgICAgICAgIF9yZXN1bHRzLnB1c2goY3R4LnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgfSkoKTtcbiAgICAgIGtleXBhdGggPSBjb250ZXh0LnNoaWZ0KCk7XG4gICAgICBvcHRpb25zLmZvcm1hdHRlcnMgPSBwaXBlcztcbiAgICAgIGlmIChkZXBlbmRlbmNpZXMgPSBjb250ZXh0LnNoaWZ0KCkpIHtcbiAgICAgICAgb3B0aW9ucy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuc3BsaXQoL1xccysvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzLnB1c2gobmV3IFJpdmV0c1tiaW5kaW5nXSh0aGlzLCBub2RlLCB0eXBlLCBrZXlwYXRoLCBvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZWwsIHBhcnNlLCBfaSwgX2xlbiwgX3JlZjE7XG4gICAgICB0aGlzLmJpbmRpbmdzID0gW107XG4gICAgICBwYXJzZSA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIHZhciBibG9jaywgY2hpbGROb2RlLCBkZWxpbWl0ZXJzLCBuLCBwYXJzZXIsIHRleHQsIHRva2VuLCB0b2tlbnMsIF9pLCBfaiwgX2xlbiwgX2xlbjEsIF9yZWYxO1xuICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICBwYXJzZXIgPSBSaXZldHMuVGV4dFRlbXBsYXRlUGFyc2VyO1xuICAgICAgICAgICAgaWYgKGRlbGltaXRlcnMgPSBfdGhpcy50ZW1wbGF0ZURlbGltaXRlcnMpIHtcbiAgICAgICAgICAgICAgaWYgKCh0b2tlbnMgPSBwYXJzZXIucGFyc2Uobm9kZS5kYXRhLCBkZWxpbWl0ZXJzKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodG9rZW5zLmxlbmd0aCA9PT0gMSAmJiB0b2tlbnNbMF0udHlwZSA9PT0gcGFyc2VyLnR5cGVzLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IHRva2Vucy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tfaV07XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0b2tlbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGV4dCwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMuYnVpbGRCaW5kaW5nKCdUZXh0QmluZGluZycsIHRleHQsIG51bGwsIHRva2VuLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgYmxvY2sgPSBfdGhpcy50cmF2ZXJzZShub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFibG9jaykge1xuICAgICAgICAgICAgX3JlZjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciBfaywgX2xlbjEsIF9yZWYxLCBfcmVzdWx0cztcbiAgICAgICAgICAgICAgX3JlZjEgPSBub2RlLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICAgIF9yZXN1bHRzID0gW107XG4gICAgICAgICAgICAgIGZvciAoX2sgPSAwLCBfbGVuMSA9IF9yZWYxLmxlbmd0aDsgX2sgPCBfbGVuMTsgX2srKykge1xuICAgICAgICAgICAgICAgIG4gPSBfcmVmMVtfa107XG4gICAgICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gX3Jlc3VsdHM7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgZm9yIChfaiA9IDAsIF9sZW4xID0gX3JlZjEubGVuZ3RoOyBfaiA8IF9sZW4xOyBfaisrKSB7XG4gICAgICAgICAgICAgIGNoaWxkTm9kZSA9IF9yZWYxW19qXTtcbiAgICAgICAgICAgICAgcGFyc2UoY2hpbGROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIF9yZWYxID0gdGhpcy5lbHM7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGVsID0gX3JlZjFbX2ldO1xuICAgICAgICBwYXJzZShlbCk7XG4gICAgICB9XG4gICAgICB0aGlzLmJpbmRpbmdzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICB2YXIgX3JlZjIsIF9yZWYzO1xuICAgICAgICByZXR1cm4gKCgoX3JlZjIgPSBiLmJpbmRlcikgIT0gbnVsbCA/IF9yZWYyLnByaW9yaXR5IDogdm9pZCAwKSB8fCAwKSAtICgoKF9yZWYzID0gYS5iaW5kZXIpICE9IG51bGwgPyBfcmVmMy5wcmlvcml0eSA6IHZvaWQgMCkgfHwgMCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUudHJhdmVyc2UgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgYXR0cmlidXRlLCBhdHRyaWJ1dGVzLCBiaW5kZXIsIGJpbmRpbmdSZWdFeHAsIGJsb2NrLCBpZGVudGlmaWVyLCByZWdleHAsIHR5cGUsIHZhbHVlLCBfaSwgX2osIF9sZW4sIF9sZW4xLCBfcmVmMSwgX3JlZjIsIF9yZWYzO1xuICAgICAgYmluZGluZ1JlZ0V4cCA9IHRoaXMuYmluZGluZ1JlZ0V4cCgpO1xuICAgICAgYmxvY2sgPSBub2RlLm5vZGVOYW1lID09PSAnU0NSSVBUJyB8fCBub2RlLm5vZGVOYW1lID09PSAnU1RZTEUnO1xuICAgICAgX3JlZjEgPSBub2RlLmF0dHJpYnV0ZXM7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGF0dHJpYnV0ZSA9IF9yZWYxW19pXTtcbiAgICAgICAgaWYgKGJpbmRpbmdSZWdFeHAudGVzdChhdHRyaWJ1dGUubmFtZSkpIHtcbiAgICAgICAgICB0eXBlID0gYXR0cmlidXRlLm5hbWUucmVwbGFjZShiaW5kaW5nUmVnRXhwLCAnJyk7XG4gICAgICAgICAgaWYgKCEoYmluZGVyID0gdGhpcy5iaW5kZXJzW3R5cGVdKSkge1xuICAgICAgICAgICAgX3JlZjIgPSB0aGlzLmJpbmRlcnM7XG4gICAgICAgICAgICBmb3IgKGlkZW50aWZpZXIgaW4gX3JlZjIpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBfcmVmMltpZGVudGlmaWVyXTtcbiAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgIT09ICcqJyAmJiBpZGVudGlmaWVyLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZWdleHAgPSBuZXcgUmVnRXhwKFwiXlwiICsgKGlkZW50aWZpZXIucmVwbGFjZSgvXFwqL2csICcuKycpKSArIFwiJFwiKTtcbiAgICAgICAgICAgICAgICBpZiAocmVnZXhwLnRlc3QodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIGJpbmRlciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBiaW5kZXIgfHwgKGJpbmRlciA9IHRoaXMuYmluZGVyc1snKiddKTtcbiAgICAgICAgICBpZiAoYmluZGVyLmJsb2NrKSB7XG4gICAgICAgICAgICBibG9jayA9IHRydWU7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzID0gW2F0dHJpYnV0ZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfcmVmMyA9IGF0dHJpYnV0ZXMgfHwgbm9kZS5hdHRyaWJ1dGVzO1xuICAgICAgZm9yIChfaiA9IDAsIF9sZW4xID0gX3JlZjMubGVuZ3RoOyBfaiA8IF9sZW4xOyBfaisrKSB7XG4gICAgICAgIGF0dHJpYnV0ZSA9IF9yZWYzW19qXTtcbiAgICAgICAgaWYgKGJpbmRpbmdSZWdFeHAudGVzdChhdHRyaWJ1dGUubmFtZSkpIHtcbiAgICAgICAgICB0eXBlID0gYXR0cmlidXRlLm5hbWUucmVwbGFjZShiaW5kaW5nUmVnRXhwLCAnJyk7XG4gICAgICAgICAgdGhpcy5idWlsZEJpbmRpbmcoJ0JpbmRpbmcnLCBub2RlLCB0eXBlLCBhdHRyaWJ1dGUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgIHR5cGUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbdHlwZV0gJiYgIW5vZGUuX2JvdW5kKSB7XG4gICAgICAgICAgdGhpcy5iaW5kaW5ncy5wdXNoKG5ldyBSaXZldHMuQ29tcG9uZW50QmluZGluZyh0aGlzLCBub2RlLCB0eXBlKSk7XG4gICAgICAgICAgYmxvY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYmxvY2s7XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICB2YXIgYmluZGluZywgX2ksIF9sZW4sIF9yZWYxLCBfcmVzdWx0cztcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIF9yZXN1bHRzID0gW107XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGJpbmRpbmcgPSBfcmVmMVtfaV07XG4gICAgICAgIGlmIChmbihiaW5kaW5nKSkge1xuICAgICAgICAgIF9yZXN1bHRzLnB1c2goYmluZGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBfcmVzdWx0cztcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJpbmRpbmcsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgYmluZGluZy5iaW5kKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnVuYmluZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJpbmRpbmcsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgYmluZGluZy51bmJpbmQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJpbmRpbmcsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgaWYgKHR5cGVvZiBiaW5kaW5nLnN5bmMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGJpbmRpbmcuc3luYygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnB1Ymxpc2ggPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBiaW5kaW5nLCBfaSwgX2xlbiwgX3JlZjE7XG4gICAgICBfcmVmMSA9IHRoaXMuc2VsZWN0KGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmFyIF9yZWYxO1xuICAgICAgICByZXR1cm4gKF9yZWYxID0gYi5iaW5kZXIpICE9IG51bGwgPyBfcmVmMS5wdWJsaXNoZXMgOiB2b2lkIDA7XG4gICAgICB9KTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgYmluZGluZy5wdWJsaXNoKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1vZGVscykge1xuICAgICAgdmFyIGJpbmRpbmcsIGtleSwgbW9kZWwsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIGlmIChtb2RlbHMgPT0gbnVsbCkge1xuICAgICAgICBtb2RlbHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGZvciAoa2V5IGluIG1vZGVscykge1xuICAgICAgICBtb2RlbCA9IG1vZGVsc1trZXldO1xuICAgICAgICB0aGlzLm1vZGVsc1trZXldID0gbW9kZWw7XG4gICAgICB9XG4gICAgICBfcmVmMSA9IHRoaXMuYmluZGluZ3M7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGJpbmRpbmcgPSBfcmVmMVtfaV07XG4gICAgICAgIGlmICh0eXBlb2YgYmluZGluZy51cGRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGJpbmRpbmcudXBkYXRlKG1vZGVscyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFZpZXc7XG5cbiAgfSkoKTtcblxuICBSaXZldHMuQmluZGluZyA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nKHZpZXcsIGVsLCB0eXBlLCBrZXlwYXRoLCBvcHRpb25zKSB7XG4gICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgIHRoaXMua2V5cGF0aCA9IGtleXBhdGg7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge307XG4gICAgICB0aGlzLmdldFZhbHVlID0gX19iaW5kKHRoaXMuZ2V0VmFsdWUsIHRoaXMpO1xuICAgICAgdGhpcy51cGRhdGUgPSBfX2JpbmQodGhpcy51cGRhdGUsIHRoaXMpO1xuICAgICAgdGhpcy51bmJpbmQgPSBfX2JpbmQodGhpcy51bmJpbmQsIHRoaXMpO1xuICAgICAgdGhpcy5iaW5kID0gX19iaW5kKHRoaXMuYmluZCwgdGhpcyk7XG4gICAgICB0aGlzLnB1Ymxpc2ggPSBfX2JpbmQodGhpcy5wdWJsaXNoLCB0aGlzKTtcbiAgICAgIHRoaXMuc3luYyA9IF9fYmluZCh0aGlzLnN5bmMsIHRoaXMpO1xuICAgICAgdGhpcy5zZXQgPSBfX2JpbmQodGhpcy5zZXQsIHRoaXMpO1xuICAgICAgdGhpcy5ldmVudEhhbmRsZXIgPSBfX2JpbmQodGhpcy5ldmVudEhhbmRsZXIsIHRoaXMpO1xuICAgICAgdGhpcy5mb3JtYXR0ZWRWYWx1ZSA9IF9fYmluZCh0aGlzLmZvcm1hdHRlZFZhbHVlLCB0aGlzKTtcbiAgICAgIHRoaXMucGFyc2VGb3JtYXR0ZXJBcmd1bWVudHMgPSBfX2JpbmQodGhpcy5wYXJzZUZvcm1hdHRlckFyZ3VtZW50cywgdGhpcyk7XG4gICAgICB0aGlzLnBhcnNlVGFyZ2V0ID0gX19iaW5kKHRoaXMucGFyc2VUYXJnZXQsIHRoaXMpO1xuICAgICAgdGhpcy5vYnNlcnZlID0gX19iaW5kKHRoaXMub2JzZXJ2ZSwgdGhpcyk7XG4gICAgICB0aGlzLnNldEJpbmRlciA9IF9fYmluZCh0aGlzLnNldEJpbmRlciwgdGhpcyk7XG4gICAgICB0aGlzLmZvcm1hdHRlcnMgPSB0aGlzLm9wdGlvbnMuZm9ybWF0dGVycyB8fCBbXTtcbiAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gW107XG4gICAgICB0aGlzLmZvcm1hdHRlck9ic2VydmVycyA9IHt9O1xuICAgICAgdGhpcy5tb2RlbCA9IHZvaWQgMDtcbiAgICAgIHRoaXMuc2V0QmluZGVyKCk7XG4gICAgfVxuXG4gICAgQmluZGluZy5wcm90b3R5cGUuc2V0QmluZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciwgcmVnZXhwLCB2YWx1ZSwgX3JlZjE7XG4gICAgICBpZiAoISh0aGlzLmJpbmRlciA9IHRoaXMudmlldy5iaW5kZXJzW3RoaXMudHlwZV0pKSB7XG4gICAgICAgIF9yZWYxID0gdGhpcy52aWV3LmJpbmRlcnM7XG4gICAgICAgIGZvciAoaWRlbnRpZmllciBpbiBfcmVmMSkge1xuICAgICAgICAgIHZhbHVlID0gX3JlZjFbaWRlbnRpZmllcl07XG4gICAgICAgICAgaWYgKGlkZW50aWZpZXIgIT09ICcqJyAmJiBpZGVudGlmaWVyLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IG5ldyBSZWdFeHAoXCJeXCIgKyAoaWRlbnRpZmllci5yZXBsYWNlKC9cXCovZywgJy4rJykpICsgXCIkXCIpO1xuICAgICAgICAgICAgaWYgKHJlZ2V4cC50ZXN0KHRoaXMudHlwZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5iaW5kZXIgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5hcmdzID0gbmV3IFJlZ0V4cChcIl5cIiArIChpZGVudGlmaWVyLnJlcGxhY2UoL1xcKi9nLCAnKC4rKScpKSArIFwiJFwiKS5leGVjKHRoaXMudHlwZSk7XG4gICAgICAgICAgICAgIHRoaXMuYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5iaW5kZXIgfHwgKHRoaXMuYmluZGVyID0gdGhpcy52aWV3LmJpbmRlcnNbJyonXSk7XG4gICAgICBpZiAodGhpcy5iaW5kZXIgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kZXIgPSB7XG4gICAgICAgICAgcm91dGluZTogdGhpcy5iaW5kZXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uKG9iaiwga2V5cGF0aCwgY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBSaXZldHMuc2lnaHRnbGFzcyhvYmosIGtleXBhdGgsIGNhbGxiYWNrLCB7XG4gICAgICAgIHJvb3Q6IHRoaXMudmlldy5yb290SW50ZXJmYWNlLFxuICAgICAgICBhZGFwdGVyczogdGhpcy52aWV3LmFkYXB0ZXJzXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUucGFyc2VUYXJnZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0b2tlbjtcbiAgICAgIHRva2VuID0gUml2ZXRzLlR5cGVQYXJzZXIucGFyc2UodGhpcy5rZXlwYXRoKTtcbiAgICAgIGlmICh0b2tlbi50eXBlID09PSBSaXZldHMuVHlwZVBhcnNlci50eXBlcy5wcmltaXRpdmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPSB0b2tlbi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmUodGhpcy52aWV3Lm1vZGVscywgdGhpcy5rZXlwYXRoLCB0aGlzLnN5bmMpO1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbCA9IHRoaXMub2JzZXJ2ZXIudGFyZ2V0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBCaW5kaW5nLnByb3RvdHlwZS5wYXJzZUZvcm1hdHRlckFyZ3VtZW50cyA9IGZ1bmN0aW9uKGFyZ3MsIGZvcm1hdHRlckluZGV4KSB7XG4gICAgICB2YXIgYWksIGFyZywgb2JzZXJ2ZXIsIHByb2Nlc3NlZEFyZ3MsIF9iYXNlLCBfaSwgX2xlbjtcbiAgICAgIGFyZ3MgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBfaSwgX2xlbiwgX3Jlc3VsdHM7XG4gICAgICAgIF9yZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gYXJncy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgIGFyZyA9IGFyZ3NbX2ldO1xuICAgICAgICAgIF9yZXN1bHRzLnB1c2goUml2ZXRzLlR5cGVQYXJzZXIucGFyc2UoYXJnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgfSkoKTtcbiAgICAgIHByb2Nlc3NlZEFyZ3MgPSBbXTtcbiAgICAgIGZvciAoYWkgPSBfaSA9IDAsIF9sZW4gPSBhcmdzLmxlbmd0aDsgX2kgPCBfbGVuOyBhaSA9ICsrX2kpIHtcbiAgICAgICAgYXJnID0gYXJnc1thaV07XG4gICAgICAgIHByb2Nlc3NlZEFyZ3MucHVzaChhcmcudHlwZSA9PT0gUml2ZXRzLlR5cGVQYXJzZXIudHlwZXMucHJpbWl0aXZlID8gYXJnLnZhbHVlIDogKChfYmFzZSA9IHRoaXMuZm9ybWF0dGVyT2JzZXJ2ZXJzKVtmb3JtYXR0ZXJJbmRleF0gfHwgKF9iYXNlW2Zvcm1hdHRlckluZGV4XSA9IHt9KSwgIShvYnNlcnZlciA9IHRoaXMuZm9ybWF0dGVyT2JzZXJ2ZXJzW2Zvcm1hdHRlckluZGV4XVthaV0pID8gKG9ic2VydmVyID0gdGhpcy5vYnNlcnZlKHRoaXMudmlldy5tb2RlbHMsIGFyZy52YWx1ZSwgdGhpcy5zeW5jKSwgdGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnNbZm9ybWF0dGVySW5kZXhdW2FpXSA9IG9ic2VydmVyKSA6IHZvaWQgMCwgb2JzZXJ2ZXIudmFsdWUoKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2Nlc3NlZEFyZ3M7XG4gICAgfTtcblxuICAgIEJpbmRpbmcucHJvdG90eXBlLmZvcm1hdHRlZFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBhcmdzLCBmaSwgZm9ybWF0dGVyLCBpZCwgcHJvY2Vzc2VkQXJncywgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMjtcbiAgICAgIF9yZWYxID0gdGhpcy5mb3JtYXR0ZXJzO1xuICAgICAgZm9yIChmaSA9IF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBmaSA9ICsrX2kpIHtcbiAgICAgICAgZm9ybWF0dGVyID0gX3JlZjFbZmldO1xuICAgICAgICBhcmdzID0gZm9ybWF0dGVyLm1hdGNoKC9bXlxccyddK3wnKFteJ118J1teXFxzXSkqJ3xcIihbXlwiXXxcIlteXFxzXSkqXCIvZyk7XG4gICAgICAgIGlkID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBmb3JtYXR0ZXIgPSB0aGlzLnZpZXcuZm9ybWF0dGVyc1tpZF07XG4gICAgICAgIHByb2Nlc3NlZEFyZ3MgPSB0aGlzLnBhcnNlRm9ybWF0dGVyQXJndW1lbnRzKGFyZ3MsIGZpKTtcbiAgICAgICAgaWYgKChmb3JtYXR0ZXIgIT0gbnVsbCA/IGZvcm1hdHRlci5yZWFkIDogdm9pZCAwKSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgdmFsdWUgPSAoX3JlZjIgPSBmb3JtYXR0ZXIucmVhZCkuY2FsbC5hcHBseShfcmVmMiwgW3RoaXMubW9kZWwsIHZhbHVlXS5jb25jYXQoX19zbGljZS5jYWxsKHByb2Nlc3NlZEFyZ3MpKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0dGVyIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICB2YWx1ZSA9IGZvcm1hdHRlci5jYWxsLmFwcGx5KGZvcm1hdHRlciwgW3RoaXMubW9kZWwsIHZhbHVlXS5jb25jYXQoX19zbGljZS5jYWxsKHByb2Nlc3NlZEFyZ3MpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUuZXZlbnRIYW5kbGVyID0gZnVuY3Rpb24oZm4pIHtcbiAgICAgIHZhciBiaW5kaW5nLCBoYW5kbGVyO1xuICAgICAgaGFuZGxlciA9IChiaW5kaW5nID0gdGhpcykudmlldy5oYW5kbGVyO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmNhbGwoZm4sIHRoaXMsIGV2LCBiaW5kaW5nKTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIEJpbmRpbmcucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgX3JlZjE7XG4gICAgICB2YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgIXRoaXMuYmluZGVyW1wiZnVuY3Rpb25cIl0gJiYgUml2ZXRzW1wicHVibGljXCJdLmV4ZWN1dGVGdW5jdGlvbnMgPyB0aGlzLmZvcm1hdHRlZFZhbHVlKHZhbHVlLmNhbGwodGhpcy5tb2RlbCkpIDogdGhpcy5mb3JtYXR0ZWRWYWx1ZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gKF9yZWYxID0gdGhpcy5iaW5kZXIucm91dGluZSkgIT0gbnVsbCA/IF9yZWYxLmNhbGwodGhpcywgdGhpcy5lbCwgdmFsdWUpIDogdm9pZCAwO1xuICAgIH07XG5cbiAgICBCaW5kaW5nLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZGVwZW5kZW5jeSwgb2JzZXJ2ZXI7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgX2ksIF9qLCBfbGVuLCBfbGVuMSwgX3JlZjEsIF9yZWYyLCBfcmVmMztcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5tb2RlbCAhPT0gdGhpcy5vYnNlcnZlci50YXJnZXQpIHtcbiAgICAgICAgICAgIF9yZWYxID0gdGhpcy5kZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyID0gX3JlZjFbX2ldO1xuICAgICAgICAgICAgICBvYnNlcnZlci51bm9ic2VydmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gW107XG4gICAgICAgICAgICBpZiAoKCh0aGlzLm1vZGVsID0gdGhpcy5vYnNlcnZlci50YXJnZXQpICE9IG51bGwpICYmICgoX3JlZjIgPSB0aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzKSAhPSBudWxsID8gX3JlZjIubGVuZ3RoIDogdm9pZCAwKSkge1xuICAgICAgICAgICAgICBfcmVmMyA9IHRoaXMub3B0aW9ucy5kZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgIGZvciAoX2ogPSAwLCBfbGVuMSA9IF9yZWYzLmxlbmd0aDsgX2ogPCBfbGVuMTsgX2orKykge1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgPSBfcmVmM1tfal07XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmUodGhpcy5tb2RlbCwgZGVwZW5kZW5jeSwgdGhpcy5zeW5jKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llcy5wdXNoKG9ic2VydmVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlci52YWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KS5jYWxsKHRoaXMpKTtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUucHVibGlzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGFyZ3MsIGZpLCBmaVJldmVyc2VkLCBmb3JtYXR0ZXIsIGlkLCBsYXN0Zm9ybWF0dGVySW5kZXgsIHByb2Nlc3NlZEFyZ3MsIHZhbHVlLCBfaSwgX2xlbiwgX3JlZjEsIF9yZWYyLCBfcmVmMztcbiAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSh0aGlzLmVsKTtcbiAgICAgICAgbGFzdGZvcm1hdHRlckluZGV4ID0gdGhpcy5mb3JtYXR0ZXJzLmxlbmd0aCAtIDE7XG4gICAgICAgIF9yZWYxID0gdGhpcy5mb3JtYXR0ZXJzLnNsaWNlKDApLnJldmVyc2UoKTtcbiAgICAgICAgZm9yIChmaVJldmVyc2VkID0gX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IGZpUmV2ZXJzZWQgPSArK19pKSB7XG4gICAgICAgICAgZm9ybWF0dGVyID0gX3JlZjFbZmlSZXZlcnNlZF07XG4gICAgICAgICAgZmkgPSBsYXN0Zm9ybWF0dGVySW5kZXggLSBmaVJldmVyc2VkO1xuICAgICAgICAgIGFyZ3MgPSBmb3JtYXR0ZXIuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICBwcm9jZXNzZWRBcmdzID0gdGhpcy5wYXJzZUZvcm1hdHRlckFyZ3VtZW50cyhhcmdzLCBmaSk7XG4gICAgICAgICAgaWYgKChfcmVmMiA9IHRoaXMudmlldy5mb3JtYXR0ZXJzW2lkXSkgIT0gbnVsbCA/IF9yZWYyLnB1Ymxpc2ggOiB2b2lkIDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gKF9yZWYzID0gdGhpcy52aWV3LmZvcm1hdHRlcnNbaWRdKS5wdWJsaXNoLmFwcGx5KF9yZWYzLCBbdmFsdWVdLmNvbmNhdChfX3NsaWNlLmNhbGwocHJvY2Vzc2VkQXJncykpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBCaW5kaW5nLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZGVwZW5kZW5jeSwgb2JzZXJ2ZXIsIF9pLCBfbGVuLCBfcmVmMSwgX3JlZjIsIF9yZWYzO1xuICAgICAgdGhpcy5wYXJzZVRhcmdldCgpO1xuICAgICAgaWYgKChfcmVmMSA9IHRoaXMuYmluZGVyLmJpbmQpICE9IG51bGwpIHtcbiAgICAgICAgX3JlZjEuY2FsbCh0aGlzLCB0aGlzLmVsKTtcbiAgICAgIH1cbiAgICAgIGlmICgodGhpcy5tb2RlbCAhPSBudWxsKSAmJiAoKF9yZWYyID0gdGhpcy5vcHRpb25zLmRlcGVuZGVuY2llcykgIT0gbnVsbCA/IF9yZWYyLmxlbmd0aCA6IHZvaWQgMCkpIHtcbiAgICAgICAgX3JlZjMgPSB0aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzO1xuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYzLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgZGVwZW5kZW5jeSA9IF9yZWYzW19pXTtcbiAgICAgICAgICBvYnNlcnZlciA9IHRoaXMub2JzZXJ2ZSh0aGlzLm1vZGVsLCBkZXBlbmRlbmN5LCB0aGlzLnN5bmMpO1xuICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLnB1c2gob2JzZXJ2ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52aWV3LnByZWxvYWREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUudW5iaW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYWksIGFyZ3MsIGZpLCBvYnNlcnZlciwgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZWY0O1xuICAgICAgaWYgKChfcmVmMSA9IHRoaXMuYmluZGVyLnVuYmluZCkgIT0gbnVsbCkge1xuICAgICAgICBfcmVmMS5jYWxsKHRoaXMsIHRoaXMuZWwpO1xuICAgICAgfVxuICAgICAgaWYgKChfcmVmMiA9IHRoaXMub2JzZXJ2ZXIpICE9IG51bGwpIHtcbiAgICAgICAgX3JlZjIudW5vYnNlcnZlKCk7XG4gICAgICB9XG4gICAgICBfcmVmMyA9IHRoaXMuZGVwZW5kZW5jaWVzO1xuICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICBvYnNlcnZlciA9IF9yZWYzW19pXTtcbiAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IFtdO1xuICAgICAgX3JlZjQgPSB0aGlzLmZvcm1hdHRlck9ic2VydmVycztcbiAgICAgIGZvciAoZmkgaW4gX3JlZjQpIHtcbiAgICAgICAgYXJncyA9IF9yZWY0W2ZpXTtcbiAgICAgICAgZm9yIChhaSBpbiBhcmdzKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIgPSBhcmdzW2FpXTtcbiAgICAgICAgICBvYnNlcnZlci51bm9ic2VydmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVyT2JzZXJ2ZXJzID0ge307XG4gICAgfTtcblxuICAgIEJpbmRpbmcucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1vZGVscykge1xuICAgICAgdmFyIF9yZWYxLCBfcmVmMjtcbiAgICAgIGlmIChtb2RlbHMgPT0gbnVsbCkge1xuICAgICAgICBtb2RlbHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIHRoaXMubW9kZWwgPSAoX3JlZjEgPSB0aGlzLm9ic2VydmVyKSAhPSBudWxsID8gX3JlZjEudGFyZ2V0IDogdm9pZCAwO1xuICAgICAgcmV0dXJuIChfcmVmMiA9IHRoaXMuYmluZGVyLnVwZGF0ZSkgIT0gbnVsbCA/IF9yZWYyLmNhbGwodGhpcywgbW9kZWxzKSA6IHZvaWQgMDtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbihlbCkge1xuICAgICAgaWYgKHRoaXMuYmluZGVyICYmICh0aGlzLmJpbmRlci5nZXRWYWx1ZSAhPSBudWxsKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kZXIuZ2V0VmFsdWUuY2FsbCh0aGlzLCBlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUml2ZXRzLlV0aWwuZ2V0SW5wdXRWYWx1ZShlbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBCaW5kaW5nO1xuXG4gIH0pKCk7XG5cbiAgUml2ZXRzLkNvbXBvbmVudEJpbmRpbmcgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbXBvbmVudEJpbmRpbmcsIF9zdXBlcik7XG5cbiAgICBmdW5jdGlvbiBDb21wb25lbnRCaW5kaW5nKHZpZXcsIGVsLCB0eXBlKSB7XG4gICAgICB2YXIgYXR0cmlidXRlLCBiaW5kaW5nUmVnRXhwLCBwcm9wZXJ0eU5hbWUsIHRva2VuLCBfaSwgX2xlbiwgX3JlZjEsIF9yZWYyO1xuICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICB0aGlzLnVuYmluZCA9IF9fYmluZCh0aGlzLnVuYmluZCwgdGhpcyk7XG4gICAgICB0aGlzLmJpbmQgPSBfX2JpbmQodGhpcy5iaW5kLCB0aGlzKTtcbiAgICAgIHRoaXMubG9jYWxzID0gX19iaW5kKHRoaXMubG9jYWxzLCB0aGlzKTtcbiAgICAgIHRoaXMuY29tcG9uZW50ID0gdGhpcy52aWV3LmNvbXBvbmVudHNbdGhpcy50eXBlXTtcbiAgICAgIHRoaXNbXCJzdGF0aWNcIl0gPSB7fTtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzID0ge307XG4gICAgICB0aGlzLnVwc3RyZWFtT2JzZXJ2ZXJzID0ge307XG4gICAgICBiaW5kaW5nUmVnRXhwID0gdmlldy5iaW5kaW5nUmVnRXhwKCk7XG4gICAgICBfcmVmMSA9IHRoaXMuZWwuYXR0cmlidXRlcyB8fCBbXTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYXR0cmlidXRlID0gX3JlZjFbX2ldO1xuICAgICAgICBpZiAoIWJpbmRpbmdSZWdFeHAudGVzdChhdHRyaWJ1dGUubmFtZSkpIHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSB0aGlzLmNhbWVsQ2FzZShhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgdG9rZW4gPSBSaXZldHMuVHlwZVBhcnNlci5wYXJzZShhdHRyaWJ1dGUudmFsdWUpO1xuICAgICAgICAgIGlmIChfX2luZGV4T2YuY2FsbCgoX3JlZjIgPSB0aGlzLmNvbXBvbmVudFtcInN0YXRpY1wiXSkgIT0gbnVsbCA/IF9yZWYyIDogW10sIHByb3BlcnR5TmFtZSkgPj0gMCkge1xuICAgICAgICAgICAgdGhpc1tcInN0YXRpY1wiXVtwcm9wZXJ0eU5hbWVdID0gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gUml2ZXRzLlR5cGVQYXJzZXIudHlwZXMucHJpbWl0aXZlKSB7XG4gICAgICAgICAgICB0aGlzW1wic3RhdGljXCJdW3Byb3BlcnR5TmFtZV0gPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnNbcHJvcGVydHlOYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb21wb25lbnRCaW5kaW5nLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7fTtcblxuICAgIENvbXBvbmVudEJpbmRpbmcucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge307XG5cbiAgICBDb21wb25lbnRCaW5kaW5nLnByb3RvdHlwZS5wdWJsaXNoID0gZnVuY3Rpb24oKSB7fTtcblxuICAgIENvbXBvbmVudEJpbmRpbmcucHJvdG90eXBlLmxvY2FscyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGtleSwgb2JzZXJ2ZXIsIHJlc3VsdCwgdmFsdWUsIF9yZWYxLCBfcmVmMjtcbiAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgX3JlZjEgPSB0aGlzW1wic3RhdGljXCJdO1xuICAgICAgZm9yIChrZXkgaW4gX3JlZjEpIHtcbiAgICAgICAgdmFsdWUgPSBfcmVmMVtrZXldO1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgX3JlZjIgPSB0aGlzLm9ic2VydmVycztcbiAgICAgIGZvciAoa2V5IGluIF9yZWYyKSB7XG4gICAgICAgIG9ic2VydmVyID0gX3JlZjJba2V5XTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBvYnNlcnZlci52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgQ29tcG9uZW50QmluZGluZy5wcm90b3R5cGUuY2FtZWxDYXNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLy0oW2Etel0pL2csIGZ1bmN0aW9uKGdyb3VwZWQpIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwZWRbMV0udG9VcHBlckNhc2UoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDb21wb25lbnRCaW5kaW5nLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaywga2V5LCBrZXlwYXRoLCBvYnNlcnZlciwgb3B0aW9uLCBvcHRpb25zLCBzY29wZSwgdiwgX2Jhc2UsIF9pLCBfaiwgX2xlbiwgX2xlbjEsIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZWY0LCBfcmVmNSwgX3JlZjYsIF9yZWY3O1xuICAgICAgaWYgKCF0aGlzLmJvdW5kKSB7XG4gICAgICAgIF9yZWYxID0gdGhpcy5vYnNlcnZlcnM7XG4gICAgICAgIGZvciAoa2V5IGluIF9yZWYxKSB7XG4gICAgICAgICAga2V5cGF0aCA9IF9yZWYxW2tleV07XG4gICAgICAgICAgdGhpcy5vYnNlcnZlcnNba2V5XSA9IHRoaXMub2JzZXJ2ZSh0aGlzLnZpZXcubW9kZWxzLCBrZXlwYXRoLCAoKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuY29tcG9uZW50Vmlldy5tb2RlbHNba2V5XSA9IF90aGlzLm9ic2VydmVyc1trZXldLnZhbHVlKCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKHRoaXMpKS5jYWxsKHRoaXMsIGtleSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm91bmQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50VmlldyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Vmlldy5iaW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsLmlubmVySFRNTCA9IHRoaXMuY29tcG9uZW50LnRlbXBsYXRlLmNhbGwodGhpcyk7XG4gICAgICAgIHNjb3BlID0gdGhpcy5jb21wb25lbnQuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMuZWwsIHRoaXMubG9jYWxzKCkpO1xuICAgICAgICB0aGlzLmVsLl9ib3VuZCA9IHRydWU7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgX3JlZjIgPSBSaXZldHMuZXh0ZW5zaW9ucztcbiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgIG9wdGlvbiA9IF9yZWYyW19pXTtcbiAgICAgICAgICBvcHRpb25zW29wdGlvbl0gPSB7fTtcbiAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRbb3B0aW9uXSkge1xuICAgICAgICAgICAgX3JlZjMgPSB0aGlzLmNvbXBvbmVudFtvcHRpb25dO1xuICAgICAgICAgICAgZm9yIChrIGluIF9yZWYzKSB7XG4gICAgICAgICAgICAgIHYgPSBfcmVmM1trXTtcbiAgICAgICAgICAgICAgb3B0aW9uc1tvcHRpb25dW2tdID0gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgX3JlZjQgPSB0aGlzLnZpZXdbb3B0aW9uXTtcbiAgICAgICAgICBmb3IgKGsgaW4gX3JlZjQpIHtcbiAgICAgICAgICAgIHYgPSBfcmVmNFtrXTtcbiAgICAgICAgICAgIGlmICgoX2Jhc2UgPSBvcHRpb25zW29wdGlvbl0pW2tdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgX2Jhc2Vba10gPSB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfcmVmNSA9IFJpdmV0cy5vcHRpb25zO1xuICAgICAgICBmb3IgKF9qID0gMCwgX2xlbjEgPSBfcmVmNS5sZW5ndGg7IF9qIDwgX2xlbjE7IF9qKyspIHtcbiAgICAgICAgICBvcHRpb24gPSBfcmVmNVtfal07XG4gICAgICAgICAgb3B0aW9uc1tvcHRpb25dID0gKF9yZWY2ID0gdGhpcy5jb21wb25lbnRbb3B0aW9uXSkgIT0gbnVsbCA/IF9yZWY2IDogdGhpcy52aWV3W29wdGlvbl07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21wb25lbnRWaWV3ID0gbmV3IFJpdmV0cy5WaWV3KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuZWwuY2hpbGROb2RlcyksIHNjb3BlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRWaWV3LmJpbmQoKTtcbiAgICAgICAgX3JlZjcgPSB0aGlzLm9ic2VydmVycztcbiAgICAgICAgZm9yIChrZXkgaW4gX3JlZjcpIHtcbiAgICAgICAgICBvYnNlcnZlciA9IF9yZWY3W2tleV07XG4gICAgICAgICAgdGhpcy51cHN0cmVhbU9ic2VydmVyc1trZXldID0gdGhpcy5vYnNlcnZlKHRoaXMuY29tcG9uZW50Vmlldy5tb2RlbHMsIGtleSwgKChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5zZXRWYWx1ZShfdGhpcy5jb21wb25lbnRWaWV3Lm1vZGVsc1trZXldKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkodGhpcykpLmNhbGwodGhpcywga2V5LCBvYnNlcnZlcikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIENvbXBvbmVudEJpbmRpbmcucHJvdG90eXBlLnVuYmluZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGtleSwgb2JzZXJ2ZXIsIF9yZWYxLCBfcmVmMiwgX3JlZjM7XG4gICAgICBfcmVmMSA9IHRoaXMudXBzdHJlYW1PYnNlcnZlcnM7XG4gICAgICBmb3IgKGtleSBpbiBfcmVmMSkge1xuICAgICAgICBvYnNlcnZlciA9IF9yZWYxW2tleV07XG4gICAgICAgIG9ic2VydmVyLnVub2JzZXJ2ZSgpO1xuICAgICAgfVxuICAgICAgX3JlZjIgPSB0aGlzLm9ic2VydmVycztcbiAgICAgIGZvciAoa2V5IGluIF9yZWYyKSB7XG4gICAgICAgIG9ic2VydmVyID0gX3JlZjJba2V5XTtcbiAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKF9yZWYzID0gdGhpcy5jb21wb25lbnRWaWV3KSAhPSBudWxsID8gX3JlZjMudW5iaW5kLmNhbGwodGhpcykgOiB2b2lkIDA7XG4gICAgfTtcblxuICAgIHJldHVybiBDb21wb25lbnRCaW5kaW5nO1xuXG4gIH0pKFJpdmV0cy5CaW5kaW5nKTtcblxuICBSaXZldHMuVGV4dEJpbmRpbmcgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRleHRCaW5kaW5nLCBfc3VwZXIpO1xuXG4gICAgZnVuY3Rpb24gVGV4dEJpbmRpbmcodmlldywgZWwsIHR5cGUsIGtleXBhdGgsIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICB0aGlzLmVsID0gZWw7XG4gICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgdGhpcy5rZXlwYXRoID0ga2V5cGF0aDtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMgOiB7fTtcbiAgICAgIHRoaXMuc3luYyA9IF9fYmluZCh0aGlzLnN5bmMsIHRoaXMpO1xuICAgICAgdGhpcy5mb3JtYXR0ZXJzID0gdGhpcy5vcHRpb25zLmZvcm1hdHRlcnMgfHwgW107XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IFtdO1xuICAgICAgdGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnMgPSB7fTtcbiAgICB9XG5cbiAgICBUZXh0QmluZGluZy5wcm90b3R5cGUuYmluZGVyID0ge1xuICAgICAgcm91dGluZTogZnVuY3Rpb24obm9kZSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuZGF0YSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICcnO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBUZXh0QmluZGluZy5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIFRleHRCaW5kaW5nLl9fc3VwZXJfXy5zeW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIHJldHVybiBUZXh0QmluZGluZztcblxuICB9KShSaXZldHMuQmluZGluZyk7XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnMudGV4dCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgIGlmIChlbC50ZXh0Q29udGVudCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZWwudGV4dENvbnRlbnQgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsLmlubmVyVGV4dCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICcnO1xuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy5odG1sID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGVsLmlubmVySFRNTCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICcnO1xuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzLnNob3cgPSBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICByZXR1cm4gZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gJycgOiAnbm9uZSc7XG4gIH07XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnMuaGlkZSA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgIHJldHVybiBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyAnbm9uZScgOiAnJztcbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy5lbmFibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGVsLmRpc2FibGVkID0gIXZhbHVlO1xuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGVsLmRpc2FibGVkID0gISF2YWx1ZTtcbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy5jaGVja2VkID0ge1xuICAgIHB1Ymxpc2hlczogdHJ1ZSxcbiAgICBwcmlvcml0eTogMjAwMCxcbiAgICBiaW5kOiBmdW5jdGlvbihlbCkge1xuICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLmJpbmRFdmVudChlbCwgJ2NoYW5nZScsIHRoaXMucHVibGlzaCk7XG4gICAgfSxcbiAgICB1bmJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICByZXR1cm4gUml2ZXRzLlV0aWwudW5iaW5kRXZlbnQoZWwsICdjaGFuZ2UnLCB0aGlzLnB1Ymxpc2gpO1xuICAgIH0sXG4gICAgcm91dGluZTogZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgICB2YXIgX3JlZjE7XG4gICAgICBpZiAoZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWwuY2hlY2tlZCA9ICgoX3JlZjEgPSBlbC52YWx1ZSkgIT0gbnVsbCA/IF9yZWYxLnRvU3RyaW5nKCkgOiB2b2lkIDApID09PSAodmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiB2b2lkIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsLmNoZWNrZWQgPSAhIXZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy51bmNoZWNrZWQgPSB7XG4gICAgcHVibGlzaGVzOiB0cnVlLFxuICAgIHByaW9yaXR5OiAyMDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICByZXR1cm4gUml2ZXRzLlV0aWwuYmluZEV2ZW50KGVsLCAnY2hhbmdlJywgdGhpcy5wdWJsaXNoKTtcbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIHJldHVybiBSaXZldHMuVXRpbC51bmJpbmRFdmVudChlbCwgJ2NoYW5nZScsIHRoaXMucHVibGlzaCk7XG4gICAgfSxcbiAgICByb3V0aW5lOiBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICAgIHZhciBfcmVmMTtcbiAgICAgIGlmIChlbC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbC5jaGVja2VkID0gKChfcmVmMSA9IGVsLnZhbHVlKSAhPSBudWxsID8gX3JlZjEudG9TdHJpbmcoKSA6IHZvaWQgMCkgIT09ICh2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHZvaWQgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWwuY2hlY2tlZCA9ICF2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnMudmFsdWUgPSB7XG4gICAgcHVibGlzaGVzOiB0cnVlLFxuICAgIHByaW9yaXR5OiAzMDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICBpZiAoIShlbC50YWdOYW1lID09PSAnSU5QVVQnICYmIGVsLnR5cGUgPT09ICdyYWRpbycpKSB7XG4gICAgICAgIHRoaXMuZXZlbnQgPSBlbC50YWdOYW1lID09PSAnU0VMRUNUJyA/ICdjaGFuZ2UnIDogJ2lucHV0JztcbiAgICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLmJpbmRFdmVudChlbCwgdGhpcy5ldmVudCwgdGhpcy5wdWJsaXNoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIGlmICghKGVsLnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZWwudHlwZSA9PT0gJ3JhZGlvJykpIHtcbiAgICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLnVuYmluZEV2ZW50KGVsLCB0aGlzLmV2ZW50LCB0aGlzLnB1Ymxpc2gpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcm91dGluZTogZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgICB2YXIgbywgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZXN1bHRzO1xuICAgICAgaWYgKGVsLnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWwuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAod2luZG93LmpRdWVyeSAhPSBudWxsKSB7XG4gICAgICAgIGVsID0galF1ZXJ5KGVsKTtcbiAgICAgICAgaWYgKCh2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHZvaWQgMCkgIT09ICgoX3JlZjEgPSBlbC52YWwoKSkgIT0gbnVsbCA/IF9yZWYxLnRvU3RyaW5nKCkgOiB2b2lkIDApKSB7XG4gICAgICAgICAgcmV0dXJuIGVsLnZhbCh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChlbC50eXBlID09PSAnc2VsZWN0LW11bHRpcGxlJykge1xuICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBfcmVzdWx0cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBlbC5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICBvID0gZWxbX2ldO1xuICAgICAgICAgICAgICBfcmVzdWx0cy5wdXNoKG8uc2VsZWN0ZWQgPSAoX3JlZjIgPSBvLnZhbHVlLCBfX2luZGV4T2YuY2FsbCh2YWx1ZSwgX3JlZjIpID49IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfcmVzdWx0cztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogdm9pZCAwKSAhPT0gKChfcmVmMyA9IGVsLnZhbHVlKSAhPSBudWxsID8gX3JlZjMudG9TdHJpbmcoKSA6IHZvaWQgMCkpIHtcbiAgICAgICAgICByZXR1cm4gZWwudmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVyc1tcImlmXCJdID0ge1xuICAgIGJsb2NrOiB0cnVlLFxuICAgIHByaW9yaXR5OiA0MDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICB2YXIgYXR0ciwgZGVjbGFyYXRpb247XG4gICAgICBpZiAodGhpcy5tYXJrZXIgPT0gbnVsbCkge1xuICAgICAgICBhdHRyID0gW3RoaXMudmlldy5wcmVmaXgsIHRoaXMudHlwZV0uam9pbignLScpLnJlcGxhY2UoJy0tJywgJy0nKTtcbiAgICAgICAgZGVjbGFyYXRpb24gPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cik7XG4gICAgICAgIHRoaXMubWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIiByaXZldHM6IFwiICsgdGhpcy50eXBlICsgXCIgXCIgKyBkZWNsYXJhdGlvbiArIFwiIFwiKTtcbiAgICAgICAgdGhpcy5ib3VuZCA9IGZhbHNlO1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICAgIGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubWFya2VyLCBlbCk7XG4gICAgICAgIHJldHVybiBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5uZXN0ZWQpIHtcbiAgICAgICAgdGhpcy5uZXN0ZWQudW5iaW5kKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmJvdW5kID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgICByb3V0aW5lOiBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICAgIHZhciBrZXksIG1vZGVsLCBtb2RlbHMsIF9yZWYxO1xuICAgICAgaWYgKCEhdmFsdWUgPT09ICF0aGlzLmJvdW5kKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIG1vZGVscyA9IHt9O1xuICAgICAgICAgIF9yZWYxID0gdGhpcy52aWV3Lm1vZGVscztcbiAgICAgICAgICBmb3IgKGtleSBpbiBfcmVmMSkge1xuICAgICAgICAgICAgbW9kZWwgPSBfcmVmMVtrZXldO1xuICAgICAgICAgICAgbW9kZWxzW2tleV0gPSBtb2RlbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgKHRoaXMubmVzdGVkIHx8ICh0aGlzLm5lc3RlZCA9IG5ldyBSaXZldHMuVmlldyhlbCwgbW9kZWxzLCB0aGlzLnZpZXcub3B0aW9ucygpKSkpLmJpbmQoKTtcbiAgICAgICAgICB0aGlzLm1hcmtlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbCwgdGhpcy5tYXJrZXIubmV4dFNpYmxpbmcpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmJvdW5kID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICB0aGlzLm5lc3RlZC51bmJpbmQoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ib3VuZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGU6IGZ1bmN0aW9uKG1vZGVscykge1xuICAgICAgdmFyIF9yZWYxO1xuICAgICAgcmV0dXJuIChfcmVmMSA9IHRoaXMubmVzdGVkKSAhPSBudWxsID8gX3JlZjEudXBkYXRlKG1vZGVscykgOiB2b2lkIDA7XG4gICAgfVxuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzLnVubGVzcyA9IHtcbiAgICBibG9jazogdHJ1ZSxcbiAgICBwcmlvcml0eTogNDAwMCxcbiAgICBiaW5kOiBmdW5jdGlvbihlbCkge1xuICAgICAgcmV0dXJuIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzW1wiaWZcIl0uYmluZC5jYWxsKHRoaXMsIGVsKTtcbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnNbXCJpZlwiXS51bmJpbmQuY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIHJvdXRpbmU6IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzW1wiaWZcIl0ucm91dGluZS5jYWxsKHRoaXMsIGVsLCAhdmFsdWUpO1xuICAgIH0sXG4gICAgdXBkYXRlOiBmdW5jdGlvbihtb2RlbHMpIHtcbiAgICAgIHJldHVybiBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVyc1tcImlmXCJdLnVwZGF0ZS5jYWxsKHRoaXMsIG1vZGVscyk7XG4gICAgfVxuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzWydvbi0qJ10gPSB7XG4gICAgXCJmdW5jdGlvblwiOiB0cnVlLFxuICAgIHByaW9yaXR5OiAxMDAwLFxuICAgIHVuYmluZDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIGlmICh0aGlzLmhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLnVuYmluZEV2ZW50KGVsLCB0aGlzLmFyZ3NbMF0sIHRoaXMuaGFuZGxlcik7XG4gICAgICB9XG4gICAgfSxcbiAgICByb3V0aW5lOiBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmhhbmRsZXIpIHtcbiAgICAgICAgUml2ZXRzLlV0aWwudW5iaW5kRXZlbnQoZWwsIHRoaXMuYXJnc1swXSwgdGhpcy5oYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSaXZldHMuVXRpbC5iaW5kRXZlbnQoZWwsIHRoaXMuYXJnc1swXSwgdGhpcy5oYW5kbGVyID0gdGhpcy5ldmVudEhhbmRsZXIodmFsdWUpKTtcbiAgICB9XG4gIH07XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnNbJ2VhY2gtKiddID0ge1xuICAgIGJsb2NrOiB0cnVlLFxuICAgIHByaW9yaXR5OiA0MDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICB2YXIgYXR0ciwgdmlldywgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgaWYgKHRoaXMubWFya2VyID09IG51bGwpIHtcbiAgICAgICAgYXR0ciA9IFt0aGlzLnZpZXcucHJlZml4LCB0aGlzLnR5cGVdLmpvaW4oJy0nKS5yZXBsYWNlKCctLScsICctJyk7XG4gICAgICAgIHRoaXMubWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIiByaXZldHM6IFwiICsgdGhpcy50eXBlICsgXCIgXCIpO1xuICAgICAgICB0aGlzLml0ZXJhdGVkID0gW107XG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5tYXJrZXIsIGVsKTtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfcmVmMSA9IHRoaXMuaXRlcmF0ZWQ7XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICB2aWV3ID0gX3JlZjFbX2ldO1xuICAgICAgICAgIHZpZXcuYmluZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB1bmJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICB2YXIgdmlldywgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgaWYgKHRoaXMuaXRlcmF0ZWQgIT0gbnVsbCkge1xuICAgICAgICBfcmVmMSA9IHRoaXMuaXRlcmF0ZWQ7XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICB2aWV3ID0gX3JlZjFbX2ldO1xuICAgICAgICAgIHZpZXcudW5iaW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHJvdXRpbmU6IGZ1bmN0aW9uKGVsLCBjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgYmluZGluZywgZGF0YSwgaSwgaW5kZXgsIGtleSwgbW9kZWwsIG1vZGVsTmFtZSwgb3B0aW9ucywgcHJldmlvdXMsIHRlbXBsYXRlLCB2aWV3LCBfaSwgX2osIF9rLCBfbGVuLCBfbGVuMSwgX2xlbjIsIF9yZWYxLCBfcmVmMiwgX3JlZjM7XG4gICAgICBtb2RlbE5hbWUgPSB0aGlzLmFyZ3NbMF07XG4gICAgICBjb2xsZWN0aW9uID0gY29sbGVjdGlvbiB8fCBbXTtcbiAgICAgIGlmICh0aGlzLml0ZXJhdGVkLmxlbmd0aCA+IGNvbGxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgIF9yZWYxID0gQXJyYXkodGhpcy5pdGVyYXRlZC5sZW5ndGggLSBjb2xsZWN0aW9uLmxlbmd0aCk7XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICBpID0gX3JlZjFbX2ldO1xuICAgICAgICAgIHZpZXcgPSB0aGlzLml0ZXJhdGVkLnBvcCgpO1xuICAgICAgICAgIHZpZXcudW5iaW5kKCk7XG4gICAgICAgICAgdGhpcy5tYXJrZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2aWV3LmVsc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoaW5kZXggPSBfaiA9IDAsIF9sZW4xID0gY29sbGVjdGlvbi5sZW5ndGg7IF9qIDwgX2xlbjE7IGluZGV4ID0gKytfaikge1xuICAgICAgICBtb2RlbCA9IGNvbGxlY3Rpb25baW5kZXhdO1xuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICB9O1xuICAgICAgICBkYXRhW1JpdmV0c1tcInB1YmxpY1wiXS5pdGVyYXRpb25BbGlhcyhtb2RlbE5hbWUpXSA9IGluZGV4O1xuICAgICAgICBkYXRhW21vZGVsTmFtZV0gPSBtb2RlbDtcbiAgICAgICAgaWYgKHRoaXMuaXRlcmF0ZWRbaW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICBfcmVmMiA9IHRoaXMudmlldy5tb2RlbHM7XG4gICAgICAgICAgZm9yIChrZXkgaW4gX3JlZjIpIHtcbiAgICAgICAgICAgIG1vZGVsID0gX3JlZjJba2V5XTtcbiAgICAgICAgICAgIGlmIChkYXRhW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICBkYXRhW2tleV0gPSBtb2RlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcHJldmlvdXMgPSB0aGlzLml0ZXJhdGVkLmxlbmd0aCA/IHRoaXMuaXRlcmF0ZWRbdGhpcy5pdGVyYXRlZC5sZW5ndGggLSAxXS5lbHNbMF0gOiB0aGlzLm1hcmtlcjtcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy52aWV3Lm9wdGlvbnMoKTtcbiAgICAgICAgICBvcHRpb25zLnByZWxvYWREYXRhID0gdHJ1ZTtcbiAgICAgICAgICB0ZW1wbGF0ZSA9IGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICB2aWV3ID0gbmV3IFJpdmV0cy5WaWV3KHRlbXBsYXRlLCBkYXRhLCBvcHRpb25zKTtcbiAgICAgICAgICB2aWV3LmJpbmQoKTtcbiAgICAgICAgICB0aGlzLml0ZXJhdGVkLnB1c2godmlldyk7XG4gICAgICAgICAgdGhpcy5tYXJrZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGVtcGxhdGUsIHByZXZpb3VzLm5leHRTaWJsaW5nKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLml0ZXJhdGVkW2luZGV4XS5tb2RlbHNbbW9kZWxOYW1lXSAhPT0gbW9kZWwpIHtcbiAgICAgICAgICB0aGlzLml0ZXJhdGVkW2luZGV4XS51cGRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgX3JlZjMgPSB0aGlzLnZpZXcuYmluZGluZ3M7XG4gICAgICAgIGZvciAoX2sgPSAwLCBfbGVuMiA9IF9yZWYzLmxlbmd0aDsgX2sgPCBfbGVuMjsgX2srKykge1xuICAgICAgICAgIGJpbmRpbmcgPSBfcmVmM1tfa107XG4gICAgICAgICAgaWYgKGJpbmRpbmcuZWwgPT09IHRoaXMubWFya2VyLnBhcmVudE5vZGUgJiYgYmluZGluZy50eXBlID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBiaW5kaW5nLnN5bmMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZTogZnVuY3Rpb24obW9kZWxzKSB7XG4gICAgICB2YXIgZGF0YSwga2V5LCBtb2RlbCwgdmlldywgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgZGF0YSA9IHt9O1xuICAgICAgZm9yIChrZXkgaW4gbW9kZWxzKSB7XG4gICAgICAgIG1vZGVsID0gbW9kZWxzW2tleV07XG4gICAgICAgIGlmIChrZXkgIT09IHRoaXMuYXJnc1swXSkge1xuICAgICAgICAgIGRhdGFba2V5XSA9IG1vZGVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfcmVmMSA9IHRoaXMuaXRlcmF0ZWQ7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIHZpZXcgPSBfcmVmMVtfaV07XG4gICAgICAgIHZpZXcudXBkYXRlKGRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVyc1snY2xhc3MtKiddID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgdmFyIGVsQ2xhc3M7XG4gICAgZWxDbGFzcyA9IFwiIFwiICsgZWwuY2xhc3NOYW1lICsgXCIgXCI7XG4gICAgaWYgKCF2YWx1ZSA9PT0gKGVsQ2xhc3MuaW5kZXhPZihcIiBcIiArIHRoaXMuYXJnc1swXSArIFwiIFwiKSAhPT0gLTEpKSB7XG4gICAgICByZXR1cm4gZWwuY2xhc3NOYW1lID0gdmFsdWUgPyBcIlwiICsgZWwuY2xhc3NOYW1lICsgXCIgXCIgKyB0aGlzLmFyZ3NbMF0gOiBlbENsYXNzLnJlcGxhY2UoXCIgXCIgKyB0aGlzLmFyZ3NbMF0gKyBcIiBcIiwgJyAnKS50cmltKCk7XG4gICAgfVxuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzWycqJ10gPSBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsLnNldEF0dHJpYnV0ZSh0aGlzLnR5cGUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLnR5cGUpO1xuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uZm9ybWF0dGVyc1snY2FsbCddID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MsIHZhbHVlO1xuICAgIHZhbHVlID0gYXJndW1lbnRzWzBdLCBhcmdzID0gMiA8PSBhcmd1bWVudHMubGVuZ3RoID8gX19zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkgOiBbXTtcbiAgICByZXR1cm4gdmFsdWUuY2FsbC5hcHBseSh2YWx1ZSwgW3RoaXNdLmNvbmNhdChfX3NsaWNlLmNhbGwoYXJncykpKTtcbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYWRhcHRlcnNbJy4nXSA9IHtcbiAgICBpZDogJ19ydicsXG4gICAgY291bnRlcjogMCxcbiAgICB3ZWFrbWFwOiB7fSxcbiAgICB3ZWFrUmVmZXJlbmNlOiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHZhciBpZCwgX2Jhc2UsIF9uYW1lO1xuICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkodGhpcy5pZCkpIHtcbiAgICAgICAgaWQgPSB0aGlzLmNvdW50ZXIrKztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgdGhpcy5pZCwge1xuICAgICAgICAgIHZhbHVlOiBpZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoX2Jhc2UgPSB0aGlzLndlYWttYXApW19uYW1lID0gb2JqW3RoaXMuaWRdXSB8fCAoX2Jhc2VbX25hbWVdID0ge1xuICAgICAgICBjYWxsYmFja3M6IHt9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNsZWFudXBXZWFrUmVmZXJlbmNlOiBmdW5jdGlvbihyZWYsIGlkKSB7XG4gICAgICBpZiAoIU9iamVjdC5rZXlzKHJlZi5jYWxsYmFja3MpLmxlbmd0aCkge1xuICAgICAgICBpZiAoIShyZWYucG9pbnRlcnMgJiYgT2JqZWN0LmtleXMocmVmLnBvaW50ZXJzKS5sZW5ndGgpKSB7XG4gICAgICAgICAgcmV0dXJuIGRlbGV0ZSB0aGlzLndlYWttYXBbaWRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzdHViRnVuY3Rpb246IGZ1bmN0aW9uKG9iaiwgZm4pIHtcbiAgICAgIHZhciBtYXAsIG9yaWdpbmFsLCB3ZWFrbWFwO1xuICAgICAgb3JpZ2luYWwgPSBvYmpbZm5dO1xuICAgICAgbWFwID0gdGhpcy53ZWFrUmVmZXJlbmNlKG9iaik7XG4gICAgICB3ZWFrbWFwID0gdGhpcy53ZWFrbWFwO1xuICAgICAgcmV0dXJuIG9ialtmbl0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrLCBrLCByLCByZXNwb25zZSwgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZWY0O1xuICAgICAgICByZXNwb25zZSA9IG9yaWdpbmFsLmFwcGx5KG9iaiwgYXJndW1lbnRzKTtcbiAgICAgICAgX3JlZjEgPSBtYXAucG9pbnRlcnM7XG4gICAgICAgIGZvciAociBpbiBfcmVmMSkge1xuICAgICAgICAgIGsgPSBfcmVmMVtyXTtcbiAgICAgICAgICBfcmVmNCA9IChfcmVmMiA9IChfcmVmMyA9IHdlYWttYXBbcl0pICE9IG51bGwgPyBfcmVmMy5jYWxsYmFja3Nba10gOiB2b2lkIDApICE9IG51bGwgPyBfcmVmMiA6IFtdO1xuICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjQubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gX3JlZjRbX2ldO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfTtcbiAgICB9LFxuICAgIG9ic2VydmVNdXRhdGlvbnM6IGZ1bmN0aW9uKG9iaiwgcmVmLCBrZXlwYXRoKSB7XG4gICAgICB2YXIgZm4sIGZ1bmN0aW9ucywgbWFwLCBfYmFzZSwgX2ksIF9sZW47XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIG1hcCA9IHRoaXMud2Vha1JlZmVyZW5jZShvYmopO1xuICAgICAgICBpZiAobWFwLnBvaW50ZXJzID09IG51bGwpIHtcbiAgICAgICAgICBtYXAucG9pbnRlcnMgPSB7fTtcbiAgICAgICAgICBmdW5jdGlvbnMgPSBbJ3B1c2gnLCAncG9wJywgJ3NoaWZ0JywgJ3Vuc2hpZnQnLCAnc29ydCcsICdyZXZlcnNlJywgJ3NwbGljZSddO1xuICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gZnVuY3Rpb25zLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICBmbiA9IGZ1bmN0aW9uc1tfaV07XG4gICAgICAgICAgICB0aGlzLnN0dWJGdW5jdGlvbihvYmosIGZuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChfYmFzZSA9IG1hcC5wb2ludGVycylbcmVmXSA9PSBudWxsKSB7XG4gICAgICAgICAgX2Jhc2VbcmVmXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfX2luZGV4T2YuY2FsbChtYXAucG9pbnRlcnNbcmVmXSwga2V5cGF0aCkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcC5wb2ludGVyc1tyZWZdLnB1c2goa2V5cGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHVub2JzZXJ2ZU11dGF0aW9uczogZnVuY3Rpb24ob2JqLCByZWYsIGtleXBhdGgpIHtcbiAgICAgIHZhciBpZHgsIG1hcCwgcG9pbnRlcnM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopICYmIChvYmpbdGhpcy5pZF0gIT0gbnVsbCkpIHtcbiAgICAgICAgaWYgKG1hcCA9IHRoaXMud2Vha21hcFtvYmpbdGhpcy5pZF1dKSB7XG4gICAgICAgICAgaWYgKHBvaW50ZXJzID0gbWFwLnBvaW50ZXJzW3JlZl0pIHtcbiAgICAgICAgICAgIGlmICgoaWR4ID0gcG9pbnRlcnMuaW5kZXhPZihrZXlwYXRoKSkgPj0gMCkge1xuICAgICAgICAgICAgICBwb2ludGVycy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcG9pbnRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBtYXAucG9pbnRlcnNbcmVmXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBXZWFrUmVmZXJlbmNlKG1hcCwgb2JqW3RoaXMuaWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIG9ic2VydmU6IGZ1bmN0aW9uKG9iaiwga2V5cGF0aCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBjYWxsYmFja3MsIGRlc2MsIHZhbHVlO1xuICAgICAgY2FsbGJhY2tzID0gdGhpcy53ZWFrUmVmZXJlbmNlKG9iaikuY2FsbGJhY2tzO1xuICAgICAgaWYgKGNhbGxiYWNrc1trZXlwYXRoXSA9PSBudWxsKSB7XG4gICAgICAgIGNhbGxiYWNrc1trZXlwYXRoXSA9IFtdO1xuICAgICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleXBhdGgpO1xuICAgICAgICBpZiAoISgoZGVzYyAhPSBudWxsID8gZGVzYy5nZXQgOiB2b2lkIDApIHx8IChkZXNjICE9IG51bGwgPyBkZXNjLnNldCA6IHZvaWQgMCkpKSB7XG4gICAgICAgICAgdmFsdWUgPSBvYmpba2V5cGF0aF07XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5cGF0aCwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2IsIG1hcCwgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLnVub2JzZXJ2ZU11dGF0aW9ucyh2YWx1ZSwgb2JqW190aGlzLmlkXSwga2V5cGF0aCk7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgaWYgKG1hcCA9IF90aGlzLndlYWttYXBbb2JqW190aGlzLmlkXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gbWFwLmNhbGxiYWNrcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1trZXlwYXRoXSkge1xuICAgICAgICAgICAgICAgICAgICAgIF9yZWYxID0gY2FsbGJhY2tzW2tleXBhdGhdLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2IgPSBfcmVmMVtfaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19pbmRleE9mLmNhbGwoY2FsbGJhY2tzW2tleXBhdGhdLCBjYikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMub2JzZXJ2ZU11dGF0aW9ucyhuZXdWYWx1ZSwgb2JqW190aGlzLmlkXSwga2V5cGF0aCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKGNhbGxiYWNrc1trZXlwYXRoXSwgY2FsbGJhY2spIDwgMCkge1xuICAgICAgICBjYWxsYmFja3Nba2V5cGF0aF0ucHVzaChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vYnNlcnZlTXV0YXRpb25zKG9ialtrZXlwYXRoXSwgb2JqW3RoaXMuaWRdLCBrZXlwYXRoKTtcbiAgICB9LFxuICAgIHVub2JzZXJ2ZTogZnVuY3Rpb24ob2JqLCBrZXlwYXRoLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGNhbGxiYWNrcywgaWR4LCBtYXA7XG4gICAgICBpZiAobWFwID0gdGhpcy53ZWFrbWFwW29ialt0aGlzLmlkXV0pIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrcyA9IG1hcC5jYWxsYmFja3Nba2V5cGF0aF0pIHtcbiAgICAgICAgICBpZiAoKGlkeCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKSkgPj0gMCkge1xuICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBtYXAuY2FsbGJhY2tzW2tleXBhdGhdO1xuICAgICAgICAgICAgICB0aGlzLnVub2JzZXJ2ZU11dGF0aW9ucyhvYmpba2V5cGF0aF0sIG9ialt0aGlzLmlkXSwga2V5cGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBXZWFrUmVmZXJlbmNlKG1hcCwgb2JqW3RoaXMuaWRdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbihvYmosIGtleXBhdGgpIHtcbiAgICAgIHJldHVybiBvYmpba2V5cGF0aF07XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKG9iaiwga2V5cGF0aCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5cGF0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgUml2ZXRzLmZhY3RvcnkgPSBmdW5jdGlvbihzaWdodGdsYXNzKSB7XG4gICAgUml2ZXRzLnNpZ2h0Z2xhc3MgPSBzaWdodGdsYXNzO1xuICAgIFJpdmV0c1tcInB1YmxpY1wiXS5fID0gUml2ZXRzO1xuICAgIHJldHVybiBSaXZldHNbXCJwdWJsaWNcIl07XG4gIH07XG5cbiAgaWYgKHR5cGVvZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUgIT09IG51bGwgPyBtb2R1bGUuZXhwb3J0cyA6IHZvaWQgMCkgPT09ICdvYmplY3QnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBSaXZldHMuZmFjdG9yeShyZXF1aXJlKCdzaWdodGdsYXNzJykpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbJ3NpZ2h0Z2xhc3MnXSwgZnVuY3Rpb24oc2lnaHRnbGFzcykge1xuICAgICAgcmV0dXJuIHRoaXMucml2ZXRzID0gUml2ZXRzLmZhY3Rvcnkoc2lnaHRnbGFzcyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yaXZldHMgPSBSaXZldHMuZmFjdG9yeShzaWdodGdsYXNzKTtcbiAgfVxuXG59KS5jYWxsKHRoaXMpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcml2ZXRzL2Rpc3Qvcml2ZXRzLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9yaXZldHMvZGlzdC9yaXZldHMuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/rivets/dist/rivets.js\n"); + +/***/ }), + +/***/ "./node_modules/sightglass/index.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function() {\n // Public sightglass interface.\n function sightglass(obj, keypath, callback, options) {\n return new Observer(obj, keypath, callback, options)\n }\n\n // Batteries not included.\n sightglass.adapters = {}\n\n // Constructs a new keypath observer and kicks things off.\n function Observer(obj, keypath, callback, options) {\n this.options = options || {}\n this.options.adapters = this.options.adapters || {}\n this.obj = obj\n this.keypath = keypath\n this.callback = callback\n this.objectPath = []\n this.update = this.update.bind(this)\n this.parse()\n\n if (isObject(this.target = this.realize())) {\n this.set(true, this.key, this.target, this.callback)\n }\n }\n\n // Tokenizes the provided keypath string into interface + path tokens for the\n // observer to work with.\n Observer.tokenize = function(keypath, interfaces, root) {\n var tokens = []\n var current = {i: root, path: ''}\n var index, chr\n\n for (index = 0; index < keypath.length; index++) {\n chr = keypath.charAt(index)\n\n if (!!~interfaces.indexOf(chr)) {\n tokens.push(current)\n current = {i: chr, path: ''}\n } else {\n current.path += chr\n }\n }\n\n tokens.push(current)\n return tokens\n }\n\n // Parses the keypath using the interfaces defined on the view. Sets variables\n // for the tokenized keypath as well as the end key.\n Observer.prototype.parse = function() {\n var interfaces = this.interfaces()\n var root, path\n\n if (!interfaces.length) {\n error('Must define at least one adapter interface.')\n }\n\n if (!!~interfaces.indexOf(this.keypath[0])) {\n root = this.keypath[0]\n path = this.keypath.substr(1)\n } else {\n if (typeof (root = this.options.root || sightglass.root) === 'undefined') {\n error('Must define a default root adapter.')\n }\n\n path = this.keypath\n }\n\n this.tokens = Observer.tokenize(path, interfaces, root)\n this.key = this.tokens.pop()\n }\n\n // Realizes the full keypath, attaching observers for every key and correcting\n // old observers to any changed objects in the keypath.\n Observer.prototype.realize = function() {\n var current = this.obj\n var unreached = false\n var prev\n\n this.tokens.forEach(function(token, index) {\n if (isObject(current)) {\n if (typeof this.objectPath[index] !== 'undefined') {\n if (current !== (prev = this.objectPath[index])) {\n this.set(false, token, prev, this.update)\n this.set(true, token, current, this.update)\n this.objectPath[index] = current\n }\n } else {\n this.set(true, token, current, this.update)\n this.objectPath[index] = current\n }\n\n current = this.get(token, current)\n } else {\n if (unreached === false) {\n unreached = index\n }\n\n if (prev = this.objectPath[index]) {\n this.set(false, token, prev, this.update)\n }\n }\n }, this)\n\n if (unreached !== false) {\n this.objectPath.splice(unreached)\n }\n\n return current\n }\n\n // Updates the keypath. This is called when any intermediary key is changed.\n Observer.prototype.update = function() {\n var next, oldValue\n\n if ((next = this.realize()) !== this.target) {\n if (isObject(this.target)) {\n this.set(false, this.key, this.target, this.callback)\n }\n\n if (isObject(next)) {\n this.set(true, this.key, next, this.callback)\n }\n\n oldValue = this.value()\n this.target = next\n\n // Always call callback if value is a function. If not a function, call callback only if value changed\n if (this.value() instanceof Function || this.value() !== oldValue) this.callback()\n }\n }\n\n // Reads the current end value of the observed keypath. Returns undefined if\n // the full keypath is unreachable.\n Observer.prototype.value = function() {\n if (isObject(this.target)) {\n return this.get(this.key, this.target)\n }\n }\n\n // Sets the current end value of the observed keypath. Calling setValue when\n // the full keypath is unreachable is a no-op.\n Observer.prototype.setValue = function(value) {\n if (isObject(this.target)) {\n this.adapter(this.key).set(this.target, this.key.path, value)\n }\n }\n\n // Gets the provided key on an object.\n Observer.prototype.get = function(key, obj) {\n return this.adapter(key).get(obj, key.path)\n }\n\n // Observes or unobserves a callback on the object using the provided key.\n Observer.prototype.set = function(active, key, obj, callback) {\n var action = active ? 'observe' : 'unobserve'\n this.adapter(key)[action](obj, key.path, callback)\n }\n\n // Returns an array of all unique adapter interfaces available.\n Observer.prototype.interfaces = function() {\n var interfaces = Object.keys(this.options.adapters)\n\n Object.keys(sightglass.adapters).forEach(function(i) {\n if (!~interfaces.indexOf(i)) {\n interfaces.push(i)\n }\n })\n\n return interfaces\n }\n\n // Convenience function to grab the adapter for a specific key.\n Observer.prototype.adapter = function(key) {\n return this.options.adapters[key.i] ||\n sightglass.adapters[key.i]\n }\n\n // Unobserves the entire keypath.\n Observer.prototype.unobserve = function() {\n var obj\n\n this.tokens.forEach(function(token, index) {\n if (obj = this.objectPath[index]) {\n this.set(false, token, obj, this.update)\n }\n }, this)\n\n if (isObject(this.target)) {\n this.set(false, this.key, this.target, this.callback)\n }\n }\n\n // Check if a value is an object than can be observed.\n function isObject(obj) {\n return typeof obj === 'object' && obj !== null\n }\n\n // Error thrower.\n function error(message) {\n throw new Error('[sightglass] ' + message)\n }\n\n // Export module for Node and the browser.\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = sightglass\n } else if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n return this.sightglass = sightglass\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n } else {\n this.sightglass = sightglass\n }\n}).call(this);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnaHRnbGFzcy9pbmRleC5qcz85NjA1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQSxtQkFBbUIsd0JBQXdCO0FBQzNDOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkIsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUFBO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3NpZ2h0Z2xhc3MvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKSB7XG4gIC8vIFB1YmxpYyBzaWdodGdsYXNzIGludGVyZmFjZS5cbiAgZnVuY3Rpb24gc2lnaHRnbGFzcyhvYmosIGtleXBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZlcihvYmosIGtleXBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKVxuICB9XG5cbiAgLy8gQmF0dGVyaWVzIG5vdCBpbmNsdWRlZC5cbiAgc2lnaHRnbGFzcy5hZGFwdGVycyA9IHt9XG5cbiAgLy8gQ29uc3RydWN0cyBhIG5ldyBrZXlwYXRoIG9ic2VydmVyIGFuZCBraWNrcyB0aGluZ3Mgb2ZmLlxuICBmdW5jdGlvbiBPYnNlcnZlcihvYmosIGtleXBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgIHRoaXMub3B0aW9ucy5hZGFwdGVycyA9IHRoaXMub3B0aW9ucy5hZGFwdGVycyB8fCB7fVxuICAgIHRoaXMub2JqID0gb2JqXG4gICAgdGhpcy5rZXlwYXRoID0ga2V5cGF0aFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMub2JqZWN0UGF0aCA9IFtdXG4gICAgdGhpcy51cGRhdGUgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5wYXJzZSgpXG5cbiAgICBpZiAoaXNPYmplY3QodGhpcy50YXJnZXQgPSB0aGlzLnJlYWxpemUoKSkpIHtcbiAgICAgIHRoaXMuc2V0KHRydWUsIHRoaXMua2V5LCB0aGlzLnRhcmdldCwgdGhpcy5jYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICAvLyBUb2tlbml6ZXMgdGhlIHByb3ZpZGVkIGtleXBhdGggc3RyaW5nIGludG8gaW50ZXJmYWNlICsgcGF0aCB0b2tlbnMgZm9yIHRoZVxuICAvLyBvYnNlcnZlciB0byB3b3JrIHdpdGguXG4gIE9ic2VydmVyLnRva2VuaXplID0gZnVuY3Rpb24oa2V5cGF0aCwgaW50ZXJmYWNlcywgcm9vdCkge1xuICAgIHZhciB0b2tlbnMgPSBbXVxuICAgIHZhciBjdXJyZW50ID0ge2k6IHJvb3QsIHBhdGg6ICcnfVxuICAgIHZhciBpbmRleCwgY2hyXG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBrZXlwYXRoLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY2hyID0ga2V5cGF0aC5jaGFyQXQoaW5kZXgpXG5cbiAgICAgIGlmICghIX5pbnRlcmZhY2VzLmluZGV4T2YoY2hyKSkge1xuICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50KVxuICAgICAgICBjdXJyZW50ID0ge2k6IGNociwgcGF0aDogJyd9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50LnBhdGggKz0gY2hyXG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9rZW5zLnB1c2goY3VycmVudClcbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIGtleXBhdGggdXNpbmcgdGhlIGludGVyZmFjZXMgZGVmaW5lZCBvbiB0aGUgdmlldy4gU2V0cyB2YXJpYWJsZXNcbiAgLy8gZm9yIHRoZSB0b2tlbml6ZWQga2V5cGF0aCBhcyB3ZWxsIGFzIHRoZSBlbmQga2V5LlxuICBPYnNlcnZlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW50ZXJmYWNlcyA9IHRoaXMuaW50ZXJmYWNlcygpXG4gICAgdmFyIHJvb3QsIHBhdGhcblxuICAgIGlmICghaW50ZXJmYWNlcy5sZW5ndGgpIHtcbiAgICAgIGVycm9yKCdNdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgYWRhcHRlciBpbnRlcmZhY2UuJylcbiAgICB9XG5cbiAgICBpZiAoISF+aW50ZXJmYWNlcy5pbmRleE9mKHRoaXMua2V5cGF0aFswXSkpIHtcbiAgICAgIHJvb3QgPSB0aGlzLmtleXBhdGhbMF1cbiAgICAgIHBhdGggPSB0aGlzLmtleXBhdGguc3Vic3RyKDEpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgKHJvb3QgPSB0aGlzLm9wdGlvbnMucm9vdCB8fCBzaWdodGdsYXNzLnJvb3QpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBlcnJvcignTXVzdCBkZWZpbmUgYSBkZWZhdWx0IHJvb3QgYWRhcHRlci4nKVxuICAgICAgfVxuXG4gICAgICBwYXRoID0gdGhpcy5rZXlwYXRoXG4gICAgfVxuXG4gICAgdGhpcy50b2tlbnMgPSBPYnNlcnZlci50b2tlbml6ZShwYXRoLCBpbnRlcmZhY2VzLCByb290KVxuICAgIHRoaXMua2V5ID0gdGhpcy50b2tlbnMucG9wKClcbiAgfVxuXG4gIC8vIFJlYWxpemVzIHRoZSBmdWxsIGtleXBhdGgsIGF0dGFjaGluZyBvYnNlcnZlcnMgZm9yIGV2ZXJ5IGtleSBhbmQgY29ycmVjdGluZ1xuICAvLyBvbGQgb2JzZXJ2ZXJzIHRvIGFueSBjaGFuZ2VkIG9iamVjdHMgaW4gdGhlIGtleXBhdGguXG4gIE9ic2VydmVyLnByb3RvdHlwZS5yZWFsaXplID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLm9ialxuICAgIHZhciB1bnJlYWNoZWQgPSBmYWxzZVxuICAgIHZhciBwcmV2XG5cbiAgICB0aGlzLnRva2Vucy5mb3JFYWNoKGZ1bmN0aW9uKHRva2VuLCBpbmRleCkge1xuICAgICAgaWYgKGlzT2JqZWN0KGN1cnJlbnQpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vYmplY3RQYXRoW2luZGV4XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gKHByZXYgPSB0aGlzLm9iamVjdFBhdGhbaW5kZXhdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoZmFsc2UsIHRva2VuLCBwcmV2LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICAgIHRoaXMuc2V0KHRydWUsIHRva2VuLCBjdXJyZW50LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICAgIHRoaXMub2JqZWN0UGF0aFtpbmRleF0gPSBjdXJyZW50XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0KHRydWUsIHRva2VuLCBjdXJyZW50LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICB0aGlzLm9iamVjdFBhdGhbaW5kZXhdID0gY3VycmVudFxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCA9IHRoaXMuZ2V0KHRva2VuLCBjdXJyZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHVucmVhY2hlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB1bnJlYWNoZWQgPSBpbmRleFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXYgPSB0aGlzLm9iamVjdFBhdGhbaW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5zZXQoZmFsc2UsIHRva2VuLCBwcmV2LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHRoaXMpXG5cbiAgICBpZiAodW5yZWFjaGVkICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vYmplY3RQYXRoLnNwbGljZSh1bnJlYWNoZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRcbiAgfVxuXG4gIC8vIFVwZGF0ZXMgdGhlIGtleXBhdGguIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW55IGludGVybWVkaWFyeSBrZXkgaXMgY2hhbmdlZC5cbiAgT2JzZXJ2ZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuZXh0LCBvbGRWYWx1ZVxuXG4gICAgaWYgKChuZXh0ID0gdGhpcy5yZWFsaXplKCkpICE9PSB0aGlzLnRhcmdldCkge1xuICAgICAgaWYgKGlzT2JqZWN0KHRoaXMudGFyZ2V0KSkge1xuICAgICAgICB0aGlzLnNldChmYWxzZSwgdGhpcy5rZXksIHRoaXMudGFyZ2V0LCB0aGlzLmNhbGxiYWNrKVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3QobmV4dCkpIHtcbiAgICAgICAgdGhpcy5zZXQodHJ1ZSwgdGhpcy5rZXksIG5leHQsIHRoaXMuY2FsbGJhY2spXG4gICAgICB9XG5cbiAgICAgIG9sZFZhbHVlID0gdGhpcy52YWx1ZSgpXG4gICAgICB0aGlzLnRhcmdldCA9IG5leHRcblxuICAgICAgLy8gQWx3YXlzIGNhbGwgY2FsbGJhY2sgaWYgdmFsdWUgaXMgYSBmdW5jdGlvbi4gSWYgbm90IGEgZnVuY3Rpb24sIGNhbGwgY2FsbGJhY2sgb25seSBpZiB2YWx1ZSBjaGFuZ2VkXG4gICAgICBpZiAodGhpcy52YWx1ZSgpIGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdGhpcy52YWx1ZSgpICE9PSBvbGRWYWx1ZSkgdGhpcy5jYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgLy8gUmVhZHMgdGhlIGN1cnJlbnQgZW5kIHZhbHVlIG9mIHRoZSBvYnNlcnZlZCBrZXlwYXRoLiBSZXR1cm5zIHVuZGVmaW5lZCBpZlxuICAvLyB0aGUgZnVsbCBrZXlwYXRoIGlzIHVucmVhY2hhYmxlLlxuICBPYnNlcnZlci5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoaXNPYmplY3QodGhpcy50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQodGhpcy5rZXksIHRoaXMudGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8vIFNldHMgdGhlIGN1cnJlbnQgZW5kIHZhbHVlIG9mIHRoZSBvYnNlcnZlZCBrZXlwYXRoLiBDYWxsaW5nIHNldFZhbHVlIHdoZW5cbiAgLy8gdGhlIGZ1bGwga2V5cGF0aCBpcyB1bnJlYWNoYWJsZSBpcyBhIG5vLW9wLlxuICBPYnNlcnZlci5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChpc09iamVjdCh0aGlzLnRhcmdldCkpIHtcbiAgICAgIHRoaXMuYWRhcHRlcih0aGlzLmtleSkuc2V0KHRoaXMudGFyZ2V0LCB0aGlzLmtleS5wYXRoLCB2YWx1ZSlcbiAgICB9XG4gIH1cblxuICAvLyBHZXRzIHRoZSBwcm92aWRlZCBrZXkgb24gYW4gb2JqZWN0LlxuICBPYnNlcnZlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5LCBvYmopIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyKGtleSkuZ2V0KG9iaiwga2V5LnBhdGgpXG4gIH1cblxuICAvLyBPYnNlcnZlcyBvciB1bm9ic2VydmVzIGEgY2FsbGJhY2sgb24gdGhlIG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQga2V5LlxuICBPYnNlcnZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oYWN0aXZlLCBrZXksIG9iaiwgY2FsbGJhY2spIHtcbiAgICB2YXIgYWN0aW9uID0gYWN0aXZlID8gJ29ic2VydmUnIDogJ3Vub2JzZXJ2ZSdcbiAgICB0aGlzLmFkYXB0ZXIoa2V5KVthY3Rpb25dKG9iaiwga2V5LnBhdGgsIGNhbGxiYWNrKVxuICB9XG5cbiAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdW5pcXVlIGFkYXB0ZXIgaW50ZXJmYWNlcyBhdmFpbGFibGUuXG4gIE9ic2VydmVyLnByb3RvdHlwZS5pbnRlcmZhY2VzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGludGVyZmFjZXMgPSBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMuYWRhcHRlcnMpXG5cbiAgICBPYmplY3Qua2V5cyhzaWdodGdsYXNzLmFkYXB0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIGlmICghfmludGVyZmFjZXMuaW5kZXhPZihpKSkge1xuICAgICAgICBpbnRlcmZhY2VzLnB1c2goaSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIGludGVyZmFjZXNcbiAgfVxuXG4gIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGdyYWIgdGhlIGFkYXB0ZXIgZm9yIGEgc3BlY2lmaWMga2V5LlxuICBPYnNlcnZlci5wcm90b3R5cGUuYWRhcHRlciA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYWRhcHRlcnNba2V5LmldIHx8XG4gICAgICBzaWdodGdsYXNzLmFkYXB0ZXJzW2tleS5pXVxuICB9XG5cbiAgLy8gVW5vYnNlcnZlcyB0aGUgZW50aXJlIGtleXBhdGguXG4gIE9ic2VydmVyLnByb3RvdHlwZS51bm9ic2VydmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JqXG5cbiAgICB0aGlzLnRva2Vucy5mb3JFYWNoKGZ1bmN0aW9uKHRva2VuLCBpbmRleCkge1xuICAgICAgaWYgKG9iaiA9IHRoaXMub2JqZWN0UGF0aFtpbmRleF0pIHtcbiAgICAgICAgdGhpcy5zZXQoZmFsc2UsIHRva2VuLCBvYmosIHRoaXMudXBkYXRlKVxuICAgICAgfVxuICAgIH0sIHRoaXMpXG5cbiAgICBpZiAoaXNPYmplY3QodGhpcy50YXJnZXQpKSB7XG4gICAgICB0aGlzLnNldChmYWxzZSwgdGhpcy5rZXksIHRoaXMudGFyZ2V0LCB0aGlzLmNhbGxiYWNrKVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gb2JqZWN0IHRoYW4gY2FuIGJlIG9ic2VydmVkLlxuICBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsXG4gIH1cblxuICAvLyBFcnJvciB0aHJvd2VyLlxuICBmdW5jdGlvbiBlcnJvcihtZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc2lnaHRnbGFzc10gJyArIG1lc3NhZ2UpXG4gIH1cblxuICAvLyBFeHBvcnQgbW9kdWxlIGZvciBOb2RlIGFuZCB0aGUgYnJvd3Nlci5cbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzaWdodGdsYXNzXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ2h0Z2xhc3MgPSBzaWdodGdsYXNzXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnNpZ2h0Z2xhc3MgPSBzaWdodGdsYXNzXG4gIH1cbn0pLmNhbGwodGhpcyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zaWdodGdsYXNzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9zaWdodGdsYXNzL2luZGV4LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/sightglass/index.js\n"); + +/***/ }), + +/***/ "./node_modules/webpack/buildin/module.js": +/***/ (function(module, exports) { + +eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xyXG5cdGlmKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XHJcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcclxuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xyXG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XHJcblx0XHRpZighbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/module.js\n"); + +/***/ }), + /***/ "./resources/js/bootstrap.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\r\n * Bootstrap any Javascript libraries required\r\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\r\n * Container for phpVMS specific functions\r\n */\nwindow.phpvms = {};\n\n/**\r\n * Configure Axios with both the csrf token and the API key\r\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\r\n 'X-CSRF-TOKEN': token.content\r\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQm9vdHN0cmFwIGFueSBKYXZhc2NyaXB0IGxpYnJhcmllcyByZXF1aXJlZFxyXG4gKi9cclxuXHJcbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XHJcblxyXG4vKipcclxuICogQ29udGFpbmVyIGZvciBwaHBWTVMgc3BlY2lmaWMgZnVuY3Rpb25zXHJcbiAqL1xyXG53aW5kb3cucGhwdm1zID0ge307XHJcblxyXG4vKipcclxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcclxuICovXHJcblxyXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcclxuaWYoYmFzZV91cmwpIHtcclxuICB3aW5kb3cuYXhpb3MuZGVmYXVsdC5iYXNlVVJMID0gYmFzZV91cmw7XHJcbn1cclxuXHJcbndpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JztcclxuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcclxuXHJcbmlmICh0b2tlbikge1xyXG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XHJcbiAgLyp3aW5kb3cuanF1ZXJ5LmFqYXhTZXR1cCh7XHJcbiAgICAnWC1DU1JGLVRPS0VOJzogdG9rZW4uY29udGVudFxyXG4gIH0pKi9cclxufSBlbHNlIHtcclxuICBjb25zb2xlLmVycm9yKCdDU1JGIHRva2VuIG5vdCBmb3VuZDogaHR0cHM6Ly9sYXJhdmVsLmNvbS9kb2NzL2NzcmYjY3NyZi14LWNzcmYtdG9rZW4nKVxyXG59XHJcblxyXG5jb25zdCBhcGlfa2V5ID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJhcGkta2V5XCJdJyk7XHJcbmlmIChhcGlfa2V5KSB7XHJcbiAgd2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWyd4LWFwaS1rZXknXSA9IGFwaV9rZXkuY29udGVudDtcclxuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGFwaV9rZXkuY29udGVudFxyXG59IGVsc2Uge1xyXG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gZmFsc2U7XHJcbiAgY29uc29sZS5lcnJvcignQVBJIEtleSBub3QgZm91bmQhJylcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); +eval("/**\n * Bootstrap any Javascript libraries required\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {};\n\n/**\n * Configure Axios with both the csrf token and the API key\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\n 'X-CSRF-TOKEN': token.content\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRDs7QUFFRCxtQkFBQWQsQ0FBUSwwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJvb3RzdHJhcCBhbnkgSmF2YXNjcmlwdCBsaWJyYXJpZXMgcmVxdWlyZWRcbiAqL1xuXG53aW5kb3cuYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuXG4vKipcbiAqIENvbnRhaW5lciBmb3IgcGhwVk1TIHNwZWNpZmljIGZ1bmN0aW9uc1xuICovXG53aW5kb3cucGhwdm1zID0ge307XG5cbi8qKlxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcbiAqL1xuXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmlmKGJhc2VfdXJsKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0LmJhc2VVUkwgPSBiYXNlX3VybDtcbn1cblxud2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnO1xuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcblxuaWYgKHRva2VuKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XG4gIC8qd2luZG93LmpxdWVyeS5hamF4U2V0dXAoe1xuICAgICdYLUNTUkYtVE9LRU4nOiB0b2tlbi5jb250ZW50XG4gIH0pKi9cbn0gZWxzZSB7XG4gIGNvbnNvbGUuZXJyb3IoJ0NTUkYgdG9rZW4gbm90IGZvdW5kOiBodHRwczovL2xhcmF2ZWwuY29tL2RvY3MvY3NyZiNjc3JmLXgtY3NyZi10b2tlbicpXG59XG5cbmNvbnN0IGFwaV9rZXkgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImFwaS1rZXlcIl0nKTtcbmlmIChhcGlfa2V5KSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsneC1hcGkta2V5J10gPSBhcGlfa2V5LmNvbnRlbnQ7XG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gYXBpX2tleS5jb250ZW50XG59IGVsc2Uge1xuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGZhbHNlO1xuICBjb25zb2xlLmVycm9yKCdBUEkgS2V5IG5vdCBmb3VuZCEnKVxufVxuXG5yZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); + +/***/ }), + +/***/ "./resources/js/common.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVMsbUJBQUFDLENBQVEsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ2xELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0gsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBU0QsS0FBVCxFQUFnQjtBQUN4QyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFPRSxRQUFRLElBQVIsR0FBZUcsSUFBZixHQUFzQixHQUE3QjtBQUNILENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCVyxFQUFsQixHQUF1QixVQUFDVCxLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCWSxFQUFsQixHQUF1QixVQUFDVixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKlxuICovXG5cbmNvbnN0IHJpdmV0cyA9IHJlcXVpcmUoJ3JpdmV0cycpO1xuXG4vKipcbiAqIEdlbmVyaWMgZm9ybWF0dGVyIHRvIHByZXBlbmRcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHByZXBlbmRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5wcmVwZW5kID0gZnVuY3Rpb24gKHZhbHVlLCBwcmVwZW5kKSB7XG4gICAgcmV0dXJuIHByZXBlbmQgKyB2YWx1ZVxufTtcblxuLyoqXG4gKiBGb3JtYXQgbWludXRlcyBpbnRvIEhIaCBNTW1cbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjApO1xuICAgIGNvbnN0IG1pbnMgPSB2YWx1ZSAlIDYwO1xuICAgIHJldHVybiBob3VycyArICdoICcgKyBtaW5zICsgJ20nO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMuZ3QgPSAodmFsdWUsIGxlbikgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBsZW47XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5sdCA9ICh2YWx1ZSwgbGVuKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8IGxlbjtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmVxID0gKHZhbHVlLCBsZW4pID0+IHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9jb21tb24uanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); /***/ }), /***/ "./resources/js/frontend/app.js": /***/ (function(module, exports, __webpack_require__) { -eval("\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYXBwLmpzPzYwZTgiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsIm1hcCJdLCJtYXBwaW5ncyI6IjtBQUNBLG1CQUFBQSxDQUFRLDZCQUFSOztBQUVBO0FBQ0FDLE9BQU9DLE1BQVAsQ0FBY0MsR0FBZCxHQUFvQixtQkFBQUgsQ0FBUSw4QkFBUixDQUFwQiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9mcm9udGVuZC9hcHAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxucmVxdWlyZSgnLi8uLi9ib290c3RyYXAnKTtcclxuXHJcbi8vIEltcG9ydCB0aGUgbWFwcGluZyBmdW5jdGlvblxyXG53aW5kb3cucGhwdm1zLm1hcCA9IHJlcXVpcmUoJy4uL21hcHMvaW5kZXgnKTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Zyb250ZW5kL2FwcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/frontend/app.js\n"); +eval("\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYXBwLmpzPzYwZTgiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsIm1hcCJdLCJtYXBwaW5ncyI6IjtBQUNBLG1CQUFBQSxDQUFRLDZCQUFSOztBQUVBO0FBQ0FDLE9BQU9DLE1BQVAsQ0FBY0MsR0FBZCxHQUFvQixtQkFBQUgsQ0FBUSw4QkFBUixDQUFwQiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9mcm9udGVuZC9hcHAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbnJlcXVpcmUoJy4vLi4vYm9vdHN0cmFwJyk7XG5cbi8vIEltcG9ydCB0aGUgbWFwcGluZyBmdW5jdGlvblxud2luZG93LnBocHZtcy5tYXAgPSByZXF1aXJlKCcuLi9tYXBzL2luZGV4Jyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYXBwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/frontend/app.js\n"); /***/ }), @@ -318,7 +346,7 @@ eval("\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the m /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\r\n * Render a map with the airspace, etc around a given set of coords\r\n * e.g, the airport map\r\n * @param opts\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZW5kZXJfZWxlbSIsIm92ZXJsYXlfZWxlbSIsImxhdCIsImxvbiIsInpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwibWFya2VyX3BvcHVwIiwibWV0YXJfd21zIiwidXJsIiwicGFyYW1zIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImNvb3JkcyIsImNvbnNvbGUiLCJsb2ciLCJzZXRWaWV3IiwibWFya2VyIiwiYWRkVG8iLCJiaW5kUG9wdXAiLCJhZGRXTVNMYXllciJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTtBQUN2QkEsU0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ25CQyxpQkFBYSxLQURNO0FBRW5CQyxrQkFBYyxFQUZLO0FBR25CQyxTQUFLLENBSGM7QUFJbkJDLFNBQUssQ0FKYztBQUtuQkMsVUFBTSxFQUxhO0FBTW5CQyxZQUFRLEVBTlc7QUFPbkJDLGdCQUFZLElBUE87QUFRbkJDLGtCQUFjLEVBUks7O0FBVW5CO0FBQ0FDLGVBQVc7QUFDUEMsV0FBSyxFQURFO0FBRVBDLGNBQVE7QUFGRDtBQVhRLEdBQWQsRUFlSmIsSUFmSSxDQUFQOztBQWlCQSxNQUFJYyxNQUFNLGtFQUFBQyxDQUFjZixJQUFkLENBQVY7QUFDQSxNQUFNZ0IsU0FBUyxDQUFDaEIsS0FBS0ssR0FBTixFQUFXTCxLQUFLTSxHQUFoQixDQUFmO0FBQ0FXLFVBQVFDLEdBQVIsQ0FBWSxpQkFBWixFQUErQkYsTUFBL0I7O0FBRUFGLE1BQUlLLE9BQUosQ0FBWUgsTUFBWixFQUFvQmhCLEtBQUtPLElBQXpCO0FBQ0EsTUFBSVAsS0FBS1MsVUFBTCxLQUFvQixJQUF4QixFQUE4QjtBQUM1QlgsWUFBUXNCLE1BQVIsQ0FBZUosTUFBZixFQUF1QkssS0FBdkIsQ0FBNkJQLEdBQTdCLEVBQWtDUSxTQUFsQyxDQUE0Q3RCLEtBQUtVLFlBQWpEO0FBQ0Q7O0FBRUQsTUFBR1YsS0FBS1csU0FBTCxDQUFlQyxHQUFmLEtBQXVCLEVBQTFCLEVBQThCO0FBQzFCVyxJQUFBLHFFQUFBQSxDQUFZVCxHQUFaLEVBQWlCZCxLQUFLVyxTQUF0QjtBQUNIOztBQUVELFNBQU9HLEdBQVA7QUFDRCxDQWhDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5cclxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcclxuaW1wb3J0IHsgYWRkV01TTGF5ZXIgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlciBhIG1hcCB3aXRoIHRoZSBhaXJzcGFjZSwgZXRjIGFyb3VuZCBhIGdpdmVuIHNldCBvZiBjb29yZHNcclxuICogZS5nLCB0aGUgYWlycG9ydCBtYXBcclxuICogQHBhcmFtIG9wdHNcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XHJcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgcmVuZGVyX2VsZW06ICdtYXAnLFxyXG4gICAgb3ZlcmxheV9lbGVtOiAnJyxcclxuICAgIGxhdDogMCxcclxuICAgIGxvbjogMCxcclxuICAgIHpvb206IDEyLFxyXG4gICAgbGF5ZXJzOiBbXSxcclxuICAgIHNldF9tYXJrZXI6IHRydWUsXHJcbiAgICBtYXJrZXJfcG9wdXA6ICcnLFxyXG5cclxuICAgIC8vIFBhc3NlZCBmcm9tIHRoZSBjb25maWcvbWFwcy5waHAgZmlsZVxyXG4gICAgbWV0YXJfd21zOiB7XHJcbiAgICAgICAgdXJsOiAnJyxcclxuICAgICAgICBwYXJhbXM6IHt9XHJcbiAgICB9LFxyXG4gIH0sIG9wdHMpO1xyXG5cclxuICBsZXQgbWFwID0gZHJhd19iYXNlX21hcChvcHRzKTtcclxuICBjb25zdCBjb29yZHMgPSBbb3B0cy5sYXQsIG9wdHMubG9uXTtcclxuICBjb25zb2xlLmxvZygnQXBwbHlpbmcgY29vcmRzJywgY29vcmRzKTtcclxuXHJcbiAgbWFwLnNldFZpZXcoY29vcmRzLCBvcHRzLnpvb20pO1xyXG4gIGlmIChvcHRzLnNldF9tYXJrZXIgPT09IHRydWUpIHtcclxuICAgIGxlYWZsZXQubWFya2VyKGNvb3JkcykuYWRkVG8obWFwKS5iaW5kUG9wdXAob3B0cy5tYXJrZXJfcG9wdXApO1xyXG4gIH1cclxuXHJcbiAgaWYob3B0cy5tZXRhcl93bXMudXJsICE9PSAnJykge1xyXG4gICAgICBhZGRXTVNMYXllcihtYXAsIG9wdHMubWV0YXJfd21zKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBtYXA7XHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\n * Render a map with the airspace, etc around a given set of coords\n * e.g, the airport map\n * @param opts\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZW5kZXJfZWxlbSIsIm92ZXJsYXlfZWxlbSIsImxhdCIsImxvbiIsInpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwibWFya2VyX3BvcHVwIiwibWV0YXJfd21zIiwidXJsIiwicGFyYW1zIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImNvb3JkcyIsImNvbnNvbGUiLCJsb2ciLCJzZXRWaWV3IiwibWFya2VyIiwiYWRkVG8iLCJiaW5kUG9wdXAiLCJhZGRXTVNMYXllciJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTtBQUN2QkEsU0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ25CQyxpQkFBYSxLQURNO0FBRW5CQyxrQkFBYyxFQUZLO0FBR25CQyxTQUFLLENBSGM7QUFJbkJDLFNBQUssQ0FKYztBQUtuQkMsVUFBTSxFQUxhO0FBTW5CQyxZQUFRLEVBTlc7QUFPbkJDLGdCQUFZLElBUE87QUFRbkJDLGtCQUFjLEVBUks7O0FBVW5CO0FBQ0FDLGVBQVc7QUFDUEMsV0FBSyxFQURFO0FBRVBDLGNBQVE7QUFGRDtBQVhRLEdBQWQsRUFlSmIsSUFmSSxDQUFQOztBQWlCQSxNQUFJYyxNQUFNLGtFQUFBQyxDQUFjZixJQUFkLENBQVY7QUFDQSxNQUFNZ0IsU0FBUyxDQUFDaEIsS0FBS0ssR0FBTixFQUFXTCxLQUFLTSxHQUFoQixDQUFmO0FBQ0FXLFVBQVFDLEdBQVIsQ0FBWSxpQkFBWixFQUErQkYsTUFBL0I7O0FBRUFGLE1BQUlLLE9BQUosQ0FBWUgsTUFBWixFQUFvQmhCLEtBQUtPLElBQXpCO0FBQ0EsTUFBSVAsS0FBS1MsVUFBTCxLQUFvQixJQUF4QixFQUE4QjtBQUM1QlgsWUFBUXNCLE1BQVIsQ0FBZUosTUFBZixFQUF1QkssS0FBdkIsQ0FBNkJQLEdBQTdCLEVBQWtDUSxTQUFsQyxDQUE0Q3RCLEtBQUtVLFlBQWpEO0FBQ0Q7O0FBRUQsTUFBR1YsS0FBS1csU0FBTCxDQUFlQyxHQUFmLEtBQXVCLEVBQTFCLEVBQThCO0FBQzFCVyxJQUFBLHFFQUFBQSxDQUFZVCxHQUFaLEVBQWlCZCxLQUFLVyxTQUF0QjtBQUNIOztBQUVELFNBQU9HLEdBQVA7QUFDRCxDQWhDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcblxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcbmltcG9ydCB7IGFkZFdNU0xheWVyIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuLyoqXG4gKiBSZW5kZXIgYSBtYXAgd2l0aCB0aGUgYWlyc3BhY2UsIGV0YyBhcm91bmQgYSBnaXZlbiBzZXQgb2YgY29vcmRzXG4gKiBlLmcsIHRoZSBhaXJwb3J0IG1hcFxuICogQHBhcmFtIG9wdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICBvdmVybGF5X2VsZW06ICcnLFxuICAgIGxhdDogMCxcbiAgICBsb246IDAsXG4gICAgem9vbTogMTIsXG4gICAgbGF5ZXJzOiBbXSxcbiAgICBzZXRfbWFya2VyOiB0cnVlLFxuICAgIG1hcmtlcl9wb3B1cDogJycsXG5cbiAgICAvLyBQYXNzZWQgZnJvbSB0aGUgY29uZmlnL21hcHMucGhwIGZpbGVcbiAgICBtZXRhcl93bXM6IHtcbiAgICAgICAgdXJsOiAnJyxcbiAgICAgICAgcGFyYW1zOiB7fVxuICAgIH0sXG4gIH0sIG9wdHMpO1xuXG4gIGxldCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICBjb25zdCBjb29yZHMgPSBbb3B0cy5sYXQsIG9wdHMubG9uXTtcbiAgY29uc29sZS5sb2coJ0FwcGx5aW5nIGNvb3JkcycsIGNvb3Jkcyk7XG5cbiAgbWFwLnNldFZpZXcoY29vcmRzLCBvcHRzLnpvb20pO1xuICBpZiAob3B0cy5zZXRfbWFya2VyID09PSB0cnVlKSB7XG4gICAgbGVhZmxldC5tYXJrZXIoY29vcmRzKS5hZGRUbyhtYXApLmJpbmRQb3B1cChvcHRzLm1hcmtlcl9wb3B1cCk7XG4gIH1cblxuICBpZihvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgICBhZGRXTVNMYXllcihtYXAsIG9wdHMubWV0YXJfd21zKTtcbiAgfVxuXG4gIHJldHVybiBtYXA7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvYWlyc3BhY2VfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); /***/ }), @@ -326,7 +354,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("var leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false\n }, opts);\n\n var feature_groups = [];\n /*var openaip_airspace_labels = new leaflet.TileLayer.WMS(\r\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\r\n maxZoom: 14,\r\n minZoom: 12,\r\n layers: 'openaip_approved_airspaces_labels',\r\n tileSize: 1024,\r\n detectRetina: true,\r\n subdomains: '12',\r\n format: 'image/png',\r\n transparent: true\r\n });\r\n openaip_airspace_labels.addTo(map);*/\n\n var opencyclemap_phys_osm = new leaflet.TileLayer('http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=f09a38fa87514de4890fc96e7fe8ecb1', {\n maxZoom: 14,\n minZoom: 4,\n format: 'image/png',\n transparent: true\n });\n\n feature_groups.push(opencyclemap_phys_osm);\n\n /*const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\r\n maxZoom: 14,\r\n minZoom: 4,\r\n tms: true,\r\n detectRetina: true,\r\n subdomains: '12',\r\n format: 'image/png',\r\n transparent: true\r\n });\r\n feature_groups.push(openaip_cached_basemap);\r\n */\n\n var openaip_basemap_phys_osm = leaflet.featureGroup(feature_groups);\n\n var map = leaflet.map('map', {\n layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n var attrib = leaflet.control.attribution({ position: 'bottomleft' });\n attrib.addAttribution('Thunderforest');\n attrib.addAttribution('openAIP');\n attrib.addAttribution('OpenStreetMap contributors');\n attrib.addAttribution('OpenWeatherMap');\n\n attrib.addTo(map);\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwiY2VudGVyIiwiem9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwiZmVhdHVyZV9ncm91cHMiLCJvcGVuY3ljbGVtYXBfcGh5c19vc20iLCJUaWxlTGF5ZXIiLCJtaW5ab29tIiwiZm9ybWF0IiwidHJhbnNwYXJlbnQiLCJwdXNoIiwib3BlbmFpcF9iYXNlbWFwX3BoeXNfb3NtIiwiZmVhdHVyZUdyb3VwIiwibWFwIiwic2Nyb2xsV2hlZWxab29tIiwiYXR0cmliIiwiY29udHJvbCIsImF0dHJpYnV0aW9uIiwicG9zaXRpb24iLCJhZGRBdHRyaWJ1dGlvbiIsImFkZFRvIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxVQUFVLG1CQUFBQyxDQUFRLDRDQUFSLENBQWhCOztBQUVBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMscUJBQWEsS0FESTtBQUVqQkMsZ0JBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRlM7QUFHakJDLGNBQU0sQ0FIVztBQUlqQkMsaUJBQVMsRUFKUTtBQUtqQkMsZ0JBQVEsRUFMUztBQU1qQkMsb0JBQVk7QUFOSyxLQUFkLEVBT0pSLElBUEksQ0FBUDs7QUFTQSxRQUFJUyxpQkFBaUIsRUFBckI7QUFDQTs7Ozs7Ozs7Ozs7OztBQWNBLFFBQU1DLHdCQUF3QixJQUFJWixRQUFRYSxTQUFaLENBQzFCLHFHQUQwQixFQUM2RTtBQUNuR0wsaUJBQVMsRUFEMEY7QUFFbkdNLGlCQUFTLENBRjBGO0FBR25HQyxnQkFBUSxXQUgyRjtBQUluR0MscUJBQWE7QUFKc0YsS0FEN0UsQ0FBOUI7O0FBUUFMLG1CQUFlTSxJQUFmLENBQW9CTCxxQkFBcEI7O0FBRUE7Ozs7Ozs7Ozs7OztBQWFBLFFBQU1NLDJCQUEyQmxCLFFBQVFtQixZQUFSLENBQXFCUixjQUFyQixDQUFqQzs7QUFFQSxRQUFJUyxNQUFNcEIsUUFBUW9CLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQ3pCWCxnQkFBUSxDQUFDUyx3QkFBRCxDQURpQjtBQUV6QlosZ0JBQVFKLEtBQUtJLE1BRlk7QUFHekJDLGNBQU1MLEtBQUtLLElBSGM7QUFJekJjLHlCQUFpQjtBQUpRLEtBQW5CLENBQVY7O0FBT0EsUUFBTUMsU0FBU3RCLFFBQVF1QixPQUFSLENBQWdCQyxXQUFoQixDQUE0QixFQUFDQyxVQUFVLFlBQVgsRUFBNUIsQ0FBZjtBQUNBSCxXQUFPSSxjQUFQLENBQXNCLG9GQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLHdFQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLDJHQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLHNGQUF0Qjs7QUFFQUosV0FBT0ssS0FBUCxDQUFhUCxHQUFiOztBQUVBLFdBQU9BLEdBQVA7QUFDSCxDQW5FRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XHJcblxyXG4gICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcclxuICAgICAgICBjZW50ZXI6IFsyOS45ODEzOSwgLTk1LjMzMzc0XSxcclxuICAgICAgICB6b29tOiA1LFxyXG4gICAgICAgIG1heFpvb206IDEwLFxyXG4gICAgICAgIGxheWVyczogW10sXHJcbiAgICAgICAgc2V0X21hcmtlcjogZmFsc2UsXHJcbiAgICB9LCBvcHRzKTtcclxuXHJcbiAgICBsZXQgZmVhdHVyZV9ncm91cHMgPSBbXTtcclxuICAgIC8qdmFyIG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyLldNUyhcclxuICAgICAgICBcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2Uvd21zXCIsIHtcclxuICAgICAgICAgICAgbWF4Wm9vbTogMTQsXHJcbiAgICAgICAgICAgIG1pblpvb206IDEyLFxyXG4gICAgICAgICAgICBsYXllcnM6ICdvcGVuYWlwX2FwcHJvdmVkX2FpcnNwYWNlc19sYWJlbHMnLFxyXG4gICAgICAgICAgICB0aWxlU2l6ZTogMTAyNCxcclxuICAgICAgICAgICAgZGV0ZWN0UmV0aW5hOiB0cnVlLFxyXG4gICAgICAgICAgICBzdWJkb21haW5zOiAnMTInLFxyXG4gICAgICAgICAgICBmb3JtYXQ6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzLmFkZFRvKG1hcCk7Ki9cclxuXHJcbiAgICBjb25zdCBvcGVuY3ljbGVtYXBfcGh5c19vc20gPSBuZXcgbGVhZmxldC5UaWxlTGF5ZXIoXHJcbiAgICAgICAgJ2h0dHA6Ly97c30udGlsZS50aHVuZGVyZm9yZXN0LmNvbS9sYW5kc2NhcGUve3p9L3t4fS97eX0ucG5nP2FwaWtleT1mMDlhMzhmYTg3NTE0ZGU0ODkwZmM5NmU3ZmU4ZWNiMScsIHtcclxuICAgICAgICAgICAgbWF4Wm9vbTogMTQsXHJcbiAgICAgICAgICAgIG1pblpvb206IDQsXHJcbiAgICAgICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5jeWNsZW1hcF9waHlzX29zbSlcclxuXHJcbiAgICAvKmNvbnN0IG9wZW5haXBfY2FjaGVkX2Jhc2VtYXAgPSBuZXcgbGVhZmxldC5UaWxlTGF5ZXIoXCJodHRwOi8ve3N9LnRpbGUubWFwcy5vcGVuYWlwLm5ldC9nZW93ZWJjYWNoZS9zZXJ2aWNlL3Rtcy8xLjAuMC9vcGVuYWlwX2Jhc2VtYXBARVBTRyUzQTkwMDkxM0Bwbmcve3p9L3t4fS97eX0ucG5nXCIsIHtcclxuICAgICAgICBtYXhab29tOiAxNCxcclxuICAgICAgICBtaW5ab29tOiA0LFxyXG4gICAgICAgIHRtczogdHJ1ZSxcclxuICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXHJcbiAgICAgICAgc3ViZG9tYWluczogJzEyJyxcclxuICAgICAgICBmb3JtYXQ6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5haXBfY2FjaGVkX2Jhc2VtYXApO1xyXG4gICAgKi9cclxuXHJcbiAgICBjb25zdCBvcGVuYWlwX2Jhc2VtYXBfcGh5c19vc20gPSBsZWFmbGV0LmZlYXR1cmVHcm91cChmZWF0dXJlX2dyb3Vwcyk7XHJcblxyXG4gICAgbGV0IG1hcCA9IGxlYWZsZXQubWFwKCdtYXAnLCB7XHJcbiAgICAgICAgbGF5ZXJzOiBbb3BlbmFpcF9iYXNlbWFwX3BoeXNfb3NtXSxcclxuICAgICAgICBjZW50ZXI6IG9wdHMuY2VudGVyLFxyXG4gICAgICAgIHpvb206IG9wdHMuem9vbSxcclxuICAgICAgICBzY3JvbGxXaGVlbFpvb206IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgYXR0cmliID0gbGVhZmxldC5jb250cm9sLmF0dHJpYnV0aW9uKHtwb3NpdGlvbjogJ2JvdHRvbWxlZnQnfSlcclxuICAgIGF0dHJpYi5hZGRBdHRyaWJ1dGlvbignPGEgaHJlZj1cImh0dHBzOi8vd3d3LnRodW5kZXJmb3Jlc3QuY29tXCIgdGFyZ2V0PVwiX2JsYW5rXCIgc3R5bGU9XCJcIj5UaHVuZGVyZm9yZXN0PC9hPicpXHJcbiAgICBhdHRyaWIuYWRkQXR0cmlidXRpb24oJzxhIGhyZWY9XCJodHRwczovL3d3dy5vcGVuYWlwLm5ldFwiIHRhcmdldD1cIl9ibGFua1wiIHN0eWxlPVwiXCI+b3BlbkFJUDwvYT4nKVxyXG4gICAgYXR0cmliLmFkZEF0dHJpYnV0aW9uKCc8YSBocmVmPVwiaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCIgdGFyZ2V0PVwiX2JsYW5rXCIgc3R5bGU9XCJcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnKVxyXG4gICAgYXR0cmliLmFkZEF0dHJpYnV0aW9uKCc8YSBocmVmPVwiaHR0cHM6Ly93d3cub3BlbndlYXRoZXJtYXAub3JnXCIgdGFyZ2V0PVwiX2JsYW5rXCIgc3R5bGU9XCJcIj5PcGVuV2VhdGhlck1hcDwvYT4nKVxyXG5cclxuICAgIGF0dHJpYi5hZGRUbyhtYXApXHJcblxyXG4gICAgcmV0dXJuIG1hcFxyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); +eval("var leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false\n }, opts);\n\n var feature_groups = [];\n /*var openaip_airspace_labels = new leaflet.TileLayer.WMS(\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\n maxZoom: 14,\n minZoom: 12,\n layers: 'openaip_approved_airspaces_labels',\n tileSize: 1024,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n openaip_airspace_labels.addTo(map);*/\n\n var opencyclemap_phys_osm = new leaflet.TileLayer('http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=f09a38fa87514de4890fc96e7fe8ecb1', {\n maxZoom: 14,\n minZoom: 4,\n format: 'image/png',\n transparent: true\n });\n\n feature_groups.push(opencyclemap_phys_osm);\n\n /*const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\n maxZoom: 14,\n minZoom: 4,\n tms: true,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n feature_groups.push(openaip_cached_basemap);\n */\n\n var openaip_basemap_phys_osm = leaflet.featureGroup(feature_groups);\n\n var map = leaflet.map('map', {\n layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n var attrib = leaflet.control.attribution({ position: 'bottomleft' });\n attrib.addAttribution('Thunderforest');\n attrib.addAttribution('openAIP');\n attrib.addAttribution('OpenStreetMap contributors');\n attrib.addAttribution('OpenWeatherMap');\n\n attrib.addTo(map);\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwiY2VudGVyIiwiem9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwiZmVhdHVyZV9ncm91cHMiLCJvcGVuY3ljbGVtYXBfcGh5c19vc20iLCJUaWxlTGF5ZXIiLCJtaW5ab29tIiwiZm9ybWF0IiwidHJhbnNwYXJlbnQiLCJwdXNoIiwib3BlbmFpcF9iYXNlbWFwX3BoeXNfb3NtIiwiZmVhdHVyZUdyb3VwIiwibWFwIiwic2Nyb2xsV2hlZWxab29tIiwiYXR0cmliIiwiY29udHJvbCIsImF0dHJpYnV0aW9uIiwicG9zaXRpb24iLCJhZGRBdHRyaWJ1dGlvbiIsImFkZFRvIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxVQUFVLG1CQUFBQyxDQUFRLDRDQUFSLENBQWhCOztBQUVBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMscUJBQWEsS0FESTtBQUVqQkMsZ0JBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRlM7QUFHakJDLGNBQU0sQ0FIVztBQUlqQkMsaUJBQVMsRUFKUTtBQUtqQkMsZ0JBQVEsRUFMUztBQU1qQkMsb0JBQVk7QUFOSyxLQUFkLEVBT0pSLElBUEksQ0FBUDs7QUFTQSxRQUFJUyxpQkFBaUIsRUFBckI7QUFDQTs7Ozs7Ozs7Ozs7OztBQWNBLFFBQU1DLHdCQUF3QixJQUFJWixRQUFRYSxTQUFaLENBQzFCLHFHQUQwQixFQUM2RTtBQUNuR0wsaUJBQVMsRUFEMEY7QUFFbkdNLGlCQUFTLENBRjBGO0FBR25HQyxnQkFBUSxXQUgyRjtBQUluR0MscUJBQWE7QUFKc0YsS0FEN0UsQ0FBOUI7O0FBUUFMLG1CQUFlTSxJQUFmLENBQW9CTCxxQkFBcEI7O0FBRUE7Ozs7Ozs7Ozs7OztBQWFBLFFBQU1NLDJCQUEyQmxCLFFBQVFtQixZQUFSLENBQXFCUixjQUFyQixDQUFqQzs7QUFFQSxRQUFJUyxNQUFNcEIsUUFBUW9CLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQ3pCWCxnQkFBUSxDQUFDUyx3QkFBRCxDQURpQjtBQUV6QlosZ0JBQVFKLEtBQUtJLE1BRlk7QUFHekJDLGNBQU1MLEtBQUtLLElBSGM7QUFJekJjLHlCQUFpQjtBQUpRLEtBQW5CLENBQVY7O0FBT0EsUUFBTUMsU0FBU3RCLFFBQVF1QixPQUFSLENBQWdCQyxXQUFoQixDQUE0QixFQUFDQyxVQUFVLFlBQVgsRUFBNUIsQ0FBZjtBQUNBSCxXQUFPSSxjQUFQLENBQXNCLG9GQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLHdFQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLDJHQUF0QjtBQUNBSixXQUFPSSxjQUFQLENBQXNCLHNGQUF0Qjs7QUFFQUosV0FBT0ssS0FBUCxDQUFhUCxHQUFiOztBQUVBLFdBQU9BLEdBQVA7QUFDSCxDQW5FRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcblxuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcblxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcmVuZGVyX2VsZW06ICdtYXAnLFxuICAgICAgICBjZW50ZXI6IFsyOS45ODEzOSwgLTk1LjMzMzc0XSxcbiAgICAgICAgem9vbTogNSxcbiAgICAgICAgbWF4Wm9vbTogMTAsXG4gICAgICAgIGxheWVyczogW10sXG4gICAgICAgIHNldF9tYXJrZXI6IGZhbHNlLFxuICAgIH0sIG9wdHMpO1xuXG4gICAgbGV0IGZlYXR1cmVfZ3JvdXBzID0gW107XG4gICAgLyp2YXIgb3BlbmFpcF9haXJzcGFjZV9sYWJlbHMgPSBuZXcgbGVhZmxldC5UaWxlTGF5ZXIuV01TKFxuICAgICAgICBcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2Uvd21zXCIsIHtcbiAgICAgICAgICAgIG1heFpvb206IDE0LFxuICAgICAgICAgICAgbWluWm9vbTogMTIsXG4gICAgICAgICAgICBsYXllcnM6ICdvcGVuYWlwX2FwcHJvdmVkX2FpcnNwYWNlc19sYWJlbHMnLFxuICAgICAgICAgICAgdGlsZVNpemU6IDEwMjQsXG4gICAgICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXG4gICAgICAgICAgICBzdWJkb21haW5zOiAnMTInLFxuICAgICAgICAgICAgZm9ybWF0OiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgb3BlbmFpcF9haXJzcGFjZV9sYWJlbHMuYWRkVG8obWFwKTsqL1xuXG4gICAgY29uc3Qgb3BlbmN5Y2xlbWFwX3BoeXNfb3NtID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyKFxuICAgICAgICAnaHR0cDovL3tzfS50aWxlLnRodW5kZXJmb3Jlc3QuY29tL2xhbmRzY2FwZS97en0ve3h9L3t5fS5wbmc/YXBpa2V5PWYwOWEzOGZhODc1MTRkZTQ4OTBmYzk2ZTdmZThlY2IxJywge1xuICAgICAgICAgICAgbWF4Wm9vbTogMTQsXG4gICAgICAgICAgICBtaW5ab29tOiA0LFxuICAgICAgICAgICAgZm9ybWF0OiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5jeWNsZW1hcF9waHlzX29zbSlcblxuICAgIC8qY29uc3Qgb3BlbmFpcF9jYWNoZWRfYmFzZW1hcCA9IG5ldyBsZWFmbGV0LlRpbGVMYXllcihcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2UvdG1zLzEuMC4wL29wZW5haXBfYmFzZW1hcEBFUFNHJTNBOTAwOTEzQHBuZy97en0ve3h9L3t5fS5wbmdcIiwge1xuICAgICAgICBtYXhab29tOiAxNCxcbiAgICAgICAgbWluWm9vbTogNCxcbiAgICAgICAgdG1zOiB0cnVlLFxuICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXG4gICAgICAgIHN1YmRvbWFpbnM6ICcxMicsXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gICAgfSk7XG5cbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5haXBfY2FjaGVkX2Jhc2VtYXApO1xuICAgICovXG5cbiAgICBjb25zdCBvcGVuYWlwX2Jhc2VtYXBfcGh5c19vc20gPSBsZWFmbGV0LmZlYXR1cmVHcm91cChmZWF0dXJlX2dyb3Vwcyk7XG5cbiAgICBsZXQgbWFwID0gbGVhZmxldC5tYXAoJ21hcCcsIHtcbiAgICAgICAgbGF5ZXJzOiBbb3BlbmFpcF9iYXNlbWFwX3BoeXNfb3NtXSxcbiAgICAgICAgY2VudGVyOiBvcHRzLmNlbnRlcixcbiAgICAgICAgem9vbTogb3B0cy56b29tLFxuICAgICAgICBzY3JvbGxXaGVlbFpvb206IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXR0cmliID0gbGVhZmxldC5jb250cm9sLmF0dHJpYnV0aW9uKHtwb3NpdGlvbjogJ2JvdHRvbWxlZnQnfSlcbiAgICBhdHRyaWIuYWRkQXR0cmlidXRpb24oJzxhIGhyZWY9XCJodHRwczovL3d3dy50aHVuZGVyZm9yZXN0LmNvbVwiIHRhcmdldD1cIl9ibGFua1wiIHN0eWxlPVwiXCI+VGh1bmRlcmZvcmVzdDwvYT4nKVxuICAgIGF0dHJpYi5hZGRBdHRyaWJ1dGlvbignPGEgaHJlZj1cImh0dHBzOi8vd3d3Lm9wZW5haXAubmV0XCIgdGFyZ2V0PVwiX2JsYW5rXCIgc3R5bGU9XCJcIj5vcGVuQUlQPC9hPicpXG4gICAgYXR0cmliLmFkZEF0dHJpYnV0aW9uKCc8YSBocmVmPVwiaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCIgdGFyZ2V0PVwiX2JsYW5rXCIgc3R5bGU9XCJcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnKVxuICAgIGF0dHJpYi5hZGRBdHRyaWJ1dGlvbignPGEgaHJlZj1cImh0dHBzOi8vd3d3Lm9wZW53ZWF0aGVybWFwLm9yZ1wiIHRhcmdldD1cIl9ibGFua1wiIHN0eWxlPVwiXCI+T3BlbldlYXRoZXJNYXA8L2E+JylcblxuICAgIGF0dHJpYi5hZGRUbyhtYXApXG5cbiAgICByZXR1cm4gbWFwXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvYmFzZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); /***/ }), @@ -334,7 +362,7 @@ eval("var leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-sr /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758',\n ACTUAL_ROUTE_COLOR = '#067ec1',\n CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiOzs7QUFBTyxJQUNIQSxtQkFBbUIsU0FEaEI7QUFBQSxJQUVIQyxxQkFBcUIsU0FGbEI7QUFBQSxJQUdIQyxlQUFlLFNBSFoiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbGV0XHJcbiAgICBQTEFOX1JPVVRFX0NPTE9SID0gJyMwNDM3NTgnLFxyXG4gICAgQUNUVUFMX1JPVVRFX0NPTE9SID0gJyMwNjdlYzEnLFxyXG4gICAgQ0lSQ0xFX0NPTE9SID0gJyMwNTYwOTMnO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); +eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758',\n ACTUAL_ROUTE_COLOR = '#067ec1',\n CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiOzs7QUFBTyxJQUNIQSxtQkFBbUIsU0FEaEI7QUFBQSxJQUVIQyxxQkFBcUIsU0FGbEI7QUFBQSxJQUdIQyxlQUFlLFNBSFoiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbGV0XG4gICAgUExBTl9ST1VURV9DT0xPUiA9ICcjMDQzNzU4JyxcbiAgICBBQ1RVQUxfUk9VVEVfQ09MT1IgPSAnIzA2N2VjMScsXG4gICAgQ0lSQ0xFX0NPTE9SID0gJyMwNTYwOTMnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvY29uZmlnLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); /***/ }), @@ -342,7 +370,7 @@ eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\r\n * Add a WMS layer to a map. opts must be:\r\n * {\r\n * url: '',\r\n * params: {}\r\n * }\r\n * @param map\r\n * @param opts\r\n */\nfunction addWMSLayer(map, opts) {\n\n if (opts.url === '') {\n return;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\r\n * Show a popup\r\n * @param feature\r\n * @param layer\r\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTs7Ozs7Ozs7O0FBU08sU0FBU0MsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEJDLElBQTFCLEVBQWdDOztBQUVuQyxRQUFHQSxLQUFLQyxHQUFMLEtBQWEsRUFBaEIsRUFBb0I7QUFDaEI7QUFDSDs7QUFFREQsU0FBS0UsTUFBTCxHQUFjQyxPQUFPQyxNQUFQLENBQWM7QUFDeEJDLGdCQUFRLFdBRGdCO0FBRXhCQyxxQkFBYSxJQUZXO0FBR3hCQyxpQkFBUyxFQUhlO0FBSXhCQyxpQkFBUztBQUplLEtBQWQsRUFLWFIsS0FBS0UsTUFMTSxDQUFkOztBQU9BLFFBQU1PLFNBQVNiLFFBQVFjLFNBQVIsQ0FBa0JDLEdBQWxCLENBQ1hYLEtBQUtDLEdBRE0sRUFDREQsS0FBS0UsTUFESixDQUFmOztBQUlBTyxXQUFPRyxLQUFQLENBQWFiLEdBQWI7O0FBRUEsV0FBT1UsTUFBUDtBQUNIOztBQUVEOzs7OztBQUtPLFNBQVNJLGdCQUFULENBQTBCQyxPQUExQixFQUFtQ0MsS0FBbkMsRUFBMEM7QUFDN0MsUUFBSUMsYUFBYSxFQUFqQjtBQUNBLFFBQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2hERixzQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDSDs7QUFFREgsVUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDSCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBBZGQgYSBXTVMgbGF5ZXIgdG8gYSBtYXAuIG9wdHMgbXVzdCBiZTpcclxuICoge1xyXG4gKiAgdXJsOiAnJyxcclxuICogIHBhcmFtczoge31cclxuICogIH1cclxuICogQHBhcmFtIG1hcFxyXG4gKiBAcGFyYW0gb3B0c1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdNU0xheWVyKG1hcCwgb3B0cykge1xyXG5cclxuICAgIGlmKG9wdHMudXJsID09PSAnJykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBvcHRzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgbWF4Wm9vbTogMTQsXHJcbiAgICAgICAgbWluWm9vbTogNCxcclxuICAgIH0sIG9wdHMucGFyYW1zKTtcclxuXHJcbiAgICBjb25zdCBtbGF5ZXIgPSBsZWFmbGV0LnRpbGVMYXllci53bXMoXHJcbiAgICAgICAgb3B0cy51cmwsIG9wdHMucGFyYW1zXHJcbiAgICApO1xyXG5cclxuICAgIG1sYXllci5hZGRUbyhtYXApO1xyXG5cclxuICAgIHJldHVybiBtbGF5ZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaG93IGEgcG9wdXBcclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxheWVyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2hvd0ZlYXR1cmVQb3B1cChmZWF0dXJlLCBsYXllcikge1xyXG4gICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcclxuICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XHJcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcclxuICAgIH1cclxuXHJcbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); +eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Add a WMS layer to a map. opts must be:\n * {\n * url: '',\n * params: {}\n * }\n * @param map\n * @param opts\n */\nfunction addWMSLayer(map, opts) {\n\n if (opts.url === '') {\n return;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\n * Show a popup\n * @param feature\n * @param layer\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTs7Ozs7Ozs7O0FBU08sU0FBU0MsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEJDLElBQTFCLEVBQWdDOztBQUVuQyxRQUFHQSxLQUFLQyxHQUFMLEtBQWEsRUFBaEIsRUFBb0I7QUFDaEI7QUFDSDs7QUFFREQsU0FBS0UsTUFBTCxHQUFjQyxPQUFPQyxNQUFQLENBQWM7QUFDeEJDLGdCQUFRLFdBRGdCO0FBRXhCQyxxQkFBYSxJQUZXO0FBR3hCQyxpQkFBUyxFQUhlO0FBSXhCQyxpQkFBUztBQUplLEtBQWQsRUFLWFIsS0FBS0UsTUFMTSxDQUFkOztBQU9BLFFBQU1PLFNBQVNiLFFBQVFjLFNBQVIsQ0FBa0JDLEdBQWxCLENBQ1hYLEtBQUtDLEdBRE0sRUFDREQsS0FBS0UsTUFESixDQUFmOztBQUlBTyxXQUFPRyxLQUFQLENBQWFiLEdBQWI7O0FBRUEsV0FBT1UsTUFBUDtBQUNIOztBQUVEOzs7OztBQUtPLFNBQVNJLGdCQUFULENBQTBCQyxPQUExQixFQUFtQ0MsS0FBbkMsRUFBMEM7QUFDN0MsUUFBSUMsYUFBYSxFQUFqQjtBQUNBLFFBQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2hERixzQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDSDs7QUFFREgsVUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDSCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5cbi8qKlxuICogQWRkIGEgV01TIGxheWVyIHRvIGEgbWFwLiBvcHRzIG11c3QgYmU6XG4gKiB7XG4gKiAgdXJsOiAnJyxcbiAqICBwYXJhbXM6IHt9XG4gKiAgfVxuICogQHBhcmFtIG1hcFxuICogQHBhcmFtIG9wdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFdNU0xheWVyKG1hcCwgb3B0cykge1xuXG4gICAgaWYob3B0cy51cmwgPT09ICcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBmb3JtYXQ6ICdpbWFnZS9wbmcnLFxuICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgbWF4Wm9vbTogMTQsXG4gICAgICAgIG1pblpvb206IDQsXG4gICAgfSwgb3B0cy5wYXJhbXMpO1xuXG4gICAgY29uc3QgbWxheWVyID0gbGVhZmxldC50aWxlTGF5ZXIud21zKFxuICAgICAgICBvcHRzLnVybCwgb3B0cy5wYXJhbXNcbiAgICApO1xuXG4gICAgbWxheWVyLmFkZFRvKG1hcCk7XG5cbiAgICByZXR1cm4gbWxheWVyO1xufVxuXG4vKipcbiAqIFNob3cgYSBwb3B1cFxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXllclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvd0ZlYXR1cmVQb3B1cChmZWF0dXJlLCBsYXllcikge1xuICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcbiAgICB9XG5cbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); /***/ }), @@ -350,7 +378,7 @@ eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer; /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\r\n * All of the functionality required for maps\r\n */\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbIndpbmRvdyIsIkwiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUFBOzs7O0FBSUFBLE9BQU9DLENBQVAsR0FBVyxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFYO0FBQ0EsbUJBQUFBLENBQVEscURBQVI7QUFDQSxtQkFBQUEsQ0FBUSwrREFBUjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBbGwgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgZm9yIG1hcHNcclxuICovXHJcblxyXG53aW5kb3cuTCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcclxucmVxdWlyZSgnTGVhZmxldC5HZW9kZXNpYycpO1xyXG5yZXF1aXJlKCdsZWFmbGV0LXJvdGF0ZWRtYXJrZXInKTtcclxuXHJcbmltcG9ydCByZW5kZXJfYWlyc3BhY2VfbWFwIGZyb20gJy4vYWlyc3BhY2VfbWFwJ1xyXG5pbXBvcnQgcmVuZGVyX2xpdmVfbWFwIGZyb20gJy4vbGl2ZV9tYXAnXHJcbmltcG9ydCByZW5kZXJfcm91dGVfbWFwIGZyb20gJy4vcm91dGVfbWFwJ1xyXG5cclxuZXhwb3J0IHtcclxuICByZW5kZXJfYWlyc3BhY2VfbWFwLFxyXG4gIHJlbmRlcl9saXZlX21hcCxcclxuICByZW5kZXJfcm91dGVfbWFwLFxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\n * All of the functionality required for maps\n */\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbIndpbmRvdyIsIkwiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUFBOzs7O0FBSUFBLE9BQU9DLENBQVAsR0FBVyxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFYO0FBQ0EsbUJBQUFBLENBQVEscURBQVI7QUFDQSxtQkFBQUEsQ0FBUSwrREFBUjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIGZvciBtYXBzXG4gKi9cblxud2luZG93LkwgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5yZXF1aXJlKCdMZWFmbGV0Lkdlb2Rlc2ljJyk7XG5yZXF1aXJlKCdsZWFmbGV0LXJvdGF0ZWRtYXJrZXInKTtcblxuaW1wb3J0IHJlbmRlcl9haXJzcGFjZV9tYXAgZnJvbSAnLi9haXJzcGFjZV9tYXAnXG5pbXBvcnQgcmVuZGVyX2xpdmVfbWFwIGZyb20gJy4vbGl2ZV9tYXAnXG5pbXBvcnQgcmVuZGVyX3JvdXRlX21hcCBmcm9tICcuL3JvdXRlX21hcCdcblxuZXhwb3J0IHtcbiAgcmVuZGVyX2FpcnNwYWNlX21hcCxcbiAgcmVuZGVyX2xpdmVfbWFwLFxuICByZW5kZXJfcm91dGVfbWFwLFxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); /***/ }), @@ -358,7 +386,7 @@ eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true } /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\r\n * Render the live map\r\n * @param opts\r\n * @private\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var pannedToCenter = false;\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n\n /**\r\n * When a flight is clicked on, show the path, etc for that flight\r\n * @param feature\r\n * @param layer\r\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var link_uri = opts.pirep_link_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + \"/acars/geojson\";\n\n var pirep_info = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flight_route = $.ajax({\n url: geojson_uri,\n dataType: 'json',\n error: console.log\n });\n\n // Load up the PIREP info\n $.when(flight_route).done(function (routeJson) {\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(routeJson.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n map.panTo({ lat: routeJson.position.lat, lng: routeJson.position.lon });\n pannedToCenter = true;\n }\n });\n\n //\n // When the PIREP info is done loading, show the bottom bar\n //\n $.when(pirep_info).done(function (pirep) {\n pirep = pirep.data;\n\n var dist = void 0,\n planned_dist = void 0;\n if (opts.units === 'nmi') {\n dist = pirep.distance.nmi;\n planned_dist = pirep.planned_distance.nmi;\n } else if (opts.units === 'mi') {\n dist = pirep.distance.mi;\n planned_dist = pirep.planned_distance.mi;\n } else if (opts.units === 'km') {\n dist = pirep.distance.km;\n planned_dist = pirep.planned_distance.km;\n }\n\n // Parse flight time\n var hours = Math.floor(pirep.flight_time / 60);\n var mins = pirep.flight_time % 60;\n\n $('#map_flight_id').html('' + pirep.airline.icao + pirep.flight_number + '');\n\n $('#map_flight_info').text(pirep.dpt_airport.name + ' (' + pirep.dpt_airport.icao + ') to ' + pirep.arr_airport.name + ' (' + pirep.arr_airport.icao + ')');\n\n $('#map_flight_stats_middle').html('Status: ' + pirep.status_text + '
' + 'Flight Time: ' + hours + 'h ' + mins + 'm
' + 'Distance: ' + dist + ' / ' + planned_dist + opts.units + '
');\n\n // Show flight stat info\n $('#map_flight_stats_right').html('Ground Speed: ' + pirep.position.gs + '
' + 'Altitude: ' + pirep.position.altitude + '
' + 'Heading: ' + pirep.position.heading + '');\n\n $('#map-info-bar').show();\n });\n };\n\n var updateMap = function updateMap() {\n\n console.log('reloading flights from acars...');\n\n /**\r\n * AJAX UPDATE\r\n */\n\n var flights = $.ajax({\n url: opts.update_uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(flights).done(function (flightGeoJson) {\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n click: function click(e) {\n pannedToCenter = false;\n onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n };\n\n updateMap();\n setInterval(updateMap, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInVwZGF0ZV91cmkiLCJwaXJlcF91cmkiLCJwaXJlcF9saW5rX3VyaSIsInBvc2l0aW9ucyIsInJlbmRlcl9lbGVtIiwiYWlyY3JhZnRfaWNvbiIsInVuaXRzIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImFpcmNyYWZ0SWNvbiIsImljb24iLCJpY29uVXJsIiwiaWNvblNpemUiLCJpY29uQW5jaG9yIiwicGFubmVkVG9DZW50ZXIiLCJsYXllckZsaWdodHMiLCJsYXllclNlbEZsaWdodCIsImxheWVyU2VsRmxpZ2h0RmVhdHVyZSIsImxheWVyU2VsRmxpZ2h0TGF5ZXIiLCJvbkZsaWdodENsaWNrIiwiZmVhdHVyZSIsImxheWVyIiwicmVwbGFjZSIsInByb3BlcnRpZXMiLCJwaXJlcF9pZCIsImxpbmtfdXJpIiwiZ2VvanNvbl91cmkiLCJwaXJlcF9pbmZvIiwiJCIsImFqYXgiLCJ1cmwiLCJkYXRhVHlwZSIsImVycm9yIiwiY29uc29sZSIsImxvZyIsImZsaWdodF9yb3V0ZSIsIndoZW4iLCJkb25lIiwicm91dGVKc29uIiwicmVtb3ZlTGF5ZXIiLCJnZW9kZXNpYyIsIndlaWdodCIsIm9wYWNpdHkiLCJjb2xvciIsIndyYXAiLCJhZGRUbyIsImdlb0pzb24iLCJsaW5lIiwicGFuVG8iLCJsYXQiLCJwb3NpdGlvbiIsImxuZyIsImxvbiIsInBpcmVwIiwiZGF0YSIsImRpc3QiLCJwbGFubmVkX2Rpc3QiLCJkaXN0YW5jZSIsIm5taSIsInBsYW5uZWRfZGlzdGFuY2UiLCJtaSIsImttIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJmbGlnaHRfdGltZSIsIm1pbnMiLCJodG1sIiwiYWlybGluZSIsImljYW8iLCJmbGlnaHRfbnVtYmVyIiwidGV4dCIsImRwdF9haXJwb3J0IiwibmFtZSIsImFycl9haXJwb3J0Iiwic3RhdHVzX3RleHQiLCJncyIsImFsdGl0dWRlIiwiaGVhZGluZyIsInNob3ciLCJ1cGRhdGVNYXAiLCJmbGlnaHRzIiwiZmxpZ2h0R2VvSnNvbiIsImNsZWFyTGF5ZXJzIiwiZ2VvSlNPTiIsIm9uRWFjaEZlYXR1cmUiLCJvbiIsImNsaWNrIiwiZSIsInBvcHVwX2h0bWwiLCJwb3B1cCIsInVuZGVmaW5lZCIsImJpbmRQb3B1cCIsInBvaW50VG9MYXllciIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJzZXRJbnRlcnZhbCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUEsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMsb0JBQVksWUFESztBQUVqQkMsbUJBQVcsa0JBRk07QUFHakJDLHdCQUFnQixjQUhDO0FBSWpCQyxtQkFBVyxJQUpNO0FBS2pCQyxxQkFBYSxLQUxJO0FBTWpCQyx1QkFBZSxnQ0FORTtBQU9qQkMsZUFBTztBQVBVLEtBQWQsRUFRSlQsSUFSSSxDQUFQOztBQVVBLFFBQU1VLE1BQU0sa0VBQUFDLENBQWNYLElBQWQsQ0FBWjtBQUNBLFFBQU1ZLGVBQWVkLFFBQVFlLElBQVIsQ0FBYTtBQUM5QkMsaUJBQVNkLEtBQUtRLGFBRGdCO0FBRTlCTyxrQkFBVSxDQUFDLEVBQUQsRUFBSyxFQUFMLENBRm9CO0FBRzlCQyxvQkFBWSxDQUFDLEVBQUQsRUFBSyxFQUFMO0FBSGtCLEtBQWIsQ0FBckI7O0FBTUEsUUFBSUMsaUJBQWlCLEtBQXJCO0FBQ0EsUUFBSUMsZUFBZSxJQUFuQjtBQUNBLFFBQUlDLGlCQUFpQixJQUFyQjtBQUNBLFFBQUlDLHdCQUF3QixJQUE1QjtBQUNBLFFBQUlDLHNCQUFzQixJQUExQjs7QUFFQTs7Ozs7QUFLQSxRQUFNQyxnQkFBZ0IsU0FBaEJB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aUIsZ0JBQVlqQixTQUFaLEVBQXVCLEtBQXZCO0FBQ0gsQ0EvS0QiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XHJcblxyXG5pbXBvcnQgZHJhd19iYXNlX21hcCBmcm9tICcuL2Jhc2VfbWFwJ1xyXG5pbXBvcnQge0FDVFVBTF9ST1VURV9DT0xPUn0gZnJvbSAnLi9jb25maWcnXHJcblxyXG4vKipcclxuICogUmVuZGVyIHRoZSBsaXZlIG1hcFxyXG4gKiBAcGFyYW0gb3B0c1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcclxuXHJcbiAgICBvcHRzID0gT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgdXBkYXRlX3VyaTogJy9hcGkvYWNhcnMnLFxyXG4gICAgICAgIHBpcmVwX3VyaTogJy9hcGkvcGlyZXBzL3tpZH0nLFxyXG4gICAgICAgIHBpcmVwX2xpbmtfdXJpOiAnL3BpcmVwcy97aWR9JyxcclxuICAgICAgICBwb3NpdGlvbnM6IG51bGwsXHJcbiAgICAgICAgcmVuZGVyX2VsZW06ICdtYXAnLFxyXG4gICAgICAgIGFpcmNyYWZ0X2ljb246ICcvYXNzZXRzL2ltZy9hY2Fycy9haXJjcmFmdC5wbmcnLFxyXG4gICAgICAgIHVuaXRzOiAnbm1pJyxcclxuICAgIH0sIG9wdHMpO1xyXG5cclxuICAgIGNvbnN0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XHJcbiAgICBjb25zdCBhaXJjcmFmdEljb24gPSBsZWFmbGV0Lmljb24oe1xyXG4gICAgICAgIGljb25Vcmw6IG9wdHMuYWlyY3JhZnRfaWNvbixcclxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXHJcbiAgICAgICAgaWNvbkFuY2hvcjogWzIxLCAyMV0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgcGFubmVkVG9DZW50ZXIgPSBmYWxzZTtcclxuICAgIGxldCBsYXllckZsaWdodHMgPSBudWxsO1xyXG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0ID0gbnVsbDtcclxuICAgIGxldCBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBudWxsO1xyXG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBhIGZsaWdodCBpcyBjbGlja2VkIG9uLCBzaG93IHRoZSBwYXRoLCBldGMgZm9yIHRoYXQgZmxpZ2h0XHJcbiAgICAgKiBAcGFyYW0gZmVhdHVyZVxyXG4gICAgICogQHBhcmFtIGxheWVyXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG9uRmxpZ2h0Q2xpY2sgPSAoZmVhdHVyZSwgbGF5ZXIpID0+IHtcclxuXHJcbiAgICAgICAgY29uc3QgcGlyZXBfdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsIGZlYXR1cmUucHJvcGVydGllcy5waXJlcF9pZCk7XHJcbiAgICAgICAgY29uc3QgbGlua191cmkgPSBvcHRzLnBpcmVwX2xpbmtfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpO1xyXG4gICAgICAgIGNvbnN0IGdlb2pzb25fdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsIGZlYXR1cmUucHJvcGVydGllcy5waXJlcF9pZCkgKyBcIi9hY2Fycy9nZW9qc29uXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHBpcmVwX2luZm8gPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IHBpcmVwX3VyaSxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZsaWdodF9yb3V0ZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogZ2VvanNvbl91cmksXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBMb2FkIHVwIHRoZSBQSVJFUCBpbmZvXHJcbiAgICAgICAgJC53aGVuKGZsaWdodF9yb3V0ZSkuZG9uZSgocm91dGVKc29uKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChsYXllclNlbEZsaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRmxpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHQgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XHJcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDUsXHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjksXHJcbiAgICAgICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxyXG4gICAgICAgICAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pLmFkZFRvKG1hcCk7XHJcblxyXG4gICAgICAgICAgICBsYXllclNlbEZsaWdodC5nZW9Kc29uKHJvdXRlSnNvbi5saW5lKTtcclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRGZWF0dXJlID0gZmVhdHVyZTtcclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRMYXllciA9IGxheWVyO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2VudGVyIG9uIGl0LCBidXQgb25seSBkbyBpdCBvbmNlLCBpbiBjYXNlIHRoZSBtYXAgaXMgbW92ZWRcclxuICAgICAgICAgICAgaWYoIXBhbm5lZFRvQ2VudGVyKSB7XHJcbiAgICAgICAgICAgICAgICBtYXAucGFuVG8oe2xhdDogcm91dGVKc29uLnBvc2l0aW9uLmxhdCwgbG5nOiByb3V0ZUpzb24ucG9zaXRpb24ubG9ufSk7XHJcbiAgICAgICAgICAgICAgICBwYW5uZWRUb0NlbnRlciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBXaGVuIHRoZSBQSVJFUCBpbmZvIGlzIGRvbmUgbG9hZGluZywgc2hvdyB0aGUgYm90dG9tIGJhclxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJC53aGVuKHBpcmVwX2luZm8pLmRvbmUocGlyZXAgPT4geyBwaXJlcCA9IHBpcmVwLmRhdGE7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGlzdCwgcGxhbm5lZF9kaXN0O1xyXG4gICAgICAgICAgICBpZihvcHRzLnVuaXRzID09PSAnbm1pJykge1xyXG4gICAgICAgICAgICAgICAgZGlzdCA9IHBpcmVwLmRpc3RhbmNlLm5taTtcclxuICAgICAgICAgICAgICAgIHBsYW5uZWRfZGlzdCA9IHBpcmVwLnBsYW5uZWRfZGlzdGFuY2Uubm1pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYob3B0cy51bml0cyA9PT0gJ21pJykge1xyXG4gICAgICAgICAgICAgICAgZGlzdCA9IHBpcmVwLmRpc3RhbmNlLm1pO1xyXG4gICAgICAgICAgICAgICAgcGxhbm5lZF9kaXN0ID0gcGlyZXAucGxhbm5lZF9kaXN0YW5jZS5taTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmKG9wdHMudW5pdHMgPT09ICdrbScpIHtcclxuICAgICAgICAgICAgICAgIGRpc3QgPSBwaXJlcC5kaXN0YW5jZS5rbTtcclxuICAgICAgICAgICAgICAgIHBsYW5uZWRfZGlzdCA9IHBpcmVwLnBsYW5uZWRfZGlzdGFuY2Uua207XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFBhcnNlIGZsaWdodCB0aW1lXHJcbiAgICAgICAgICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihwaXJlcC5mbGlnaHRfdGltZSAvIDYwKTtcclxuICAgICAgICAgICAgY29uc3QgbWlucyA9IHBpcmVwLmZsaWdodF90aW1lICUgNjA7XHJcblxyXG4gICAgICAgICAgICAkKCcjbWFwX2ZsaWdodF9pZCcpLmh0bWwoXHJcbiAgICAgICAgICAgICAgICAnPGEgaHJlZj1cIicgKyBsaW5rX3VyaSAgKyAnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JyArXHJcbiAgICAgICAgICAgICAgICBwaXJlcC5haXJsaW5lLmljYW8gKyBwaXJlcC5mbGlnaHRfbnVtYmVyICtcclxuICAgICAgICAgICAgICAgICc8L2E+J1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgJCgnI21hcF9mbGlnaHRfaW5mbycpLnRleHQoXHJcbiAgICAgICAgICAgICAgICBwaXJlcC5kcHRfYWlycG9ydC5uYW1lICsgJyAoJyArIHBpcmVwLmRwdF9haXJwb3J0LmljYW8gKyAnKSB0byAnICtcclxuICAgICAgICAgICAgICAgIHBpcmVwLmFycl9haXJwb3J0Lm5hbWUgKyAnICgnICsgcGlyZXAuYXJyX2FpcnBvcnQuaWNhbyArICcpJ1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgJCgnI21hcF9mbGlnaHRfc3RhdHNfbWlkZGxlJykuaHRtbChcclxuICAgICAgICAgICAgICAgICdTdGF0dXM6IDxzdHJvbmc+JyArIHBpcmVwLnN0YXR1c190ZXh0ICsgJzwvc3Ryb25nPjxiciAvPicgK1xyXG4gICAgICAgICAgICAgICAgJ0ZsaWdodCBUaW1lOiA8c3Ryb25nPicgKyBob3VycyArICdoICcgKyBtaW5zICsgJ208L3N0cm9uZz48YnIgLz4nICtcclxuICAgICAgICAgICAgICAgICdEaXN0YW5jZTogPHN0cm9uZz4nICsgZGlzdCArICc8L3N0cm9uZz4gLyAnICsgcGxhbm5lZF9kaXN0ICsgb3B0cy51bml0cyArICc8YnIgLz4nXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAvLyBTaG93IGZsaWdodCBzdGF0IGluZm9cclxuICAgICAgICAgICAgJCgnI21hcF9mbGlnaHRfc3RhdHNfcmlnaHQnKS5odG1sKFxyXG4gICAgICAgICAgICAgICAgJ0dyb3VuZCBTcGVlZDogPHN0cm9uZz4nICsgcGlyZXAucG9zaXRpb24uZ3MgKyAnPC9zdHJvbmc+PGJyIC8+JyArXHJcbiAgICAgICAgICAgICAgICAnQWx0aXR1ZGU6IDxzdHJvbmc+JyArIHBpcmVwLnBvc2l0aW9uLmFsdGl0dWRlICsgJzwvc3Ryb25nPjxiciAvPicgICtcclxuICAgICAgICAgICAgICAgICdIZWFkaW5nOiA8c3Ryb25nPicgKyBwaXJlcC5wb3NpdGlvbi5oZWFkaW5nICsgJzwvc3Ryb25nPidcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICQoJyNtYXAtaW5mby1iYXInKS5zaG93KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZU1hcCA9ICgpID0+IHtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coJ3JlbG9hZGluZyBmbGlnaHRzIGZyb20gYWNhcnMuLi4nKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQUpBWCBVUERBVEVcclxuICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgbGV0IGZsaWdodHMgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IG9wdHMudXBkYXRlX3VyaSxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQud2hlbihmbGlnaHRzKS5kb25lKGZ1bmN0aW9uIChmbGlnaHRHZW9Kc29uKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAobGF5ZXJGbGlnaHRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsYXllckZsaWdodHMuY2xlYXJMYXllcnMoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsYXllckZsaWdodHMgPSBsZWFmbGV0Lmdlb0pTT04oZmxpZ2h0R2VvSnNvbiwge1xyXG4gICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogKGZlYXR1cmUsIGxheWVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIub24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZsaWdodENsaWNrKGZlYXR1cmUsIGxheWVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3B1cF9odG1sID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSAnJyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXAgIT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChwb3B1cF9odG1sKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBmdW5jdGlvbiAoZmVhdHVyZSwgbGF0bG9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBhaXJjcmFmdEljb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uQW5nbGU6IGZlYXR1cmUucHJvcGVydGllcy5oZWFkaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsYXllckZsaWdodHMuYWRkVG8obWFwKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgY2xpY2tlZC1mbGlnaHQgaW5mb3JtYXRpb25cclxuICAgICAgICAgICAgaWYgKGxheWVyU2VsRmxpZ2h0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBvbkZsaWdodENsaWNrKGxheWVyU2VsRmxpZ2h0RmVhdHVyZSwgbGF5ZXJTZWxGbGlnaHRMYXllcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9O1xyXG5cclxuICAgIHVwZGF0ZU1hcCgpO1xyXG4gICAgc2V0SW50ZXJ2YWwodXBkYXRlTWFwLCAxMDAwMClcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n\n\n\n/**\n * Render the live map\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var pannedToCenter = false;\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n\n var r_map_view = rivets.bind($('#map-info-box'), { pirep: {} });\n var r_table_view = rivets.bind($('#live_flights'), { pireps: [] });\n\n /**\n * When a flight is clicked on, show the path, etc for that flight\n * @param feature\n * @param layer\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + \"/acars/geojson\";\n\n var pirep_info = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flight_route = $.ajax({\n url: geojson_uri,\n dataType: 'json',\n error: console.log\n });\n\n // Load up the PIREP info\n $.when(flight_route).done(function (routeJson) {\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(routeJson.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n map.panTo({ lat: routeJson.position.lat, lng: routeJson.position.lon });\n pannedToCenter = true;\n }\n });\n\n //\n // When the PIREP info is done loading, show the bottom bar\n //\n $.when(pirep_info).done(function (pirep) {\n r_map_view.update({ pirep: pirep.data });\n $('#map-info-box').show();\n });\n };\n\n var updateMap = function updateMap() {\n\n console.log('reloading flights from acars...');\n\n /**\n * AJAX UPDATE\n */\n var pirep_uri = opts.pirep_uri.replace('{id}', '');\n var pireps = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flights = $.ajax({\n url: opts.update_uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(flights).done(function (flightGeoJson) {\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n click: function click(e) {\n pannedToCenter = false;\n onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n\n $.when(pireps).done(function (pireps) {\n r_table_view.update({\n pireps: pireps.data,\n has_data: pireps.data.length > 0\n });\n });\n };\n\n updateMap();\n setInterval(updateMap, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwicml2ZXRzIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInVwZGF0ZV91cmkiLCJwaXJlcF91cmkiLCJwaXJlcF9saW5rX3VyaSIsInBvc2l0aW9ucyIsInJlbmRlcl9lbGVtIiwiYWlyY3JhZnRfaWNvbiIsInVuaXRzIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImFpcmNyYWZ0SWNvbiIsImljb24iLCJpY29uVXJsIiwiaWNvblNpemUiLCJpY29uQW5jaG9yIiwicGFubmVkVG9DZW50ZXIiLCJsYXllckZsaWdodHMiLCJsYXllclNlbEZsaWdodCIsImxheWVyU2VsRmxpZ2h0RmVhdHVyZSIsImxheWVyU2VsRmxpZ2h0TGF5ZXIiLCJyX21hcF92aWV3IiwiYmluZCIsIiQiLCJwaXJlcCIsInJfdGFibGVfdmlldyIsInBpcmVwcyIsIm9uRmxpZ2h0Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJyZXBsYWNlIiwicHJvcGVydGllcyIsInBpcmVwX2lkIiwiZ2VvanNvbl91cmkiLCJwaXJlcF9pbmZvIiwiYWpheCIsInVybCIsImRhdGFUeXBlIiwiZXJyb3IiLCJjb25zb2xlIiwibG9nIiwiZmxpZ2h0X3JvdXRlIiwid2hlbiIsImRvbmUiLCJyb3V0ZUpzb24iLCJyZW1vdmVMYXllciIsImdlb2Rlc2ljIiwid2VpZ2h0Iiwib3BhY2l0eSIsImNvbG9yIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImxpbmUiLCJwYW5UbyIsImxhdCIsInBvc2l0aW9uIiwibG5nIiwibG9uIiwidXBkYXRlIiwiZGF0YSIsInNob3ciLCJ1cGRhdGVNYXAiLCJmbGlnaHRzIiwiY2xlYXJMYXllcnMiLCJnZW9KU09OIiwiZmxpZ2h0R2VvSnNvbiIsIm9uRWFjaEZlYXR1cmUiLCJvbiIsImNsaWNrIiwiZSIsInBvcHVwX2h0bWwiLCJwb3B1cCIsInVuZGVmaW5lZCIsImJpbmRQb3B1cCIsInBvaW50VG9MYXllciIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJoZWFkaW5nIiwiaGFzX2RhdGEiLCJsZW5ndGgiLCJzZXRJbnRlcnZhbCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUEsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjtBQUNBLElBQU1DLFNBQVMsbUJBQUFELENBQVEsc0NBQVIsQ0FBZjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNFLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMsb0JBQVksWUFESztBQUVqQkMsbUJBQVcsa0JBRk07QUFHakJDLHdCQUFnQixjQUhDO0FBSWpCQyxtQkFBVyxJQUpNO0FBS2pCQyxxQkFBYSxLQUxJO0FBTWpCQyx1QkFBZSxnQ0FORTtBQU9qQkMsZUFBTztBQVBVLEtBQWQsRUFRSlQsSUFSSSxDQUFQOztBQVVBLFFBQU1VLE1BQU0sa0VBQUFDLENBQWNYLElBQWQsQ0FBWjtBQUNBLFFBQU1ZLGVBQWVmLFFBQVFnQixJQUFSLENBQWE7QUFDOUJDLGlCQUFTZCxLQUFLUSxhQURnQjtBQUU5Qk8sa0JBQVUsQ0FBQyxFQUFELEVBQUssRUFBTCxDQUZvQjtBQUc5QkMsb0JBQVksQ0FBQyxFQUFELEVBQUssRUFBTDtBQUhrQixLQUFiLENBQXJCOztBQU1BLFFBQUlDLGlCQUFpQixLQUFyQjtBQUNBLFFBQUlDLGVBQWUsSUFBbkI7QUFDQSxRQUFJQyxpQkFBaUIsSUFBckI7QUFDQSxRQUFJQyx3QkFBd0IsSUFBNUI7QUFDQSxRQUFJQyxzQkFBc0IsSUFBMUI7O0FBRUEsUUFBTUMsYUFBYXZCLE9BQU93QixJQUFQLENBQVlDLEVBQUUsZUFBRixDQUFaLEVBQWdDLEVBQUNDLE9BQU8sRUFBUixFQUFoQyxDQUFuQjtBQUNBLFFBQU1DLGVBQWUzQixPQUFPd0IsSUFBUCxDQUFZQyxFQUFFLGVBQUYsQ0FBWixFQUFnQyxFQUFD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QUF2QjtBQUNILENBdEpEIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuY29uc3Qgcml2ZXRzID0gcmVxdWlyZSgncml2ZXRzJyk7XG5cbmltcG9ydCBkcmF3X2Jhc2VfbWFwIGZyb20gJy4vYmFzZV9tYXAnXG5pbXBvcnQge0FDVFVBTF9ST1VURV9DT0xPUn0gZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogUmVuZGVyIHRoZSBsaXZlIG1hcFxuICogQHBhcmFtIG9wdHNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XG5cbiAgICBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHVwZGF0ZV91cmk6ICcvYXBpL2FjYXJzJyxcbiAgICAgICAgcGlyZXBfdXJpOiAnL2FwaS9waXJlcHMve2lkfScsXG4gICAgICAgIHBpcmVwX2xpbmtfdXJpOiAnL3BpcmVwcy97aWR9JyxcbiAgICAgICAgcG9zaXRpb25zOiBudWxsLFxuICAgICAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgICAgIGFpcmNyYWZ0X2ljb246ICcvYXNzZXRzL2ltZy9hY2Fycy9haXJjcmFmdC5wbmcnLFxuICAgICAgICB1bml0czogJ25taScsXG4gICAgfSwgb3B0cyk7XG5cbiAgICBjb25zdCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICAgIGNvbnN0IGFpcmNyYWZ0SWNvbiA9IGxlYWZsZXQuaWNvbih7XG4gICAgICAgIGljb25Vcmw6IG9wdHMuYWlyY3JhZnRfaWNvbixcbiAgICAgICAgaWNvblNpemU6IFs0MiwgNDJdLFxuICAgICAgICBpY29uQW5jaG9yOiBbMjEsIDIxXSxcbiAgICB9KTtcblxuICAgIGxldCBwYW5uZWRUb0NlbnRlciA9IGZhbHNlO1xuICAgIGxldCBsYXllckZsaWdodHMgPSBudWxsO1xuICAgIGxldCBsYXllclNlbEZsaWdodCA9IG51bGw7XG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0RmVhdHVyZSA9IG51bGw7XG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBudWxsO1xuXG4gICAgY29uc3Qgcl9tYXBfdmlldyA9IHJpdmV0cy5iaW5kKCQoJyNtYXAtaW5mby1ib3gnKSwge3BpcmVwOiB7fX0pO1xuICAgIGNvbnN0IHJfdGFibGVfdmlldyA9IHJpdmV0cy5iaW5kKCQoJyNsaXZlX2ZsaWdodHMnKSwge3BpcmVwczogW119KTtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gYSBmbGlnaHQgaXMgY2xpY2tlZCBvbiwgc2hvdyB0aGUgcGF0aCwgZXRjIGZvciB0aGF0IGZsaWdodFxuICAgICAqIEBwYXJhbSBmZWF0dXJlXG4gICAgICogQHBhcmFtIGxheWVyXG4gICAgICovXG4gICAgY29uc3Qgb25GbGlnaHRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xuXG4gICAgICAgIGNvbnN0IHBpcmVwX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpO1xuICAgICAgICBjb25zdCBnZW9qc29uX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpICsgXCIvYWNhcnMvZ2VvanNvblwiO1xuXG4gICAgICAgIGNvbnN0IHBpcmVwX2luZm8gPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBwaXJlcF91cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZsaWdodF9yb3V0ZSA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IGdlb2pzb25fdXJpLFxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBMb2FkIHVwIHRoZSBQSVJFUCBpbmZvXG4gICAgICAgICQud2hlbihmbGlnaHRfcm91dGUpLmRvbmUoKHJvdXRlSnNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGxheWVyU2VsRmxpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRmxpZ2h0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHQgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XG4gICAgICAgICAgICAgICAgd2VpZ2h0OiA1LFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuOSxcbiAgICAgICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxuICAgICAgICAgICAgICAgIHdyYXA6IGZhbHNlLFxuICAgICAgICAgICAgfSkuYWRkVG8obWFwKTtcblxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHQuZ2VvSnNvbihyb3V0ZUpzb24ubGluZSk7XG4gICAgICAgICAgICBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBmZWF0dXJlO1xuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRMYXllciA9IGxheWVyO1xuXG4gICAgICAgICAgICAvLyBDZW50ZXIgb24gaXQsIGJ1dCBvbmx5IGRvIGl0IG9uY2UsIGluIGNhc2UgdGhlIG1hcCBpcyBtb3ZlZFxuICAgICAgICAgICAgaWYoIXBhbm5lZFRvQ2VudGVyKSB7XG4gICAgICAgICAgICAgICAgbWFwLnBhblRvKHtsYXQ6IHJvdXRlSnNvbi5wb3NpdGlvbi5sYXQsIGxuZzogcm91dGVKc29uLnBvc2l0aW9uLmxvbn0pO1xuICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgUElSRVAgaW5mbyBpcyBkb25lIGxvYWRpbmcsIHNob3cgdGhlIGJvdHRvbSBiYXJcbiAgICAgICAgLy9cbiAgICAgICAgJC53aGVuKHBpcmVwX2luZm8pLmRvbmUocGlyZXAgPT4ge1xuICAgICAgICAgICAgcl9tYXBfdmlldy51cGRhdGUoe3BpcmVwOnBpcmVwLmRhdGF9KTtcbiAgICAgICAgICAgICQoJyNtYXAtaW5mby1ib3gnKS5zaG93KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVNYXAgPSAoKSA9PiB7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ3JlbG9hZGluZyBmbGlnaHRzIGZyb20gYWNhcnMuLi4nKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQUpBWCBVUERBVEVcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHBpcmVwX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCAnJyk7XG4gICAgICAgIGxldCBwaXJlcHMgPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBwaXJlcF91cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBmbGlnaHRzID0gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogb3B0cy51cGRhdGVfdXJpLFxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xuICAgICAgICB9KTtcblxuICAgICAgICAkLndoZW4oZmxpZ2h0cykuZG9uZShmbGlnaHRHZW9Kc29uID0+IHtcblxuICAgICAgICAgICAgaWYgKGxheWVyRmxpZ2h0cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxheWVyRmxpZ2h0cy5jbGVhckxheWVycygpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxheWVyRmxpZ2h0cyA9IGxlYWZsZXQuZ2VvSlNPTihmbGlnaHRHZW9Kc29uLCB7XG4gICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogKGZlYXR1cmUsIGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLm9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GbGlnaHRDbGljayhmZWF0dXJlLCBsYXllcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSAnJyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXAgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwX2h0bWwgKz0gZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuYmluZFBvcHVwKHBvcHVwX2h0bWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGF5ZXJGbGlnaHRzLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgY2xpY2tlZC1mbGlnaHQgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGlmIChsYXllclNlbEZsaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2sobGF5ZXJTZWxGbGlnaHRGZWF0dXJlLCBsYXllclNlbEZsaWdodExheWVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkLndoZW4ocGlyZXBzKS5kb25lKHBpcmVwcyA9PiB7XG4gICAgICAgICAgICByX3RhYmxlX3ZpZXcudXBkYXRlKHtcbiAgICAgICAgICAgICAgICBwaXJlcHM6IHBpcmVwcy5kYXRhLFxuICAgICAgICAgICAgICAgIGhhc19kYXRhOiAocGlyZXBzLmRhdGEubGVuZ3RoID4gMCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHVwZGF0ZU1hcCgpO1xuICAgIHNldEludGVydmFsKHVwZGF0ZU1hcCwgMTAwMDApXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); /***/ }), @@ -366,7 +394,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n\n\n/**\r\n * Show some popup text when a feature is clicked on\r\n * @param feature\r\n * @param layer\r\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\r\n * Show each point as a marker\r\n * @param feature\r\n * @param latlng\r\n * @returns {*}\r\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_2__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\r\n *\r\n * @param opts\r\n * @private\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var geodesicLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n geodesicLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\r\n * draw the actual route\r\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var _geodesicLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n _geodesicLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(_geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\r\n *\r\n */\n var liveFlight = function liveFlight() {\n var uri = opts.pirep_uri;\n var live_route = $.ajax({\n url: uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(live_route).done(function (routeJson) {\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicm91dGVfcG9pbnRzIiwicGxhbm5lZF9yb3V0ZV9saW5lIiwiYWN0dWFsX3JvdXRlX3BvaW50cyIsImFjdHVhbF9yb3V0ZV9saW5lIiwicmVuZGVyX2VsZW0iLCJsaXZlX21hcCIsImFpcmNyYWZ0X2ljb24iLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsImdlb2Rlc2ljTGF5ZXIiLCJnZW9kZXNpYyIsInN0ZXBzIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImZpdEJvdW5kcyIsImdldEJvdW5kcyIsImUiLCJjb25zb2xlIiwibG9nIiwiZ2VvSlNPTiIsIm9uRWFjaEZlYXR1cmUiLCJzdHlsZSIsImZlYXR1cmVzIiwibGVuZ3RoIiwibGl2ZUZsaWdodCIsInVyaSIsInBpcmVwX3VyaSIsImxpdmVfcm91dGUiLCIkIiwiYWpheCIsImRhdGFUeXBlIiwiZXJyb3IiLCJ3aGVuIiwiZG9uZSIsInJvdXRlSnNvbiIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJoZWFkaW5nIiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3Mi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QVUsVUFBRUksSUFBRixDQUFPTCxVQUFQLEVBQW1CTSxJQUFuQixDQUF3QixVQUFDQyxTQUFELEVBQWU7QUFDbkM1Qiw4QkFBa0J0QyxRQUFRbUQsT0FBUixDQUFnQmUsU0FBaEIsRUFBMkI7QUFDekN6RCw4QkFBYyxzQkFBVU4sT0FBVixFQUFtQmdFLE1BQW5CLEVBQTJCO0FBQ3JDLDJCQUFPbkUsUUFBUW9FLE1BQVIsQ0FBZUQsTUFBZixFQUF1QjtBQUMxQm5DLDhCQUFNRCxZQURvQjtBQUUxQnNDLHVDQUFlbEUsUUFBUUcsVUFBUixDQUFtQmdFO0FBRlIscUJBQXZCLENBQVA7QUFJSDtBQU53QyxhQUEzQixDQUFsQjs7QUFTQWhDLDRCQUFnQk0sS0FBaEIsQ0FBc0JSLEdBQXRCO0FBQ0gsU0FYRDtBQVlILEtBcEJEOztBQXNCQW1DLGdCQUFZZixVQUFaLEVBQXdCLEtBQXhCO0FBQ0gsQ0EzSEQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5cclxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcclxuaW1wb3J0IHthZGRXTVNMYXllcn0gZnJvbSAnLi9oZWxwZXJzJztcclxuXHJcbmltcG9ydCB7QUNUVUFMX1JPVVRFX0NPTE9SLCBDSVJDTEVfQ09MT1IsIFBMQU5fUk9VVEVfQ09MT1J9IGZyb20gJy4vY29uZmlnJ1xyXG5cclxuLyoqXHJcbiAqIFNob3cgc29tZSBwb3B1cCB0ZXh0IHdoZW4gYSBmZWF0dXJlIGlzIGNsaWNrZWQgb25cclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxheWVyXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb25GZWF0dXJlUG9pbnRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xyXG4gICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcclxuICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XHJcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcclxuICAgIH1cclxuXHJcbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93IGVhY2ggcG9pbnQgYXMgYSBtYXJrZXJcclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxhdGxuZ1xyXG4gKiBAcmV0dXJucyB7Kn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb2ludFRvTGF5ZXIgPSAoZmVhdHVyZSwgbGF0bG5nKSA9PiB7XHJcbiAgICByZXR1cm4gbGVhZmxldC5jaXJjbGVNYXJrZXIobGF0bG5nLCB7XHJcbiAgICAgICAgcmFkaXVzOiA1LFxyXG4gICAgICAgIGZpbGxDb2xvcjogQ0lSQ0xFX0NPTE9SLFxyXG4gICAgICAgIGNvbG9yOiAnIzAwMCcsXHJcbiAgICAgICAgd2VpZ2h0OiAxLFxyXG4gICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgZmlsbE9wYWNpdHk6IDAuOFxyXG4gICAgfSlcclxufVxyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBvcHRzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAob3B0cykgPT4ge1xyXG5cclxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcclxuXHJcbiAgICAgICAgcm91dGVfcG9pbnRzOiBudWxsLFxyXG4gICAgICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcclxuICAgICAgICBhY3R1YWxfcm91dGVfcG9pbnRzOiBudWxsLFxyXG4gICAgICAgIGFjdHVhbF9yb3V0ZV9saW5lOiBudWxsLFxyXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcclxuICAgICAgICBsaXZlX21hcDogZmFsc2UsXHJcbiAgICAgICAgYWlyY3JhZnRfaWNvbjogJy9hc3NldHMvaW1nL2FjYXJzL2FpcmNyYWZ0LnBuZycsXHJcbiAgICAgICAgbWV0YXJfd21zOiB7XHJcbiAgICAgICAgICAgIHVybDogJycsXHJcbiAgICAgICAgICAgIHBhcmFtczoge31cclxuICAgICAgICB9LFxyXG4gICAgfSwgb3B0cyk7XHJcblxyXG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcclxuICAgICAgICBpY29uVXJsOiBvcHRzLmFpcmNyYWZ0X2ljb24sXHJcbiAgICAgICAgaWNvblNpemU6IFs0MiwgNDJdLFxyXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XHJcbiAgICBsZXQgbGF5ZXJMaXZlRmxpZ2h0O1xyXG5cclxuICAgIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XHJcbiAgICAgICAgYWRkV01TTGF5ZXIobWFwLCBvcHRzLm1ldGFyX3dtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGdlb2Rlc2ljTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XHJcbiAgICAgICAgd2VpZ2h0OiA0LFxyXG4gICAgICAgIG9wYWNpdHk6IDAuOSxcclxuICAgICAgICBjb2xvcjogUExBTl9ST1VURV9DT0xPUixcclxuICAgICAgICBzdGVwczogNTAsXHJcbiAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICB9KS5hZGRUbyhtYXApO1xyXG5cclxuICAgIGdlb2Rlc2ljTGF5ZXIuZ2VvSnNvbihvcHRzLnBsYW5uZWRfcm91dGVfbGluZSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZSlcclxuICAgIH1cclxuXHJcbiAgICAvLyBEcmF3IHRoZSByb3V0ZSBwb2ludHMgYWZ0ZXJcclxuICAgIGlmIChvcHRzLnJvdXRlX3BvaW50cyAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5yb3V0ZV9wb2ludHMsIHtcclxuICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogb25GZWF0dXJlUG9pbnRDbGljayxcclxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXHJcbiAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAnY29sb3InOiBQTEFOX1JPVVRFX0NPTE9SLFxyXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMsXHJcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6IDAuNjUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJvdXRlX3BvaW50cy5hZGRUbyhtYXApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZHJhdyB0aGUgYWN0dWFsIHJvdXRlXHJcbiAgICAgKi9cclxuXHJcbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfbGluZSAhPT0gbnVsbCAmJiBvcHRzLmFjdHVhbF9yb3V0ZV9saW5lLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgZ2VvZGVzaWNMYXllciA9IGxlYWZsZXQuZ2VvZGVzaWMoW10sIHtcclxuICAgICAgICAgICAgd2VpZ2h0OiAzLFxyXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjksXHJcbiAgICAgICAgICAgIGNvbG9yOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXHJcbiAgICAgICAgICAgIHN0ZXBzOiA1MCxcclxuICAgICAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICAgICAgfSkuYWRkVG8obWFwKTtcclxuXHJcbiAgICAgICAgZ2VvZGVzaWNMYXllci5nZW9Kc29uKG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX3BvaW50cy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHJvdXRlX3BvaW50cyA9IGxlYWZsZXQuZ2VvSlNPTihvcHRzLmFjdHVhbF9yb3V0ZV9wb2ludHMsIHtcclxuICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogb25GZWF0dXJlUG9pbnRDbGljayxcclxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXHJcbiAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAnY29sb3InOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXHJcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMyxcclxuICAgICAgICAgICAgICAgICdvcGFjaXR5JzogMC42NSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcm91dGVfcG9pbnRzLmFkZFRvKG1hcClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGxpdmVGbGlnaHQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXJpID0gb3B0cy5waXJlcF91cmk7XHJcbiAgICAgICAgY29uc3QgbGl2ZV9yb3V0ZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogdXJpLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5sb2dcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJC53aGVuKGxpdmVfcm91dGUpLmRvbmUoKHJvdXRlSnNvbikgPT4ge1xyXG4gICAgICAgICAgICBsYXllckxpdmVGbGlnaHQgPSBsZWFmbGV0Lmdlb0pTT04ocm91dGVKc29uLCB7XHJcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVhZmxldC5tYXJrZXIobGF0bG9uLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGFpcmNyYWZ0SWNvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyTGl2ZUZsaWdodC5hZGRUbyhtYXApXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHNldEludGVydmFsKGxpdmVGbGlnaHQsIDEwMDAwKTtcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvcm91dGVfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); +eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n\n\n/**\n * Show some popup text when a feature is clicked on\n * @param feature\n * @param layer\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\n * Show each point as a marker\n * @param feature\n * @param latlng\n * @returns {*}\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_2__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\n *\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var geodesicLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n geodesicLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\n * draw the actual route\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var _geodesicLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n _geodesicLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(_geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\n *\n */\n var liveFlight = function liveFlight() {\n var uri = opts.pirep_uri;\n var live_route = $.ajax({\n url: uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(live_route).done(function (routeJson) {\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicm91dGVfcG9pbnRzIiwicGxhbm5lZF9yb3V0ZV9saW5lIiwiYWN0dWFsX3JvdXRlX3BvaW50cyIsImFjdHVhbF9yb3V0ZV9saW5lIiwicmVuZGVyX2VsZW0iLCJsaXZlX21hcCIsImFpcmNyYWZ0X2ljb24iLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsImdlb2Rlc2ljTGF5ZXIiLCJnZW9kZXNpYyIsInN0ZXBzIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImZpdEJvdW5kcyIsImdldEJvdW5kcyIsImUiLCJjb25zb2xlIiwibG9nIiwiZ2VvSlNPTiIsIm9uRWFjaEZlYXR1cmUiLCJzdHlsZSIsImZlYXR1cmVzIiwibGVuZ3RoIiwibGl2ZUZsaWdodCIsInVyaSIsInBpcmVwX3VyaSIsImxpdmVfcm91dGUiLCIkIiwiYWpheCIsImRhdGFUeXBlIiwiZXJyb3IiLCJ3aGVuIiwiZG9uZSIsInJvdXRlSnNvbiIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJoZWFkaW5nIiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUFBLElBQU1BLFVBQVUsbUJBQUFDLENBQVEsNENBQVIsQ0FBaEI7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7Ozs7QUFLTyxJQUFNQyxzQkFBc0IsU0FBdEJBLG1CQUFzQixDQUFDQyxPQUFELEVBQVVDLEtBQVYsRUFBb0I7QUFDbkQsUUFBSUMsYUFBYSxFQUFqQjtBQUNBLFFBQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2hERixzQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDSDs7QUFFREgsVUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDSCxDQVBNOztBQVNQOzs7Ozs7QUFNTyxJQUFNSSxlQUFlLFNBQWZBLFlBQWUsQ0FBQ04sT0FBRCxFQUFVTyxNQUFWLEVBQXFCO0FBQzdDLFdBQU9WLFFBQVFXLFlBQVIsQ0FBcUJELE1BQXJCLEVBQTZCO0FBQ2hDRSxnQkFBUSxDQUR3QjtBQUVoQ0MsbUJBQVcsNkRBRnFCO0FBR2hDQyxlQUFPLE1BSHlCO0FBSWhDQyxnQkFBUSxDQUp3QjtBQUtoQ0MsaUJBQVMsQ0FMdUI7QUFNaENDLHFCQUFhO0FBTm1CLEtBQTdCLENBQVA7QUFRSCxDQVRNOztBQVdQOzs7Ozt5REFLZSxVQUFDQyxJQUFELEVBQVU7O0FBRXJCQSxXQUFPQyxPQUFPQyxNQUFQLENBQWM7O0FBRWpCQyxzQkFBYyxJQUZHO0FBR2pCQyw0QkFBb0IsSUFISDtBQUlqQkMsNkJBQXFCLElBSko7QUFLakJDLDJCQUFtQixJQUxGO0FBTWpCQyxxQkFBYSxLQU5JO0FBT2pCQyxrQkFBVSxLQVBPO0FBUWpCQyx1QkFBZSxnQ0FSRTtBQVNqQkMsbUJBQVc7QUFDUEMsaUJBQUssRUFERTtBQUVQQyxvQkFBUTtBQUZEO0FBVE0sS0FBZCxFQWFKWixJQWJJLENBQVA7O0FBZUEsUUFBTWEsZUFBZS9CLFFBQVFnQyxJQUFSLENBQWE7QUFDOUJDLGlCQUFTZixLQUFLUyxhQURnQjtBQUU5Qk8sa0JBQVUsQ0FBQyxFQUFELEVBQUssRUFBTCxDQUZvQjtBQUc5QkMsb0JBQVksQ0FBQyxFQUFELEVBQUssRUFBTDtBQUhrQixLQUFiLENBQXJCOztBQU1BLFFBQUlDLE1BQU0sa0VBQUFDLENBQWNuQixJQUFkLENBQVY7QUFDQSxRQUFJb0Isd0JBQUo7O0FBRUEsUUFBSXBCLEtBQUtVLFNBQUwsQ0FBZUMsR0FBZixLQUF1QixFQUEzQixFQUErQjtBQUMzQlUsUUFBQSxxRUFBQUEsQ0FBWUgsR0FBWixFQUFpQmxCLEtBQUtVLFNBQXRCO0FBQ0g7O0FBRUQsUUFBSVksZ0JBQWdCeEMsUUFBUXlDLFFBQVIsQ0FBaUIsRUFBakIsRUFBcUI7QUFDckMxQixnQkFBUSxDQUQ2QjtBQUVyQ0MsaUJBQVMsR0FGNEI7QUFHckNGLGVBQU8saUVBSDhCO0FBSXJDNEIsZUFBTyxFQUo4QjtBQUtyQ0MsY0FBTTtBQUwrQixLQUFyQixFQU1qQkMsS0FOaUIsQ0FNWFIsR0FOVyxDQUFwQjs7QUFRQUksa0JBQWNLLE9BQWQsQ0FBc0IzQixLQUFLSSxrQkFBM0I7O0FBRUEsUUFBSTtBQUNBYyxZQUFJVSxTQUFKLENBQWNOLGNBQWNPLFNBQWQsRUFBZDtBQUNILEtBRkQsQ0FFRSxPQUFPQyxDQUFQLEVBQVU7QUFDUkMsZ0JBQVFDLEdBQVIsQ0FBWUYsQ0FBWjtBQUNIOztBQUVEO0FBQ0EsUUFBSTlCLEtBQUtHLFlBQUwsS0FBc0IsSUFBMUIsRUFBZ0M7QUFDNUIsWUFBSUEsZUFBZXJCLFFBQVFtRCxPQUFSLENBQWdCakMsS0FBS0csWUFBckIsRUFBbUM7QUFDbEQrQiwyQkFBZWxELG1CQURtQztBQUVsRE8sMEJBQWNBLFlBRm9DO0FBR2xENEMsbUJBQU87QUFDSCx5QkFBUyxpRUFETjtBQUVILDBCQUFVLENBRlA7QUFHSCwyQkFBVztBQUhSO0FBSDJDLFNBQW5DLENBQW5COztBQVVBaEMscUJBQWF1QixLQUFiLENBQW1CUixHQUFuQjtBQUNIOztBQUVEOzs7O0FBSUEsUUFBSWxCLEtBQUtNLGlCQUFMLEtBQTJCLElBQTNCLElBQW1DTixLQUFLTSxpQkFBTCxDQUF1QjhCLFFBQXZCLENBQWdDQyxNQUFoQyxHQUF5QyxDQUFoRixFQUFtRjtBQUMvRSxZQUFJZixpQkFBZ0J4QyxRQUFReUMsUUFBUixDQUFpQixFQUFqQixFQUFxQjtBQUNyQzFCLG9CQUFRLENBRDZCO0FBRXJDQyxxQkFBUyxHQUY0QjtBQUdyQ0YsbUJBQU8sbUVBSDhCO0FBSXJDNEIsbUJBQU8sRUFKOEI7QUFLckNDLGtCQUFNO0FBTCtCLFNBQXJCLEVBTWpCQyxLQU5pQixDQU1YUixHQU5XLENBQXBCOztBQVFBSSx1QkFBY0ssT0FBZCxDQUFzQjNCLEtBQUtNLGlCQUEzQjs7QUFFQSxZQUFJO0FBQ0FZLGdCQUFJVSxTQUFKLENBQWNOLGVBQWNPLFNBQWQsRUFBZDtBQUNILFNBRkQsQ0FFRSxPQUFPQyxDQUFQLEVBQVU7QUFDUkMsb0JBQVFDLEdBQVIsQ0FBWUYsQ0FBWjtBQUNIO0FBQ0o7O0FBRUQsUUFBSTlCLEtBQUtLLG1CQUFMLEtBQTZCLElBQTdCLElBQXFDTCxLQUFLSyxtQkFBTCxDQUF5QitCLFFBQXpCLENBQWtDQyxNQUFsQyxHQUEyQyxDQUFwRixFQUF1RjtBQUNuRixZQUFJbEMsZ0JBQWVyQixRQUFRbUQsT0FBUixDQUFnQmpDLEtBQUtLLG1CQUFyQixFQUEwQztBQUN6RDZCLDJCQUFlbEQsbUJBRDBDO0FBRXpETywwQkFBY0EsWUFGMkM7QUFHekQ0QyxtQkFBTztBQUNILHlCQUFTLG1FQUROO0FBRUgsMEJBQVUsQ0FGUDtBQUdILDJCQUFXO0FBSFI7QUFIa0QsU0FBMUMsQ0FBbkI7O0FBVUFoQyxzQkFBYXVCLEtBQWIsQ0FBbUJSLEdBQW5CO0FBQ0g7O0FBRUQ7OztBQUdBLFFBQU1vQixhQUFhLFNBQWJBLFVBQWEsR0FBTTtBQUNyQixZQUFNQyxNQUFNdkMsS0FBS3dDLFNBQWpCO0FBQ0EsWUFBTUMsYUFBYUMsRUFBRUMsSUFBRixDQUFPO0FBQ3RCaEMsaUJBQUs0QixHQURpQjtBQUV0Qkssc0JBQVUsTUFGWTtBQUd0QkMsbUJBQU9kLFFBQVFDO0FBSE8sU0FBUCxDQUFuQjs7QUFNQVUsVUFBRUksSUFBRixDQUFPTCxVQUFQLEVBQW1CTSxJQUFuQixDQUF3QixVQUFDQyxTQUFELEVBQWU7QUFDbkM1Qiw4QkFBa0J0QyxRQUFRbUQsT0FBUixDQUFnQmUsU0FBaEIsRUFBMkI7QUFDekN6RCw4QkFBYyxzQkFBVU4sT0FBVixFQUFtQmdFLE1BQW5CLEVBQTJCO0FBQ3JDLDJCQUFPbkUsUUFBUW9FLE1BQVIsQ0FBZUQsTUFBZixFQUF1QjtBQUMxQm5DLDhCQUFNRCxZQURvQjtBQUUxQnNDLHVDQUFlbEUsUUFBUUcsVUFBUixDQUFtQmdFO0FBRlIscUJBQXZCLENBQVA7QUFJSDtBQU53QyxhQUEzQixDQUFsQjs7QUFTQWhDLDRCQUFnQk0sS0FBaEIsQ0FBc0JSLEdBQXRCO0FBQ0gsU0FYRDtBQVlILEtBcEJEOztBQXNCQW1DLGdCQUFZZixVQUFaLEVBQXdCLEtBQXhCO0FBQ0gsQ0EzSEQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuXG5pbXBvcnQgZHJhd19iYXNlX21hcCBmcm9tICcuL2Jhc2VfbWFwJ1xuaW1wb3J0IHthZGRXTVNMYXllcn0gZnJvbSAnLi9oZWxwZXJzJztcblxuaW1wb3J0IHtBQ1RVQUxfUk9VVEVfQ09MT1IsIENJUkNMRV9DT0xPUiwgUExBTl9ST1VURV9DT0xPUn0gZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogU2hvdyBzb21lIHBvcHVwIHRleHQgd2hlbiBhIGZlYXR1cmUgaXMgY2xpY2tlZCBvblxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXllclxuICovXG5leHBvcnQgY29uc3Qgb25GZWF0dXJlUG9pbnRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xuICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcbiAgICB9XG5cbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcbn07XG5cbi8qKlxuICogU2hvdyBlYWNoIHBvaW50IGFzIGEgbWFya2VyXG4gKiBAcGFyYW0gZmVhdHVyZVxuICogQHBhcmFtIGxhdGxuZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBjb25zdCBwb2ludFRvTGF5ZXIgPSAoZmVhdHVyZSwgbGF0bG5nKSA9PiB7XG4gICAgcmV0dXJuIGxlYWZsZXQuY2lyY2xlTWFya2VyKGxhdGxuZywge1xuICAgICAgICByYWRpdXM6IDUsXG4gICAgICAgIGZpbGxDb2xvcjogQ0lSQ0xFX0NPTE9SLFxuICAgICAgICBjb2xvcjogJyMwMDAnLFxuICAgICAgICB3ZWlnaHQ6IDEsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGZpbGxPcGFjaXR5OiAwLjhcbiAgICB9KVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gb3B0c1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcblxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcblxuICAgICAgICByb3V0ZV9wb2ludHM6IG51bGwsXG4gICAgICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX3BvaW50czogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX2xpbmU6IG51bGwsXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICAgICAgbGl2ZV9tYXA6IGZhbHNlLFxuICAgICAgICBhaXJjcmFmdF9pY29uOiAnL2Fzc2V0cy9pbWcvYWNhcnMvYWlyY3JhZnQucG5nJyxcbiAgICAgICAgbWV0YXJfd21zOiB7XG4gICAgICAgICAgICB1cmw6ICcnLFxuICAgICAgICAgICAgcGFyYW1zOiB7fVxuICAgICAgICB9LFxuICAgIH0sIG9wdHMpO1xuXG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcbiAgICAgICAgaWNvblVybDogb3B0cy5haXJjcmFmdF9pY29uLFxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxuICAgIH0pO1xuXG4gICAgbGV0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XG4gICAgbGV0IGxheWVyTGl2ZUZsaWdodDtcblxuICAgIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgICAgIGFkZFdNU0xheWVyKG1hcCwgb3B0cy5tZXRhcl93bXMpO1xuICAgIH1cblxuICAgIGxldCBnZW9kZXNpY0xheWVyID0gbGVhZmxldC5nZW9kZXNpYyhbXSwge1xuICAgICAgICB3ZWlnaHQ6IDQsXG4gICAgICAgIG9wYWNpdHk6IDAuOSxcbiAgICAgICAgY29sb3I6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgIHN0ZXBzOiA1MCxcbiAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgfSkuYWRkVG8obWFwKTtcblxuICAgIGdlb2Rlc2ljTGF5ZXIuZ2VvSnNvbihvcHRzLnBsYW5uZWRfcm91dGVfbGluZSk7XG5cbiAgICB0cnkge1xuICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKVxuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIHJvdXRlIHBvaW50cyBhZnRlclxuICAgIGlmIChvcHRzLnJvdXRlX3BvaW50cyAhPT0gbnVsbCkge1xuICAgICAgICBsZXQgcm91dGVfcG9pbnRzID0gbGVhZmxldC5nZW9KU09OKG9wdHMucm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMsXG4gICAgICAgICAgICAgICAgJ29wYWNpdHknOiAwLjY1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcm91dGVfcG9pbnRzLmFkZFRvKG1hcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZHJhdyB0aGUgYWN0dWFsIHJvdXRlXG4gICAgICovXG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfbGluZSAhPT0gbnVsbCAmJiBvcHRzLmFjdHVhbF9yb3V0ZV9saW5lLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGdlb2Rlc2ljTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XG4gICAgICAgICAgICB3ZWlnaHQ6IDMsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjksXG4gICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxuICAgICAgICAgICAgc3RlcHM6IDUwLFxuICAgICAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgICAgIH0pLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgZ2VvZGVzaWNMYXllci5nZW9Kc29uKG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX3BvaW50cy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IEFDVFVBTF9ST1VURV9DT0xPUixcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMyxcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6IDAuNjUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICByb3V0ZV9wb2ludHMuYWRkVG8obWFwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgY29uc3QgbGl2ZUZsaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdXJpID0gb3B0cy5waXJlcF91cmk7XG4gICAgICAgIGNvbnN0IGxpdmVfcm91dGUgPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB1cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQud2hlbihsaXZlX3JvdXRlKS5kb25lKChyb3V0ZUpzb24pID0+IHtcbiAgICAgICAgICAgIGxheWVyTGl2ZUZsaWdodCA9IGxlYWZsZXQuZ2VvSlNPTihyb3V0ZUpzb24sIHtcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGF5ZXJMaXZlRmxpZ2h0LmFkZFRvKG1hcClcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldEludGVydmFsKGxpdmVGbGlnaHQsIDEwMDAwKTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); /***/ }), diff --git a/public/assets/installer/css/vendor.css b/public/assets/installer/css/vendor.css index a4f79ae6..7b87e764 100644 --- a/public/assets/installer/css/vendor.css +++ b/public/assets/installer/css/vendor.css @@ -6799,31 +6799,31 @@ button.close { } /*# sourceMappingURL=bootstrap.css.map */ -/*! - - ========================================================= - * Now-ui-kit - v1.0.0 - ========================================================= - - * Product Page: http://www.creative-tim.com/product/now-ui-kit - * Copyright 2017 Creative Tim (http://www.creative-tim.com) - * Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md) - - * Designed by www.invisionapp.com Coded by www.creative-tim.com - - ========================================================= - - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - +/*! + + ========================================================= + * Now-ui-kit - v1.0.0 + ========================================================= + + * Product Page: http://www.creative-tim.com/product/now-ui-kit + * Copyright 2017 Creative Tim (http://www.creative-tim.com) + * Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md) + + * Designed by www.invisionapp.com Coded by www.creative-tim.com + + ========================================================= + + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + */ /* brand Colors */ /* light colors */ -/* ======================================================================== - * bootstrap-switch - v3.3.2 - * http://www.bootstrap-switch.org - * ======================================================================== - * Copyright 2012-2013 Mattia Larentis - * http://www.apache.org/licenses/LICENSE-2.0 +/* ======================================================================== + * bootstrap-switch - v3.3.2 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * http://www.apache.org/licenses/LICENSE-2.0 */ .bootstrap-switch { display: inline-block; @@ -7094,9 +7094,9 @@ button.close { } /*! nouislider - 9.1.0 - 2016-12-10 16:00:32 */ -/* Functional styling; - * These styles are required for noUiSlider to function. - * You don't need to change these rules to apply your design. +/* Functional styling; + * These styles are required for noUiSlider to function. + * You don't need to change these rules to apply your design. */ .noUi-target, .noUi-target * { @@ -7154,8 +7154,8 @@ button.close { cursor: inherit !important; } -/* Painting and performance; - * Browsers can paint handles in their own layer. +/* Painting and performance; + * Browsers can paint handles in their own layer. */ .noUi-base, .noUi-handle { @@ -7163,7 +7163,7 @@ button.close { transform: translate3d(0, 0, 0); } -/* Slider size and handle placement; +/* Slider size and handle placement; */ .noUi-horizontal { height: 1px; @@ -7192,7 +7192,7 @@ button.close { top: -17px; } -/* Styling; +/* Styling; */ .noUi-target { background-color: rgba(182, 182, 182, 0.3); @@ -7206,7 +7206,7 @@ button.close { transition: background 450ms; } -/* Handles and cursors; +/* Handles and cursors; */ .noUi-draggable { cursor: ew-resize; @@ -7220,8 +7220,8 @@ button.close { border-radius: 3px; background: #FFF; cursor: default; - -webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; - box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; + -webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; + box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; -webkit-transition: 300ms ease 0s; -moz-transition: 300ms ease 0s; -ms-transition: 300ms ease 0s; @@ -7234,7 +7234,7 @@ button.close { transform: scale3d(1.5, 1.5, 1); } -/* Disabled state; +/* Disabled state; */ [disabled] .noUi-connect { background: #B8B8B8; @@ -7246,8 +7246,8 @@ button.close { cursor: not-allowed; } -/* Base; - * +/* Base; + * */ .noUi-pips, .noUi-pips * { @@ -7260,8 +7260,8 @@ button.close { color: #999; } -/* Values; - * +/* Values; + * */ .noUi-value { position: absolute; @@ -7273,8 +7273,8 @@ button.close { font-size: 10px; } -/* Markings; - * +/* Markings; + * */ .noUi-marker { position: absolute; @@ -7289,8 +7289,8 @@ button.close { background: #AAA; } -/* Horizontal layout; - * +/* Horizontal layout; + * */ .noUi-pips-horizontal { padding: 10px 0; @@ -7319,8 +7319,8 @@ button.close { height: 15px; } -/* Vertical layout; - * +/* Vertical layout; + * */ .noUi-pips-vertical { padding: 0 10px; @@ -7446,10 +7446,10 @@ button.close { background-color: #FF3636; } -/*! - * Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker) - * - * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) +/*! + * Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) */ .datepicker { padding: 8px 6px; @@ -8999,17 +8999,17 @@ fieldset[disabled] background-color: #E3E3E3; } -/*.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { - border-right: 0 none; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child) { - border-left: 0 none; +/*.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-right: 0 none; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-left: 0 none; }*/ .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #E3E3E3; @@ -10556,12 +10556,12 @@ img { box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); } -/* -------------------------------- - -Nucleo Outline Web Font - nucleoapp.com/ -License - nucleoapp.com/license/ -Created using IcoMoon - icomoon.io - +/* -------------------------------- + +Nucleo Outline Web Font - nucleoapp.com/ +License - nucleoapp.com/license/ +Created using IcoMoon - icomoon.io + -------------------------------- */ @font-face { font-family: 'Nucleo Outline'; @@ -10571,8 +10571,8 @@ Created using IcoMoon - icomoon.io font-style: normal; } -/*------------------------ - base class definition +/*------------------------ + base class definition -------------------------*/ .now-ui-icons { display: inline-block; @@ -10585,11 +10585,11 @@ Created using IcoMoon - icomoon.io -moz-osx-font-smoothing: grayscale; } -/*------------------------ - change icon size +/*------------------------ + change icon size -------------------------*/ -/*---------------------------------- - add a square/circle background +/*---------------------------------- + add a square/circle background -----------------------------------*/ .now-ui-icons.circle { padding: 0.33333333em; @@ -10601,8 +10601,8 @@ Created using IcoMoon - icomoon.io border-radius: 50%; } -/*------------------------ - list icons +/*------------------------ + list icons -------------------------*/ .nc-icon-ul { padding-left: 0; @@ -10626,8 +10626,8 @@ Created using IcoMoon - icomoon.io left: -1.9047619em; } -/*------------------------ - spinning icons +/*------------------------ + spinning icons -------------------------*/ .now-ui-icons.spin { -webkit-animation: nc-icon-spin 2s infinite linear; @@ -10654,11 +10654,11 @@ Created using IcoMoon - icomoon.io } } -/*------------------------ - rotated/flipped icons +/*------------------------ + rotated/flipped icons -------------------------*/ -/*------------------------ - font icons +/*------------------------ + font icons -------------------------*/ .now-ui-icons.ui-1_check:before { content: "\EA22"; @@ -12469,21 +12469,21 @@ Created using IcoMoon - icomoon.io } } -/*.separator{ - content: "Separator"; - color: #FFFFFF; - display: block; - width: 100%; - padding: 20px; -} -.separator-line{ - background-color: #EEE; - height: 1px; - width: 100%; - display: block; -} -.separator.separator-gray{ - background-color: #EEEEEE; +/*.separator{ + content: "Separator"; + color: #FFFFFF; + display: block; + width: 100%; + padding: 20px; +} +.separator-line{ + background-color: #EEE; + height: 1px; + width: 100%; + display: block; +} +.separator.separator-gray{ + background-color: #EEEEEE; }*/ .social-buttons-demo .btn { margin-right: 5px; diff --git a/public/assets/installer/js/app.js b/public/assets/installer/js/app.js index 859734f5..45ee171a 100644 --- a/public/assets/installer/js/app.js +++ b/public/assets/installer/js/app.js @@ -278,17 +278,45 @@ eval("// shim for using process in browser\nvar process = module.exports = {};\n /***/ }), +/***/ "./node_modules/rivets/dist/rivets.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Rivets.js\n// version: 0.9.6\n// author: Michael Richards\n// license: MIT\n(function() {\n var Rivets, bindMethod, jQuery, unbindMethod, _ref,\n __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n __slice = [].slice,\n __hasProp = {}.hasOwnProperty,\n __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n Rivets = {\n options: ['prefix', 'templateDelimiters', 'rootInterface', 'preloadData', 'handler', 'executeFunctions'],\n extensions: ['binders', 'formatters', 'components', 'adapters'],\n \"public\": {\n binders: {},\n components: {},\n formatters: {},\n adapters: {},\n prefix: 'rv',\n templateDelimiters: ['{', '}'],\n rootInterface: '.',\n preloadData: true,\n executeFunctions: false,\n iterationAlias: function(modelName) {\n return '%' + modelName + '%';\n },\n handler: function(context, ev, binding) {\n return this.call(context, ev, binding.view.models);\n },\n configure: function(options) {\n var descriptor, key, option, value;\n if (options == null) {\n options = {};\n }\n for (option in options) {\n value = options[option];\n if (option === 'binders' || option === 'components' || option === 'formatters' || option === 'adapters') {\n for (key in value) {\n descriptor = value[key];\n Rivets[option][key] = descriptor;\n }\n } else {\n Rivets[\"public\"][option] = value;\n }\n }\n },\n bind: function(el, models, options) {\n var view;\n if (models == null) {\n models = {};\n }\n if (options == null) {\n options = {};\n }\n view = new Rivets.View(el, models, options);\n view.bind();\n return view;\n },\n init: function(component, el, data) {\n var scope, template, view;\n if (data == null) {\n data = {};\n }\n if (el == null) {\n el = document.createElement('div');\n }\n component = Rivets[\"public\"].components[component];\n template = component.template.call(this, el);\n if (template instanceof HTMLElement) {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n el.appendChild(template);\n } else {\n el.innerHTML = template;\n }\n scope = component.initialize.call(this, el, data);\n view = new Rivets.View(el, scope);\n view.bind();\n return view;\n }\n }\n };\n\n if (window['jQuery'] || window['$']) {\n jQuery = window['jQuery'] || window['$'];\n _ref = 'on' in jQuery.prototype ? ['on', 'off'] : ['bind', 'unbind'], bindMethod = _ref[0], unbindMethod = _ref[1];\n Rivets.Util = {\n bindEvent: function(el, event, handler) {\n return jQuery(el)[bindMethod](event, handler);\n },\n unbindEvent: function(el, event, handler) {\n return jQuery(el)[unbindMethod](event, handler);\n },\n getInputValue: function(el) {\n var $el;\n $el = jQuery(el);\n if ($el.attr('type') === 'checkbox') {\n return $el.is(':checked');\n } else {\n return $el.val();\n }\n }\n };\n } else {\n Rivets.Util = {\n bindEvent: (function() {\n if ('addEventListener' in window) {\n return function(el, event, handler) {\n return el.addEventListener(event, handler, false);\n };\n }\n return function(el, event, handler) {\n return el.attachEvent('on' + event, handler);\n };\n })(),\n unbindEvent: (function() {\n if ('removeEventListener' in window) {\n return function(el, event, handler) {\n return el.removeEventListener(event, handler, false);\n };\n }\n return function(el, event, handler) {\n return el.detachEvent('on' + event, handler);\n };\n })(),\n getInputValue: function(el) {\n var o, _i, _len, _results;\n if (el.type === 'checkbox') {\n return el.checked;\n } else if (el.type === 'select-multiple') {\n _results = [];\n for (_i = 0, _len = el.length; _i < _len; _i++) {\n o = el[_i];\n if (o.selected) {\n _results.push(o.value);\n }\n }\n return _results;\n } else {\n return el.value;\n }\n }\n };\n }\n\n Rivets.TypeParser = (function() {\n function TypeParser() {}\n\n TypeParser.types = {\n primitive: 0,\n keypath: 1\n };\n\n TypeParser.parse = function(string) {\n if (/^'.*'$|^\".*\"$/.test(string)) {\n return {\n type: this.types.primitive,\n value: string.slice(1, -1)\n };\n } else if (string === 'true') {\n return {\n type: this.types.primitive,\n value: true\n };\n } else if (string === 'false') {\n return {\n type: this.types.primitive,\n value: false\n };\n } else if (string === 'null') {\n return {\n type: this.types.primitive,\n value: null\n };\n } else if (string === 'undefined') {\n return {\n type: this.types.primitive,\n value: void 0\n };\n } else if (string === '') {\n return {\n type: this.types.primitive,\n value: void 0\n };\n } else if (isNaN(Number(string)) === false) {\n return {\n type: this.types.primitive,\n value: Number(string)\n };\n } else {\n return {\n type: this.types.keypath,\n value: string\n };\n }\n };\n\n return TypeParser;\n\n })();\n\n Rivets.TextTemplateParser = (function() {\n function TextTemplateParser() {}\n\n TextTemplateParser.types = {\n text: 0,\n binding: 1\n };\n\n TextTemplateParser.parse = function(template, delimiters) {\n var index, lastIndex, lastToken, length, substring, tokens, value;\n tokens = [];\n length = template.length;\n index = 0;\n lastIndex = 0;\n while (lastIndex < length) {\n index = template.indexOf(delimiters[0], lastIndex);\n if (index < 0) {\n tokens.push({\n type: this.types.text,\n value: template.slice(lastIndex)\n });\n break;\n } else {\n if (index > 0 && lastIndex < index) {\n tokens.push({\n type: this.types.text,\n value: template.slice(lastIndex, index)\n });\n }\n lastIndex = index + delimiters[0].length;\n index = template.indexOf(delimiters[1], lastIndex);\n if (index < 0) {\n substring = template.slice(lastIndex - delimiters[1].length);\n lastToken = tokens[tokens.length - 1];\n if ((lastToken != null ? lastToken.type : void 0) === this.types.text) {\n lastToken.value += substring;\n } else {\n tokens.push({\n type: this.types.text,\n value: substring\n });\n }\n break;\n }\n value = template.slice(lastIndex, index).trim();\n tokens.push({\n type: this.types.binding,\n value: value\n });\n lastIndex = index + delimiters[1].length;\n }\n }\n return tokens;\n };\n\n return TextTemplateParser;\n\n })();\n\n Rivets.View = (function() {\n function View(els, models, options) {\n var k, option, v, _base, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5;\n this.els = els;\n this.models = models;\n if (options == null) {\n options = {};\n }\n this.update = __bind(this.update, this);\n this.publish = __bind(this.publish, this);\n this.sync = __bind(this.sync, this);\n this.unbind = __bind(this.unbind, this);\n this.bind = __bind(this.bind, this);\n this.select = __bind(this.select, this);\n this.traverse = __bind(this.traverse, this);\n this.build = __bind(this.build, this);\n this.buildBinding = __bind(this.buildBinding, this);\n this.bindingRegExp = __bind(this.bindingRegExp, this);\n this.options = __bind(this.options, this);\n if (!(this.els.jquery || this.els instanceof Array)) {\n this.els = [this.els];\n }\n _ref1 = Rivets.extensions;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n option = _ref1[_i];\n this[option] = {};\n if (options[option]) {\n _ref2 = options[option];\n for (k in _ref2) {\n v = _ref2[k];\n this[option][k] = v;\n }\n }\n _ref3 = Rivets[\"public\"][option];\n for (k in _ref3) {\n v = _ref3[k];\n if ((_base = this[option])[k] == null) {\n _base[k] = v;\n }\n }\n }\n _ref4 = Rivets.options;\n for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) {\n option = _ref4[_j];\n this[option] = (_ref5 = options[option]) != null ? _ref5 : Rivets[\"public\"][option];\n }\n this.build();\n }\n\n View.prototype.options = function() {\n var option, options, _i, _len, _ref1;\n options = {};\n _ref1 = Rivets.extensions.concat(Rivets.options);\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n option = _ref1[_i];\n options[option] = this[option];\n }\n return options;\n };\n\n View.prototype.bindingRegExp = function() {\n return new RegExp(\"^\" + this.prefix + \"-\");\n };\n\n View.prototype.buildBinding = function(binding, node, type, declaration) {\n var context, ctx, dependencies, keypath, options, pipe, pipes;\n options = {};\n pipes = (function() {\n var _i, _len, _ref1, _results;\n _ref1 = declaration.match(/((?:'[^']*')*(?:(?:[^\\|']*(?:'[^']*')+[^\\|']*)+|[^\\|]+))|^$/g);\n _results = [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n pipe = _ref1[_i];\n _results.push(pipe.trim());\n }\n return _results;\n })();\n context = (function() {\n var _i, _len, _ref1, _results;\n _ref1 = pipes.shift().split('<');\n _results = [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n ctx = _ref1[_i];\n _results.push(ctx.trim());\n }\n return _results;\n })();\n keypath = context.shift();\n options.formatters = pipes;\n if (dependencies = context.shift()) {\n options.dependencies = dependencies.split(/\\s+/);\n }\n return this.bindings.push(new Rivets[binding](this, node, type, keypath, options));\n };\n\n View.prototype.build = function() {\n var el, parse, _i, _len, _ref1;\n this.bindings = [];\n parse = (function(_this) {\n return function(node) {\n var block, childNode, delimiters, n, parser, text, token, tokens, _i, _j, _len, _len1, _ref1;\n if (node.nodeType === 3) {\n parser = Rivets.TextTemplateParser;\n if (delimiters = _this.templateDelimiters) {\n if ((tokens = parser.parse(node.data, delimiters)).length) {\n if (!(tokens.length === 1 && tokens[0].type === parser.types.text)) {\n for (_i = 0, _len = tokens.length; _i < _len; _i++) {\n token = tokens[_i];\n text = document.createTextNode(token.value);\n node.parentNode.insertBefore(text, node);\n if (token.type === 1) {\n _this.buildBinding('TextBinding', text, null, token.value);\n }\n }\n node.parentNode.removeChild(node);\n }\n }\n }\n } else if (node.nodeType === 1) {\n block = _this.traverse(node);\n }\n if (!block) {\n _ref1 = (function() {\n var _k, _len1, _ref1, _results;\n _ref1 = node.childNodes;\n _results = [];\n for (_k = 0, _len1 = _ref1.length; _k < _len1; _k++) {\n n = _ref1[_k];\n _results.push(n);\n }\n return _results;\n })();\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n childNode = _ref1[_j];\n parse(childNode);\n }\n }\n };\n })(this);\n _ref1 = this.els;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n el = _ref1[_i];\n parse(el);\n }\n this.bindings.sort(function(a, b) {\n var _ref2, _ref3;\n return (((_ref2 = b.binder) != null ? _ref2.priority : void 0) || 0) - (((_ref3 = a.binder) != null ? _ref3.priority : void 0) || 0);\n });\n };\n\n View.prototype.traverse = function(node) {\n var attribute, attributes, binder, bindingRegExp, block, identifier, regexp, type, value, _i, _j, _len, _len1, _ref1, _ref2, _ref3;\n bindingRegExp = this.bindingRegExp();\n block = node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE';\n _ref1 = node.attributes;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n attribute = _ref1[_i];\n if (bindingRegExp.test(attribute.name)) {\n type = attribute.name.replace(bindingRegExp, '');\n if (!(binder = this.binders[type])) {\n _ref2 = this.binders;\n for (identifier in _ref2) {\n value = _ref2[identifier];\n if (identifier !== '*' && identifier.indexOf('*') !== -1) {\n regexp = new RegExp(\"^\" + (identifier.replace(/\\*/g, '.+')) + \"$\");\n if (regexp.test(type)) {\n binder = value;\n }\n }\n }\n }\n binder || (binder = this.binders['*']);\n if (binder.block) {\n block = true;\n attributes = [attribute];\n }\n }\n }\n _ref3 = attributes || node.attributes;\n for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {\n attribute = _ref3[_j];\n if (bindingRegExp.test(attribute.name)) {\n type = attribute.name.replace(bindingRegExp, '');\n this.buildBinding('Binding', node, type, attribute.value);\n }\n }\n if (!block) {\n type = node.nodeName.toLowerCase();\n if (this.components[type] && !node._bound) {\n this.bindings.push(new Rivets.ComponentBinding(this, node, type));\n block = true;\n }\n }\n return block;\n };\n\n View.prototype.select = function(fn) {\n var binding, _i, _len, _ref1, _results;\n _ref1 = this.bindings;\n _results = [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n if (fn(binding)) {\n _results.push(binding);\n }\n }\n return _results;\n };\n\n View.prototype.bind = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n binding.bind();\n }\n };\n\n View.prototype.unbind = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n binding.unbind();\n }\n };\n\n View.prototype.sync = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n if (typeof binding.sync === \"function\") {\n binding.sync();\n }\n }\n };\n\n View.prototype.publish = function() {\n var binding, _i, _len, _ref1;\n _ref1 = this.select(function(b) {\n var _ref1;\n return (_ref1 = b.binder) != null ? _ref1.publishes : void 0;\n });\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n binding.publish();\n }\n };\n\n View.prototype.update = function(models) {\n var binding, key, model, _i, _len, _ref1;\n if (models == null) {\n models = {};\n }\n for (key in models) {\n model = models[key];\n this.models[key] = model;\n }\n _ref1 = this.bindings;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n binding = _ref1[_i];\n if (typeof binding.update === \"function\") {\n binding.update(models);\n }\n }\n };\n\n return View;\n\n })();\n\n Rivets.Binding = (function() {\n function Binding(view, el, type, keypath, options) {\n this.view = view;\n this.el = el;\n this.type = type;\n this.keypath = keypath;\n this.options = options != null ? options : {};\n this.getValue = __bind(this.getValue, this);\n this.update = __bind(this.update, this);\n this.unbind = __bind(this.unbind, this);\n this.bind = __bind(this.bind, this);\n this.publish = __bind(this.publish, this);\n this.sync = __bind(this.sync, this);\n this.set = __bind(this.set, this);\n this.eventHandler = __bind(this.eventHandler, this);\n this.formattedValue = __bind(this.formattedValue, this);\n this.parseFormatterArguments = __bind(this.parseFormatterArguments, this);\n this.parseTarget = __bind(this.parseTarget, this);\n this.observe = __bind(this.observe, this);\n this.setBinder = __bind(this.setBinder, this);\n this.formatters = this.options.formatters || [];\n this.dependencies = [];\n this.formatterObservers = {};\n this.model = void 0;\n this.setBinder();\n }\n\n Binding.prototype.setBinder = function() {\n var identifier, regexp, value, _ref1;\n if (!(this.binder = this.view.binders[this.type])) {\n _ref1 = this.view.binders;\n for (identifier in _ref1) {\n value = _ref1[identifier];\n if (identifier !== '*' && identifier.indexOf('*') !== -1) {\n regexp = new RegExp(\"^\" + (identifier.replace(/\\*/g, '.+')) + \"$\");\n if (regexp.test(this.type)) {\n this.binder = value;\n this.args = new RegExp(\"^\" + (identifier.replace(/\\*/g, '(.+)')) + \"$\").exec(this.type);\n this.args.shift();\n }\n }\n }\n }\n this.binder || (this.binder = this.view.binders['*']);\n if (this.binder instanceof Function) {\n return this.binder = {\n routine: this.binder\n };\n }\n };\n\n Binding.prototype.observe = function(obj, keypath, callback) {\n return Rivets.sightglass(obj, keypath, callback, {\n root: this.view.rootInterface,\n adapters: this.view.adapters\n });\n };\n\n Binding.prototype.parseTarget = function() {\n var token;\n token = Rivets.TypeParser.parse(this.keypath);\n if (token.type === Rivets.TypeParser.types.primitive) {\n return this.value = token.value;\n } else {\n this.observer = this.observe(this.view.models, this.keypath, this.sync);\n return this.model = this.observer.target;\n }\n };\n\n Binding.prototype.parseFormatterArguments = function(args, formatterIndex) {\n var ai, arg, observer, processedArgs, _base, _i, _len;\n args = (function() {\n var _i, _len, _results;\n _results = [];\n for (_i = 0, _len = args.length; _i < _len; _i++) {\n arg = args[_i];\n _results.push(Rivets.TypeParser.parse(arg));\n }\n return _results;\n })();\n processedArgs = [];\n for (ai = _i = 0, _len = args.length; _i < _len; ai = ++_i) {\n arg = args[ai];\n processedArgs.push(arg.type === Rivets.TypeParser.types.primitive ? arg.value : ((_base = this.formatterObservers)[formatterIndex] || (_base[formatterIndex] = {}), !(observer = this.formatterObservers[formatterIndex][ai]) ? (observer = this.observe(this.view.models, arg.value, this.sync), this.formatterObservers[formatterIndex][ai] = observer) : void 0, observer.value()));\n }\n return processedArgs;\n };\n\n Binding.prototype.formattedValue = function(value) {\n var args, fi, formatter, id, processedArgs, _i, _len, _ref1, _ref2;\n _ref1 = this.formatters;\n for (fi = _i = 0, _len = _ref1.length; _i < _len; fi = ++_i) {\n formatter = _ref1[fi];\n args = formatter.match(/[^\\s']+|'([^']|'[^\\s])*'|\"([^\"]|\"[^\\s])*\"/g);\n id = args.shift();\n formatter = this.view.formatters[id];\n processedArgs = this.parseFormatterArguments(args, fi);\n if ((formatter != null ? formatter.read : void 0) instanceof Function) {\n value = (_ref2 = formatter.read).call.apply(_ref2, [this.model, value].concat(__slice.call(processedArgs)));\n } else if (formatter instanceof Function) {\n value = formatter.call.apply(formatter, [this.model, value].concat(__slice.call(processedArgs)));\n }\n }\n return value;\n };\n\n Binding.prototype.eventHandler = function(fn) {\n var binding, handler;\n handler = (binding = this).view.handler;\n return function(ev) {\n return handler.call(fn, this, ev, binding);\n };\n };\n\n Binding.prototype.set = function(value) {\n var _ref1;\n value = value instanceof Function && !this.binder[\"function\"] && Rivets[\"public\"].executeFunctions ? this.formattedValue(value.call(this.model)) : this.formattedValue(value);\n return (_ref1 = this.binder.routine) != null ? _ref1.call(this, this.el, value) : void 0;\n };\n\n Binding.prototype.sync = function() {\n var dependency, observer;\n return this.set((function() {\n var _i, _j, _len, _len1, _ref1, _ref2, _ref3;\n if (this.observer) {\n if (this.model !== this.observer.target) {\n _ref1 = this.dependencies;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n observer = _ref1[_i];\n observer.unobserve();\n }\n this.dependencies = [];\n if (((this.model = this.observer.target) != null) && ((_ref2 = this.options.dependencies) != null ? _ref2.length : void 0)) {\n _ref3 = this.options.dependencies;\n for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {\n dependency = _ref3[_j];\n observer = this.observe(this.model, dependency, this.sync);\n this.dependencies.push(observer);\n }\n }\n }\n return this.observer.value();\n } else {\n return this.value;\n }\n }).call(this));\n };\n\n Binding.prototype.publish = function() {\n var args, fi, fiReversed, formatter, id, lastformatterIndex, processedArgs, value, _i, _len, _ref1, _ref2, _ref3;\n if (this.observer) {\n value = this.getValue(this.el);\n lastformatterIndex = this.formatters.length - 1;\n _ref1 = this.formatters.slice(0).reverse();\n for (fiReversed = _i = 0, _len = _ref1.length; _i < _len; fiReversed = ++_i) {\n formatter = _ref1[fiReversed];\n fi = lastformatterIndex - fiReversed;\n args = formatter.split(/\\s+/);\n id = args.shift();\n processedArgs = this.parseFormatterArguments(args, fi);\n if ((_ref2 = this.view.formatters[id]) != null ? _ref2.publish : void 0) {\n value = (_ref3 = this.view.formatters[id]).publish.apply(_ref3, [value].concat(__slice.call(processedArgs)));\n }\n }\n return this.observer.setValue(value);\n }\n };\n\n Binding.prototype.bind = function() {\n var dependency, observer, _i, _len, _ref1, _ref2, _ref3;\n this.parseTarget();\n if ((_ref1 = this.binder.bind) != null) {\n _ref1.call(this, this.el);\n }\n if ((this.model != null) && ((_ref2 = this.options.dependencies) != null ? _ref2.length : void 0)) {\n _ref3 = this.options.dependencies;\n for (_i = 0, _len = _ref3.length; _i < _len; _i++) {\n dependency = _ref3[_i];\n observer = this.observe(this.model, dependency, this.sync);\n this.dependencies.push(observer);\n }\n }\n if (this.view.preloadData) {\n return this.sync();\n }\n };\n\n Binding.prototype.unbind = function() {\n var ai, args, fi, observer, _i, _len, _ref1, _ref2, _ref3, _ref4;\n if ((_ref1 = this.binder.unbind) != null) {\n _ref1.call(this, this.el);\n }\n if ((_ref2 = this.observer) != null) {\n _ref2.unobserve();\n }\n _ref3 = this.dependencies;\n for (_i = 0, _len = _ref3.length; _i < _len; _i++) {\n observer = _ref3[_i];\n observer.unobserve();\n }\n this.dependencies = [];\n _ref4 = this.formatterObservers;\n for (fi in _ref4) {\n args = _ref4[fi];\n for (ai in args) {\n observer = args[ai];\n observer.unobserve();\n }\n }\n return this.formatterObservers = {};\n };\n\n Binding.prototype.update = function(models) {\n var _ref1, _ref2;\n if (models == null) {\n models = {};\n }\n this.model = (_ref1 = this.observer) != null ? _ref1.target : void 0;\n return (_ref2 = this.binder.update) != null ? _ref2.call(this, models) : void 0;\n };\n\n Binding.prototype.getValue = function(el) {\n if (this.binder && (this.binder.getValue != null)) {\n return this.binder.getValue.call(this, el);\n } else {\n return Rivets.Util.getInputValue(el);\n }\n };\n\n return Binding;\n\n })();\n\n Rivets.ComponentBinding = (function(_super) {\n __extends(ComponentBinding, _super);\n\n function ComponentBinding(view, el, type) {\n var attribute, bindingRegExp, propertyName, token, _i, _len, _ref1, _ref2;\n this.view = view;\n this.el = el;\n this.type = type;\n this.unbind = __bind(this.unbind, this);\n this.bind = __bind(this.bind, this);\n this.locals = __bind(this.locals, this);\n this.component = this.view.components[this.type];\n this[\"static\"] = {};\n this.observers = {};\n this.upstreamObservers = {};\n bindingRegExp = view.bindingRegExp();\n _ref1 = this.el.attributes || [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n attribute = _ref1[_i];\n if (!bindingRegExp.test(attribute.name)) {\n propertyName = this.camelCase(attribute.name);\n token = Rivets.TypeParser.parse(attribute.value);\n if (__indexOf.call((_ref2 = this.component[\"static\"]) != null ? _ref2 : [], propertyName) >= 0) {\n this[\"static\"][propertyName] = attribute.value;\n } else if (token.type === Rivets.TypeParser.types.primitive) {\n this[\"static\"][propertyName] = token.value;\n } else {\n this.observers[propertyName] = attribute.value;\n }\n }\n }\n }\n\n ComponentBinding.prototype.sync = function() {};\n\n ComponentBinding.prototype.update = function() {};\n\n ComponentBinding.prototype.publish = function() {};\n\n ComponentBinding.prototype.locals = function() {\n var key, observer, result, value, _ref1, _ref2;\n result = {};\n _ref1 = this[\"static\"];\n for (key in _ref1) {\n value = _ref1[key];\n result[key] = value;\n }\n _ref2 = this.observers;\n for (key in _ref2) {\n observer = _ref2[key];\n result[key] = observer.value();\n }\n return result;\n };\n\n ComponentBinding.prototype.camelCase = function(string) {\n return string.replace(/-([a-z])/g, function(grouped) {\n return grouped[1].toUpperCase();\n });\n };\n\n ComponentBinding.prototype.bind = function() {\n var k, key, keypath, observer, option, options, scope, v, _base, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7;\n if (!this.bound) {\n _ref1 = this.observers;\n for (key in _ref1) {\n keypath = _ref1[key];\n this.observers[key] = this.observe(this.view.models, keypath, ((function(_this) {\n return function(key) {\n return function() {\n return _this.componentView.models[key] = _this.observers[key].value();\n };\n };\n })(this)).call(this, key));\n }\n this.bound = true;\n }\n if (this.componentView != null) {\n this.componentView.bind();\n } else {\n this.el.innerHTML = this.component.template.call(this);\n scope = this.component.initialize.call(this, this.el, this.locals());\n this.el._bound = true;\n options = {};\n _ref2 = Rivets.extensions;\n for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n option = _ref2[_i];\n options[option] = {};\n if (this.component[option]) {\n _ref3 = this.component[option];\n for (k in _ref3) {\n v = _ref3[k];\n options[option][k] = v;\n }\n }\n _ref4 = this.view[option];\n for (k in _ref4) {\n v = _ref4[k];\n if ((_base = options[option])[k] == null) {\n _base[k] = v;\n }\n }\n }\n _ref5 = Rivets.options;\n for (_j = 0, _len1 = _ref5.length; _j < _len1; _j++) {\n option = _ref5[_j];\n options[option] = (_ref6 = this.component[option]) != null ? _ref6 : this.view[option];\n }\n this.componentView = new Rivets.View(Array.prototype.slice.call(this.el.childNodes), scope, options);\n this.componentView.bind();\n _ref7 = this.observers;\n for (key in _ref7) {\n observer = _ref7[key];\n this.upstreamObservers[key] = this.observe(this.componentView.models, key, ((function(_this) {\n return function(key, observer) {\n return function() {\n return observer.setValue(_this.componentView.models[key]);\n };\n };\n })(this)).call(this, key, observer));\n }\n }\n };\n\n ComponentBinding.prototype.unbind = function() {\n var key, observer, _ref1, _ref2, _ref3;\n _ref1 = this.upstreamObservers;\n for (key in _ref1) {\n observer = _ref1[key];\n observer.unobserve();\n }\n _ref2 = this.observers;\n for (key in _ref2) {\n observer = _ref2[key];\n observer.unobserve();\n }\n return (_ref3 = this.componentView) != null ? _ref3.unbind.call(this) : void 0;\n };\n\n return ComponentBinding;\n\n })(Rivets.Binding);\n\n Rivets.TextBinding = (function(_super) {\n __extends(TextBinding, _super);\n\n function TextBinding(view, el, type, keypath, options) {\n this.view = view;\n this.el = el;\n this.type = type;\n this.keypath = keypath;\n this.options = options != null ? options : {};\n this.sync = __bind(this.sync, this);\n this.formatters = this.options.formatters || [];\n this.dependencies = [];\n this.formatterObservers = {};\n }\n\n TextBinding.prototype.binder = {\n routine: function(node, value) {\n return node.data = value != null ? value : '';\n }\n };\n\n TextBinding.prototype.sync = function() {\n return TextBinding.__super__.sync.apply(this, arguments);\n };\n\n return TextBinding;\n\n })(Rivets.Binding);\n\n Rivets[\"public\"].binders.text = function(el, value) {\n if (el.textContent != null) {\n return el.textContent = value != null ? value : '';\n } else {\n return el.innerText = value != null ? value : '';\n }\n };\n\n Rivets[\"public\"].binders.html = function(el, value) {\n return el.innerHTML = value != null ? value : '';\n };\n\n Rivets[\"public\"].binders.show = function(el, value) {\n return el.style.display = value ? '' : 'none';\n };\n\n Rivets[\"public\"].binders.hide = function(el, value) {\n return el.style.display = value ? 'none' : '';\n };\n\n Rivets[\"public\"].binders.enabled = function(el, value) {\n return el.disabled = !value;\n };\n\n Rivets[\"public\"].binders.disabled = function(el, value) {\n return el.disabled = !!value;\n };\n\n Rivets[\"public\"].binders.checked = {\n publishes: true,\n priority: 2000,\n bind: function(el) {\n return Rivets.Util.bindEvent(el, 'change', this.publish);\n },\n unbind: function(el) {\n return Rivets.Util.unbindEvent(el, 'change', this.publish);\n },\n routine: function(el, value) {\n var _ref1;\n if (el.type === 'radio') {\n return el.checked = ((_ref1 = el.value) != null ? _ref1.toString() : void 0) === (value != null ? value.toString() : void 0);\n } else {\n return el.checked = !!value;\n }\n }\n };\n\n Rivets[\"public\"].binders.unchecked = {\n publishes: true,\n priority: 2000,\n bind: function(el) {\n return Rivets.Util.bindEvent(el, 'change', this.publish);\n },\n unbind: function(el) {\n return Rivets.Util.unbindEvent(el, 'change', this.publish);\n },\n routine: function(el, value) {\n var _ref1;\n if (el.type === 'radio') {\n return el.checked = ((_ref1 = el.value) != null ? _ref1.toString() : void 0) !== (value != null ? value.toString() : void 0);\n } else {\n return el.checked = !value;\n }\n }\n };\n\n Rivets[\"public\"].binders.value = {\n publishes: true,\n priority: 3000,\n bind: function(el) {\n if (!(el.tagName === 'INPUT' && el.type === 'radio')) {\n this.event = el.tagName === 'SELECT' ? 'change' : 'input';\n return Rivets.Util.bindEvent(el, this.event, this.publish);\n }\n },\n unbind: function(el) {\n if (!(el.tagName === 'INPUT' && el.type === 'radio')) {\n return Rivets.Util.unbindEvent(el, this.event, this.publish);\n }\n },\n routine: function(el, value) {\n var o, _i, _len, _ref1, _ref2, _ref3, _results;\n if (el.tagName === 'INPUT' && el.type === 'radio') {\n return el.setAttribute('value', value);\n } else if (window.jQuery != null) {\n el = jQuery(el);\n if ((value != null ? value.toString() : void 0) !== ((_ref1 = el.val()) != null ? _ref1.toString() : void 0)) {\n return el.val(value != null ? value : '');\n }\n } else {\n if (el.type === 'select-multiple') {\n if (value != null) {\n _results = [];\n for (_i = 0, _len = el.length; _i < _len; _i++) {\n o = el[_i];\n _results.push(o.selected = (_ref2 = o.value, __indexOf.call(value, _ref2) >= 0));\n }\n return _results;\n }\n } else if ((value != null ? value.toString() : void 0) !== ((_ref3 = el.value) != null ? _ref3.toString() : void 0)) {\n return el.value = value != null ? value : '';\n }\n }\n }\n };\n\n Rivets[\"public\"].binders[\"if\"] = {\n block: true,\n priority: 4000,\n bind: function(el) {\n var attr, declaration;\n if (this.marker == null) {\n attr = [this.view.prefix, this.type].join('-').replace('--', '-');\n declaration = el.getAttribute(attr);\n this.marker = document.createComment(\" rivets: \" + this.type + \" \" + declaration + \" \");\n this.bound = false;\n el.removeAttribute(attr);\n el.parentNode.insertBefore(this.marker, el);\n return el.parentNode.removeChild(el);\n }\n },\n unbind: function() {\n if (this.nested) {\n this.nested.unbind();\n return this.bound = false;\n }\n },\n routine: function(el, value) {\n var key, model, models, _ref1;\n if (!!value === !this.bound) {\n if (value) {\n models = {};\n _ref1 = this.view.models;\n for (key in _ref1) {\n model = _ref1[key];\n models[key] = model;\n }\n (this.nested || (this.nested = new Rivets.View(el, models, this.view.options()))).bind();\n this.marker.parentNode.insertBefore(el, this.marker.nextSibling);\n return this.bound = true;\n } else {\n el.parentNode.removeChild(el);\n this.nested.unbind();\n return this.bound = false;\n }\n }\n },\n update: function(models) {\n var _ref1;\n return (_ref1 = this.nested) != null ? _ref1.update(models) : void 0;\n }\n };\n\n Rivets[\"public\"].binders.unless = {\n block: true,\n priority: 4000,\n bind: function(el) {\n return Rivets[\"public\"].binders[\"if\"].bind.call(this, el);\n },\n unbind: function() {\n return Rivets[\"public\"].binders[\"if\"].unbind.call(this);\n },\n routine: function(el, value) {\n return Rivets[\"public\"].binders[\"if\"].routine.call(this, el, !value);\n },\n update: function(models) {\n return Rivets[\"public\"].binders[\"if\"].update.call(this, models);\n }\n };\n\n Rivets[\"public\"].binders['on-*'] = {\n \"function\": true,\n priority: 1000,\n unbind: function(el) {\n if (this.handler) {\n return Rivets.Util.unbindEvent(el, this.args[0], this.handler);\n }\n },\n routine: function(el, value) {\n if (this.handler) {\n Rivets.Util.unbindEvent(el, this.args[0], this.handler);\n }\n return Rivets.Util.bindEvent(el, this.args[0], this.handler = this.eventHandler(value));\n }\n };\n\n Rivets[\"public\"].binders['each-*'] = {\n block: true,\n priority: 4000,\n bind: function(el) {\n var attr, view, _i, _len, _ref1;\n if (this.marker == null) {\n attr = [this.view.prefix, this.type].join('-').replace('--', '-');\n this.marker = document.createComment(\" rivets: \" + this.type + \" \");\n this.iterated = [];\n el.removeAttribute(attr);\n el.parentNode.insertBefore(this.marker, el);\n el.parentNode.removeChild(el);\n } else {\n _ref1 = this.iterated;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n view = _ref1[_i];\n view.bind();\n }\n }\n },\n unbind: function(el) {\n var view, _i, _len, _ref1;\n if (this.iterated != null) {\n _ref1 = this.iterated;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n view = _ref1[_i];\n view.unbind();\n }\n }\n },\n routine: function(el, collection) {\n var binding, data, i, index, key, model, modelName, options, previous, template, view, _i, _j, _k, _len, _len1, _len2, _ref1, _ref2, _ref3;\n modelName = this.args[0];\n collection = collection || [];\n if (this.iterated.length > collection.length) {\n _ref1 = Array(this.iterated.length - collection.length);\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n i = _ref1[_i];\n view = this.iterated.pop();\n view.unbind();\n this.marker.parentNode.removeChild(view.els[0]);\n }\n }\n for (index = _j = 0, _len1 = collection.length; _j < _len1; index = ++_j) {\n model = collection[index];\n data = {\n index: index\n };\n data[Rivets[\"public\"].iterationAlias(modelName)] = index;\n data[modelName] = model;\n if (this.iterated[index] == null) {\n _ref2 = this.view.models;\n for (key in _ref2) {\n model = _ref2[key];\n if (data[key] == null) {\n data[key] = model;\n }\n }\n previous = this.iterated.length ? this.iterated[this.iterated.length - 1].els[0] : this.marker;\n options = this.view.options();\n options.preloadData = true;\n template = el.cloneNode(true);\n view = new Rivets.View(template, data, options);\n view.bind();\n this.iterated.push(view);\n this.marker.parentNode.insertBefore(template, previous.nextSibling);\n } else if (this.iterated[index].models[modelName] !== model) {\n this.iterated[index].update(data);\n }\n }\n if (el.nodeName === 'OPTION') {\n _ref3 = this.view.bindings;\n for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {\n binding = _ref3[_k];\n if (binding.el === this.marker.parentNode && binding.type === 'value') {\n binding.sync();\n }\n }\n }\n },\n update: function(models) {\n var data, key, model, view, _i, _len, _ref1;\n data = {};\n for (key in models) {\n model = models[key];\n if (key !== this.args[0]) {\n data[key] = model;\n }\n }\n _ref1 = this.iterated;\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n view = _ref1[_i];\n view.update(data);\n }\n }\n };\n\n Rivets[\"public\"].binders['class-*'] = function(el, value) {\n var elClass;\n elClass = \" \" + el.className + \" \";\n if (!value === (elClass.indexOf(\" \" + this.args[0] + \" \") !== -1)) {\n return el.className = value ? \"\" + el.className + \" \" + this.args[0] : elClass.replace(\" \" + this.args[0] + \" \", ' ').trim();\n }\n };\n\n Rivets[\"public\"].binders['*'] = function(el, value) {\n if (value != null) {\n return el.setAttribute(this.type, value);\n } else {\n return el.removeAttribute(this.type);\n }\n };\n\n Rivets[\"public\"].formatters['call'] = function() {\n var args, value;\n value = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n return value.call.apply(value, [this].concat(__slice.call(args)));\n };\n\n Rivets[\"public\"].adapters['.'] = {\n id: '_rv',\n counter: 0,\n weakmap: {},\n weakReference: function(obj) {\n var id, _base, _name;\n if (!obj.hasOwnProperty(this.id)) {\n id = this.counter++;\n Object.defineProperty(obj, this.id, {\n value: id\n });\n }\n return (_base = this.weakmap)[_name = obj[this.id]] || (_base[_name] = {\n callbacks: {}\n });\n },\n cleanupWeakReference: function(ref, id) {\n if (!Object.keys(ref.callbacks).length) {\n if (!(ref.pointers && Object.keys(ref.pointers).length)) {\n return delete this.weakmap[id];\n }\n }\n },\n stubFunction: function(obj, fn) {\n var map, original, weakmap;\n original = obj[fn];\n map = this.weakReference(obj);\n weakmap = this.weakmap;\n return obj[fn] = function() {\n var callback, k, r, response, _i, _len, _ref1, _ref2, _ref3, _ref4;\n response = original.apply(obj, arguments);\n _ref1 = map.pointers;\n for (r in _ref1) {\n k = _ref1[r];\n _ref4 = (_ref2 = (_ref3 = weakmap[r]) != null ? _ref3.callbacks[k] : void 0) != null ? _ref2 : [];\n for (_i = 0, _len = _ref4.length; _i < _len; _i++) {\n callback = _ref4[_i];\n callback();\n }\n }\n return response;\n };\n },\n observeMutations: function(obj, ref, keypath) {\n var fn, functions, map, _base, _i, _len;\n if (Array.isArray(obj)) {\n map = this.weakReference(obj);\n if (map.pointers == null) {\n map.pointers = {};\n functions = ['push', 'pop', 'shift', 'unshift', 'sort', 'reverse', 'splice'];\n for (_i = 0, _len = functions.length; _i < _len; _i++) {\n fn = functions[_i];\n this.stubFunction(obj, fn);\n }\n }\n if ((_base = map.pointers)[ref] == null) {\n _base[ref] = [];\n }\n if (__indexOf.call(map.pointers[ref], keypath) < 0) {\n return map.pointers[ref].push(keypath);\n }\n }\n },\n unobserveMutations: function(obj, ref, keypath) {\n var idx, map, pointers;\n if (Array.isArray(obj) && (obj[this.id] != null)) {\n if (map = this.weakmap[obj[this.id]]) {\n if (pointers = map.pointers[ref]) {\n if ((idx = pointers.indexOf(keypath)) >= 0) {\n pointers.splice(idx, 1);\n }\n if (!pointers.length) {\n delete map.pointers[ref];\n }\n return this.cleanupWeakReference(map, obj[this.id]);\n }\n }\n }\n },\n observe: function(obj, keypath, callback) {\n var callbacks, desc, value;\n callbacks = this.weakReference(obj).callbacks;\n if (callbacks[keypath] == null) {\n callbacks[keypath] = [];\n desc = Object.getOwnPropertyDescriptor(obj, keypath);\n if (!((desc != null ? desc.get : void 0) || (desc != null ? desc.set : void 0))) {\n value = obj[keypath];\n Object.defineProperty(obj, keypath, {\n enumerable: true,\n get: function() {\n return value;\n },\n set: (function(_this) {\n return function(newValue) {\n var cb, map, _i, _len, _ref1;\n if (newValue !== value) {\n _this.unobserveMutations(value, obj[_this.id], keypath);\n value = newValue;\n if (map = _this.weakmap[obj[_this.id]]) {\n callbacks = map.callbacks;\n if (callbacks[keypath]) {\n _ref1 = callbacks[keypath].slice();\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n cb = _ref1[_i];\n if (__indexOf.call(callbacks[keypath], cb) >= 0) {\n cb();\n }\n }\n }\n return _this.observeMutations(newValue, obj[_this.id], keypath);\n }\n }\n };\n })(this)\n });\n }\n }\n if (__indexOf.call(callbacks[keypath], callback) < 0) {\n callbacks[keypath].push(callback);\n }\n return this.observeMutations(obj[keypath], obj[this.id], keypath);\n },\n unobserve: function(obj, keypath, callback) {\n var callbacks, idx, map;\n if (map = this.weakmap[obj[this.id]]) {\n if (callbacks = map.callbacks[keypath]) {\n if ((idx = callbacks.indexOf(callback)) >= 0) {\n callbacks.splice(idx, 1);\n if (!callbacks.length) {\n delete map.callbacks[keypath];\n this.unobserveMutations(obj[keypath], obj[this.id], keypath);\n }\n }\n return this.cleanupWeakReference(map, obj[this.id]);\n }\n }\n },\n get: function(obj, keypath) {\n return obj[keypath];\n },\n set: function(obj, keypath, value) {\n return obj[keypath] = value;\n }\n };\n\n Rivets.factory = function(sightglass) {\n Rivets.sightglass = sightglass;\n Rivets[\"public\"]._ = Rivets;\n return Rivets[\"public\"];\n };\n\n if (typeof (typeof module !== \"undefined\" && module !== null ? module.exports : void 0) === 'object') {\n module.exports = Rivets.factory(__webpack_require__(\"./node_modules/sightglass/index.js\"));\n } else if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(\"./node_modules/sightglass/index.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function(sightglass) {\n return this.rivets = Rivets.factory(sightglass);\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {\n this.rivets = Rivets.factory(sightglass);\n }\n\n}).call(this);\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(\"./node_modules/webpack/buildin/module.js\")(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcml2ZXRzL2Rpc3Qvcml2ZXRzLmpzP2ViMWIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjhDQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixtQkFBbUIsZ0NBQWdDLEdBQUcsRUFBRTtBQUN0RjtBQUNBLGtCQUFrQjtBQUNsQix5Q0FBeUMsMEJBQTBCLDJEQUEyRCxFQUFFLGtCQUFrQiwwQkFBMEIsRUFBRSxtQ0FBbUMsOEJBQThCLG9DQUFvQyxjQUFjLEVBQUU7QUFDblMsOENBQThDLGlDQUFpQyxPQUFPLE9BQU8sNkNBQTZDLEVBQUUsV0FBVzs7QUFFdko7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixrQkFBa0I7QUFDbEI7QUFDQSw2QkFBNkIsS0FBSztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxZQUFZO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFdBQVc7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxXQUFXO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsWUFBWTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiw4Q0FBOEMsWUFBWTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFlBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSwyQ0FBMkMsV0FBVztBQUN0RDtBQUNBLHlLQUF5SztBQUN6SztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFdBQVc7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFdBQVc7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFlBQVk7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsV0FBVztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxZQUFZO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxXQUFXO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNB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Ii8vIFJpdmV0cy5qc1xuLy8gdmVyc2lvbjogMC45LjZcbi8vIGF1dGhvcjogTWljaGFlbCBSaWNoYXJkc1xuLy8gbGljZW5zZTogTUlUXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBSaXZldHMsIGJpbmRNZXRob2QsIGpRdWVyeSwgdW5iaW5kTWV0aG9kLCBfcmVmLFxuICAgIF9fYmluZCA9IGZ1bmN0aW9uKGZuLCBtZSl7IHJldHVybiBmdW5jdGlvbigpeyByZXR1cm4gZm4uYXBwbHkobWUsIGFyZ3VtZW50cyk7IH07IH0sXG4gICAgX19zbGljZSA9IFtdLnNsaWNlLFxuICAgIF9faGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoX19oYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIF9faW5kZXhPZiA9IFtdLmluZGV4T2YgfHwgZnVuY3Rpb24oaXRlbSkgeyBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGlmIChpIGluIHRoaXMgJiYgdGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7IH0gcmV0dXJuIC0xOyB9O1xuXG4gIFJpdmV0cyA9IHtcbiAgICBvcHRpb25zOiBbJ3ByZWZpeCcsICd0ZW1wbGF0ZURlbGltaXRlcnMnLCAncm9vdEludGVyZmFjZScsICdwcmVsb2FkRGF0YScsICdoYW5kbGVyJywgJ2V4ZWN1dGVGdW5jdGlvbnMnXSxcbiAgICBleHRlbnNpb25zOiBbJ2JpbmRlcnMnLCAnZm9ybWF0dGVycycsICdjb21wb25lbnRzJywgJ2FkYXB0ZXJzJ10sXG4gICAgXCJwdWJsaWNcIjoge1xuICAgICAgYmluZGVyczoge30sXG4gICAgICBjb21wb25lbnRzOiB7fSxcbiAgICAgIGZvcm1hdHRlcnM6IHt9LFxuICAgICAgYWRhcHRlcnM6IHt9LFxuICAgICAgcHJlZml4OiAncnYnLFxuICAgICAgdGVtcGxhdGVEZWxpbWl0ZXJzOiBbJ3snLCAnfSddLFxuICAgICAgcm9vdEludGVyZmFjZTogJy4nLFxuICAgICAgcHJlbG9hZERhdGE6IHRydWUsXG4gICAgICBleGVjdXRlRnVuY3Rpb25zOiBmYWxzZSxcbiAgICAgIGl0ZXJhdGlvbkFsaWFzOiBmdW5jdGlvbihtb2RlbE5hbWUpIHtcbiAgICAgICAgcmV0dXJuICclJyArIG1vZGVsTmFtZSArICclJztcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbihjb250ZXh0LCBldiwgYmluZGluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKGNvbnRleHQsIGV2LCBiaW5kaW5nLnZpZXcubW9kZWxzKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IsIGtleSwgb3B0aW9uLCB2YWx1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgdmFsdWUgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgaWYgKG9wdGlvbiA9PT0gJ2JpbmRlcnMnIHx8IG9wdGlvbiA9PT0gJ2NvbXBvbmVudHMnIHx8IG9wdGlvbiA9PT0gJ2Zvcm1hdHRlcnMnIHx8IG9wdGlvbiA9PT0gJ2FkYXB0ZXJzJykge1xuICAgICAgICAgICAgZm9yIChrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHZhbHVlW2tleV07XG4gICAgICAgICAgICAgIFJpdmV0c1tvcHRpb25dW2tleV0gPSBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBSaXZldHNbXCJwdWJsaWNcIl1bb3B0aW9uXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGJpbmQ6IGZ1bmN0aW9uKGVsLCBtb2RlbHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHZpZXc7XG4gICAgICAgIGlmIChtb2RlbHMgPT0gbnVsbCkge1xuICAgICAgICAgIG1vZGVscyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdmlldyA9IG5ldyBSaXZldHMuVmlldyhlbCwgbW9kZWxzLCBvcHRpb25zKTtcbiAgICAgICAgdmlldy5iaW5kKCk7XG4gICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgfSxcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGNvbXBvbmVudCwgZWwsIGRhdGEpIHtcbiAgICAgICAgdmFyIHNjb3BlLCB0ZW1wbGF0ZSwgdmlldztcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgIGRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50ID0gUml2ZXRzW1wicHVibGljXCJdLmNvbXBvbmVudHNbY29tcG9uZW50XTtcbiAgICAgICAgdGVtcGxhdGUgPSBjb21wb25lbnQudGVtcGxhdGUuY2FsbCh0aGlzLCBlbCk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgd2hpbGUgKGVsLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwuaW5uZXJIVE1MID0gdGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUgPSBjb21wb25lbnQuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIGVsLCBkYXRhKTtcbiAgICAgICAgdmlldyA9IG5ldyBSaXZldHMuVmlldyhlbCwgc2NvcGUpO1xuICAgICAgICB2aWV3LmJpbmQoKTtcbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGlmICh3aW5kb3dbJ2pRdWVyeSddIHx8IHdpbmRvd1snJCddKSB7XG4gICAgalF1ZXJ5ID0gd2luZG93WydqUXVlcnknXSB8fCB3aW5kb3dbJyQnXTtcbiAgICBfcmVmID0gJ29uJyBpbiBqUXVlcnkucHJvdG90eXBlID8gWydvbicsICdvZmYnXSA6IFsnYmluZCcsICd1bmJpbmQnXSwgYmluZE1ldGhvZCA9IF9yZWZbMF0sIHVuYmluZE1ldGhvZCA9IF9yZWZbMV07XG4gICAgUml2ZXRzLlV0aWwgPSB7XG4gICAgICBiaW5kRXZlbnQ6IGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4galF1ZXJ5KGVsKVtiaW5kTWV0aG9kXShldmVudCwgaGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgdW5iaW5kRXZlbnQ6IGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4galF1ZXJ5KGVsKVt1bmJpbmRNZXRob2RdKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgIH0sXG4gICAgICBnZXRJbnB1dFZhbHVlOiBmdW5jdGlvbihlbCkge1xuICAgICAgICB2YXIgJGVsO1xuICAgICAgICAkZWwgPSBqUXVlcnkoZWwpO1xuICAgICAgICBpZiAoJGVsLmF0dHIoJ3R5cGUnKSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgIHJldHVybiAkZWwuaXMoJzpjaGVja2VkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICRlbC52YWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgUml2ZXRzLlV0aWwgPSB7XG4gICAgICBiaW5kRXZlbnQ6IChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCdhZGRFdmVudExpc3RlbmVyJyBpbiB3aW5kb3cpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZWwsIGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBlbC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfSkoKSxcbiAgICAgIHVuYmluZEV2ZW50OiAoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgncmVtb3ZlRXZlbnRMaXN0ZW5lcicgaW4gd2luZG93KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVsLCBldmVudCwgaGFuZGxlcikge1xuICAgICAgICAgICAgcmV0dXJuIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihlbCwgZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gZWwuZGV0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgIH0pKCksXG4gICAgICBnZXRJbnB1dFZhbHVlOiBmdW5jdGlvbihlbCkge1xuICAgICAgICB2YXIgbywgX2ksIF9sZW4sIF9yZXN1bHRzO1xuICAgICAgICBpZiAoZWwudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgIHJldHVybiBlbC5jaGVja2VkO1xuICAgICAgICB9IGVsc2UgaWYgKGVsLnR5cGUgPT09ICdzZWxlY3QtbXVsdGlwbGUnKSB7XG4gICAgICAgICAgX3Jlc3VsdHMgPSBbXTtcbiAgICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGVsLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICBvID0gZWxbX2ldO1xuICAgICAgICAgICAgaWYgKG8uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChvLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBSaXZldHMuVHlwZVBhcnNlciA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBUeXBlUGFyc2VyKCkge31cblxuICAgIFR5cGVQYXJzZXIudHlwZXMgPSB7XG4gICAgICBwcmltaXRpdmU6IDAsXG4gICAgICBrZXlwYXRoOiAxXG4gICAgfTtcblxuICAgIFR5cGVQYXJzZXIucGFyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIGlmICgvXicuKickfF5cIi4qXCIkLy50ZXN0KHN0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogc3RyaW5nLnNsaWNlKDEsIC0xKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzdHJpbmcgPT09ICd0cnVlJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMucHJpbWl0aXZlLFxuICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMucHJpbWl0aXZlLFxuICAgICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzdHJpbmcgPT09ICdudWxsJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMucHJpbWl0aXZlLFxuICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZyA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGlzTmFOKE51bWJlcihzdHJpbmcpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVzLnByaW1pdGl2ZSxcbiAgICAgICAgICB2YWx1ZTogTnVtYmVyKHN0cmluZylcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlcy5rZXlwYXRoLFxuICAgICAgICAgIHZhbHVlOiBzdHJpbmdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFR5cGVQYXJzZXI7XG5cbiAgfSkoKTtcblxuICBSaXZldHMuVGV4dFRlbXBsYXRlUGFyc2VyID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFRleHRUZW1wbGF0ZVBhcnNlcigpIHt9XG5cbiAgICBUZXh0VGVtcGxhdGVQYXJzZXIudHlwZXMgPSB7XG4gICAgICB0ZXh0OiAwLFxuICAgICAgYmluZGluZzogMVxuICAgIH07XG5cbiAgICBUZXh0VGVtcGxhdGVQYXJzZXIucGFyc2UgPSBmdW5jdGlvbih0ZW1wbGF0ZSwgZGVsaW1pdGVycykge1xuICAgICAgdmFyIGluZGV4LCBsYXN0SW5kZXgsIGxhc3RUb2tlbiwgbGVuZ3RoLCBzdWJzdHJpbmcsIHRva2VucywgdmFsdWU7XG4gICAgICB0b2tlbnMgPSBbXTtcbiAgICAgIGxlbmd0aCA9IHRlbXBsYXRlLmxlbmd0aDtcbiAgICAgIGluZGV4ID0gMDtcbiAgICAgIGxhc3RJbmRleCA9IDA7XG4gICAgICB3aGlsZSAobGFzdEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGluZGV4ID0gdGVtcGxhdGUuaW5kZXhPZihkZWxpbWl0ZXJzWzBdLCBsYXN0SW5kZXgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlcy50ZXh0LFxuICAgICAgICAgICAgdmFsdWU6IHRlbXBsYXRlLnNsaWNlKGxhc3RJbmRleClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIGxhc3RJbmRleCA8IGluZGV4KSB7XG4gICAgICAgICAgICB0b2tlbnMucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZXMudGV4dCxcbiAgICAgICAgICAgICAgdmFsdWU6IHRlbXBsYXRlLnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdEluZGV4ID0gaW5kZXggKyBkZWxpbWl0ZXJzWzBdLmxlbmd0aDtcbiAgICAgICAgICBpbmRleCA9IHRlbXBsYXRlLmluZGV4T2YoZGVsaW1pdGVyc1sxXSwgbGFzdEluZGV4KTtcbiAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICBzdWJzdHJpbmcgPSB0ZW1wbGF0ZS5zbGljZShsYXN0SW5kZXggLSBkZWxpbWl0ZXJzWzFdLmxlbmd0aCk7XG4gICAgICAgICAgICBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKChsYXN0VG9rZW4gIT0gbnVsbCA/IGxhc3RUb2tlbi50eXBlIDogdm9pZCAwKSA9PT0gdGhpcy50eXBlcy50ZXh0KSB7XG4gICAgICAgICAgICAgIGxhc3RUb2tlbi52YWx1ZSArPSBzdWJzdHJpbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlcy50ZXh0LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdWJzdHJpbmdcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSB0ZW1wbGF0ZS5zbGljZShsYXN0SW5kZXgsIGluZGV4KS50cmltKCk7XG4gICAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlcy5iaW5kaW5nLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGFzdEluZGV4ID0gaW5kZXggKyBkZWxpbWl0ZXJzWzFdLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRleHRUZW1wbGF0ZVBhcnNlcjtcblxuICB9KSgpO1xuXG4gIFJpdmV0cy5WaWV3ID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFZpZXcoZWxzLCBtb2RlbHMsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBrLCBvcHRpb24sIHYsIF9iYXNlLCBfaSwgX2osIF9sZW4sIF9sZW4xLCBfcmVmMSwgX3JlZjIsIF9yZWYzLCBfcmVmNCwgX3JlZjU7XG4gICAgICB0aGlzLmVscyA9IGVscztcbiAgICAgIHRoaXMubW9kZWxzID0gbW9kZWxzO1xuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZSA9IF9fYmluZCh0aGlzLnVwZGF0ZSwgdGhpcyk7XG4gICAgICB0aGlzLnB1Ymxpc2ggPSBfX2JpbmQodGhpcy5wdWJsaXNoLCB0aGlzKTtcbiAgICAgIHRoaXMuc3luYyA9IF9fYmluZCh0aGlzLnN5bmMsIHRoaXMpO1xuICAgICAgdGhpcy51bmJpbmQgPSBfX2JpbmQodGhpcy51bmJpbmQsIHRoaXMpO1xuICAgICAgdGhpcy5iaW5kID0gX19iaW5kKHRoaXMuYmluZCwgdGhpcyk7XG4gICAgICB0aGlzLnNlbGVjdCA9IF9fYmluZCh0aGlzLnNlbGVjdCwgdGhpcyk7XG4gICAgICB0aGlzLnRyYXZlcnNlID0gX19iaW5kKHRoaXMudHJhdmVyc2UsIHRoaXMpO1xuICAgICAgdGhpcy5idWlsZCA9IF9fYmluZCh0aGlzLmJ1aWxkLCB0aGlzKTtcbiAgICAgIHRoaXMuYnVpbGRCaW5kaW5nID0gX19iaW5kKHRoaXMuYnVpbGRCaW5kaW5nLCB0aGlzKTtcbiAgICAgIHRoaXMuYmluZGluZ1JlZ0V4cCA9IF9fYmluZCh0aGlzLmJpbmRpbmdSZWdFeHAsIHRoaXMpO1xuICAgICAgdGhpcy5vcHRpb25zID0gX19iaW5kKHRoaXMub3B0aW9ucywgdGhpcyk7XG4gICAgICBpZiAoISh0aGlzLmVscy5qcXVlcnkgfHwgdGhpcy5lbHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgdGhpcy5lbHMgPSBbdGhpcy5lbHNdO1xuICAgICAgfVxuICAgICAgX3JlZjEgPSBSaXZldHMuZXh0ZW5zaW9ucztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgb3B0aW9uID0gX3JlZjFbX2ldO1xuICAgICAgICB0aGlzW29wdGlvbl0gPSB7fTtcbiAgICAgICAgaWYgKG9wdGlvbnNbb3B0aW9uXSkge1xuICAgICAgICAgIF9yZWYyID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICAgIGZvciAoayBpbiBfcmVmMikge1xuICAgICAgICAgICAgdiA9IF9yZWYyW2tdO1xuICAgICAgICAgICAgdGhpc1tvcHRpb25dW2tdID0gdjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JlZjMgPSBSaXZldHNbXCJwdWJsaWNcIl1bb3B0aW9uXTtcbiAgICAgICAgZm9yIChrIGluIF9yZWYzKSB7XG4gICAgICAgICAgdiA9IF9yZWYzW2tdO1xuICAgICAgICAgIGlmICgoX2Jhc2UgPSB0aGlzW29wdGlvbl0pW2tdID09IG51bGwpIHtcbiAgICAgICAgICAgIF9iYXNlW2tdID0gdjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIF9yZWY0ID0gUml2ZXRzLm9wdGlvbnM7XG4gICAgICBmb3IgKF9qID0gMCwgX2xlbjEgPSBfcmVmNC5sZW5ndGg7IF9qIDwgX2xlbjE7IF9qKyspIHtcbiAgICAgICAgb3B0aW9uID0gX3JlZjRbX2pdO1xuICAgICAgICB0aGlzW29wdGlvbl0gPSAoX3JlZjUgPSBvcHRpb25zW29wdGlvbl0pICE9IG51bGwgPyBfcmVmNSA6IFJpdmV0c1tcInB1YmxpY1wiXVtvcHRpb25dO1xuICAgICAgfVxuICAgICAgdGhpcy5idWlsZCgpO1xuICAgIH1cblxuICAgIFZpZXcucHJvdG90eXBlLm9wdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb24sIG9wdGlvbnMsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIF9yZWYxID0gUml2ZXRzLmV4dGVuc2lvbnMuY29uY2F0KFJpdmV0cy5vcHRpb25zKTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgb3B0aW9uID0gX3JlZjFbX2ldO1xuICAgICAgICBvcHRpb25zW29wdGlvbl0gPSB0aGlzW29wdGlvbl07XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuYmluZGluZ1JlZ0V4cCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoXCJeXCIgKyB0aGlzLnByZWZpeCArIFwiLVwiKTtcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuYnVpbGRCaW5kaW5nID0gZnVuY3Rpb24oYmluZGluZywgbm9kZSwgdHlwZSwgZGVjbGFyYXRpb24pIHtcbiAgICAgIHZhciBjb250ZXh0LCBjdHgsIGRlcGVuZGVuY2llcywga2V5cGF0aCwgb3B0aW9ucywgcGlwZSwgcGlwZXM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgICBwaXBlcyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9pLCBfbGVuLCBfcmVmMSwgX3Jlc3VsdHM7XG4gICAgICAgIF9yZWYxID0gZGVjbGFyYXRpb24ubWF0Y2goLygoPzonW14nXSonKSooPzooPzpbXlxcfCddKig/OidbXiddKicpK1teXFx8J10qKSt8W15cXHxdKykpfF4kL2cpO1xuICAgICAgICBfcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgcGlwZSA9IF9yZWYxW19pXTtcbiAgICAgICAgICBfcmVzdWx0cy5wdXNoKHBpcGUudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Jlc3VsdHM7XG4gICAgICB9KSgpO1xuICAgICAgY29udGV4dCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9pLCBfbGVuLCBfcmVmMSwgX3Jlc3VsdHM7XG4gICAgICAgIF9yZWYxID0gcGlwZXMuc2hpZnQoKS5zcGxpdCgnPCcpO1xuICAgICAgICBfcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgY3R4ID0gX3JlZjFbX2ldO1xuICAgICAgICAgIF9yZXN1bHRzLnB1c2goY3R4LnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgfSkoKTtcbiAgICAgIGtleXBhdGggPSBjb250ZXh0LnNoaWZ0KCk7XG4gICAgICBvcHRpb25zLmZvcm1hdHRlcnMgPSBwaXBlcztcbiAgICAgIGlmIChkZXBlbmRlbmNpZXMgPSBjb250ZXh0LnNoaWZ0KCkpIHtcbiAgICAgICAgb3B0aW9ucy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuc3BsaXQoL1xccysvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzLnB1c2gobmV3IFJpdmV0c1tiaW5kaW5nXSh0aGlzLCBub2RlLCB0eXBlLCBrZXlwYXRoLCBvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZWwsIHBhcnNlLCBfaSwgX2xlbiwgX3JlZjE7XG4gICAgICB0aGlzLmJpbmRpbmdzID0gW107XG4gICAgICBwYXJzZSA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIHZhciBibG9jaywgY2hpbGROb2RlLCBkZWxpbWl0ZXJzLCBuLCBwYXJzZXIsIHRleHQsIHRva2VuLCB0b2tlbnMsIF9pLCBfaiwgX2xlbiwgX2xlbjEsIF9yZWYxO1xuICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICBwYXJzZXIgPSBSaXZldHMuVGV4dFRlbXBsYXRlUGFyc2VyO1xuICAgICAgICAgICAgaWYgKGRlbGltaXRlcnMgPSBfdGhpcy50ZW1wbGF0ZURlbGltaXRlcnMpIHtcbiAgICAgICAgICAgICAgaWYgKCh0b2tlbnMgPSBwYXJzZXIucGFyc2Uobm9kZS5kYXRhLCBkZWxpbWl0ZXJzKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodG9rZW5zLmxlbmd0aCA9PT0gMSAmJiB0b2tlbnNbMF0udHlwZSA9PT0gcGFyc2VyLnR5cGVzLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IHRva2Vucy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tfaV07XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0b2tlbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGV4dCwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMuYnVpbGRCaW5kaW5nKCdUZXh0QmluZGluZycsIHRleHQsIG51bGwsIHRva2VuLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgYmxvY2sgPSBfdGhpcy50cmF2ZXJzZShub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFibG9jaykge1xuICAgICAgICAgICAgX3JlZjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciBfaywgX2xlbjEsIF9yZWYxLCBfcmVzdWx0cztcbiAgICAgICAgICAgICAgX3JlZjEgPSBub2RlLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICAgIF9yZXN1bHRzID0gW107XG4gICAgICAgICAgICAgIGZvciAoX2sgPSAwLCBfbGVuMSA9IF9yZWYxLmxlbmd0aDsgX2sgPCBfbGVuMTsgX2srKykge1xuICAgICAgICAgICAgICAgIG4gPSBfcmVmMVtfa107XG4gICAgICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gX3Jlc3VsdHM7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgZm9yIChfaiA9IDAsIF9sZW4xID0gX3JlZjEubGVuZ3RoOyBfaiA8IF9sZW4xOyBfaisrKSB7XG4gICAgICAgICAgICAgIGNoaWxkTm9kZSA9IF9yZWYxW19qXTtcbiAgICAgICAgICAgICAgcGFyc2UoY2hpbGROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIF9yZWYxID0gdGhpcy5lbHM7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGVsID0gX3JlZjFbX2ldO1xuICAgICAgICBwYXJzZShlbCk7XG4gICAgICB9XG4gICAgICB0aGlzLmJpbmRpbmdzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICB2YXIgX3JlZjIsIF9yZWYzO1xuICAgICAgICByZXR1cm4gKCgoX3JlZjIgPSBiLmJpbmRlcikgIT0gbnVsbCA/IF9yZWYyLnByaW9yaXR5IDogdm9pZCAwKSB8fCAwKSAtICgoKF9yZWYzID0gYS5iaW5kZXIpICE9IG51bGwgPyBfcmVmMy5wcmlvcml0eSA6IHZvaWQgMCkgfHwgMCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUudHJhdmVyc2UgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgYXR0cmlidXRlLCBhdHRyaWJ1dGVzLCBiaW5kZXIsIGJpbmRpbmdSZWdFeHAsIGJsb2NrLCBpZGVudGlmaWVyLCByZWdleHAsIHR5cGUsIHZhbHVlLCBfaSwgX2osIF9sZW4sIF9sZW4xLCBfcmVmMSwgX3JlZjIsIF9yZWYzO1xuICAgICAgYmluZGluZ1JlZ0V4cCA9IHRoaXMuYmluZGluZ1JlZ0V4cCgpO1xuICAgICAgYmxvY2sgPSBub2RlLm5vZGVOYW1lID09PSAnU0NSSVBUJyB8fCBub2RlLm5vZGVOYW1lID09PSAnU1RZTEUnO1xuICAgICAgX3JlZjEgPSBub2RlLmF0dHJpYnV0ZXM7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGF0dHJpYnV0ZSA9IF9yZWYxW19pXTtcbiAgICAgICAgaWYgKGJpbmRpbmdSZWdFeHAudGVzdChhdHRyaWJ1dGUubmFtZSkpIHtcbiAgICAgICAgICB0eXBlID0gYXR0cmlidXRlLm5hbWUucmVwbGFjZShiaW5kaW5nUmVnRXhwLCAnJyk7XG4gICAgICAgICAgaWYgKCEoYmluZGVyID0gdGhpcy5iaW5kZXJzW3R5cGVdKSkge1xuICAgICAgICAgICAgX3JlZjIgPSB0aGlzLmJpbmRlcnM7XG4gICAgICAgICAgICBmb3IgKGlkZW50aWZpZXIgaW4gX3JlZjIpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBfcmVmMltpZGVudGlmaWVyXTtcbiAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgIT09ICcqJyAmJiBpZGVudGlmaWVyLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZWdleHAgPSBuZXcgUmVnRXhwKFwiXlwiICsgKGlkZW50aWZpZXIucmVwbGFjZSgvXFwqL2csICcuKycpKSArIFwiJFwiKTtcbiAgICAgICAgICAgICAgICBpZiAocmVnZXhwLnRlc3QodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIGJpbmRlciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBiaW5kZXIgfHwgKGJpbmRlciA9IHRoaXMuYmluZGVyc1snKiddKTtcbiAgICAgICAgICBpZiAoYmluZGVyLmJsb2NrKSB7XG4gICAgICAgICAgICBibG9jayA9IHRydWU7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzID0gW2F0dHJpYnV0ZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfcmVmMyA9IGF0dHJpYnV0ZXMgfHwgbm9kZS5hdHRyaWJ1dGVzO1xuICAgICAgZm9yIChfaiA9IDAsIF9sZW4xID0gX3JlZjMubGVuZ3RoOyBfaiA8IF9sZW4xOyBfaisrKSB7XG4gICAgICAgIGF0dHJpYnV0ZSA9IF9yZWYzW19qXTtcbiAgICAgICAgaWYgKGJpbmRpbmdSZWdFeHAudGVzdChhdHRyaWJ1dGUubmFtZSkpIHtcbiAgICAgICAgICB0eXBlID0gYXR0cmlidXRlLm5hbWUucmVwbGFjZShiaW5kaW5nUmVnRXhwLCAnJyk7XG4gICAgICAgICAgdGhpcy5idWlsZEJpbmRpbmcoJ0JpbmRpbmcnLCBub2RlLCB0eXBlLCBhdHRyaWJ1dGUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgIHR5cGUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbdHlwZV0gJiYgIW5vZGUuX2JvdW5kKSB7XG4gICAgICAgICAgdGhpcy5iaW5kaW5ncy5wdXNoKG5ldyBSaXZldHMuQ29tcG9uZW50QmluZGluZyh0aGlzLCBub2RlLCB0eXBlKSk7XG4gICAgICAgICAgYmxvY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYmxvY2s7XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICB2YXIgYmluZGluZywgX2ksIF9sZW4sIF9yZWYxLCBfcmVzdWx0cztcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIF9yZXN1bHRzID0gW107XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGJpbmRpbmcgPSBfcmVmMVtfaV07XG4gICAgICAgIGlmIChmbihiaW5kaW5nKSkge1xuICAgICAgICAgIF9yZXN1bHRzLnB1c2goYmluZGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBfcmVzdWx0cztcbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJpbmRpbmcsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgYmluZGluZy5iaW5kKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnVuYmluZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJpbmRpbmcsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgYmluZGluZy51bmJpbmQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgVmlldy5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJpbmRpbmcsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIF9yZWYxID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgaWYgKHR5cGVvZiBiaW5kaW5nLnN5bmMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGJpbmRpbmcuc3luYygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnB1Ymxpc2ggPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBiaW5kaW5nLCBfaSwgX2xlbiwgX3JlZjE7XG4gICAgICBfcmVmMSA9IHRoaXMuc2VsZWN0KGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmFyIF9yZWYxO1xuICAgICAgICByZXR1cm4gKF9yZWYxID0gYi5iaW5kZXIpICE9IG51bGwgPyBfcmVmMS5wdWJsaXNoZXMgOiB2b2lkIDA7XG4gICAgICB9KTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYmluZGluZyA9IF9yZWYxW19pXTtcbiAgICAgICAgYmluZGluZy5wdWJsaXNoKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFZpZXcucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1vZGVscykge1xuICAgICAgdmFyIGJpbmRpbmcsIGtleSwgbW9kZWwsIF9pLCBfbGVuLCBfcmVmMTtcbiAgICAgIGlmIChtb2RlbHMgPT0gbnVsbCkge1xuICAgICAgICBtb2RlbHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGZvciAoa2V5IGluIG1vZGVscykge1xuICAgICAgICBtb2RlbCA9IG1vZGVsc1trZXldO1xuICAgICAgICB0aGlzLm1vZGVsc1trZXldID0gbW9kZWw7XG4gICAgICB9XG4gICAgICBfcmVmMSA9IHRoaXMuYmluZGluZ3M7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGJpbmRpbmcgPSBfcmVmMVtfaV07XG4gICAgICAgIGlmICh0eXBlb2YgYmluZGluZy51cGRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGJpbmRpbmcudXBkYXRlKG1vZGVscyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFZpZXc7XG5cbiAgfSkoKTtcblxuICBSaXZldHMuQmluZGluZyA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nKHZpZXcsIGVsLCB0eXBlLCBrZXlwYXRoLCBvcHRpb25zKSB7XG4gICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgIHRoaXMua2V5cGF0aCA9IGtleXBhdGg7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge307XG4gICAgICB0aGlzLmdldFZhbHVlID0gX19iaW5kKHRoaXMuZ2V0VmFsdWUsIHRoaXMpO1xuICAgICAgdGhpcy51cGRhdGUgPSBfX2JpbmQodGhpcy51cGRhdGUsIHRoaXMpO1xuICAgICAgdGhpcy51bmJpbmQgPSBfX2JpbmQodGhpcy51bmJpbmQsIHRoaXMpO1xuICAgICAgdGhpcy5iaW5kID0gX19iaW5kKHRoaXMuYmluZCwgdGhpcyk7XG4gICAgICB0aGlzLnB1Ymxpc2ggPSBfX2JpbmQodGhpcy5wdWJsaXNoLCB0aGlzKTtcbiAgICAgIHRoaXMuc3luYyA9IF9fYmluZCh0aGlzLnN5bmMsIHRoaXMpO1xuICAgICAgdGhpcy5zZXQgPSBfX2JpbmQodGhpcy5zZXQsIHRoaXMpO1xuICAgICAgdGhpcy5ldmVudEhhbmRsZXIgPSBfX2JpbmQodGhpcy5ldmVudEhhbmRsZXIsIHRoaXMpO1xuICAgICAgdGhpcy5mb3JtYXR0ZWRWYWx1ZSA9IF9fYmluZCh0aGlzLmZvcm1hdHRlZFZhbHVlLCB0aGlzKTtcbiAgICAgIHRoaXMucGFyc2VGb3JtYXR0ZXJBcmd1bWVudHMgPSBfX2JpbmQodGhpcy5wYXJzZUZvcm1hdHRlckFyZ3VtZW50cywgdGhpcyk7XG4gICAgICB0aGlzLnBhcnNlVGFyZ2V0ID0gX19iaW5kKHRoaXMucGFyc2VUYXJnZXQsIHRoaXMpO1xuICAgICAgdGhpcy5vYnNlcnZlID0gX19iaW5kKHRoaXMub2JzZXJ2ZSwgdGhpcyk7XG4gICAgICB0aGlzLnNldEJpbmRlciA9IF9fYmluZCh0aGlzLnNldEJpbmRlciwgdGhpcyk7XG4gICAgICB0aGlzLmZvcm1hdHRlcnMgPSB0aGlzLm9wdGlvbnMuZm9ybWF0dGVycyB8fCBbXTtcbiAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gW107XG4gICAgICB0aGlzLmZvcm1hdHRlck9ic2VydmVycyA9IHt9O1xuICAgICAgdGhpcy5tb2RlbCA9IHZvaWQgMDtcbiAgICAgIHRoaXMuc2V0QmluZGVyKCk7XG4gICAgfVxuXG4gICAgQmluZGluZy5wcm90b3R5cGUuc2V0QmluZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciwgcmVnZXhwLCB2YWx1ZSwgX3JlZjE7XG4gICAgICBpZiAoISh0aGlzLmJpbmRlciA9IHRoaXMudmlldy5iaW5kZXJzW3RoaXMudHlwZV0pKSB7XG4gICAgICAgIF9yZWYxID0gdGhpcy52aWV3LmJpbmRlcnM7XG4gICAgICAgIGZvciAoaWRlbnRpZmllciBpbiBfcmVmMSkge1xuICAgICAgICAgIHZhbHVlID0gX3JlZjFbaWRlbnRpZmllcl07XG4gICAgICAgICAgaWYgKGlkZW50aWZpZXIgIT09ICcqJyAmJiBpZGVudGlmaWVyLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IG5ldyBSZWdFeHAoXCJeXCIgKyAoaWRlbnRpZmllci5yZXBsYWNlKC9cXCovZywgJy4rJykpICsgXCIkXCIpO1xuICAgICAgICAgICAgaWYgKHJlZ2V4cC50ZXN0KHRoaXMudHlwZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5iaW5kZXIgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5hcmdzID0gbmV3IFJlZ0V4cChcIl5cIiArIChpZGVudGlmaWVyLnJlcGxhY2UoL1xcKi9nLCAnKC4rKScpKSArIFwiJFwiKS5leGVjKHRoaXMudHlwZSk7XG4gICAgICAgICAgICAgIHRoaXMuYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5iaW5kZXIgfHwgKHRoaXMuYmluZGVyID0gdGhpcy52aWV3LmJpbmRlcnNbJyonXSk7XG4gICAgICBpZiAodGhpcy5iaW5kZXIgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kZXIgPSB7XG4gICAgICAgICAgcm91dGluZTogdGhpcy5iaW5kZXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uKG9iaiwga2V5cGF0aCwgY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBSaXZldHMuc2lnaHRnbGFzcyhvYmosIGtleXBhdGgsIGNhbGxiYWNrLCB7XG4gICAgICAgIHJvb3Q6IHRoaXMudmlldy5yb290SW50ZXJmYWNlLFxuICAgICAgICBhZGFwdGVyczogdGhpcy52aWV3LmFkYXB0ZXJzXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUucGFyc2VUYXJnZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0b2tlbjtcbiAgICAgIHRva2VuID0gUml2ZXRzLlR5cGVQYXJzZXIucGFyc2UodGhpcy5rZXlwYXRoKTtcbiAgICAgIGlmICh0b2tlbi50eXBlID09PSBSaXZldHMuVHlwZVBhcnNlci50eXBlcy5wcmltaXRpdmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPSB0b2tlbi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmUodGhpcy52aWV3Lm1vZGVscywgdGhpcy5rZXlwYXRoLCB0aGlzLnN5bmMpO1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbCA9IHRoaXMub2JzZXJ2ZXIudGFyZ2V0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBCaW5kaW5nLnByb3RvdHlwZS5wYXJzZUZvcm1hdHRlckFyZ3VtZW50cyA9IGZ1bmN0aW9uKGFyZ3MsIGZvcm1hdHRlckluZGV4KSB7XG4gICAgICB2YXIgYWksIGFyZywgb2JzZXJ2ZXIsIHByb2Nlc3NlZEFyZ3MsIF9iYXNlLCBfaSwgX2xlbjtcbiAgICAgIGFyZ3MgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBfaSwgX2xlbiwgX3Jlc3VsdHM7XG4gICAgICAgIF9yZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gYXJncy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgIGFyZyA9IGFyZ3NbX2ldO1xuICAgICAgICAgIF9yZXN1bHRzLnB1c2goUml2ZXRzLlR5cGVQYXJzZXIucGFyc2UoYXJnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgfSkoKTtcbiAgICAgIHByb2Nlc3NlZEFyZ3MgPSBbXTtcbiAgICAgIGZvciAoYWkgPSBfaSA9IDAsIF9sZW4gPSBhcmdzLmxlbmd0aDsgX2kgPCBfbGVuOyBhaSA9ICsrX2kpIHtcbiAgICAgICAgYXJnID0gYXJnc1thaV07XG4gICAgICAgIHByb2Nlc3NlZEFyZ3MucHVzaChhcmcudHlwZSA9PT0gUml2ZXRzLlR5cGVQYXJzZXIudHlwZXMucHJpbWl0aXZlID8gYXJnLnZhbHVlIDogKChfYmFzZSA9IHRoaXMuZm9ybWF0dGVyT2JzZXJ2ZXJzKVtmb3JtYXR0ZXJJbmRleF0gfHwgKF9iYXNlW2Zvcm1hdHRlckluZGV4XSA9IHt9KSwgIShvYnNlcnZlciA9IHRoaXMuZm9ybWF0dGVyT2JzZXJ2ZXJzW2Zvcm1hdHRlckluZGV4XVthaV0pID8gKG9ic2VydmVyID0gdGhpcy5vYnNlcnZlKHRoaXMudmlldy5tb2RlbHMsIGFyZy52YWx1ZSwgdGhpcy5zeW5jKSwgdGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnNbZm9ybWF0dGVySW5kZXhdW2FpXSA9IG9ic2VydmVyKSA6IHZvaWQgMCwgb2JzZXJ2ZXIudmFsdWUoKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2Nlc3NlZEFyZ3M7XG4gICAgfTtcblxuICAgIEJpbmRpbmcucHJvdG90eXBlLmZvcm1hdHRlZFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBhcmdzLCBmaSwgZm9ybWF0dGVyLCBpZCwgcHJvY2Vzc2VkQXJncywgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMjtcbiAgICAgIF9yZWYxID0gdGhpcy5mb3JtYXR0ZXJzO1xuICAgICAgZm9yIChmaSA9IF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBmaSA9ICsrX2kpIHtcbiAgICAgICAgZm9ybWF0dGVyID0gX3JlZjFbZmldO1xuICAgICAgICBhcmdzID0gZm9ybWF0dGVyLm1hdGNoKC9bXlxccyddK3wnKFteJ118J1teXFxzXSkqJ3xcIihbXlwiXXxcIlteXFxzXSkqXCIvZyk7XG4gICAgICAgIGlkID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBmb3JtYXR0ZXIgPSB0aGlzLnZpZXcuZm9ybWF0dGVyc1tpZF07XG4gICAgICAgIHByb2Nlc3NlZEFyZ3MgPSB0aGlzLnBhcnNlRm9ybWF0dGVyQXJndW1lbnRzKGFyZ3MsIGZpKTtcbiAgICAgICAgaWYgKChmb3JtYXR0ZXIgIT0gbnVsbCA/IGZvcm1hdHRlci5yZWFkIDogdm9pZCAwKSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgdmFsdWUgPSAoX3JlZjIgPSBmb3JtYXR0ZXIucmVhZCkuY2FsbC5hcHBseShfcmVmMiwgW3RoaXMubW9kZWwsIHZhbHVlXS5jb25jYXQoX19zbGljZS5jYWxsKHByb2Nlc3NlZEFyZ3MpKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0dGVyIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICB2YWx1ZSA9IGZvcm1hdHRlci5jYWxsLmFwcGx5KGZvcm1hdHRlciwgW3RoaXMubW9kZWwsIHZhbHVlXS5jb25jYXQoX19zbGljZS5jYWxsKHByb2Nlc3NlZEFyZ3MpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUuZXZlbnRIYW5kbGVyID0gZnVuY3Rpb24oZm4pIHtcbiAgICAgIHZhciBiaW5kaW5nLCBoYW5kbGVyO1xuICAgICAgaGFuZGxlciA9IChiaW5kaW5nID0gdGhpcykudmlldy5oYW5kbGVyO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmNhbGwoZm4sIHRoaXMsIGV2LCBiaW5kaW5nKTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIEJpbmRpbmcucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgX3JlZjE7XG4gICAgICB2YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgIXRoaXMuYmluZGVyW1wiZnVuY3Rpb25cIl0gJiYgUml2ZXRzW1wicHVibGljXCJdLmV4ZWN1dGVGdW5jdGlvbnMgPyB0aGlzLmZvcm1hdHRlZFZhbHVlKHZhbHVlLmNhbGwodGhpcy5tb2RlbCkpIDogdGhpcy5mb3JtYXR0ZWRWYWx1ZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gKF9yZWYxID0gdGhpcy5iaW5kZXIucm91dGluZSkgIT0gbnVsbCA/IF9yZWYxLmNhbGwodGhpcywgdGhpcy5lbCwgdmFsdWUpIDogdm9pZCAwO1xuICAgIH07XG5cbiAgICBCaW5kaW5nLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZGVwZW5kZW5jeSwgb2JzZXJ2ZXI7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgX2ksIF9qLCBfbGVuLCBfbGVuMSwgX3JlZjEsIF9yZWYyLCBfcmVmMztcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5tb2RlbCAhPT0gdGhpcy5vYnNlcnZlci50YXJnZXQpIHtcbiAgICAgICAgICAgIF9yZWYxID0gdGhpcy5kZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyID0gX3JlZjFbX2ldO1xuICAgICAgICAgICAgICBvYnNlcnZlci51bm9ic2VydmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gW107XG4gICAgICAgICAgICBpZiAoKCh0aGlzLm1vZGVsID0gdGhpcy5vYnNlcnZlci50YXJnZXQpICE9IG51bGwpICYmICgoX3JlZjIgPSB0aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzKSAhPSBudWxsID8gX3JlZjIubGVuZ3RoIDogdm9pZCAwKSkge1xuICAgICAgICAgICAgICBfcmVmMyA9IHRoaXMub3B0aW9ucy5kZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgIGZvciAoX2ogPSAwLCBfbGVuMSA9IF9yZWYzLmxlbmd0aDsgX2ogPCBfbGVuMTsgX2orKykge1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgPSBfcmVmM1tfal07XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmUodGhpcy5tb2RlbCwgZGVwZW5kZW5jeSwgdGhpcy5zeW5jKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llcy5wdXNoKG9ic2VydmVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlci52YWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KS5jYWxsKHRoaXMpKTtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUucHVibGlzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGFyZ3MsIGZpLCBmaVJldmVyc2VkLCBmb3JtYXR0ZXIsIGlkLCBsYXN0Zm9ybWF0dGVySW5kZXgsIHByb2Nlc3NlZEFyZ3MsIHZhbHVlLCBfaSwgX2xlbiwgX3JlZjEsIF9yZWYyLCBfcmVmMztcbiAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSh0aGlzLmVsKTtcbiAgICAgICAgbGFzdGZvcm1hdHRlckluZGV4ID0gdGhpcy5mb3JtYXR0ZXJzLmxlbmd0aCAtIDE7XG4gICAgICAgIF9yZWYxID0gdGhpcy5mb3JtYXR0ZXJzLnNsaWNlKDApLnJldmVyc2UoKTtcbiAgICAgICAgZm9yIChmaVJldmVyc2VkID0gX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IGZpUmV2ZXJzZWQgPSArK19pKSB7XG4gICAgICAgICAgZm9ybWF0dGVyID0gX3JlZjFbZmlSZXZlcnNlZF07XG4gICAgICAgICAgZmkgPSBsYXN0Zm9ybWF0dGVySW5kZXggLSBmaVJldmVyc2VkO1xuICAgICAgICAgIGFyZ3MgPSBmb3JtYXR0ZXIuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICBwcm9jZXNzZWRBcmdzID0gdGhpcy5wYXJzZUZvcm1hdHRlckFyZ3VtZW50cyhhcmdzLCBmaSk7XG4gICAgICAgICAgaWYgKChfcmVmMiA9IHRoaXMudmlldy5mb3JtYXR0ZXJzW2lkXSkgIT0gbnVsbCA/IF9yZWYyLnB1Ymxpc2ggOiB2b2lkIDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gKF9yZWYzID0gdGhpcy52aWV3LmZvcm1hdHRlcnNbaWRdKS5wdWJsaXNoLmFwcGx5KF9yZWYzLCBbdmFsdWVdLmNvbmNhdChfX3NsaWNlLmNhbGwocHJvY2Vzc2VkQXJncykpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBCaW5kaW5nLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZGVwZW5kZW5jeSwgb2JzZXJ2ZXIsIF9pLCBfbGVuLCBfcmVmMSwgX3JlZjIsIF9yZWYzO1xuICAgICAgdGhpcy5wYXJzZVRhcmdldCgpO1xuICAgICAgaWYgKChfcmVmMSA9IHRoaXMuYmluZGVyLmJpbmQpICE9IG51bGwpIHtcbiAgICAgICAgX3JlZjEuY2FsbCh0aGlzLCB0aGlzLmVsKTtcbiAgICAgIH1cbiAgICAgIGlmICgodGhpcy5tb2RlbCAhPSBudWxsKSAmJiAoKF9yZWYyID0gdGhpcy5vcHRpb25zLmRlcGVuZGVuY2llcykgIT0gbnVsbCA/IF9yZWYyLmxlbmd0aCA6IHZvaWQgMCkpIHtcbiAgICAgICAgX3JlZjMgPSB0aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzO1xuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYzLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgZGVwZW5kZW5jeSA9IF9yZWYzW19pXTtcbiAgICAgICAgICBvYnNlcnZlciA9IHRoaXMub2JzZXJ2ZSh0aGlzLm1vZGVsLCBkZXBlbmRlbmN5LCB0aGlzLnN5bmMpO1xuICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLnB1c2gob2JzZXJ2ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52aWV3LnByZWxvYWREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUudW5iaW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYWksIGFyZ3MsIGZpLCBvYnNlcnZlciwgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZWY0O1xuICAgICAgaWYgKChfcmVmMSA9IHRoaXMuYmluZGVyLnVuYmluZCkgIT0gbnVsbCkge1xuICAgICAgICBfcmVmMS5jYWxsKHRoaXMsIHRoaXMuZWwpO1xuICAgICAgfVxuICAgICAgaWYgKChfcmVmMiA9IHRoaXMub2JzZXJ2ZXIpICE9IG51bGwpIHtcbiAgICAgICAgX3JlZjIudW5vYnNlcnZlKCk7XG4gICAgICB9XG4gICAgICBfcmVmMyA9IHRoaXMuZGVwZW5kZW5jaWVzO1xuICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICBvYnNlcnZlciA9IF9yZWYzW19pXTtcbiAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IFtdO1xuICAgICAgX3JlZjQgPSB0aGlzLmZvcm1hdHRlck9ic2VydmVycztcbiAgICAgIGZvciAoZmkgaW4gX3JlZjQpIHtcbiAgICAgICAgYXJncyA9IF9yZWY0W2ZpXTtcbiAgICAgICAgZm9yIChhaSBpbiBhcmdzKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIgPSBhcmdzW2FpXTtcbiAgICAgICAgICBvYnNlcnZlci51bm9ic2VydmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVyT2JzZXJ2ZXJzID0ge307XG4gICAgfTtcblxuICAgIEJpbmRpbmcucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1vZGVscykge1xuICAgICAgdmFyIF9yZWYxLCBfcmVmMjtcbiAgICAgIGlmIChtb2RlbHMgPT0gbnVsbCkge1xuICAgICAgICBtb2RlbHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIHRoaXMubW9kZWwgPSAoX3JlZjEgPSB0aGlzLm9ic2VydmVyKSAhPSBudWxsID8gX3JlZjEudGFyZ2V0IDogdm9pZCAwO1xuICAgICAgcmV0dXJuIChfcmVmMiA9IHRoaXMuYmluZGVyLnVwZGF0ZSkgIT0gbnVsbCA/IF9yZWYyLmNhbGwodGhpcywgbW9kZWxzKSA6IHZvaWQgMDtcbiAgICB9O1xuXG4gICAgQmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbihlbCkge1xuICAgICAgaWYgKHRoaXMuYmluZGVyICYmICh0aGlzLmJpbmRlci5nZXRWYWx1ZSAhPSBudWxsKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kZXIuZ2V0VmFsdWUuY2FsbCh0aGlzLCBlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUml2ZXRzLlV0aWwuZ2V0SW5wdXRWYWx1ZShlbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBCaW5kaW5nO1xuXG4gIH0pKCk7XG5cbiAgUml2ZXRzLkNvbXBvbmVudEJpbmRpbmcgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbXBvbmVudEJpbmRpbmcsIF9zdXBlcik7XG5cbiAgICBmdW5jdGlvbiBDb21wb25lbnRCaW5kaW5nKHZpZXcsIGVsLCB0eXBlKSB7XG4gICAgICB2YXIgYXR0cmlidXRlLCBiaW5kaW5nUmVnRXhwLCBwcm9wZXJ0eU5hbWUsIHRva2VuLCBfaSwgX2xlbiwgX3JlZjEsIF9yZWYyO1xuICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICB0aGlzLnVuYmluZCA9IF9fYmluZCh0aGlzLnVuYmluZCwgdGhpcyk7XG4gICAgICB0aGlzLmJpbmQgPSBfX2JpbmQodGhpcy5iaW5kLCB0aGlzKTtcbiAgICAgIHRoaXMubG9jYWxzID0gX19iaW5kKHRoaXMubG9jYWxzLCB0aGlzKTtcbiAgICAgIHRoaXMuY29tcG9uZW50ID0gdGhpcy52aWV3LmNvbXBvbmVudHNbdGhpcy50eXBlXTtcbiAgICAgIHRoaXNbXCJzdGF0aWNcIl0gPSB7fTtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzID0ge307XG4gICAgICB0aGlzLnVwc3RyZWFtT2JzZXJ2ZXJzID0ge307XG4gICAgICBiaW5kaW5nUmVnRXhwID0gdmlldy5iaW5kaW5nUmVnRXhwKCk7XG4gICAgICBfcmVmMSA9IHRoaXMuZWwuYXR0cmlidXRlcyB8fCBbXTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgYXR0cmlidXRlID0gX3JlZjFbX2ldO1xuICAgICAgICBpZiAoIWJpbmRpbmdSZWdFeHAudGVzdChhdHRyaWJ1dGUubmFtZSkpIHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSB0aGlzLmNhbWVsQ2FzZShhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgdG9rZW4gPSBSaXZldHMuVHlwZVBhcnNlci5wYXJzZShhdHRyaWJ1dGUudmFsdWUpO1xuICAgICAgICAgIGlmIChfX2luZGV4T2YuY2FsbCgoX3JlZjIgPSB0aGlzLmNvbXBvbmVudFtcInN0YXRpY1wiXSkgIT0gbnVsbCA/IF9yZWYyIDogW10sIHByb3BlcnR5TmFtZSkgPj0gMCkge1xuICAgICAgICAgICAgdGhpc1tcInN0YXRpY1wiXVtwcm9wZXJ0eU5hbWVdID0gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gUml2ZXRzLlR5cGVQYXJzZXIudHlwZXMucHJpbWl0aXZlKSB7XG4gICAgICAgICAgICB0aGlzW1wic3RhdGljXCJdW3Byb3BlcnR5TmFtZV0gPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnNbcHJvcGVydHlOYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb21wb25lbnRCaW5kaW5nLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7fTtcblxuICAgIENvbXBvbmVudEJpbmRpbmcucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge307XG5cbiAgICBDb21wb25lbnRCaW5kaW5nLnByb3RvdHlwZS5wdWJsaXNoID0gZnVuY3Rpb24oKSB7fTtcblxuICAgIENvbXBvbmVudEJpbmRpbmcucHJvdG90eXBlLmxvY2FscyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGtleSwgb2JzZXJ2ZXIsIHJlc3VsdCwgdmFsdWUsIF9yZWYxLCBfcmVmMjtcbiAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgX3JlZjEgPSB0aGlzW1wic3RhdGljXCJdO1xuICAgICAgZm9yIChrZXkgaW4gX3JlZjEpIHtcbiAgICAgICAgdmFsdWUgPSBfcmVmMVtrZXldO1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgX3JlZjIgPSB0aGlzLm9ic2VydmVycztcbiAgICAgIGZvciAoa2V5IGluIF9yZWYyKSB7XG4gICAgICAgIG9ic2VydmVyID0gX3JlZjJba2V5XTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBvYnNlcnZlci52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgQ29tcG9uZW50QmluZGluZy5wcm90b3R5cGUuY2FtZWxDYXNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLy0oW2Etel0pL2csIGZ1bmN0aW9uKGdyb3VwZWQpIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwZWRbMV0udG9VcHBlckNhc2UoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDb21wb25lbnRCaW5kaW5nLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaywga2V5LCBrZXlwYXRoLCBvYnNlcnZlciwgb3B0aW9uLCBvcHRpb25zLCBzY29wZSwgdiwgX2Jhc2UsIF9pLCBfaiwgX2xlbiwgX2xlbjEsIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZWY0LCBfcmVmNSwgX3JlZjYsIF9yZWY3O1xuICAgICAgaWYgKCF0aGlzLmJvdW5kKSB7XG4gICAgICAgIF9yZWYxID0gdGhpcy5vYnNlcnZlcnM7XG4gICAgICAgIGZvciAoa2V5IGluIF9yZWYxKSB7XG4gICAgICAgICAga2V5cGF0aCA9IF9yZWYxW2tleV07XG4gICAgICAgICAgdGhpcy5vYnNlcnZlcnNba2V5XSA9IHRoaXMub2JzZXJ2ZSh0aGlzLnZpZXcubW9kZWxzLCBrZXlwYXRoLCAoKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuY29tcG9uZW50Vmlldy5tb2RlbHNba2V5XSA9IF90aGlzLm9ic2VydmVyc1trZXldLnZhbHVlKCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKHRoaXMpKS5jYWxsKHRoaXMsIGtleSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm91bmQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50VmlldyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Vmlldy5iaW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsLmlubmVySFRNTCA9IHRoaXMuY29tcG9uZW50LnRlbXBsYXRlLmNhbGwodGhpcyk7XG4gICAgICAgIHNjb3BlID0gdGhpcy5jb21wb25lbnQuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMuZWwsIHRoaXMubG9jYWxzKCkpO1xuICAgICAgICB0aGlzLmVsLl9ib3VuZCA9IHRydWU7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgX3JlZjIgPSBSaXZldHMuZXh0ZW5zaW9ucztcbiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgIG9wdGlvbiA9IF9yZWYyW19pXTtcbiAgICAgICAgICBvcHRpb25zW29wdGlvbl0gPSB7fTtcbiAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRbb3B0aW9uXSkge1xuICAgICAgICAgICAgX3JlZjMgPSB0aGlzLmNvbXBvbmVudFtvcHRpb25dO1xuICAgICAgICAgICAgZm9yIChrIGluIF9yZWYzKSB7XG4gICAgICAgICAgICAgIHYgPSBfcmVmM1trXTtcbiAgICAgICAgICAgICAgb3B0aW9uc1tvcHRpb25dW2tdID0gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgX3JlZjQgPSB0aGlzLnZpZXdbb3B0aW9uXTtcbiAgICAgICAgICBmb3IgKGsgaW4gX3JlZjQpIHtcbiAgICAgICAgICAgIHYgPSBfcmVmNFtrXTtcbiAgICAgICAgICAgIGlmICgoX2Jhc2UgPSBvcHRpb25zW29wdGlvbl0pW2tdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgX2Jhc2Vba10gPSB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfcmVmNSA9IFJpdmV0cy5vcHRpb25zO1xuICAgICAgICBmb3IgKF9qID0gMCwgX2xlbjEgPSBfcmVmNS5sZW5ndGg7IF9qIDwgX2xlbjE7IF9qKyspIHtcbiAgICAgICAgICBvcHRpb24gPSBfcmVmNVtfal07XG4gICAgICAgICAgb3B0aW9uc1tvcHRpb25dID0gKF9yZWY2ID0gdGhpcy5jb21wb25lbnRbb3B0aW9uXSkgIT0gbnVsbCA/IF9yZWY2IDogdGhpcy52aWV3W29wdGlvbl07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21wb25lbnRWaWV3ID0gbmV3IFJpdmV0cy5WaWV3KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuZWwuY2hpbGROb2RlcyksIHNjb3BlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRWaWV3LmJpbmQoKTtcbiAgICAgICAgX3JlZjcgPSB0aGlzLm9ic2VydmVycztcbiAgICAgICAgZm9yIChrZXkgaW4gX3JlZjcpIHtcbiAgICAgICAgICBvYnNlcnZlciA9IF9yZWY3W2tleV07XG4gICAgICAgICAgdGhpcy51cHN0cmVhbU9ic2VydmVyc1trZXldID0gdGhpcy5vYnNlcnZlKHRoaXMuY29tcG9uZW50Vmlldy5tb2RlbHMsIGtleSwgKChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5zZXRWYWx1ZShfdGhpcy5jb21wb25lbnRWaWV3Lm1vZGVsc1trZXldKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkodGhpcykpLmNhbGwodGhpcywga2V5LCBvYnNlcnZlcikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIENvbXBvbmVudEJpbmRpbmcucHJvdG90eXBlLnVuYmluZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGtleSwgb2JzZXJ2ZXIsIF9yZWYxLCBfcmVmMiwgX3JlZjM7XG4gICAgICBfcmVmMSA9IHRoaXMudXBzdHJlYW1PYnNlcnZlcnM7XG4gICAgICBmb3IgKGtleSBpbiBfcmVmMSkge1xuICAgICAgICBvYnNlcnZlciA9IF9yZWYxW2tleV07XG4gICAgICAgIG9ic2VydmVyLnVub2JzZXJ2ZSgpO1xuICAgICAgfVxuICAgICAgX3JlZjIgPSB0aGlzLm9ic2VydmVycztcbiAgICAgIGZvciAoa2V5IGluIF9yZWYyKSB7XG4gICAgICAgIG9ic2VydmVyID0gX3JlZjJba2V5XTtcbiAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKF9yZWYzID0gdGhpcy5jb21wb25lbnRWaWV3KSAhPSBudWxsID8gX3JlZjMudW5iaW5kLmNhbGwodGhpcykgOiB2b2lkIDA7XG4gICAgfTtcblxuICAgIHJldHVybiBDb21wb25lbnRCaW5kaW5nO1xuXG4gIH0pKFJpdmV0cy5CaW5kaW5nKTtcblxuICBSaXZldHMuVGV4dEJpbmRpbmcgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRleHRCaW5kaW5nLCBfc3VwZXIpO1xuXG4gICAgZnVuY3Rpb24gVGV4dEJpbmRpbmcodmlldywgZWwsIHR5cGUsIGtleXBhdGgsIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICB0aGlzLmVsID0gZWw7XG4gICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgdGhpcy5rZXlwYXRoID0ga2V5cGF0aDtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMgOiB7fTtcbiAgICAgIHRoaXMuc3luYyA9IF9fYmluZCh0aGlzLnN5bmMsIHRoaXMpO1xuICAgICAgdGhpcy5mb3JtYXR0ZXJzID0gdGhpcy5vcHRpb25zLmZvcm1hdHRlcnMgfHwgW107XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IFtdO1xuICAgICAgdGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnMgPSB7fTtcbiAgICB9XG5cbiAgICBUZXh0QmluZGluZy5wcm90b3R5cGUuYmluZGVyID0ge1xuICAgICAgcm91dGluZTogZnVuY3Rpb24obm9kZSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuZGF0YSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICcnO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBUZXh0QmluZGluZy5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIFRleHRCaW5kaW5nLl9fc3VwZXJfXy5zeW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIHJldHVybiBUZXh0QmluZGluZztcblxuICB9KShSaXZldHMuQmluZGluZyk7XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnMudGV4dCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgIGlmIChlbC50ZXh0Q29udGVudCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZWwudGV4dENvbnRlbnQgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsLmlubmVyVGV4dCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICcnO1xuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy5odG1sID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGVsLmlubmVySFRNTCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICcnO1xuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzLnNob3cgPSBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICByZXR1cm4gZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gJycgOiAnbm9uZSc7XG4gIH07XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnMuaGlkZSA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgIHJldHVybiBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyAnbm9uZScgOiAnJztcbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy5lbmFibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGVsLmRpc2FibGVkID0gIXZhbHVlO1xuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGVsLmRpc2FibGVkID0gISF2YWx1ZTtcbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy5jaGVja2VkID0ge1xuICAgIHB1Ymxpc2hlczogdHJ1ZSxcbiAgICBwcmlvcml0eTogMjAwMCxcbiAgICBiaW5kOiBmdW5jdGlvbihlbCkge1xuICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLmJpbmRFdmVudChlbCwgJ2NoYW5nZScsIHRoaXMucHVibGlzaCk7XG4gICAgfSxcbiAgICB1bmJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICByZXR1cm4gUml2ZXRzLlV0aWwudW5iaW5kRXZlbnQoZWwsICdjaGFuZ2UnLCB0aGlzLnB1Ymxpc2gpO1xuICAgIH0sXG4gICAgcm91dGluZTogZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgICB2YXIgX3JlZjE7XG4gICAgICBpZiAoZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWwuY2hlY2tlZCA9ICgoX3JlZjEgPSBlbC52YWx1ZSkgIT0gbnVsbCA/IF9yZWYxLnRvU3RyaW5nKCkgOiB2b2lkIDApID09PSAodmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiB2b2lkIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsLmNoZWNrZWQgPSAhIXZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVycy51bmNoZWNrZWQgPSB7XG4gICAgcHVibGlzaGVzOiB0cnVlLFxuICAgIHByaW9yaXR5OiAyMDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICByZXR1cm4gUml2ZXRzLlV0aWwuYmluZEV2ZW50KGVsLCAnY2hhbmdlJywgdGhpcy5wdWJsaXNoKTtcbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIHJldHVybiBSaXZldHMuVXRpbC51bmJpbmRFdmVudChlbCwgJ2NoYW5nZScsIHRoaXMucHVibGlzaCk7XG4gICAgfSxcbiAgICByb3V0aW5lOiBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICAgIHZhciBfcmVmMTtcbiAgICAgIGlmIChlbC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbC5jaGVja2VkID0gKChfcmVmMSA9IGVsLnZhbHVlKSAhPSBudWxsID8gX3JlZjEudG9TdHJpbmcoKSA6IHZvaWQgMCkgIT09ICh2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHZvaWQgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWwuY2hlY2tlZCA9ICF2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnMudmFsdWUgPSB7XG4gICAgcHVibGlzaGVzOiB0cnVlLFxuICAgIHByaW9yaXR5OiAzMDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICBpZiAoIShlbC50YWdOYW1lID09PSAnSU5QVVQnICYmIGVsLnR5cGUgPT09ICdyYWRpbycpKSB7XG4gICAgICAgIHRoaXMuZXZlbnQgPSBlbC50YWdOYW1lID09PSAnU0VMRUNUJyA/ICdjaGFuZ2UnIDogJ2lucHV0JztcbiAgICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLmJpbmRFdmVudChlbCwgdGhpcy5ldmVudCwgdGhpcy5wdWJsaXNoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIGlmICghKGVsLnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZWwudHlwZSA9PT0gJ3JhZGlvJykpIHtcbiAgICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLnVuYmluZEV2ZW50KGVsLCB0aGlzLmV2ZW50LCB0aGlzLnB1Ymxpc2gpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcm91dGluZTogZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgICB2YXIgbywgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZXN1bHRzO1xuICAgICAgaWYgKGVsLnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZWwudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWwuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAod2luZG93LmpRdWVyeSAhPSBudWxsKSB7XG4gICAgICAgIGVsID0galF1ZXJ5KGVsKTtcbiAgICAgICAgaWYgKCh2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHZvaWQgMCkgIT09ICgoX3JlZjEgPSBlbC52YWwoKSkgIT0gbnVsbCA/IF9yZWYxLnRvU3RyaW5nKCkgOiB2b2lkIDApKSB7XG4gICAgICAgICAgcmV0dXJuIGVsLnZhbCh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChlbC50eXBlID09PSAnc2VsZWN0LW11bHRpcGxlJykge1xuICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBfcmVzdWx0cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBlbC5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICBvID0gZWxbX2ldO1xuICAgICAgICAgICAgICBfcmVzdWx0cy5wdXNoKG8uc2VsZWN0ZWQgPSAoX3JlZjIgPSBvLnZhbHVlLCBfX2luZGV4T2YuY2FsbCh2YWx1ZSwgX3JlZjIpID49IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfcmVzdWx0cztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogdm9pZCAwKSAhPT0gKChfcmVmMyA9IGVsLnZhbHVlKSAhPSBudWxsID8gX3JlZjMudG9TdHJpbmcoKSA6IHZvaWQgMCkpIHtcbiAgICAgICAgICByZXR1cm4gZWwudmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVyc1tcImlmXCJdID0ge1xuICAgIGJsb2NrOiB0cnVlLFxuICAgIHByaW9yaXR5OiA0MDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICB2YXIgYXR0ciwgZGVjbGFyYXRpb247XG4gICAgICBpZiAodGhpcy5tYXJrZXIgPT0gbnVsbCkge1xuICAgICAgICBhdHRyID0gW3RoaXMudmlldy5wcmVmaXgsIHRoaXMudHlwZV0uam9pbignLScpLnJlcGxhY2UoJy0tJywgJy0nKTtcbiAgICAgICAgZGVjbGFyYXRpb24gPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cik7XG4gICAgICAgIHRoaXMubWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIiByaXZldHM6IFwiICsgdGhpcy50eXBlICsgXCIgXCIgKyBkZWNsYXJhdGlvbiArIFwiIFwiKTtcbiAgICAgICAgdGhpcy5ib3VuZCA9IGZhbHNlO1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICAgIGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubWFya2VyLCBlbCk7XG4gICAgICAgIHJldHVybiBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5uZXN0ZWQpIHtcbiAgICAgICAgdGhpcy5uZXN0ZWQudW5iaW5kKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmJvdW5kID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgICByb3V0aW5lOiBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICAgIHZhciBrZXksIG1vZGVsLCBtb2RlbHMsIF9yZWYxO1xuICAgICAgaWYgKCEhdmFsdWUgPT09ICF0aGlzLmJvdW5kKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIG1vZGVscyA9IHt9O1xuICAgICAgICAgIF9yZWYxID0gdGhpcy52aWV3Lm1vZGVscztcbiAgICAgICAgICBmb3IgKGtleSBpbiBfcmVmMSkge1xuICAgICAgICAgICAgbW9kZWwgPSBfcmVmMVtrZXldO1xuICAgICAgICAgICAgbW9kZWxzW2tleV0gPSBtb2RlbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgKHRoaXMubmVzdGVkIHx8ICh0aGlzLm5lc3RlZCA9IG5ldyBSaXZldHMuVmlldyhlbCwgbW9kZWxzLCB0aGlzLnZpZXcub3B0aW9ucygpKSkpLmJpbmQoKTtcbiAgICAgICAgICB0aGlzLm1hcmtlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbCwgdGhpcy5tYXJrZXIubmV4dFNpYmxpbmcpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmJvdW5kID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICB0aGlzLm5lc3RlZC51bmJpbmQoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ib3VuZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGU6IGZ1bmN0aW9uKG1vZGVscykge1xuICAgICAgdmFyIF9yZWYxO1xuICAgICAgcmV0dXJuIChfcmVmMSA9IHRoaXMubmVzdGVkKSAhPSBudWxsID8gX3JlZjEudXBkYXRlKG1vZGVscykgOiB2b2lkIDA7XG4gICAgfVxuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzLnVubGVzcyA9IHtcbiAgICBibG9jazogdHJ1ZSxcbiAgICBwcmlvcml0eTogNDAwMCxcbiAgICBiaW5kOiBmdW5jdGlvbihlbCkge1xuICAgICAgcmV0dXJuIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzW1wiaWZcIl0uYmluZC5jYWxsKHRoaXMsIGVsKTtcbiAgICB9LFxuICAgIHVuYmluZDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnNbXCJpZlwiXS51bmJpbmQuY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIHJvdXRpbmU6IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzW1wiaWZcIl0ucm91dGluZS5jYWxsKHRoaXMsIGVsLCAhdmFsdWUpO1xuICAgIH0sXG4gICAgdXBkYXRlOiBmdW5jdGlvbihtb2RlbHMpIHtcbiAgICAgIHJldHVybiBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVyc1tcImlmXCJdLnVwZGF0ZS5jYWxsKHRoaXMsIG1vZGVscyk7XG4gICAgfVxuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzWydvbi0qJ10gPSB7XG4gICAgXCJmdW5jdGlvblwiOiB0cnVlLFxuICAgIHByaW9yaXR5OiAxMDAwLFxuICAgIHVuYmluZDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIGlmICh0aGlzLmhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIFJpdmV0cy5VdGlsLnVuYmluZEV2ZW50KGVsLCB0aGlzLmFyZ3NbMF0sIHRoaXMuaGFuZGxlcik7XG4gICAgICB9XG4gICAgfSxcbiAgICByb3V0aW5lOiBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmhhbmRsZXIpIHtcbiAgICAgICAgUml2ZXRzLlV0aWwudW5iaW5kRXZlbnQoZWwsIHRoaXMuYXJnc1swXSwgdGhpcy5oYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSaXZldHMuVXRpbC5iaW5kRXZlbnQoZWwsIHRoaXMuYXJnc1swXSwgdGhpcy5oYW5kbGVyID0gdGhpcy5ldmVudEhhbmRsZXIodmFsdWUpKTtcbiAgICB9XG4gIH07XG5cbiAgUml2ZXRzW1wicHVibGljXCJdLmJpbmRlcnNbJ2VhY2gtKiddID0ge1xuICAgIGJsb2NrOiB0cnVlLFxuICAgIHByaW9yaXR5OiA0MDAwLFxuICAgIGJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICB2YXIgYXR0ciwgdmlldywgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgaWYgKHRoaXMubWFya2VyID09IG51bGwpIHtcbiAgICAgICAgYXR0ciA9IFt0aGlzLnZpZXcucHJlZml4LCB0aGlzLnR5cGVdLmpvaW4oJy0nKS5yZXBsYWNlKCctLScsICctJyk7XG4gICAgICAgIHRoaXMubWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIiByaXZldHM6IFwiICsgdGhpcy50eXBlICsgXCIgXCIpO1xuICAgICAgICB0aGlzLml0ZXJhdGVkID0gW107XG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5tYXJrZXIsIGVsKTtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfcmVmMSA9IHRoaXMuaXRlcmF0ZWQ7XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICB2aWV3ID0gX3JlZjFbX2ldO1xuICAgICAgICAgIHZpZXcuYmluZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB1bmJpbmQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICB2YXIgdmlldywgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgaWYgKHRoaXMuaXRlcmF0ZWQgIT0gbnVsbCkge1xuICAgICAgICBfcmVmMSA9IHRoaXMuaXRlcmF0ZWQ7XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICB2aWV3ID0gX3JlZjFbX2ldO1xuICAgICAgICAgIHZpZXcudW5iaW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHJvdXRpbmU6IGZ1bmN0aW9uKGVsLCBjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgYmluZGluZywgZGF0YSwgaSwgaW5kZXgsIGtleSwgbW9kZWwsIG1vZGVsTmFtZSwgb3B0aW9ucywgcHJldmlvdXMsIHRlbXBsYXRlLCB2aWV3LCBfaSwgX2osIF9rLCBfbGVuLCBfbGVuMSwgX2xlbjIsIF9yZWYxLCBfcmVmMiwgX3JlZjM7XG4gICAgICBtb2RlbE5hbWUgPSB0aGlzLmFyZ3NbMF07XG4gICAgICBjb2xsZWN0aW9uID0gY29sbGVjdGlvbiB8fCBbXTtcbiAgICAgIGlmICh0aGlzLml0ZXJhdGVkLmxlbmd0aCA+IGNvbGxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgIF9yZWYxID0gQXJyYXkodGhpcy5pdGVyYXRlZC5sZW5ndGggLSBjb2xsZWN0aW9uLmxlbmd0aCk7XG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICBpID0gX3JlZjFbX2ldO1xuICAgICAgICAgIHZpZXcgPSB0aGlzLml0ZXJhdGVkLnBvcCgpO1xuICAgICAgICAgIHZpZXcudW5iaW5kKCk7XG4gICAgICAgICAgdGhpcy5tYXJrZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2aWV3LmVsc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoaW5kZXggPSBfaiA9IDAsIF9sZW4xID0gY29sbGVjdGlvbi5sZW5ndGg7IF9qIDwgX2xlbjE7IGluZGV4ID0gKytfaikge1xuICAgICAgICBtb2RlbCA9IGNvbGxlY3Rpb25baW5kZXhdO1xuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICB9O1xuICAgICAgICBkYXRhW1JpdmV0c1tcInB1YmxpY1wiXS5pdGVyYXRpb25BbGlhcyhtb2RlbE5hbWUpXSA9IGluZGV4O1xuICAgICAgICBkYXRhW21vZGVsTmFtZV0gPSBtb2RlbDtcbiAgICAgICAgaWYgKHRoaXMuaXRlcmF0ZWRbaW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICBfcmVmMiA9IHRoaXMudmlldy5tb2RlbHM7XG4gICAgICAgICAgZm9yIChrZXkgaW4gX3JlZjIpIHtcbiAgICAgICAgICAgIG1vZGVsID0gX3JlZjJba2V5XTtcbiAgICAgICAgICAgIGlmIChkYXRhW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICBkYXRhW2tleV0gPSBtb2RlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcHJldmlvdXMgPSB0aGlzLml0ZXJhdGVkLmxlbmd0aCA/IHRoaXMuaXRlcmF0ZWRbdGhpcy5pdGVyYXRlZC5sZW5ndGggLSAxXS5lbHNbMF0gOiB0aGlzLm1hcmtlcjtcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy52aWV3Lm9wdGlvbnMoKTtcbiAgICAgICAgICBvcHRpb25zLnByZWxvYWREYXRhID0gdHJ1ZTtcbiAgICAgICAgICB0ZW1wbGF0ZSA9IGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICB2aWV3ID0gbmV3IFJpdmV0cy5WaWV3KHRlbXBsYXRlLCBkYXRhLCBvcHRpb25zKTtcbiAgICAgICAgICB2aWV3LmJpbmQoKTtcbiAgICAgICAgICB0aGlzLml0ZXJhdGVkLnB1c2godmlldyk7XG4gICAgICAgICAgdGhpcy5tYXJrZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGVtcGxhdGUsIHByZXZpb3VzLm5leHRTaWJsaW5nKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLml0ZXJhdGVkW2luZGV4XS5tb2RlbHNbbW9kZWxOYW1lXSAhPT0gbW9kZWwpIHtcbiAgICAgICAgICB0aGlzLml0ZXJhdGVkW2luZGV4XS51cGRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgX3JlZjMgPSB0aGlzLnZpZXcuYmluZGluZ3M7XG4gICAgICAgIGZvciAoX2sgPSAwLCBfbGVuMiA9IF9yZWYzLmxlbmd0aDsgX2sgPCBfbGVuMjsgX2srKykge1xuICAgICAgICAgIGJpbmRpbmcgPSBfcmVmM1tfa107XG4gICAgICAgICAgaWYgKGJpbmRpbmcuZWwgPT09IHRoaXMubWFya2VyLnBhcmVudE5vZGUgJiYgYmluZGluZy50eXBlID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBiaW5kaW5nLnN5bmMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZTogZnVuY3Rpb24obW9kZWxzKSB7XG4gICAgICB2YXIgZGF0YSwga2V5LCBtb2RlbCwgdmlldywgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgZGF0YSA9IHt9O1xuICAgICAgZm9yIChrZXkgaW4gbW9kZWxzKSB7XG4gICAgICAgIG1vZGVsID0gbW9kZWxzW2tleV07XG4gICAgICAgIGlmIChrZXkgIT09IHRoaXMuYXJnc1swXSkge1xuICAgICAgICAgIGRhdGFba2V5XSA9IG1vZGVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfcmVmMSA9IHRoaXMuaXRlcmF0ZWQ7XG4gICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYxLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIHZpZXcgPSBfcmVmMVtfaV07XG4gICAgICAgIHZpZXcudXBkYXRlKGRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYmluZGVyc1snY2xhc3MtKiddID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgdmFyIGVsQ2xhc3M7XG4gICAgZWxDbGFzcyA9IFwiIFwiICsgZWwuY2xhc3NOYW1lICsgXCIgXCI7XG4gICAgaWYgKCF2YWx1ZSA9PT0gKGVsQ2xhc3MuaW5kZXhPZihcIiBcIiArIHRoaXMuYXJnc1swXSArIFwiIFwiKSAhPT0gLTEpKSB7XG4gICAgICByZXR1cm4gZWwuY2xhc3NOYW1lID0gdmFsdWUgPyBcIlwiICsgZWwuY2xhc3NOYW1lICsgXCIgXCIgKyB0aGlzLmFyZ3NbMF0gOiBlbENsYXNzLnJlcGxhY2UoXCIgXCIgKyB0aGlzLmFyZ3NbMF0gKyBcIiBcIiwgJyAnKS50cmltKCk7XG4gICAgfVxuICB9O1xuXG4gIFJpdmV0c1tcInB1YmxpY1wiXS5iaW5kZXJzWycqJ10gPSBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsLnNldEF0dHJpYnV0ZSh0aGlzLnR5cGUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLnR5cGUpO1xuICAgIH1cbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uZm9ybWF0dGVyc1snY2FsbCddID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MsIHZhbHVlO1xuICAgIHZhbHVlID0gYXJndW1lbnRzWzBdLCBhcmdzID0gMiA8PSBhcmd1bWVudHMubGVuZ3RoID8gX19zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkgOiBbXTtcbiAgICByZXR1cm4gdmFsdWUuY2FsbC5hcHBseSh2YWx1ZSwgW3RoaXNdLmNvbmNhdChfX3NsaWNlLmNhbGwoYXJncykpKTtcbiAgfTtcblxuICBSaXZldHNbXCJwdWJsaWNcIl0uYWRhcHRlcnNbJy4nXSA9IHtcbiAgICBpZDogJ19ydicsXG4gICAgY291bnRlcjogMCxcbiAgICB3ZWFrbWFwOiB7fSxcbiAgICB3ZWFrUmVmZXJlbmNlOiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHZhciBpZCwgX2Jhc2UsIF9uYW1lO1xuICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkodGhpcy5pZCkpIHtcbiAgICAgICAgaWQgPSB0aGlzLmNvdW50ZXIrKztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgdGhpcy5pZCwge1xuICAgICAgICAgIHZhbHVlOiBpZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoX2Jhc2UgPSB0aGlzLndlYWttYXApW19uYW1lID0gb2JqW3RoaXMuaWRdXSB8fCAoX2Jhc2VbX25hbWVdID0ge1xuICAgICAgICBjYWxsYmFja3M6IHt9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNsZWFudXBXZWFrUmVmZXJlbmNlOiBmdW5jdGlvbihyZWYsIGlkKSB7XG4gICAgICBpZiAoIU9iamVjdC5rZXlzKHJlZi5jYWxsYmFja3MpLmxlbmd0aCkge1xuICAgICAgICBpZiAoIShyZWYucG9pbnRlcnMgJiYgT2JqZWN0LmtleXMocmVmLnBvaW50ZXJzKS5sZW5ndGgpKSB7XG4gICAgICAgICAgcmV0dXJuIGRlbGV0ZSB0aGlzLndlYWttYXBbaWRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzdHViRnVuY3Rpb246IGZ1bmN0aW9uKG9iaiwgZm4pIHtcbiAgICAgIHZhciBtYXAsIG9yaWdpbmFsLCB3ZWFrbWFwO1xuICAgICAgb3JpZ2luYWwgPSBvYmpbZm5dO1xuICAgICAgbWFwID0gdGhpcy53ZWFrUmVmZXJlbmNlKG9iaik7XG4gICAgICB3ZWFrbWFwID0gdGhpcy53ZWFrbWFwO1xuICAgICAgcmV0dXJuIG9ialtmbl0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrLCBrLCByLCByZXNwb25zZSwgX2ksIF9sZW4sIF9yZWYxLCBfcmVmMiwgX3JlZjMsIF9yZWY0O1xuICAgICAgICByZXNwb25zZSA9IG9yaWdpbmFsLmFwcGx5KG9iaiwgYXJndW1lbnRzKTtcbiAgICAgICAgX3JlZjEgPSBtYXAucG9pbnRlcnM7XG4gICAgICAgIGZvciAociBpbiBfcmVmMSkge1xuICAgICAgICAgIGsgPSBfcmVmMVtyXTtcbiAgICAgICAgICBfcmVmNCA9IChfcmVmMiA9IChfcmVmMyA9IHdlYWttYXBbcl0pICE9IG51bGwgPyBfcmVmMy5jYWxsYmFja3Nba10gOiB2b2lkIDApICE9IG51bGwgPyBfcmVmMiA6IFtdO1xuICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjQubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gX3JlZjRbX2ldO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfTtcbiAgICB9LFxuICAgIG9ic2VydmVNdXRhdGlvbnM6IGZ1bmN0aW9uKG9iaiwgcmVmLCBrZXlwYXRoKSB7XG4gICAgICB2YXIgZm4sIGZ1bmN0aW9ucywgbWFwLCBfYmFzZSwgX2ksIF9sZW47XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIG1hcCA9IHRoaXMud2Vha1JlZmVyZW5jZShvYmopO1xuICAgICAgICBpZiAobWFwLnBvaW50ZXJzID09IG51bGwpIHtcbiAgICAgICAgICBtYXAucG9pbnRlcnMgPSB7fTtcbiAgICAgICAgICBmdW5jdGlvbnMgPSBbJ3B1c2gnLCAncG9wJywgJ3NoaWZ0JywgJ3Vuc2hpZnQnLCAnc29ydCcsICdyZXZlcnNlJywgJ3NwbGljZSddO1xuICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gZnVuY3Rpb25zLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICBmbiA9IGZ1bmN0aW9uc1tfaV07XG4gICAgICAgICAgICB0aGlzLnN0dWJGdW5jdGlvbihvYmosIGZuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChfYmFzZSA9IG1hcC5wb2ludGVycylbcmVmXSA9PSBudWxsKSB7XG4gICAgICAgICAgX2Jhc2VbcmVmXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfX2luZGV4T2YuY2FsbChtYXAucG9pbnRlcnNbcmVmXSwga2V5cGF0aCkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcC5wb2ludGVyc1tyZWZdLnB1c2goa2V5cGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHVub2JzZXJ2ZU11dGF0aW9uczogZnVuY3Rpb24ob2JqLCByZWYsIGtleXBhdGgpIHtcbiAgICAgIHZhciBpZHgsIG1hcCwgcG9pbnRlcnM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopICYmIChvYmpbdGhpcy5pZF0gIT0gbnVsbCkpIHtcbiAgICAgICAgaWYgKG1hcCA9IHRoaXMud2Vha21hcFtvYmpbdGhpcy5pZF1dKSB7XG4gICAgICAgICAgaWYgKHBvaW50ZXJzID0gbWFwLnBvaW50ZXJzW3JlZl0pIHtcbiAgICAgICAgICAgIGlmICgoaWR4ID0gcG9pbnRlcnMuaW5kZXhPZihrZXlwYXRoKSkgPj0gMCkge1xuICAgICAgICAgICAgICBwb2ludGVycy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcG9pbnRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBtYXAucG9pbnRlcnNbcmVmXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBXZWFrUmVmZXJlbmNlKG1hcCwgb2JqW3RoaXMuaWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIG9ic2VydmU6IGZ1bmN0aW9uKG9iaiwga2V5cGF0aCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBjYWxsYmFja3MsIGRlc2MsIHZhbHVlO1xuICAgICAgY2FsbGJhY2tzID0gdGhpcy53ZWFrUmVmZXJlbmNlKG9iaikuY2FsbGJhY2tzO1xuICAgICAgaWYgKGNhbGxiYWNrc1trZXlwYXRoXSA9PSBudWxsKSB7XG4gICAgICAgIGNhbGxiYWNrc1trZXlwYXRoXSA9IFtdO1xuICAgICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleXBhdGgpO1xuICAgICAgICBpZiAoISgoZGVzYyAhPSBudWxsID8gZGVzYy5nZXQgOiB2b2lkIDApIHx8IChkZXNjICE9IG51bGwgPyBkZXNjLnNldCA6IHZvaWQgMCkpKSB7XG4gICAgICAgICAgdmFsdWUgPSBvYmpba2V5cGF0aF07XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5cGF0aCwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2IsIG1hcCwgX2ksIF9sZW4sIF9yZWYxO1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLnVub2JzZXJ2ZU11dGF0aW9ucyh2YWx1ZSwgb2JqW190aGlzLmlkXSwga2V5cGF0aCk7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgaWYgKG1hcCA9IF90aGlzLndlYWttYXBbb2JqW190aGlzLmlkXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gbWFwLmNhbGxiYWNrcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1trZXlwYXRoXSkge1xuICAgICAgICAgICAgICAgICAgICAgIF9yZWYxID0gY2FsbGJhY2tzW2tleXBhdGhdLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2IgPSBfcmVmMVtfaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19pbmRleE9mLmNhbGwoY2FsbGJhY2tzW2tleXBhdGhdLCBjYikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMub2JzZXJ2ZU11dGF0aW9ucyhuZXdWYWx1ZSwgb2JqW190aGlzLmlkXSwga2V5cGF0aCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKGNhbGxiYWNrc1trZXlwYXRoXSwgY2FsbGJhY2spIDwgMCkge1xuICAgICAgICBjYWxsYmFja3Nba2V5cGF0aF0ucHVzaChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vYnNlcnZlTXV0YXRpb25zKG9ialtrZXlwYXRoXSwgb2JqW3RoaXMuaWRdLCBrZXlwYXRoKTtcbiAgICB9LFxuICAgIHVub2JzZXJ2ZTogZnVuY3Rpb24ob2JqLCBrZXlwYXRoLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGNhbGxiYWNrcywgaWR4LCBtYXA7XG4gICAgICBpZiAobWFwID0gdGhpcy53ZWFrbWFwW29ialt0aGlzLmlkXV0pIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrcyA9IG1hcC5jYWxsYmFja3Nba2V5cGF0aF0pIHtcbiAgICAgICAgICBpZiAoKGlkeCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKSkgPj0gMCkge1xuICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBtYXAuY2FsbGJhY2tzW2tleXBhdGhdO1xuICAgICAgICAgICAgICB0aGlzLnVub2JzZXJ2ZU11dGF0aW9ucyhvYmpba2V5cGF0aF0sIG9ialt0aGlzLmlkXSwga2V5cGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBXZWFrUmVmZXJlbmNlKG1hcCwgb2JqW3RoaXMuaWRdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbihvYmosIGtleXBhdGgpIHtcbiAgICAgIHJldHVybiBvYmpba2V5cGF0aF07XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKG9iaiwga2V5cGF0aCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5cGF0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgUml2ZXRzLmZhY3RvcnkgPSBmdW5jdGlvbihzaWdodGdsYXNzKSB7XG4gICAgUml2ZXRzLnNpZ2h0Z2xhc3MgPSBzaWdodGdsYXNzO1xuICAgIFJpdmV0c1tcInB1YmxpY1wiXS5fID0gUml2ZXRzO1xuICAgIHJldHVybiBSaXZldHNbXCJwdWJsaWNcIl07XG4gIH07XG5cbiAgaWYgKHR5cGVvZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUgIT09IG51bGwgPyBtb2R1bGUuZXhwb3J0cyA6IHZvaWQgMCkgPT09ICdvYmplY3QnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBSaXZldHMuZmFjdG9yeShyZXF1aXJlKCdzaWdodGdsYXNzJykpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbJ3NpZ2h0Z2xhc3MnXSwgZnVuY3Rpb24oc2lnaHRnbGFzcykge1xuICAgICAgcmV0dXJuIHRoaXMucml2ZXRzID0gUml2ZXRzLmZhY3Rvcnkoc2lnaHRnbGFzcyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yaXZldHMgPSBSaXZldHMuZmFjdG9yeShzaWdodGdsYXNzKTtcbiAgfVxuXG59KS5jYWxsKHRoaXMpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcml2ZXRzL2Rpc3Qvcml2ZXRzLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9yaXZldHMvZGlzdC9yaXZldHMuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/rivets/dist/rivets.js\n"); + +/***/ }), + +/***/ "./node_modules/sightglass/index.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function() {\n // Public sightglass interface.\n function sightglass(obj, keypath, callback, options) {\n return new Observer(obj, keypath, callback, options)\n }\n\n // Batteries not included.\n sightglass.adapters = {}\n\n // Constructs a new keypath observer and kicks things off.\n function Observer(obj, keypath, callback, options) {\n this.options = options || {}\n this.options.adapters = this.options.adapters || {}\n this.obj = obj\n this.keypath = keypath\n this.callback = callback\n this.objectPath = []\n this.update = this.update.bind(this)\n this.parse()\n\n if (isObject(this.target = this.realize())) {\n this.set(true, this.key, this.target, this.callback)\n }\n }\n\n // Tokenizes the provided keypath string into interface + path tokens for the\n // observer to work with.\n Observer.tokenize = function(keypath, interfaces, root) {\n var tokens = []\n var current = {i: root, path: ''}\n var index, chr\n\n for (index = 0; index < keypath.length; index++) {\n chr = keypath.charAt(index)\n\n if (!!~interfaces.indexOf(chr)) {\n tokens.push(current)\n current = {i: chr, path: ''}\n } else {\n current.path += chr\n }\n }\n\n tokens.push(current)\n return tokens\n }\n\n // Parses the keypath using the interfaces defined on the view. Sets variables\n // for the tokenized keypath as well as the end key.\n Observer.prototype.parse = function() {\n var interfaces = this.interfaces()\n var root, path\n\n if (!interfaces.length) {\n error('Must define at least one adapter interface.')\n }\n\n if (!!~interfaces.indexOf(this.keypath[0])) {\n root = this.keypath[0]\n path = this.keypath.substr(1)\n } else {\n if (typeof (root = this.options.root || sightglass.root) === 'undefined') {\n error('Must define a default root adapter.')\n }\n\n path = this.keypath\n }\n\n this.tokens = Observer.tokenize(path, interfaces, root)\n this.key = this.tokens.pop()\n }\n\n // Realizes the full keypath, attaching observers for every key and correcting\n // old observers to any changed objects in the keypath.\n Observer.prototype.realize = function() {\n var current = this.obj\n var unreached = false\n var prev\n\n this.tokens.forEach(function(token, index) {\n if (isObject(current)) {\n if (typeof this.objectPath[index] !== 'undefined') {\n if (current !== (prev = this.objectPath[index])) {\n this.set(false, token, prev, this.update)\n this.set(true, token, current, this.update)\n this.objectPath[index] = current\n }\n } else {\n this.set(true, token, current, this.update)\n this.objectPath[index] = current\n }\n\n current = this.get(token, current)\n } else {\n if (unreached === false) {\n unreached = index\n }\n\n if (prev = this.objectPath[index]) {\n this.set(false, token, prev, this.update)\n }\n }\n }, this)\n\n if (unreached !== false) {\n this.objectPath.splice(unreached)\n }\n\n return current\n }\n\n // Updates the keypath. This is called when any intermediary key is changed.\n Observer.prototype.update = function() {\n var next, oldValue\n\n if ((next = this.realize()) !== this.target) {\n if (isObject(this.target)) {\n this.set(false, this.key, this.target, this.callback)\n }\n\n if (isObject(next)) {\n this.set(true, this.key, next, this.callback)\n }\n\n oldValue = this.value()\n this.target = next\n\n // Always call callback if value is a function. If not a function, call callback only if value changed\n if (this.value() instanceof Function || this.value() !== oldValue) this.callback()\n }\n }\n\n // Reads the current end value of the observed keypath. Returns undefined if\n // the full keypath is unreachable.\n Observer.prototype.value = function() {\n if (isObject(this.target)) {\n return this.get(this.key, this.target)\n }\n }\n\n // Sets the current end value of the observed keypath. Calling setValue when\n // the full keypath is unreachable is a no-op.\n Observer.prototype.setValue = function(value) {\n if (isObject(this.target)) {\n this.adapter(this.key).set(this.target, this.key.path, value)\n }\n }\n\n // Gets the provided key on an object.\n Observer.prototype.get = function(key, obj) {\n return this.adapter(key).get(obj, key.path)\n }\n\n // Observes or unobserves a callback on the object using the provided key.\n Observer.prototype.set = function(active, key, obj, callback) {\n var action = active ? 'observe' : 'unobserve'\n this.adapter(key)[action](obj, key.path, callback)\n }\n\n // Returns an array of all unique adapter interfaces available.\n Observer.prototype.interfaces = function() {\n var interfaces = Object.keys(this.options.adapters)\n\n Object.keys(sightglass.adapters).forEach(function(i) {\n if (!~interfaces.indexOf(i)) {\n interfaces.push(i)\n }\n })\n\n return interfaces\n }\n\n // Convenience function to grab the adapter for a specific key.\n Observer.prototype.adapter = function(key) {\n return this.options.adapters[key.i] ||\n sightglass.adapters[key.i]\n }\n\n // Unobserves the entire keypath.\n Observer.prototype.unobserve = function() {\n var obj\n\n this.tokens.forEach(function(token, index) {\n if (obj = this.objectPath[index]) {\n this.set(false, token, obj, this.update)\n }\n }, this)\n\n if (isObject(this.target)) {\n this.set(false, this.key, this.target, this.callback)\n }\n }\n\n // Check if a value is an object than can be observed.\n function isObject(obj) {\n return typeof obj === 'object' && obj !== null\n }\n\n // Error thrower.\n function error(message) {\n throw new Error('[sightglass] ' + message)\n }\n\n // Export module for Node and the browser.\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = sightglass\n } else if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n return this.sightglass = sightglass\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n } else {\n this.sightglass = sightglass\n }\n}).call(this);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnaHRnbGFzcy9pbmRleC5qcz85NjA1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQSxtQkFBbUIsd0JBQXdCO0FBQzNDOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkIsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUFBO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3NpZ2h0Z2xhc3MvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKSB7XG4gIC8vIFB1YmxpYyBzaWdodGdsYXNzIGludGVyZmFjZS5cbiAgZnVuY3Rpb24gc2lnaHRnbGFzcyhvYmosIGtleXBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZlcihvYmosIGtleXBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKVxuICB9XG5cbiAgLy8gQmF0dGVyaWVzIG5vdCBpbmNsdWRlZC5cbiAgc2lnaHRnbGFzcy5hZGFwdGVycyA9IHt9XG5cbiAgLy8gQ29uc3RydWN0cyBhIG5ldyBrZXlwYXRoIG9ic2VydmVyIGFuZCBraWNrcyB0aGluZ3Mgb2ZmLlxuICBmdW5jdGlvbiBPYnNlcnZlcihvYmosIGtleXBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgIHRoaXMub3B0aW9ucy5hZGFwdGVycyA9IHRoaXMub3B0aW9ucy5hZGFwdGVycyB8fCB7fVxuICAgIHRoaXMub2JqID0gb2JqXG4gICAgdGhpcy5rZXlwYXRoID0ga2V5cGF0aFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMub2JqZWN0UGF0aCA9IFtdXG4gICAgdGhpcy51cGRhdGUgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5wYXJzZSgpXG5cbiAgICBpZiAoaXNPYmplY3QodGhpcy50YXJnZXQgPSB0aGlzLnJlYWxpemUoKSkpIHtcbiAgICAgIHRoaXMuc2V0KHRydWUsIHRoaXMua2V5LCB0aGlzLnRhcmdldCwgdGhpcy5jYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICAvLyBUb2tlbml6ZXMgdGhlIHByb3ZpZGVkIGtleXBhdGggc3RyaW5nIGludG8gaW50ZXJmYWNlICsgcGF0aCB0b2tlbnMgZm9yIHRoZVxuICAvLyBvYnNlcnZlciB0byB3b3JrIHdpdGguXG4gIE9ic2VydmVyLnRva2VuaXplID0gZnVuY3Rpb24oa2V5cGF0aCwgaW50ZXJmYWNlcywgcm9vdCkge1xuICAgIHZhciB0b2tlbnMgPSBbXVxuICAgIHZhciBjdXJyZW50ID0ge2k6IHJvb3QsIHBhdGg6ICcnfVxuICAgIHZhciBpbmRleCwgY2hyXG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBrZXlwYXRoLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY2hyID0ga2V5cGF0aC5jaGFyQXQoaW5kZXgpXG5cbiAgICAgIGlmICghIX5pbnRlcmZhY2VzLmluZGV4T2YoY2hyKSkge1xuICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50KVxuICAgICAgICBjdXJyZW50ID0ge2k6IGNociwgcGF0aDogJyd9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50LnBhdGggKz0gY2hyXG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9rZW5zLnB1c2goY3VycmVudClcbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIGtleXBhdGggdXNpbmcgdGhlIGludGVyZmFjZXMgZGVmaW5lZCBvbiB0aGUgdmlldy4gU2V0cyB2YXJpYWJsZXNcbiAgLy8gZm9yIHRoZSB0b2tlbml6ZWQga2V5cGF0aCBhcyB3ZWxsIGFzIHRoZSBlbmQga2V5LlxuICBPYnNlcnZlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW50ZXJmYWNlcyA9IHRoaXMuaW50ZXJmYWNlcygpXG4gICAgdmFyIHJvb3QsIHBhdGhcblxuICAgIGlmICghaW50ZXJmYWNlcy5sZW5ndGgpIHtcbiAgICAgIGVycm9yKCdNdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgYWRhcHRlciBpbnRlcmZhY2UuJylcbiAgICB9XG5cbiAgICBpZiAoISF+aW50ZXJmYWNlcy5pbmRleE9mKHRoaXMua2V5cGF0aFswXSkpIHtcbiAgICAgIHJvb3QgPSB0aGlzLmtleXBhdGhbMF1cbiAgICAgIHBhdGggPSB0aGlzLmtleXBhdGguc3Vic3RyKDEpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgKHJvb3QgPSB0aGlzLm9wdGlvbnMucm9vdCB8fCBzaWdodGdsYXNzLnJvb3QpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBlcnJvcignTXVzdCBkZWZpbmUgYSBkZWZhdWx0IHJvb3QgYWRhcHRlci4nKVxuICAgICAgfVxuXG4gICAgICBwYXRoID0gdGhpcy5rZXlwYXRoXG4gICAgfVxuXG4gICAgdGhpcy50b2tlbnMgPSBPYnNlcnZlci50b2tlbml6ZShwYXRoLCBpbnRlcmZhY2VzLCByb290KVxuICAgIHRoaXMua2V5ID0gdGhpcy50b2tlbnMucG9wKClcbiAgfVxuXG4gIC8vIFJlYWxpemVzIHRoZSBmdWxsIGtleXBhdGgsIGF0dGFjaGluZyBvYnNlcnZlcnMgZm9yIGV2ZXJ5IGtleSBhbmQgY29ycmVjdGluZ1xuICAvLyBvbGQgb2JzZXJ2ZXJzIHRvIGFueSBjaGFuZ2VkIG9iamVjdHMgaW4gdGhlIGtleXBhdGguXG4gIE9ic2VydmVyLnByb3RvdHlwZS5yZWFsaXplID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLm9ialxuICAgIHZhciB1bnJlYWNoZWQgPSBmYWxzZVxuICAgIHZhciBwcmV2XG5cbiAgICB0aGlzLnRva2Vucy5mb3JFYWNoKGZ1bmN0aW9uKHRva2VuLCBpbmRleCkge1xuICAgICAgaWYgKGlzT2JqZWN0KGN1cnJlbnQpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vYmplY3RQYXRoW2luZGV4XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gKHByZXYgPSB0aGlzLm9iamVjdFBhdGhbaW5kZXhdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoZmFsc2UsIHRva2VuLCBwcmV2LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICAgIHRoaXMuc2V0KHRydWUsIHRva2VuLCBjdXJyZW50LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICAgIHRoaXMub2JqZWN0UGF0aFtpbmRleF0gPSBjdXJyZW50XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0KHRydWUsIHRva2VuLCBjdXJyZW50LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICB0aGlzLm9iamVjdFBhdGhbaW5kZXhdID0gY3VycmVudFxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCA9IHRoaXMuZ2V0KHRva2VuLCBjdXJyZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHVucmVhY2hlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB1bnJlYWNoZWQgPSBpbmRleFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXYgPSB0aGlzLm9iamVjdFBhdGhbaW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5zZXQoZmFsc2UsIHRva2VuLCBwcmV2LCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHRoaXMpXG5cbiAgICBpZiAodW5yZWFjaGVkICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vYmplY3RQYXRoLnNwbGljZSh1bnJlYWNoZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRcbiAgfVxuXG4gIC8vIFVwZGF0ZXMgdGhlIGtleXBhdGguIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW55IGludGVybWVkaWFyeSBrZXkgaXMgY2hhbmdlZC5cbiAgT2JzZXJ2ZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuZXh0LCBvbGRWYWx1ZVxuXG4gICAgaWYgKChuZXh0ID0gdGhpcy5yZWFsaXplKCkpICE9PSB0aGlzLnRhcmdldCkge1xuICAgICAgaWYgKGlzT2JqZWN0KHRoaXMudGFyZ2V0KSkge1xuICAgICAgICB0aGlzLnNldChmYWxzZSwgdGhpcy5rZXksIHRoaXMudGFyZ2V0LCB0aGlzLmNhbGxiYWNrKVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3QobmV4dCkpIHtcbiAgICAgICAgdGhpcy5zZXQodHJ1ZSwgdGhpcy5rZXksIG5leHQsIHRoaXMuY2FsbGJhY2spXG4gICAgICB9XG5cbiAgICAgIG9sZFZhbHVlID0gdGhpcy52YWx1ZSgpXG4gICAgICB0aGlzLnRhcmdldCA9IG5leHRcblxuICAgICAgLy8gQWx3YXlzIGNhbGwgY2FsbGJhY2sgaWYgdmFsdWUgaXMgYSBmdW5jdGlvbi4gSWYgbm90IGEgZnVuY3Rpb24sIGNhbGwgY2FsbGJhY2sgb25seSBpZiB2YWx1ZSBjaGFuZ2VkXG4gICAgICBpZiAodGhpcy52YWx1ZSgpIGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdGhpcy52YWx1ZSgpICE9PSBvbGRWYWx1ZSkgdGhpcy5jYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgLy8gUmVhZHMgdGhlIGN1cnJlbnQgZW5kIHZhbHVlIG9mIHRoZSBvYnNlcnZlZCBrZXlwYXRoLiBSZXR1cm5zIHVuZGVmaW5lZCBpZlxuICAvLyB0aGUgZnVsbCBrZXlwYXRoIGlzIHVucmVhY2hhYmxlLlxuICBPYnNlcnZlci5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoaXNPYmplY3QodGhpcy50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQodGhpcy5rZXksIHRoaXMudGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8vIFNldHMgdGhlIGN1cnJlbnQgZW5kIHZhbHVlIG9mIHRoZSBvYnNlcnZlZCBrZXlwYXRoLiBDYWxsaW5nIHNldFZhbHVlIHdoZW5cbiAgLy8gdGhlIGZ1bGwga2V5cGF0aCBpcyB1bnJlYWNoYWJsZSBpcyBhIG5vLW9wLlxuICBPYnNlcnZlci5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChpc09iamVjdCh0aGlzLnRhcmdldCkpIHtcbiAgICAgIHRoaXMuYWRhcHRlcih0aGlzLmtleSkuc2V0KHRoaXMudGFyZ2V0LCB0aGlzLmtleS5wYXRoLCB2YWx1ZSlcbiAgICB9XG4gIH1cblxuICAvLyBHZXRzIHRoZSBwcm92aWRlZCBrZXkgb24gYW4gb2JqZWN0LlxuICBPYnNlcnZlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5LCBvYmopIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyKGtleSkuZ2V0KG9iaiwga2V5LnBhdGgpXG4gIH1cblxuICAvLyBPYnNlcnZlcyBvciB1bm9ic2VydmVzIGEgY2FsbGJhY2sgb24gdGhlIG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQga2V5LlxuICBPYnNlcnZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oYWN0aXZlLCBrZXksIG9iaiwgY2FsbGJhY2spIHtcbiAgICB2YXIgYWN0aW9uID0gYWN0aXZlID8gJ29ic2VydmUnIDogJ3Vub2JzZXJ2ZSdcbiAgICB0aGlzLmFkYXB0ZXIoa2V5KVthY3Rpb25dKG9iaiwga2V5LnBhdGgsIGNhbGxiYWNrKVxuICB9XG5cbiAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdW5pcXVlIGFkYXB0ZXIgaW50ZXJmYWNlcyBhdmFpbGFibGUuXG4gIE9ic2VydmVyLnByb3RvdHlwZS5pbnRlcmZhY2VzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGludGVyZmFjZXMgPSBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMuYWRhcHRlcnMpXG5cbiAgICBPYmplY3Qua2V5cyhzaWdodGdsYXNzLmFkYXB0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIGlmICghfmludGVyZmFjZXMuaW5kZXhPZihpKSkge1xuICAgICAgICBpbnRlcmZhY2VzLnB1c2goaSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIGludGVyZmFjZXNcbiAgfVxuXG4gIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGdyYWIgdGhlIGFkYXB0ZXIgZm9yIGEgc3BlY2lmaWMga2V5LlxuICBPYnNlcnZlci5wcm90b3R5cGUuYWRhcHRlciA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYWRhcHRlcnNba2V5LmldIHx8XG4gICAgICBzaWdodGdsYXNzLmFkYXB0ZXJzW2tleS5pXVxuICB9XG5cbiAgLy8gVW5vYnNlcnZlcyB0aGUgZW50aXJlIGtleXBhdGguXG4gIE9ic2VydmVyLnByb3RvdHlwZS51bm9ic2VydmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JqXG5cbiAgICB0aGlzLnRva2Vucy5mb3JFYWNoKGZ1bmN0aW9uKHRva2VuLCBpbmRleCkge1xuICAgICAgaWYgKG9iaiA9IHRoaXMub2JqZWN0UGF0aFtpbmRleF0pIHtcbiAgICAgICAgdGhpcy5zZXQoZmFsc2UsIHRva2VuLCBvYmosIHRoaXMudXBkYXRlKVxuICAgICAgfVxuICAgIH0sIHRoaXMpXG5cbiAgICBpZiAoaXNPYmplY3QodGhpcy50YXJnZXQpKSB7XG4gICAgICB0aGlzLnNldChmYWxzZSwgdGhpcy5rZXksIHRoaXMudGFyZ2V0LCB0aGlzLmNhbGxiYWNrKVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gb2JqZWN0IHRoYW4gY2FuIGJlIG9ic2VydmVkLlxuICBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsXG4gIH1cblxuICAvLyBFcnJvciB0aHJvd2VyLlxuICBmdW5jdGlvbiBlcnJvcihtZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc2lnaHRnbGFzc10gJyArIG1lc3NhZ2UpXG4gIH1cblxuICAvLyBFeHBvcnQgbW9kdWxlIGZvciBOb2RlIGFuZCB0aGUgYnJvd3Nlci5cbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzaWdodGdsYXNzXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ2h0Z2xhc3MgPSBzaWdodGdsYXNzXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnNpZ2h0Z2xhc3MgPSBzaWdodGdsYXNzXG4gIH1cbn0pLmNhbGwodGhpcyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zaWdodGdsYXNzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9zaWdodGdsYXNzL2luZGV4LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/sightglass/index.js\n"); + +/***/ }), + +/***/ "./node_modules/webpack/buildin/module.js": +/***/ (function(module, exports) { + +eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xyXG5cdGlmKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XHJcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcclxuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xyXG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XHJcblx0XHRpZighbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/module.js\n"); + +/***/ }), + /***/ "./resources/js/bootstrap.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\r\n * Bootstrap any Javascript libraries required\r\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\r\n * Container for phpVMS specific functions\r\n */\nwindow.phpvms = {};\n\n/**\r\n * Configure Axios with both the csrf token and the API key\r\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\r\n 'X-CSRF-TOKEN': token.content\r\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQm9vdHN0cmFwIGFueSBKYXZhc2NyaXB0IGxpYnJhcmllcyByZXF1aXJlZFxyXG4gKi9cclxuXHJcbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XHJcblxyXG4vKipcclxuICogQ29udGFpbmVyIGZvciBwaHBWTVMgc3BlY2lmaWMgZnVuY3Rpb25zXHJcbiAqL1xyXG53aW5kb3cucGhwdm1zID0ge307XHJcblxyXG4vKipcclxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcclxuICovXHJcblxyXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcclxuaWYoYmFzZV91cmwpIHtcclxuICB3aW5kb3cuYXhpb3MuZGVmYXVsdC5iYXNlVVJMID0gYmFzZV91cmw7XHJcbn1cclxuXHJcbndpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JztcclxuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcclxuXHJcbmlmICh0b2tlbikge1xyXG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XHJcbiAgLyp3aW5kb3cuanF1ZXJ5LmFqYXhTZXR1cCh7XHJcbiAgICAnWC1DU1JGLVRPS0VOJzogdG9rZW4uY29udGVudFxyXG4gIH0pKi9cclxufSBlbHNlIHtcclxuICBjb25zb2xlLmVycm9yKCdDU1JGIHRva2VuIG5vdCBmb3VuZDogaHR0cHM6Ly9sYXJhdmVsLmNvbS9kb2NzL2NzcmYjY3NyZi14LWNzcmYtdG9rZW4nKVxyXG59XHJcblxyXG5jb25zdCBhcGlfa2V5ID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJhcGkta2V5XCJdJyk7XHJcbmlmIChhcGlfa2V5KSB7XHJcbiAgd2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWyd4LWFwaS1rZXknXSA9IGFwaV9rZXkuY29udGVudDtcclxuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGFwaV9rZXkuY29udGVudFxyXG59IGVsc2Uge1xyXG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gZmFsc2U7XHJcbiAgY29uc29sZS5lcnJvcignQVBJIEtleSBub3QgZm91bmQhJylcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); +eval("/**\n * Bootstrap any Javascript libraries required\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {};\n\n/**\n * Configure Axios with both the csrf token and the API key\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\n 'X-CSRF-TOKEN': token.content\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRDs7QUFFRCxtQkFBQWQsQ0FBUSwwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJvb3RzdHJhcCBhbnkgSmF2YXNjcmlwdCBsaWJyYXJpZXMgcmVxdWlyZWRcbiAqL1xuXG53aW5kb3cuYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuXG4vKipcbiAqIENvbnRhaW5lciBmb3IgcGhwVk1TIHNwZWNpZmljIGZ1bmN0aW9uc1xuICovXG53aW5kb3cucGhwdm1zID0ge307XG5cbi8qKlxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcbiAqL1xuXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmlmKGJhc2VfdXJsKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0LmJhc2VVUkwgPSBiYXNlX3VybDtcbn1cblxud2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnO1xuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcblxuaWYgKHRva2VuKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XG4gIC8qd2luZG93LmpxdWVyeS5hamF4U2V0dXAoe1xuICAgICdYLUNTUkYtVE9LRU4nOiB0b2tlbi5jb250ZW50XG4gIH0pKi9cbn0gZWxzZSB7XG4gIGNvbnNvbGUuZXJyb3IoJ0NTUkYgdG9rZW4gbm90IGZvdW5kOiBodHRwczovL2xhcmF2ZWwuY29tL2RvY3MvY3NyZiNjc3JmLXgtY3NyZi10b2tlbicpXG59XG5cbmNvbnN0IGFwaV9rZXkgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImFwaS1rZXlcIl0nKTtcbmlmIChhcGlfa2V5KSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsneC1hcGkta2V5J10gPSBhcGlfa2V5LmNvbnRlbnQ7XG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gYXBpX2tleS5jb250ZW50XG59IGVsc2Uge1xuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGZhbHNlO1xuICBjb25zb2xlLmVycm9yKCdBUEkgS2V5IG5vdCBmb3VuZCEnKVxufVxuXG5yZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); + +/***/ }), + +/***/ "./resources/js/common.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVMsbUJBQUFDLENBQVEsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ2xELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0gsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBU0QsS0FBVCxFQUFnQjtBQUN4QyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFPRSxRQUFRLElBQVIsR0FBZUcsSUFBZixHQUFzQixHQUE3QjtBQUNILENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCVyxFQUFsQixHQUF1QixVQUFDVCxLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCWSxFQUFsQixHQUF1QixVQUFDVixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKlxuICovXG5cbmNvbnN0IHJpdmV0cyA9IHJlcXVpcmUoJ3JpdmV0cycpO1xuXG4vKipcbiAqIEdlbmVyaWMgZm9ybWF0dGVyIHRvIHByZXBlbmRcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHByZXBlbmRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5wcmVwZW5kID0gZnVuY3Rpb24gKHZhbHVlLCBwcmVwZW5kKSB7XG4gICAgcmV0dXJuIHByZXBlbmQgKyB2YWx1ZVxufTtcblxuLyoqXG4gKiBGb3JtYXQgbWludXRlcyBpbnRvIEhIaCBNTW1cbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjApO1xuICAgIGNvbnN0IG1pbnMgPSB2YWx1ZSAlIDYwO1xuICAgIHJldHVybiBob3VycyArICdoICcgKyBtaW5zICsgJ20nO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMuZ3QgPSAodmFsdWUsIGxlbikgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBsZW47XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5sdCA9ICh2YWx1ZSwgbGVuKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8IGxlbjtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmVxID0gKHZhbHVlLCBsZW4pID0+IHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9jb21tb24uanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); /***/ }), /***/ "./resources/js/installer/app.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\r\n * Admin stuff needed\r\n */\n\n__webpack_require__(\"./resources/js/bootstrap.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvaW5zdGFsbGVyL2FwcC5qcz8wNTdjIl0sIm5hbWVzIjpbInJlcXVpcmUiXSwibWFwcGluZ3MiOiJBQUFBOzs7O0FBSUEsbUJBQUFBLENBQVEsNkJBQVIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvaW5zdGFsbGVyL2FwcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBZG1pbiBzdHVmZiBuZWVkZWRcclxuICovXHJcblxyXG5yZXF1aXJlKCcuLy4uL2Jvb3RzdHJhcCcpO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvaW5zdGFsbGVyL2FwcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/installer/app.js\n"); +eval("/**\n * Admin stuff needed\n */\n\n__webpack_require__(\"./resources/js/bootstrap.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvaW5zdGFsbGVyL2FwcC5qcz8wNTdjIl0sIm5hbWVzIjpbInJlcXVpcmUiXSwibWFwcGluZ3MiOiJBQUFBOzs7O0FBSUEsbUJBQUFBLENBQVEsNkJBQVIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvaW5zdGFsbGVyL2FwcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWRtaW4gc3R1ZmYgbmVlZGVkXG4gKi9cblxucmVxdWlyZSgnLi8uLi9ib290c3RyYXAnKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9pbnN0YWxsZXIvYXBwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/installer/app.js\n"); /***/ }), diff --git a/public/mix-manifest.json b/public/mix-manifest.json index c12d2cb9..94ba864f 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,20 +1,20 @@ { - "/assets/frontend/js/app.js": "/assets/frontend/js/app.js?id=8f1a1bff7c8d0e2888db", - "/assets/frontend/css/now-ui-kit.css": "/assets/frontend/css/now-ui-kit.css?id=70c0f73b28bc686d7791", - "/assets/admin/css/vendor.min.css": "/assets/admin/css/vendor.min.css?id=42f138d32d03b309dec7", - "/assets/admin/js/app.js": "/assets/admin/js/app.js?id=e4a5d8869d23f708dd10", - "/assets/installer/js/app.js": "/assets/installer/js/app.js?id=27b9f2ce0b268e658f01", + "/assets/frontend/js/app.js": "/assets/frontend/js/app.js?id=a9c6b70866d562211ec7", + "/assets/frontend/css/now-ui-kit.css": "/assets/frontend/css/now-ui-kit.css?id=b0a0f05b94a4486db4f2", + "/assets/admin/css/vendor.min.css": "/assets/admin/css/vendor.min.css?id=cc80aec3cf1646f83d8d", + "/assets/admin/js/app.js": "/assets/admin/js/app.js?id=daa4de1b316b95d218ba", + "/assets/installer/js/app.js": "/assets/installer/js/app.js?id=3a51850509367b06cd1f", "/assets/fonts/glyphicons-halflings-regular.woff2": "/assets/fonts/glyphicons-halflings-regular.woff2?id=b5b5055c6d812c0f9f0d", "/assets/admin/fonts/glyphicons-halflings-regular.woff2": "/assets/admin/fonts/glyphicons-halflings-regular.woff2?id=b5b5055c6d812c0f9f0d", "/assets/admin/img/clear.png": "/assets/admin/img/clear.png?id=0e92f4c3efc6988a3c96", "/assets/admin/img/loading.gif": "/assets/admin/img/loading.gif?id=90a4b76b4f11558691f6", "/assets/global/js/jquery.js": "/assets/global/js/jquery.js?id=6a07da9fae934baf3f74", - "/assets/admin/css/vendor.css": "/assets/admin/css/vendor.css?id=f139af0f666d5cefde4d", + "/assets/admin/css/vendor.css": "/assets/admin/css/vendor.css?id=99aedbd62dfa118e7b73", "/assets/admin/js/vendor.js": "/assets/admin/js/vendor.js?id=5130233c88c71fc60135", "/assets/admin/css/blue.png": "/assets/admin/css/blue.png?id=753a3c0dec86d3a38d9c", "/assets/admin/css/blue@2x.png": "/assets/admin/css/blue@2x.png?id=97da23d47b838cbd4bef", "/assets/global/js/vendor.js": "/assets/global/js/vendor.js?id=6436d215691e8f38eb12", "/assets/global/css/vendor.css": "/assets/global/css/vendor.css?id=115d5c4f2370ae94a962", - "/assets/installer/css/vendor.css": "/assets/installer/css/vendor.css?id=344796a10af1741dc754", + "/assets/installer/css/vendor.css": "/assets/installer/css/vendor.css?id=cd76d2d9611b9a13d644", "/assets/installer/js/vendor.js": "/assets/installer/js/vendor.js?id=01249af00bd2c1267e15" } \ No newline at end of file diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index b2081fad..65b71f57 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -38,3 +38,5 @@ if (api_key) { window.PHPVMS_USER_API_KEY = false; console.error('API Key not found!') } + +require('./common'); diff --git a/resources/js/common.js b/resources/js/common.js index 139597f9..754eda28 100644 --- a/resources/js/common.js +++ b/resources/js/common.js @@ -1,2 +1,56 @@ +/** + * + */ +const rivets = require('rivets'); +/** + * Generic formatter to prepend + * @param value + * @param prepend + * @returns {*} + */ +rivets.formatters.prepend = function (value, prepend) { + return prepend + value +}; + +/** + * Format minutes into HHh MMm + * @param value + * @returns {string} + */ +rivets.formatters.time_hm = function(value) { + const hours = Math.floor(value / 60); + const mins = value % 60; + return hours + 'h ' + mins + 'm'; +}; + +/** + * + * @param value + * @param len + * @returns {boolean} + */ +rivets.formatters.gt = (value, len) => { + return value.length > len; +}; + +/** + * + * @param value + * @param len + * @returns {boolean} + */ +rivets.formatters.lt = (value, len) => { + return value.length < len; +}; + +/** + * + * @param value + * @param len + * @returns {boolean} + */ +rivets.formatters.eq = (value, len) => { + return value.length > len; +}; diff --git a/resources/js/maps/live_map.js b/resources/js/maps/live_map.js index 12b8ea50..839bbe5f 100644 --- a/resources/js/maps/live_map.js +++ b/resources/js/maps/live_map.js @@ -1,4 +1,5 @@ const leaflet = require('leaflet'); +const rivets = require('rivets'); import draw_base_map from './base_map' import {ACTUAL_ROUTE_COLOR} from './config' @@ -33,6 +34,9 @@ export default (opts) => { let layerSelFlightFeature = null; let layerSelFlightLayer = null; + const r_map_view = rivets.bind($('#map-info-box'), {pirep: {}}); + const r_table_view = rivets.bind($('#live_flights'), {pireps: []}); + /** * When a flight is clicked on, show the path, etc for that flight * @param feature @@ -41,7 +45,6 @@ export default (opts) => { const onFlightClick = (feature, layer) => { const pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id); - const link_uri = opts.pirep_link_uri.replace('{id}', feature.properties.pirep_id); const geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + "/acars/geojson"; const pirep_info = $.ajax({ @@ -83,49 +86,9 @@ export default (opts) => { // // When the PIREP info is done loading, show the bottom bar // - $.when(pirep_info).done(pirep => { pirep = pirep.data; - - let dist, planned_dist; - if(opts.units === 'nmi') { - dist = pirep.distance.nmi; - planned_dist = pirep.planned_distance.nmi; - } else if(opts.units === 'mi') { - dist = pirep.distance.mi; - planned_dist = pirep.planned_distance.mi; - } else if(opts.units === 'km') { - dist = pirep.distance.km; - planned_dist = pirep.planned_distance.km; - } - - // Parse flight time - const hours = Math.floor(pirep.flight_time / 60); - const mins = pirep.flight_time % 60; - - $('#map_flight_id').html( - '' + - pirep.airline.icao + pirep.flight_number + - '' - ); - - $('#map_flight_info').text( - pirep.dpt_airport.name + ' (' + pirep.dpt_airport.icao + ') to ' + - pirep.arr_airport.name + ' (' + pirep.arr_airport.icao + ')' - ); - - $('#map_flight_stats_middle').html( - 'Status: ' + pirep.status_text + '
' + - 'Flight Time: ' + hours + 'h ' + mins + 'm
' + - 'Distance: ' + dist + ' / ' + planned_dist + opts.units + '
' - ); - - // Show flight stat info - $('#map_flight_stats_right').html( - 'Ground Speed: ' + pirep.position.gs + '
' + - 'Altitude: ' + pirep.position.altitude + '
' + - 'Heading: ' + pirep.position.heading + '' - ); - - $('#map-info-bar').show(); + $.when(pirep_info).done(pirep => { + r_map_view.update({pirep:pirep.data}); + $('#map-info-box').show(); }); }; @@ -136,6 +99,12 @@ export default (opts) => { /** * AJAX UPDATE */ + const pirep_uri = opts.pirep_uri.replace('{id}', ''); + let pireps = $.ajax({ + url: pirep_uri, + dataType: 'json', + error: console.log + }); let flights = $.ajax({ url: opts.update_uri, @@ -143,7 +112,7 @@ export default (opts) => { error: console.log }); - $.when(flights).done(function (flightGeoJson) { + $.when(flights).done(flightGeoJson => { if (layerFlights !== null) { layerFlights.clearLayers() @@ -178,7 +147,14 @@ export default (opts) => { if (layerSelFlight !== null) { onFlightClick(layerSelFlightFeature, layerSelFlightLayer) } - }) + }); + + $.when(pireps).done(pireps => { + r_table_view.update({ + pireps: pireps.data, + has_data: (pireps.data.length > 0), + }); + }); }; updateMap(); diff --git a/resources/views/layouts/default/app.blade.php b/resources/views/layouts/default/app.blade.php index 31b660fe..350e5672 100644 --- a/resources/views/layouts/default/app.blade.php +++ b/resources/views/layouts/default/app.blade.php @@ -79,6 +79,8 @@ {{-- Start of the required tags block. Don't remove these or things will break!! --}} +{{-- +--}} @yield('scripts') {{-- End the required tags block --}} diff --git a/resources/views/layouts/default/flights/table.blade.php b/resources/views/layouts/default/flights/table.blade.php index 2020203d..881701ab 100644 --- a/resources/views/layouts/default/flights/table.blade.php +++ b/resources/views/layouts/default/flights/table.blade.php @@ -18,8 +18,8 @@ If you change it, remember to change it in the in-array line as well --}}