concerto_frontend_vue 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ccdf1620c1fb183f74d395344eb81a85a2cbdfc8
4
- data.tar.gz: f49f83f1e972ebe2a0ee2284334ff6abb41e6d0d
3
+ metadata.gz: 20d305f904be47a4fa0df58fe9555a9900c2a768
4
+ data.tar.gz: '080681cd6d144d3f555c71e6a032fc3b5ae2c25b'
5
5
  SHA512:
6
- metadata.gz: c869141040f79f6436d10547a30ecdcbd44afdb922aac2b57c5d40bc8eb807bbbde24cf775e84d9a4784b05f86c2d36432884607597de142c4d089566119283e
7
- data.tar.gz: b18e0fde10475bc35e0a9f8b69e9ba3f63716f76c571a16420bcc221e1e9f80b57dd57384db13fec947609c3b1a744b5e8ce2ba3f82b3bb01ea358740a31774b
6
+ metadata.gz: 9cfc71274234dde1d097be7072f74f4f94070ce6382c6e0268ce754f8db3d09301a4c491c0dd657a3245307a54a5d8b613118f0d7ced5c09bc444589b067ceef
7
+ data.tar.gz: 4179a18798b84d79be7aca98570cbac3814be4993f113a1081fa4e0150a1af43145ff4319d0244309183de875170e483634f68f658279823d99b818c3313d81d
@@ -63,7 +63,7 @@
63
63
  /******/
64
64
  /******/ var hotApplyOnUpdate = true;
65
65
  /******/ // eslint-disable-next-line no-unused-vars
66
- /******/ var hotCurrentHash = "1d6b15a47bc75a00026a";
66
+ /******/ var hotCurrentHash = "6eab254e41448167f364";
67
67
  /******/ var hotRequestTimeout = 10000;
68
68
  /******/ var hotCurrentModuleData = {};
69
69
  /******/ var hotCurrentChildModule;
@@ -1150,7 +1150,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n/* harmony de
1150
1150
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
1151
1151
 
1152
1152
  "use strict";
1153
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.function.name */ \"./node_modules/core-js/modules/es6.function.name.js\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es6.number.constructor */ \"./node_modules/core-js/modules/es6.number.constructor.js\");\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n/* harmony import */ var _ConcertoClientTime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ConcertoClientTime */ \"./src/components/ConcertoClientTime.vue\");\n/* harmony import */ var _ConcertoEmpty__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ConcertoEmpty */ \"./src/components/ConcertoEmpty.vue\");\n/* harmony import */ var _ConcertoGraphic__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ConcertoGraphic */ \"./src/components/ConcertoGraphic.vue\");\n/* harmony import */ var _ConcertoHtmlText__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ConcertoHtmlText */ \"./src/components/ConcertoHtmlText.vue\");\n/* harmony import */ var _ConcertoIframe__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ConcertoIframe */ \"./src/components/ConcertoIframe.vue\");\n/* harmony import */ var _ConcertoRemoteVideo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ConcertoRemoteVideo */ \"./src/components/ConcertoRemoteVideo.vue\");\n/* harmony import */ var _ConcertoTicker__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ConcertoTicker */ \"./src/components/ConcertoTicker.vue\");\n\n\n\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* eslint no-console: 0 */\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'ConcertoField',\n props: {\n baseUrl: String,\n debug: Boolean,\n field: Object,\n frontendKey: String,\n locale: String,\n screenId: Number,\n timezone: String\n },\n data: function data() {\n return {\n contentQueue: [],\n contentErrorCount: 0,\n contentType: null,\n currentContent: null,\n debouncedScheduleNextContent: null,\n lastUpdated: 0,\n status: ''\n };\n },\n components: {\n // the \"canned\" content\n ConcertoClientTime: _ConcertoClientTime__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n ConcertoEmpty: _ConcertoEmpty__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n ConcertoGraphic: _ConcertoGraphic__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n ConcertoHtmlText: _ConcertoHtmlText__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n ConcertoIframe: _ConcertoIframe__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n ConcertoRemoteVideo: _ConcertoRemoteVideo__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n ConcertoTicker: _ConcertoTicker__WEBPACK_IMPORTED_MODULE_12__[\"default\"]\n },\n computed: {\n debugFieldTitle: function debugFieldTitle() {\n var _this = this;\n\n var info = [];\n\n if (this.field) {\n if (this.field.style) {\n info.push('style: ' + this.field.style);\n }\n\n Object.keys(this.field.config).forEach(function (key) {\n return info.push(key + ': ' + _this.field.config[key]);\n });\n }\n\n return info.join(' \\n ');\n },\n clearContentWhenEmpty: function clearContentWhenEmpty() {\n // find out if this field should clear the last content when it is empty (default to true)\n var clearContent = this.field.config['screens_clear_last_content'];\n\n if (clearContent == null || typeof clearContent == 'undefined') {\n clearContent = true;\n }\n\n return clearContent;\n },\n duration: function duration() {\n if (this.currentContent && this.currentContent.length !== 0) {\n return this.currentContent[0].duration;\n }\n\n return '';\n },\n emptyContent: function emptyContent() {\n return {\n duration: 10,\n id: Date.now(),\n name: 'Empty Content - Waiting',\n type: 'Empty',\n render_details: {}\n };\n },\n inInfo: function inInfo() {\n var info = '';\n if (this.field && this.field.config && this.field.config.entry_transition) info = this.field.config.entry_transition + ' - ';\n return info;\n },\n outInfo: function outInfo() {\n var info = '';\n if (this.field && this.field.config && this.field.config.exit_transition) info = ' - ' + this.field.config.exit_transition;\n return info;\n },\n suppressRepeatingContent: function suppressRepeatingContent() {\n // find out if we should display repeat content (default to false)\n var repeatContent = this.field.config['repeat_content'] && this.field.config['repeat_content'] === 'Reload';\n return !repeatContent;\n },\n transitionIn: function transitionIn() {\n // default to fade in\n var transition = 'animated fadeIn'; // map old settings to new settings\n\n if (this.field.config && this.field.config.entry_transition) {\n switch (this.field.config.entry_transition) {\n case 'fade-in-animation':\n transition = 'animated fadeIn';\n break;\n\n case 'scale-up-animation':\n transition = 'animated zoomIn';\n break;\n\n case 'slide-left-animation':\n case 'slide-from-right-animation':\n transition = 'animated slideInRight';\n break;\n\n case 'slide-right-animation':\n case 'slide-from-left-animation':\n transition = 'animated slideInLeft';\n break;\n\n case 'slide-down-animation':\n transition = 'animated slideInDown';\n break;\n\n case 'slide-up-animation':\n transition = 'animated slideInUp';\n break;\n\n default:\n transition = this.field.config.entry_transition;\n break;\n }\n }\n\n return transition;\n },\n transitionOut: function transitionOut() {\n // default to fade out\n var transition = 'animated fadeOut'; // map old settings to new settings\n\n if (this.field.config && this.field.config.exit_transition) {\n switch (this.field.config.exit_transition) {\n case 'fade-out-animation':\n transition = 'animated fadeOut';\n break;\n\n case 'scale-down-animation':\n transition = 'animated zoomOut';\n break;\n\n case 'slide-left-animation':\n case 'slide-from-right-animation':\n transition = 'animated slideOutLeft';\n break;\n\n case 'slide-right-animation':\n case 'slide-from-left-animation':\n transition = 'animated slideOutRight';\n break;\n\n case 'slide-up-animation':\n transition = 'animated slideOutUp';\n break;\n\n case 'slide-down-animation':\n transition = 'animated slideOutDown';\n break;\n\n default:\n transition = this.field.config.exit_transition;\n break;\n }\n }\n\n return transition;\n }\n },\n mounted: function mounted() {\n this.fetchContent(); //this.loadNextContent()\n },\n methods: {\n concertoTicked: function concertoTicked() {\n if (this.debug) {\n this.decrementDuration();\n }\n },\n decrementDuration: function decrementDuration() {\n if (this.currentContent && this.currentContent.length > 0 && this.currentContent[0].duration > 0) {\n this.currentContent[0].duration--;\n }\n },\n // allows user to click through content\n forceNextContent: function forceNextContent() {\n if (this.debouncedScheduleNextContent) {\n this.debouncedScheduleNextContent.flush();\n } else {\n this.scheduleNextContent(1);\n }\n },\n // check for frontend key mismatch (which simply means the server wants us to reload the screen)\n // but we will delegate that to the screen component\n isSameFrontendKey: function isSameFrontendKey(key) {\n if (this.frontendKey && key && key !== this.frontendKey) {\n console.debug('different frontend-key detected');\n this.$emit('frontend-key-changed');\n return false;\n }\n\n return true;\n },\n fetchContent: function fetchContent() {\n var _this2 = this;\n\n // console.debug(Date(), this.field.id, this.field.name, 'fetching content')\n this.status = 'fetching content';\n var url = _utils__WEBPACK_IMPORTED_MODULE_5__[\"default\"].prefixWithBase(\"/frontend/\" + this.screenId + \"/fields/\" + this.field.id + \"/contents.json\", this.baseUrl);\n return axios__WEBPACK_IMPORTED_MODULE_4___default.a.get(url).then(function (response) {\n var data = response.data;\n var key = response.headers['x-concerto-frontend-setup-key']; // only process the contents if the frontend key is the same otherwise the screen is going to reload the page anyway so dont bother\n\n if (_this2.isSameFrontendKey(key)) {\n // since there really is no data for the Time field, mock up an entry\n if (_this2.field.name === \"Time\") {\n _this2.status = _this2.timezone || 'No timezone specified';\n _this2.status += ', ' + (_this2.locale || 'No locale specified');\n data = [{\n 'duration': 15,\n 'id': Date.now(),\n // must be differing so each item is treated as new content\n 'name': 'System Time',\n 'type': 'ClientTime',\n 'render_details': {\n 'timezone': _this2.timezone,\n 'locale': _this2.locale\n }\n }];\n }\n\n if (data === null || data.length === 0) {\n _this2.status = 'no content returned, trying again in 10 seconds';\n data = [_this2.emptyContent];\n }\n } // console.debug(this.field.id, this.field.name, 'data', data)\n // add it to the queue\n\n\n Array.prototype.push.apply(_this2.contentQueue, data); // dont wait to show it if we are currently not showing anything\n\n if ((!_this2.currentContent || _this2.currentContent.type == 'Empty') && _this2.contentQueue.length >= 1) {\n _this2.scheduleNextContent(1);\n }\n\n return data;\n }).catch(function (error) {\n _this2.status = \"An error has occurred \" + error.message;\n var data = [{\n 'duration': 10,\n 'id': Date.now(),\n // must be differing so each item is treated as new content\n 'name': 'Error',\n 'type': 'HtmlText',\n 'render_details': {\n data: 'An error has occurred - ' + error.message\n }\n }]; // an error ocurred, so tell the screen to reload -- it has a nicer error msg\n\n _this2.$emit('frontend-key-changed');\n\n return data;\n });\n },\n\n /**\n * Schedule an attempt to load the next piece of content for this field.\n *\n * @function scheduleNextContent\n * @param {Number} msToWait Number of milliseconds to wait.\n */\n scheduleNextContent: function scheduleNextContent(msToWait) {\n var _this3 = this;\n\n if (this.debouncedScheduleNextContent) {\n console.debug(this.field.id, this.field.name, 'ignoring schedule next content request since already pending');\n return;\n } // keep track of our debounced function so we can flush it later if needed, but if we've been called already\n // then clear our track so we dont try and flush it later.\n\n\n this.debouncedScheduleNextContent = _utils__WEBPACK_IMPORTED_MODULE_5__[\"default\"].debounce(function () {\n _this3.debouncedScheduleNextContent = null;\n\n _this3.loadNextContent();\n }, msToWait);\n this.debouncedScheduleNextContent();\n },\n\n /**\n * Load a piece of content based on the content data.\n *\n * @function loadContent\n * @param {Object} contentData\n * @returns {Boolean} Return true if the content started loading OK.\n */\n loadContent: function loadContent(contentData) {\n if (!contentData) {\n this.status = 'Missing contentData';\n console.error(this.field.id, this.field.name, 'invalid contentData');\n return false;\n }\n\n var simpleContentData = {\n title: contentData.name,\n contentId: contentData.id,\n duration: contentData.duration,\n config: this.field.config,\n baseUrl: this.baseUrl,\n type: contentData.type,\n fieldHeight: this.$el.offsetHeight,\n fieldWidth: this.$el.offsetWidth\n }; // Flatten render_details\n\n Object.keys(contentData.render_details).forEach(function (key) {\n simpleContentData[key] = contentData.render_details[key];\n });\n this.contentType = 'Concerto' + contentData.type;\n this.currentContent = [simpleContentData]; // console.debug('scheduling next content load for ', simpleContentData.duration * 1000)\n\n this.scheduleNextContent(simpleContentData.duration * 1000);\n return true;\n },\n loadNextContent: function loadNextContent() {\n var newContent = this.contentQueue.shift(); // If we got nothing from the queue or it is empty then fetch more, but continue on (since we might\n // have grabbed the last item from the queue and still need to show it).\n\n if (!newContent || this.contentQueue.length < 1) {\n // console.debug(this.field.id, this.field.name, 'queue is empty now so fetching more')\n this.fetchContent();\n }\n\n if (!newContent) {\n // This happens when we empty the queue and the fetchContent routine hasn't completed yet.\n // There was no content in the queue, try again in a few seconds.\n this.scheduleNextContent(10 * 1000);\n return false;\n } // If we have a current item and the new item is the same, then if we are supposed to suppress it, skip the new item.\n // This does not apply to RemoteVideo content since that should restart the video.\n\n\n if (this.currentContent && this.currentContent.length > 0 && this.currentContent[0].contentId === newContent.id && this.suppressRepeatingContent && newContent['type'] !== 'RemoteVideo') {\n this.status = 'skipping same piece of content: ' + newContent.id + ' - ' + newContent.name; // console.debug(Date(), this.field.id, this.field.name, this.status, this.contentQueue.length)\n // if there is more stuff in the queue, then go right to the next item, otherwise, we dont want to thrash if we only have one item on the feed,\n // peek in the queue and see if it is filled with the same\n\n var delay = 1;\n\n if (this.contentQueue.length == 0 || this.contentQueue.length == 1 && this.contentQueue[0].id === newContent.id) {\n // console.debug('showing repeat content anyway since it appears to be the only item')\n this.currentContent[0].duration = newContent.duration;\n delay = newContent.duration * 1000;\n }\n\n this.scheduleNextContent(delay);\n return true;\n } // If we have a current item, but the new item is empty AND the field is supposed to leave the last item shown, then skip the new item\n // and check for a new item in 10 seconds-- not the items duration again since we are already beyond that.\n\n\n if (this.currentContent && this.currentContent.length > 0 && newContent.type === 'Empty' && !this.clearContentWhenEmpty) {\n this.status = 'leaving last piece of content, trying again in 10 seconds';\n console.debug(this.field.id, this.field.name, this.status);\n this.scheduleNextContent(10 * 1000);\n return true;\n }\n\n if (!this.loadContent(newContent)) {\n // The content failed to load.\n console.log(this.field.id, this.field.name, 'Unable to load ' + newContent.type + ' content');\n this.contentErrorCount++; // Allow the field to retry 5 times quickly.\n\n if (this.contentErrorCount <= 5) {\n // Move on to the next content -- instead of calling recursively, use the scheduler\n // this.loadNextContent();\n if (this.debouncedScheduleNextContent !== null) {\n // if there is a pending call then do it now\n this.debouncedScheduleNextContent.flush();\n } else {\n this.scheduleNextContent(10 * 1000);\n this.status = 'Retrying ' + this.contentErrorCount + ' in 10 seconds.';\n console.debug(this.field.id, this.field.name, this.status);\n }\n } else {\n // try again in half minute increments up to ten minutes since we are having problems fetching data\n var retryDuration = Math.min((this.contentErrorCount - 1) * 30, 1200);\n this.status = 'Retrying ' + this.contentErrorCount + ' in ' + retryDuration + ' seconds.';\n console.debug(this.field.id, this.field.name, this.status);\n this.scheduleNextContent(retryDuration * 1000);\n }\n\n return false;\n } else {\n // The content loaded sucessfully.\n this.contentErrorCount = 0;\n this.lastUpdated = Date.now();\n this.status = 'Content ' + this.currentContent[0].contentId + ' - ' + this.currentContent[0].title;\n return true;\n }\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPyEuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4vbm9kZV9tb2R1bGVzL2NhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvaW5kZXguanM/IS4vc3JjL2NvbXBvbmVudHMvQ29uY2VydG9GaWVsZC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL0NvbmNlcnRvRmllbGQudnVlP2I0NjUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiY29uY2VydG8tZmllbGRcIlxuICAgIDpmaWVsZC1pZD1cImZpZWxkLmlkXCJcbiAgICA6ZmllbGQtbmFtZT1cImZpZWxkLm5hbWVcIlxuICAgIEBjbGljaz1cImZvcmNlTmV4dENvbnRlbnRcIlxuICAgIEBjb25jZXJ0b3RpY2s9XCJjb25jZXJ0b1RpY2tlZFwiXG4gID5cbiAgICA8ZGl2IHYtaWY9XCJkZWJ1Z1wiIGNsYXNzPVwiZGVidWctZmllbGRcIiA6dGl0bGU9XCJkZWJ1Z0ZpZWxkVGl0bGVcIj5GaWVsZCB7e2ZpZWxkLmlkIH19IC0ge3tmaWVsZC5uYW1lfX08L2Rpdj5cbiAgICAgIDx0cmFuc2l0aW9uIG5hbWU9XCJjdXN0b20tY2xhc3Nlcy10cmFuc2l0aW9uXCIgOmVudGVyLWFjdGl2ZS1jbGFzcz1cInRyYW5zaXRpb25JblwiIDpsZWF2ZS1hY3RpdmUtY2xhc3M9XCJ0cmFuc2l0aW9uT3V0XCI+XG4gICAgICAgIDxjb21wb25lbnQgdi1mb3I9XCJjb250ZW50IGluIGN1cnJlbnRDb250ZW50XCIgOmtleT1cImNvbnRlbnQuY29udGVudElkXCIgdi1iaW5kOmlzPVwiY29udGVudFR5cGVcIiA6Y29udGVudD1cImNvbnRlbnRcIiA6c3R5bGU9XCJmaWVsZC5zdHlsZVwiID48L2NvbXBvbmVudD5cbiAgICAgIDwvdHJhbnNpdGlvbj5cbiAgICA8ZGl2IHYtaWY9XCJkZWJ1Z1wiIGNsYXNzPVwiZGVidWctZmllbGQtc3RhdHVzXCI+e3tzdGF0dXN9fTwvZGl2PlxuICAgIDxkaXYgdi1pZj1cImRlYnVnXCIgY2xhc3M9XCJkZWJ1Zy1maWVsZC1kdXJhdGlvblwiPnt7IGluSW5mbyB9fXt7ZHVyYXRpb259fXt7IG91dEluZm8gfX08L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuICAvKiBlc2xpbnQgbm8tY29uc29sZTogMCAqL1xuXG4gIGltcG9ydCBheGlvcyBmcm9tICdheGlvcydcbiAgaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzJ1xuXG4gIGltcG9ydCBDb25jZXJ0b0NsaWVudFRpbWUgZnJvbSBcIi4vQ29uY2VydG9DbGllbnRUaW1lXCJcbiAgaW1wb3J0IENvbmNlcnRvRW1wdHkgZnJvbSBcIi4vQ29uY2VydG9FbXB0eVwiXG4gIGltcG9ydCBDb25jZXJ0b0dyYXBoaWMgZnJvbSBcIi4vQ29uY2VydG9HcmFwaGljXCJcbiAgaW1wb3J0IENvbmNlcnRvSHRtbFRleHQgZnJvbSBcIi4vQ29uY2VydG9IdG1sVGV4dFwiXG4gIGltcG9ydCBDb25jZXJ0b0lmcmFtZSBmcm9tIFwiLi9Db25jZXJ0b0lmcmFtZVwiXG4gIGltcG9ydCBDb25jZXJ0b1JlbW90ZVZpZGVvIGZyb20gXCIuL0NvbmNlcnRvUmVtb3RlVmlkZW9cIlxuICBpbXBvcnQgQ29uY2VydG9UaWNrZXIgZnJvbSBcIi4vQ29uY2VydG9UaWNrZXJcIlxuXG4gIGV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnQ29uY2VydG9GaWVsZCcsXG4gICAgcHJvcHM6IHtcbiAgICAgIGJhc2VVcmw6IFN0cmluZyxcbiAgICAgIGRlYnVnOiBCb29sZWFuLFxuICAgICAgZmllbGQ6IE9iamVjdCxcbiAgICAgIGZyb250ZW5kS2V5OiBTdHJpbmcsXG4gICAgICBsb2NhbGU6IFN0cmluZyxcbiAgICAgIHNjcmVlbklkOiBOdW1iZXIsXG4gICAgICB0aW1lem9uZTogU3RyaW5nXG4gICAgfSxcbiAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnRRdWV1ZTogW10sXG4gICAgICAgIGNvbnRlbnRFcnJvckNvdW50OiAwLFxuICAgICAgICBjb250ZW50VHlwZTogbnVsbCxcbiAgICAgICAgY3VycmVudENvbnRlbnQ6IG51bGwsXG4gICAgICAgIGRlYm91bmNlZFNjaGVkdWxlTmV4dENvbnRlbnQ6IG51bGwsXG4gICAgICAgIGxhc3RVcGRhdGVkOiAwLFxuICAgICAgICBzdGF0dXM6ICcnXG4gICAgICB9XG4gICAgfSxcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICAvLyB0aGUgXCJjYW5uZWRcIiBjb250ZW50XG4gICAgICBDb25jZXJ0b0NsaWVudFRpbWUsXG4gICAgICBDb25jZXJ0b0VtcHR5LFxuICAgICAgQ29uY2VydG9HcmFwaGljLFxuICAgICAgQ29uY2VydG9IdG1sVGV4dCxcbiAgICAgIENvbmNlcnRvSWZyYW1lLFxuICAgICAgQ29uY2VydG9SZW1vdGVWaWRlbyxcbiAgICAgIENvbmNlcnRvVGlja2VyLFxuICAgIH0sXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGRlYnVnRmllbGRUaXRsZSgpIHtcbiAgICAgICAgbGV0IGluZm8gPSBbXVxuICAgICAgICBpZiAodGhpcy5maWVsZCkge1xuICAgICAgICAgIGlmICh0aGlzLmZpZWxkLnN0eWxlKSB7XG4gICAgICAgICAgICBpbmZvLnB1c2goJ3N0eWxlOiAnICsgdGhpcy5maWVsZC5zdHlsZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWVsZC5jb25maWcpLmZvckVhY2goa2V5ID0+IGluZm8ucHVzaChrZXkgKyAnOiAnICsgdGhpcy5maWVsZC5jb25maWdba2V5XSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZm8uam9pbignIFxcbiAnKTtcbiAgICAgIH0sXG4gICAgICBjbGVhckNvbnRlbnRXaGVuRW1wdHkoKSB7XG4gICAgICAgIC8vIGZpbmQgb3V0IGlmIHRoaXMgZmllbGQgc2hvdWxkIGNsZWFyIHRoZSBsYXN0IGNvbnRlbnQgd2hlbiBpdCBpcyBlbXB0eSAoZGVmYXVsdCB0byB0cnVlKVxuICAgICAgICBsZXQgY2xlYXJDb250ZW50ID0gdGhpcy5maWVsZC5jb25maWdbJ3NjcmVlbnNfY2xlYXJfbGFzdF9jb250ZW50J11cbiAgICAgICAgaWYgKGNsZWFyQ29udGVudCA9PSBudWxsIHx8IHR5cGVvZiBjbGVhckNvbnRlbnQgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBjbGVhckNvbnRlbnQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsZWFyQ29udGVudFxuICAgICAgfSxcbiAgICAgIGR1cmF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENvbnRlbnQgJiYgdGhpcy5jdXJyZW50Q29udGVudC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q29udGVudFswXS5kdXJhdGlvblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJ1xuICAgICAgfSxcbiAgICAgIGVtcHR5Q29udGVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZHVyYXRpb246IDEwLFxuICAgICAgICAgIGlkOiBEYXRlLm5vdygpLFxuICAgICAgICAgIG5hbWU6ICdFbXB0eSBDb250ZW50IC0gV2FpdGluZycsXG4gICAgICAgICAgdHlwZTogJ0VtcHR5JyxcbiAgICAgICAgICByZW5kZXJfZGV0YWlsczoge31cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGluSW5mbygpIHtcbiAgICAgICAgbGV0IGluZm8gPSAnJ1xuICAgICAgICBpZiAodGhpcy5maWVsZCAmJiB0aGlzLmZpZWxkLmNvbmZpZyAmJiB0aGlzLmZpZWxkLmNvbmZpZy5lbnRyeV90cmFuc2l0aW9uKVxuICAgICAgICAgIGluZm8gPSB0aGlzLmZpZWxkLmNvbmZpZy5lbnRyeV90cmFuc2l0aW9uICsgJyAtICdcbiAgICAgICAgcmV0dXJuIGluZm9cbiAgICAgIH0sXG4gICAgICBvdXRJbmZvKCkge1xuICAgICAgICBsZXQgaW5mbyA9ICcnXG4gICAgICAgIGlmICh0aGlzLmZpZWxkICYmIHRoaXMuZmllbGQuY29uZmlnICYmIHRoaXMuZmllbGQuY29uZmlnLmV4aXRfdHJhbnNpdGlvbilcbiAgICAgICAgICBpbmZvID0gJyAtICcgKyB0aGlzLmZpZWxkLmNvbmZpZy5leGl0X3RyYW5zaXRpb25cbiAgICAgICAgcmV0dXJuIGluZm9cbiAgICAgIH0sXG4gICAgICBzdXBwcmVzc1JlcGVhdGluZ0NvbnRlbnQoKSB7XG4gICAgICAgIC8vIGZpbmQgb3V0IGlmIHdlIHNob3VsZCBkaXNwbGF5IHJlcGVhdCBjb250ZW50IChkZWZhdWx0IHRvIGZhbHNlKVxuICAgICAgICBsZXQgcmVwZWF0Q29udGVudCA9IHRoaXMuZmllbGQuY29uZmlnWydyZXBlYXRfY29udGVudCddICYmIHRoaXMuZmllbGQuY29uZmlnWydyZXBlYXRfY29udGVudCddID09PSAnUmVsb2FkJ1xuICAgICAgICByZXR1cm4gIXJlcGVhdENvbnRlbnRcbiAgICAgIH0sXG4gICAgICB0cmFuc2l0aW9uSW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZGVmYXVsdCB0byBmYWRlIGluXG4gICAgICAgIGxldCB0cmFuc2l0aW9uID0gJ2FuaW1hdGVkIGZhZGVJbidcbiAgICAgICAgLy8gbWFwIG9sZCBzZXR0aW5ncyB0byBuZXcgc2V0dGluZ3NcblxuICAgICAgICBpZiAodGhpcy5maWVsZC5jb25maWcgJiYgdGhpcy5maWVsZC5jb25maWcuZW50cnlfdHJhbnNpdGlvbikge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5maWVsZC5jb25maWcuZW50cnlfdHJhbnNpdGlvbikge1xuICAgICAgICAgICAgY2FzZSAnZmFkZS1pbi1hbmltYXRpb24nOlxuICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gJ2FuaW1hdGVkIGZhZGVJbidcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NjYWxlLXVwLWFuaW1hdGlvbic6XG4gICAgICAgICAgICAgIHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgem9vbUluJ1xuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAnc2xpZGUtbGVmdC1hbmltYXRpb24nOlxuICAgICAgICAgICAgY2FzZSAnc2xpZGUtZnJvbS1yaWdodC1hbmltYXRpb24nOlxuICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gJ2FuaW1hdGVkIHNsaWRlSW5SaWdodCdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLXJpZ2h0LWFuaW1hdGlvbic6XG4gICAgICAgICAgICBjYXNlICdzbGlkZS1mcm9tLWxlZnQtYW5pbWF0aW9uJzpcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9ICdhbmltYXRlZCBzbGlkZUluTGVmdCdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLWRvd24tYW5pbWF0aW9uJzpcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9ICdhbmltYXRlZCBzbGlkZUluRG93bidcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLXVwLWFuaW1hdGlvbic6XG4gICAgICAgICAgICAgIHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgc2xpZGVJblVwJ1xuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9IHRoaXMuZmllbGQuY29uZmlnLmVudHJ5X3RyYW5zaXRpb25cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zaXRpb25cbiAgICAgIH0sXG4gICAgICB0cmFuc2l0aW9uT3V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGRlZmF1bHQgdG8gZmFkZSBvdXRcbiAgICAgICAgbGV0IHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgZmFkZU91dCdcbiAgICAgICAgLy8gbWFwIG9sZCBzZXR0aW5ncyB0byBuZXcgc2V0dGluZ3NcbiAgICAgICAgaWYgKHRoaXMuZmllbGQuY29uZmlnICYmIHRoaXMuZmllbGQuY29uZmlnLmV4aXRfdHJhbnNpdGlvbikge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5maWVsZC5jb25maWcuZXhpdF90cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdmYWRlLW91dC1hbmltYXRpb24nOlxuICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gJ2FuaW1hdGVkIGZhZGVPdXQnXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdzY2FsZS1kb3duLWFuaW1hdGlvbic6XG4gICAgICAgICAgICAgIHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgem9vbU91dCdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLWxlZnQtYW5pbWF0aW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLWZyb20tcmlnaHQtYW5pbWF0aW9uJzpcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9ICdhbmltYXRlZCBzbGlkZU91dExlZnQnXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdzbGlkZS1yaWdodC1hbmltYXRpb24nOlxuICAgICAgICAgICAgY2FzZSAnc2xpZGUtZnJvbS1sZWZ0LWFuaW1hdGlvbic6XG4gICAgICAgICAgICAgIHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgc2xpZGVPdXRSaWdodCdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLXVwLWFuaW1hdGlvbic6XG4gICAgICAgICAgICAgIHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgc2xpZGVPdXRVcCdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLWRvd24tYW5pbWF0aW9uJzpcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9ICdhbmltYXRlZCBzbGlkZU91dERvd24nXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gdGhpcy5maWVsZC5jb25maWcuZXhpdF90cmFuc2l0aW9uXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2l0aW9uXG4gICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZmV0Y2hDb250ZW50KClcbiAgICAgIC8vdGhpcy5sb2FkTmV4dENvbnRlbnQoKVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgY29uY2VydG9UaWNrZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgdGhpcy5kZWNyZW1lbnREdXJhdGlvbigpXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRlY3JlbWVudER1cmF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29udGVudCAmJiB0aGlzLmN1cnJlbnRDb250ZW50Lmxlbmd0aCA+IDAgJiYgdGhpcy5jdXJyZW50Q29udGVudFswXS5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDb250ZW50WzBdLmR1cmF0aW9uLS1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gYWxsb3dzIHVzZXIgdG8gY2xpY2sgdGhyb3VnaCBjb250ZW50XG4gICAgICBmb3JjZU5leHRDb250ZW50KCkge1xuICAgICAgICBpZiAodGhpcy5kZWJvdW5jZWRTY2hlZHVsZU5leHRDb250ZW50KSB7XG4gICAgICAgICAgdGhpcy5kZWJvdW5jZWRTY2hlZHVsZU5leHRDb250ZW50LmZsdXNoKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlTmV4dENvbnRlbnQoMSlcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gY2hlY2sgZm9yIGZyb250ZW5kIGtleSBtaXNtYXRjaCAod2hpY2ggc2ltcGx5IG1lYW5zIHRoZSBzZXJ2ZXIgd2FudHMgdXMgdG8gcmVsb2FkIHRoZSBzY3JlZW4pXG4gICAgICAvLyBidXQgd2Ugd2lsbCBkZWxlZ2F0ZSB0aGF0IHRvIHRoZSBzY3JlZW4gY29tcG9uZW50XG4gICAgICBpc1NhbWVGcm9udGVuZEtleShrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJvbnRlbmRLZXkgJiYga2V5ICYmIGtleSAhPT0gdGhpcy5mcm9udGVuZEtleSkge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ2RpZmZlcmVudCBmcm9udGVuZC1rZXkgZGV0ZWN0ZWQnKVxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2Zyb250ZW5kLWtleS1jaGFuZ2VkJylcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcblxuICAgICAgZmV0Y2hDb250ZW50KCkge1xuICAgICAgICAvLyBjb25zb2xlLmRlYnVnKERhdGUoKSwgdGhpcy5maWVsZC5pZCwgdGhpcy5maWVsZC5uYW1lLCAnZmV0Y2hpbmcgY29udGVudCcpXG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ2ZldGNoaW5nIGNvbnRlbnQnXG4gICAgICAgIGxldCB1cmwgPSB1dGlscy5wcmVmaXhXaXRoQmFzZShcIi9mcm9udGVuZC9cIiArIHRoaXMuc2NyZWVuSWQgKyBcIi9maWVsZHMvXCIgKyB0aGlzLmZpZWxkLmlkICsgXCIvY29udGVudHMuanNvblwiLCB0aGlzLmJhc2VVcmwpO1xuICAgICAgICByZXR1cm4gYXhpb3MuZ2V0KHVybClcbiAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gcmVzcG9uc2UuZGF0YVxuICAgICAgICAgICAgbGV0IGtleSA9IHJlc3BvbnNlLmhlYWRlcnNbJ3gtY29uY2VydG8tZnJvbnRlbmQtc2V0dXAta2V5J11cblxuICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHRoZSBjb250ZW50cyBpZiB0aGUgZnJvbnRlbmQga2V5IGlzIHRoZSBzYW1lIG90aGVyd2lzZSB0aGUgc2NyZWVuIGlzIGdvaW5nIHRvIHJlbG9hZCB0aGUgcGFnZSBhbnl3YXkgc28gZG9udCBib3RoZXJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2FtZUZyb250ZW5kS2V5KGtleSkpIHtcbiAgICAgICAgICAgICAgLy8gc2luY2UgdGhlcmUgcmVhbGx5IGlzIG5vIGRhdGEgZm9yIHRoZSBUaW1lIGZpZWxkLCBtb2NrIHVwIGFuIGVudHJ5XG4gICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkLm5hbWUgPT09IFwiVGltZVwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSB0aGlzLnRpbWV6b25lIHx8ICdObyB0aW1lem9uZSBzcGVjaWZpZWQnXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgKz0gJywgJyArICh0aGlzLmxvY2FsZSB8fCAnTm8gbG9jYWxlIHNwZWNpZmllZCcpXG4gICAgICAgICAgICAgICAgZGF0YSA9IFt7XG4gICAgICAgICAgICAgICAgICAnZHVyYXRpb24nOiAxNSxcbiAgICAgICAgICAgICAgICAgICdpZCc6IERhdGUubm93KCksIC8vIG11c3QgYmUgZGlmZmVyaW5nIHNvIGVhY2ggaXRlbSBpcyB0cmVhdGVkIGFzIG5ldyBjb250ZW50XG4gICAgICAgICAgICAgICAgICAnbmFtZSc6ICdTeXN0ZW0gVGltZScsXG4gICAgICAgICAgICAgICAgICAndHlwZSc6ICdDbGllbnRUaW1lJyxcbiAgICAgICAgICAgICAgICAgICdyZW5kZXJfZGV0YWlscyc6IHsndGltZXpvbmUnOiB0aGlzLnRpbWV6b25lLCAnbG9jYWxlJzogdGhpcy5sb2NhbGV9XG4gICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnbm8gY29udGVudCByZXR1cm5lZCwgdHJ5aW5nIGFnYWluIGluIDEwIHNlY29uZHMnXG4gICAgICAgICAgICAgICAgZGF0YSA9IFsgdGhpcy5lbXB0eUNvbnRlbnQgXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmRlYnVnKHRoaXMuZmllbGQuaWQsIHRoaXMuZmllbGQubmFtZSwgJ2RhdGEnLCBkYXRhKVxuICAgICAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5jb250ZW50UXVldWUsIGRhdGEpO1xuICAgICAgICAgICAgLy8gZG9udCB3YWl0IHRvIHNob3cgaXQgaWYgd2UgYXJlIGN1cnJlbnRseSBub3Qgc2hvd2luZyBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKCghdGhpcy5jdXJyZW50Q29udGVudCB8fCB0aGlzLmN1cnJlbnRDb250ZW50LnR5cGUgPT0gJ0VtcHR5JykgJiYgdGhpcy5jb250ZW50UXVldWUubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZU5leHRDb250ZW50KDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBcIkFuIGVycm9yIGhhcyBvY2N1cnJlZCBcIiArIGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgIGxldCBkYXRhID0gW3tcbiAgICAgICAgICAgICAgJ2R1cmF0aW9uJzogMTAsXG4gICAgICAgICAgICAgICdpZCc6IERhdGUubm93KCksIC8vIG11c3QgYmUgZGlmZmVyaW5nIHNvIGVhY2ggaXRlbSBpcyB0cmVhdGVkIGFzIG5ldyBjb250ZW50XG4gICAgICAgICAgICAgICduYW1lJzogJ0Vycm9yJyxcbiAgICAgICAgICAgICAgJ3R5cGUnOiAnSHRtbFRleHQnLFxuICAgICAgICAgICAgICAncmVuZGVyX2RldGFpbHMnOiB7IGRhdGE6ICdBbiBlcnJvciBoYXMgb2NjdXJyZWQgLSAnICsgZXJyb3IubWVzc2FnZSB9XG4gICAgICAgICAgICB9XVxuICAgICAgICAgICAgLy8gYW4gZXJyb3Igb2N1cnJlZCwgc28gdGVsbCB0aGUgc2NyZWVuIHRvIHJlbG9hZCAtLSBpdCBoYXMgYSBuaWNlciBlcnJvciBtc2dcbiAgICAgICAgICAgIHRoaXMuJGVtaXQoJ2Zyb250ZW5kLWtleS1jaGFuZ2VkJylcbiAgICAgICAgICAgIHJldHVybiBkYXRhXG4gICAgICAgICAgfSlcbiAgICAgIH0sXG5cblxuICAgICAgLyoqXG4gICAgICAgKiBTY2hlZHVsZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIG5leHQgcGllY2Ugb2YgY29udGVudCBmb3IgdGhpcyBmaWVsZC5cbiAgICAgICAqXG4gICAgICAgKiBAZnVuY3Rpb24gc2NoZWR1bGVOZXh0Q29udGVudFxuICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IG1zVG9XYWl0IE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdC5cbiAgICAgICAqL1xuICAgICAgc2NoZWR1bGVOZXh0Q29udGVudChtc1RvV2FpdCkge1xuICAgICAgICBpZiAodGhpcy5kZWJvdW5jZWRTY2hlZHVsZU5leHRDb250ZW50KSB7XG4gICAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmZpZWxkLmlkLCB0aGlzLmZpZWxkLm5hbWUsICdpZ25vcmluZyBzY2hlZHVsZSBuZXh0IGNvbnRlbnQgcmVxdWVzdCBzaW5jZSBhbHJlYWR5IHBlbmRpbmcnKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIGtlZXAgdHJhY2sgb2Ygb3VyIGRlYm91bmNlZCBmdW5jdGlvbiBzbyB3ZSBjYW4gZmx1c2ggaXQgbGF0ZXIgaWYgbmVlZGVkLCBidXQgaWYgd2UndmUgYmVlbiBjYWxsZWQgYWxyZWFkeVxuICAgICAgICAvLyB0aGVuIGNsZWFyIG91ciB0cmFjayBzbyB3ZSBkb250IHRyeSBhbmQgZmx1c2ggaXQgbGF0ZXIuXG4gICAgICAgIHRoaXMuZGVib3VuY2VkU2NoZWR1bGVOZXh0Q29udGVudCA9IHV0aWxzLmRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRlYm91bmNlZFNjaGVkdWxlTmV4dENvbnRlbnQgPSBudWxsXG4gICAgICAgICAgdGhpcy5sb2FkTmV4dENvbnRlbnQoKVxuICAgICAgICB9LCBtc1RvV2FpdClcbiAgICAgICAgdGhpcy5kZWJvdW5jZWRTY2hlZHVsZU5leHRDb250ZW50KClcbiAgICAgIH0sXG5cblxuICAgICAgLyoqXG4gICAgICAgKiBMb2FkIGEgcGllY2Ugb2YgY29udGVudCBiYXNlZCBvbiB0aGUgY29udGVudCBkYXRhLlxuICAgICAgICpcbiAgICAgICAqIEBmdW5jdGlvbiBsb2FkQ29udGVudFxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRlbnREYXRhXG4gICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJuIHRydWUgaWYgdGhlIGNvbnRlbnQgc3RhcnRlZCBsb2FkaW5nIE9LLlxuICAgICAgICovXG4gICAgICBsb2FkQ29udGVudCAoY29udGVudERhdGEpIHtcbiAgICAgICAgaWYgKCFjb250ZW50RGF0YSkge1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ01pc3NpbmcgY29udGVudERhdGEnXG4gICAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLmZpZWxkLmlkLCB0aGlzLmZpZWxkLm5hbWUsICdpbnZhbGlkIGNvbnRlbnREYXRhJylcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2ltcGxlQ29udGVudERhdGEgPSB7XG4gICAgICAgICAgdGl0bGU6IGNvbnRlbnREYXRhLm5hbWUsXG4gICAgICAgICAgY29udGVudElkOiBjb250ZW50RGF0YS5pZCxcbiAgICAgICAgICBkdXJhdGlvbjogY29udGVudERhdGEuZHVyYXRpb24sXG4gICAgICAgICAgY29uZmlnOiB0aGlzLmZpZWxkLmNvbmZpZyxcbiAgICAgICAgICBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsXG4gICAgICAgICAgdHlwZTogY29udGVudERhdGEudHlwZSxcbiAgICAgICAgICBmaWVsZEhlaWdodDogdGhpcy4kZWwub2Zmc2V0SGVpZ2h0LFxuICAgICAgICAgIGZpZWxkV2lkdGg6IHRoaXMuJGVsLm9mZnNldFdpZHRoXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRmxhdHRlbiByZW5kZXJfZGV0YWlsc1xuICAgICAgICBPYmplY3Qua2V5cyhjb250ZW50RGF0YS5yZW5kZXJfZGV0YWlscykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICBzaW1wbGVDb250ZW50RGF0YVtrZXldID0gY29udGVudERhdGEucmVuZGVyX2RldGFpbHNba2V5XTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9ICdDb25jZXJ0bycgKyBjb250ZW50RGF0YS50eXBlO1xuICAgICAgICB0aGlzLmN1cnJlbnRDb250ZW50ID0gW3NpbXBsZUNvbnRlbnREYXRhXTtcblxuICAgICAgICAvLyBjb25zb2xlLmRlYnVnKCdzY2hlZHVsaW5nIG5leHQgY29udGVudCBsb2FkIGZvciAnLCBzaW1wbGVDb250ZW50RGF0YS5kdXJhdGlvbiAqIDEwMDApXG4gICAgICAgIHRoaXMuc2NoZWR1bGVOZXh0Q29udGVudChzaW1wbGVDb250ZW50RGF0YS5kdXJhdGlvbiAqIDEwMDApXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuXG4gICAgICBsb2FkTmV4dENvbnRlbnQgKCkge1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IHRoaXMuY29udGVudFF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgLy8gSWYgd2UgZ290IG5vdGhpbmcgZnJvbSB0aGUgcXVldWUgb3IgaXQgaXMgZW1wdHkgdGhlbiBmZXRjaCBtb3JlLCBidXQgY29udGludWUgb24gKHNpbmNlIHdlIG1pZ2h0XG4gICAgICAgIC8vIGhhdmUgZ3JhYmJlZCB0aGUgbGFzdCBpdGVtIGZyb20gdGhlIHF1ZXVlIGFuZCBzdGlsbCBuZWVkIHRvIHNob3cgaXQpLlxuICAgICAgICBpZiAoIW5ld0NvbnRlbnQgfHwgdGhpcy5jb250ZW50UXVldWUubGVuZ3RoIDwgMSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUuZGVidWcodGhpcy5maWVsZC5pZCwgdGhpcy5maWVsZC5uYW1lLCAncXVldWUgaXMgZW1wdHkgbm93IHNvIGZldGNoaW5nIG1vcmUnKVxuICAgICAgICAgIHRoaXMuZmV0Y2hDb250ZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ld0NvbnRlbnQpIHtcbiAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBlbXB0eSB0aGUgcXVldWUgYW5kIHRoZSBmZXRjaENvbnRlbnQgcm91dGluZSBoYXNuJ3QgY29tcGxldGVkIHlldC5cbiAgICAgICAgICAvLyBUaGVyZSB3YXMgbm8gY29udGVudCBpbiB0aGUgcXVldWUsIHRyeSBhZ2FpbiBpbiBhIGZldyBzZWNvbmRzLlxuICAgICAgICAgIHRoaXMuc2NoZWR1bGVOZXh0Q29udGVudCgxMCAqIDEwMDApO1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9IFxuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBjdXJyZW50IGl0ZW0gYW5kIHRoZSBuZXcgaXRlbSBpcyB0aGUgc2FtZSwgdGhlbiBpZiB3ZSBhcmUgc3VwcG9zZWQgdG8gc3VwcHJlc3MgaXQsIHNraXAgdGhlIG5ldyBpdGVtLlxuICAgICAgICAvLyBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIFJlbW90ZVZpZGVvIGNvbnRlbnQgc2luY2UgdGhhdCBzaG91bGQgcmVzdGFydCB0aGUgdmlkZW8uXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb250ZW50ICYmIHRoaXMuY3VycmVudENvbnRlbnQubGVuZ3RoID4gMCAmJiB0aGlzLmN1cnJlbnRDb250ZW50WzBdLmNvbnRlbnRJZCA9PT0gbmV3Q29udGVudC5pZCAmJiB0aGlzLnN1cHByZXNzUmVwZWF0aW5nQ29udGVudCAmJiBuZXdDb250ZW50Wyd0eXBlJ10gIT09ICdSZW1vdGVWaWRlbycpIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdza2lwcGluZyBzYW1lIHBpZWNlIG9mIGNvbnRlbnQ6ICcgKyBuZXdDb250ZW50LmlkICsgJyAtICcgKyBuZXdDb250ZW50Lm5hbWVcbiAgICAgICAgICAvLyBjb25zb2xlLmRlYnVnKERhdGUoKSwgdGhpcy5maWVsZC5pZCwgdGhpcy5maWVsZC5uYW1lLCB0aGlzLnN0YXR1cywgdGhpcy5jb250ZW50UXVldWUubGVuZ3RoKVxuICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG1vcmUgc3R1ZmYgaW4gdGhlIHF1ZXVlLCB0aGVuIGdvIHJpZ2h0IHRvIHRoZSBuZXh0IGl0ZW0sIG90aGVyd2lzZSwgd2UgZG9udCB3YW50IHRvIHRocmFzaCBpZiB3ZSBvbmx5IGhhdmUgb25lIGl0ZW0gb24gdGhlIGZlZWQsXG4gICAgICAgICAgLy8gcGVlayBpbiB0aGUgcXVldWUgYW5kIHNlZSBpZiBpdCBpcyBmaWxsZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIGxldCBkZWxheSA9IDFcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50UXVldWUubGVuZ3RoID09IDAgfHwgKHRoaXMuY29udGVudFF1ZXVlLmxlbmd0aCA9PSAxICYmIHRoaXMuY29udGVudFF1ZXVlWzBdLmlkID09PSBuZXdDb250ZW50LmlkKSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5kZWJ1Zygnc2hvd2luZyByZXBlYXQgY29udGVudCBhbnl3YXkgc2luY2UgaXQgYXBwZWFycyB0byBiZSB0aGUgb25seSBpdGVtJylcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENvbnRlbnRbMF0uZHVyYXRpb24gPSBuZXdDb250ZW50LmR1cmF0aW9uXG4gICAgICAgICAgICBkZWxheSA9IG5ld0NvbnRlbnQuZHVyYXRpb24gKiAxMDAwXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2NoZWR1bGVOZXh0Q29udGVudChkZWxheSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgY3VycmVudCBpdGVtLCBidXQgdGhlIG5ldyBpdGVtIGlzIGVtcHR5IEFORCB0aGUgZmllbGQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgdGhlIGxhc3QgaXRlbSBzaG93biwgdGhlbiBza2lwIHRoZSBuZXcgaXRlbVxuICAgICAgICAvLyBhbmQgY2hlY2sgZm9yIGEgbmV3IGl0ZW0gaW4gMTAgc2Vjb25kcy0tIG5vdCB0aGUgaXRlbXMgZHVyYXRpb24gYWdhaW4gc2luY2Ugd2UgYXJlIGFscmVhZHkgYmV5b25kIHRoYXQuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb250ZW50ICYmIHRoaXMuY3VycmVudENvbnRlbnQubGVuZ3RoID4gMCAmJiBuZXdDb250ZW50LnR5cGUgPT09ICdFbXB0eScgJiYgIXRoaXMuY2xlYXJDb250ZW50V2hlbkVtcHR5KSB7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSAnbGVhdmluZyBsYXN0IHBpZWNlIG9mIGNvbnRlbnQsIHRyeWluZyBhZ2FpbiBpbiAxMCBzZWNvbmRzJ1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5maWVsZC5pZCwgdGhpcy5maWVsZC5uYW1lLCB0aGlzLnN0YXR1cylcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlTmV4dENvbnRlbnQoMTAgKiAxMDAwKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5sb2FkQ29udGVudChuZXdDb250ZW50KSkge1xuICAgICAgICAgIC8vIFRoZSBjb250ZW50IGZhaWxlZCB0byBsb2FkLlxuICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuZmllbGQuaWQsIHRoaXMuZmllbGQubmFtZSwgJ1VuYWJsZSB0byBsb2FkICcgKyBuZXdDb250ZW50LnR5cGUgKyAnIGNvbnRlbnQnKVxuICAgICAgICAgIHRoaXMuY29udGVudEVycm9yQ291bnQrKztcbiAgICAgICAgICAvLyBBbGxvdyB0aGUgZmllbGQgdG8gcmV0cnkgNSB0aW1lcyBxdWlja2x5LlxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRFcnJvckNvdW50IDw9IDUpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgb24gdG8gdGhlIG5leHQgY29udGVudCAtLSBpbnN0ZWFkIG9mIGNhbGxpbmcgcmVjdXJzaXZlbHksIHVzZSB0aGUgc2NoZWR1bGVyXG4gICAgICAgICAgICAvLyB0aGlzLmxvYWROZXh0Q29udGVudCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVib3VuY2VkU2NoZWR1bGVOZXh0Q29udGVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgY2FsbCB0aGVuIGRvIGl0IG5vd1xuICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlZFNjaGVkdWxlTmV4dENvbnRlbnQuZmx1c2goKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZU5leHRDb250ZW50KDEwICogMTAwMCk7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ1JldHJ5aW5nICcgKyB0aGlzLmNvbnRlbnRFcnJvckNvdW50ICsgJyBpbiAxMCBzZWNvbmRzLidcbiAgICAgICAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmZpZWxkLmlkLCB0aGlzLmZpZWxkLm5hbWUsIHRoaXMuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGluIGhhbGYgbWludXRlIGluY3JlbWVudHMgdXAgdG8gdGVuIG1pbnV0ZXMgc2luY2Ugd2UgYXJlIGhhdmluZyBwcm9ibGVtcyBmZXRjaGluZyBkYXRhXG4gICAgICAgICAgICBsZXQgcmV0cnlEdXJhdGlvbiA9IE1hdGgubWluKCh0aGlzLmNvbnRlbnRFcnJvckNvdW50IC0gMSkgKiAzMCwgMTIwMCk7XG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdSZXRyeWluZyAnICsgdGhpcy5jb250ZW50RXJyb3JDb3VudCArICcgaW4gJyArIHJldHJ5RHVyYXRpb24gKyAnIHNlY29uZHMuJ1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmZpZWxkLmlkLCB0aGlzLmZpZWxkLm5hbWUsIHRoaXMuc3RhdHVzKTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVOZXh0Q29udGVudChyZXRyeUR1cmF0aW9uICogMTAwMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBjb250ZW50IGxvYWRlZCBzdWNlc3NmdWxseS5cbiAgICAgICAgICB0aGlzLmNvbnRlbnRFcnJvckNvdW50ID0gMFxuICAgICAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSBEYXRlLm5vdygpXG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSAnQ29udGVudCAnICsgdGhpcy5jdXJyZW50Q29udGVudFswXS5jb250ZW50SWQgKyAnIC0gJyArIHRoaXMuY3VycmVudENvbnRlbnRbMF0udGl0bGVcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgfSxcbiAgICB9XG4gIH1cbjwvc2NyaXB0PlxuXG48c3R5bGU+XG4gIC5jb25jZXJ0by1maWVsZCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlXG4gIH1cbjwvc3R5bGU+Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBdkJBO0FBeUJBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQXZCQTtBQXlCQTtBQUNBO0FBQUE7QUFDQTtBQXJIQTtBQXVIQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFMQTtBQUNBO0FBT0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWhPQTtBQTNKQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/ConcertoField.vue?vue&type=script&lang=js&\n");
1153
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.function.name */ \"./node_modules/core-js/modules/es6.function.name.js\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es6.number.constructor */ \"./node_modules/core-js/modules/es6.number.constructor.js\");\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n/* harmony import */ var _ConcertoClientTime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ConcertoClientTime */ \"./src/components/ConcertoClientTime.vue\");\n/* harmony import */ var _ConcertoEmpty__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ConcertoEmpty */ \"./src/components/ConcertoEmpty.vue\");\n/* harmony import */ var _ConcertoGraphic__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ConcertoGraphic */ \"./src/components/ConcertoGraphic.vue\");\n/* harmony import */ var _ConcertoHtmlText__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ConcertoHtmlText */ \"./src/components/ConcertoHtmlText.vue\");\n/* harmony import */ var _ConcertoIframe__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ConcertoIframe */ \"./src/components/ConcertoIframe.vue\");\n/* harmony import */ var _ConcertoRemoteVideo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ConcertoRemoteVideo */ \"./src/components/ConcertoRemoteVideo.vue\");\n/* harmony import */ var _ConcertoTicker__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ConcertoTicker */ \"./src/components/ConcertoTicker.vue\");\n\n\n\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* eslint no-console: 0 */\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'ConcertoField',\n props: {\n baseUrl: String,\n debug: Boolean,\n field: Object,\n frontendKey: String,\n locale: String,\n screenId: Number,\n timezone: String\n },\n data: function data() {\n return {\n contentQueue: [],\n contentErrorCount: 0,\n contentType: null,\n currentContent: null,\n debouncedScheduleNextContent: null,\n lastUpdated: 0,\n status: ''\n };\n },\n components: {\n // the \"canned\" content\n ConcertoClientTime: _ConcertoClientTime__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n ConcertoEmpty: _ConcertoEmpty__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n ConcertoGraphic: _ConcertoGraphic__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n ConcertoHtmlText: _ConcertoHtmlText__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n ConcertoIframe: _ConcertoIframe__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n ConcertoRemoteVideo: _ConcertoRemoteVideo__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n ConcertoTicker: _ConcertoTicker__WEBPACK_IMPORTED_MODULE_12__[\"default\"]\n },\n computed: {\n debugFieldTitle: function debugFieldTitle() {\n var _this = this;\n\n var info = [];\n\n if (this.field) {\n if (this.field.style) {\n info.push('style: ' + this.field.style);\n }\n\n Object.keys(this.field.config).forEach(function (key) {\n return info.push(key + ': ' + _this.field.config[key]);\n });\n }\n\n return info.join(' \\n ');\n },\n clearContentWhenEmpty: function clearContentWhenEmpty() {\n // find out if this field should clear the last content when it is empty (default to true)\n var clearContent = this.field.config['screens_clear_last_content'];\n\n if (clearContent == null || typeof clearContent == 'undefined') {\n clearContent = true;\n }\n\n return clearContent;\n },\n duration: function duration() {\n if (this.currentContent && this.currentContent.length !== 0) {\n return this.currentContent[0].duration;\n }\n\n return '';\n },\n emptyContent: function emptyContent() {\n return {\n duration: 10,\n id: Date.now(),\n name: 'Empty Content - Waiting',\n type: 'Empty',\n render_details: {}\n };\n },\n inInfo: function inInfo() {\n var info = '';\n if (this.field && this.field.config && this.field.config.entry_transition) info = this.field.config.entry_transition + ' - ';\n return info;\n },\n outInfo: function outInfo() {\n var info = '';\n if (this.field && this.field.config && this.field.config.exit_transition) info = ' - ' + this.field.config.exit_transition;\n return info;\n },\n suppressRepeatingContent: function suppressRepeatingContent() {\n // find out if we should display repeat content (default to false)\n var repeatContent = this.field.config['repeat_content'] && this.field.config['repeat_content'] === 'Reload';\n return !repeatContent;\n },\n transitionIn: function transitionIn() {\n // default to fade in\n var transition = 'animated fadeIn'; // map old settings to new settings\n\n if (this.field.config && this.field.config.entry_transition) {\n switch (this.field.config.entry_transition) {\n case 'fade-in-animation':\n transition = 'animated fadeIn';\n break;\n\n case 'scale-up-animation':\n transition = 'animated zoomIn';\n break;\n\n case 'slide-left-animation':\n case 'slide-from-right-animation':\n transition = 'animated slideInRight';\n break;\n\n case 'slide-right-animation':\n case 'slide-from-left-animation':\n transition = 'animated slideInLeft';\n break;\n\n case 'slide-down-animation':\n transition = 'animated slideInDown';\n break;\n\n case 'slide-up-animation':\n transition = 'animated slideInUp';\n break;\n\n default:\n transition = this.field.config.entry_transition;\n break;\n }\n }\n\n return transition;\n },\n transitionOut: function transitionOut() {\n // default to fade out\n var transition = 'animated fadeOut'; // map old settings to new settings\n\n if (this.field.config && this.field.config.exit_transition) {\n switch (this.field.config.exit_transition) {\n case 'fade-out-animation':\n transition = 'animated fadeOut';\n break;\n\n case 'scale-down-animation':\n transition = 'animated zoomOut';\n break;\n\n case 'slide-left-animation':\n case 'slide-from-right-animation':\n transition = 'animated slideOutLeft';\n break;\n\n case 'slide-right-animation':\n case 'slide-from-left-animation':\n transition = 'animated slideOutRight';\n break;\n\n case 'slide-up-animation':\n transition = 'animated slideOutUp';\n break;\n\n case 'slide-down-animation':\n transition = 'animated slideOutDown';\n break;\n\n default:\n transition = this.field.config.exit_transition;\n break;\n }\n }\n\n return transition;\n }\n },\n mounted: function mounted() {\n this.fetchContent(); //this.loadNextContent()\n },\n methods: {\n concertoTicked: function concertoTicked() {\n if (this.debug) {\n this.decrementDuration();\n }\n },\n decrementDuration: function decrementDuration() {\n if (this.currentContent && this.currentContent.length > 0 && this.currentContent[0].duration > 0) {\n this.currentContent[0].duration--;\n }\n },\n // allows user to click through content\n forceNextContent: function forceNextContent() {\n if (this.debouncedScheduleNextContent) {\n this.debouncedScheduleNextContent.flush();\n } else {\n this.scheduleNextContent(1);\n }\n },\n // check for frontend key mismatch (which simply means the server wants us to reload the screen)\n // but we will delegate that to the screen component\n isSameFrontendKey: function isSameFrontendKey(key) {\n if (this.frontendKey && key && key !== this.frontendKey) {\n console.debug('different frontend-key detected');\n this.$emit('frontend-key-changed');\n return false;\n }\n\n return true;\n },\n fetchContent: function fetchContent() {\n var _this2 = this;\n\n // console.debug(Date(), this.field.id, this.field.name, 'fetching content')\n this.status = 'fetching content'; // send the field's container's dimensions to the server just in case it wants to use them\n\n var width = this.$el.parentElement.clientWidth;\n var height = this.$el.parentElement.clientHeight;\n var url = _utils__WEBPACK_IMPORTED_MODULE_5__[\"default\"].prefixWithBase(\"/frontend/\" + this.screenId + \"/fields/\" + this.field.id + \"/contents.json?width=\" + width + '&height=' + height, this.baseUrl);\n return axios__WEBPACK_IMPORTED_MODULE_4___default.a.get(url).then(function (response) {\n var data = response.data;\n var key = response.headers['x-concerto-frontend-setup-key']; // only process the contents if the frontend key is the same otherwise the screen is going to reload the page anyway so dont bother\n\n if (_this2.isSameFrontendKey(key)) {\n // since there really is no data for the Time field, mock up an entry\n if (_this2.field.name === \"Time\") {\n _this2.status = _this2.timezone || 'No timezone specified';\n _this2.status += ', ' + (_this2.locale || 'No locale specified');\n data = [{\n 'duration': 15,\n 'id': Date.now(),\n // must be differing so each item is treated as new content\n 'name': 'System Time',\n 'type': 'ClientTime',\n 'render_details': {\n 'timezone': _this2.timezone,\n 'locale': _this2.locale\n }\n }];\n }\n\n if (data === null || data.length === 0) {\n _this2.status = 'no content returned, trying again in 10 seconds';\n data = [_this2.emptyContent];\n }\n } // console.debug(this.field.id, this.field.name, 'data', data)\n // add it to the queue\n\n\n Array.prototype.push.apply(_this2.contentQueue, data); // dont wait to show it if we are currently not showing anything\n\n if ((!_this2.currentContent || _this2.currentContent.type == 'Empty') && _this2.contentQueue.length >= 1) {\n _this2.scheduleNextContent(1);\n }\n\n return data;\n }).catch(function (error) {\n _this2.status = \"An error has occurred \" + error.message;\n var data = [{\n 'duration': 10,\n 'id': Date.now(),\n // must be differing so each item is treated as new content\n 'name': 'Error',\n 'type': 'HtmlText',\n 'render_details': {\n data: 'An error has occurred - ' + error.message\n }\n }]; // an error ocurred, so tell the screen to reload -- it has a nicer error msg\n\n _this2.$emit('frontend-key-changed');\n\n return data;\n });\n },\n\n /**\n * Schedule an attempt to load the next piece of content for this field.\n *\n * @function scheduleNextContent\n * @param {Number} msToWait Number of milliseconds to wait.\n */\n scheduleNextContent: function scheduleNextContent(msToWait) {\n var _this3 = this;\n\n if (this.debouncedScheduleNextContent) {\n console.debug(this.field.id, this.field.name, 'ignoring schedule next content request since already pending');\n return;\n } // keep track of our debounced function so we can flush it later if needed, but if we've been called already\n // then clear our track so we dont try and flush it later.\n\n\n this.debouncedScheduleNextContent = _utils__WEBPACK_IMPORTED_MODULE_5__[\"default\"].debounce(function () {\n _this3.debouncedScheduleNextContent = null;\n\n _this3.loadNextContent();\n }, msToWait);\n this.debouncedScheduleNextContent();\n },\n\n /**\n * Load a piece of content based on the content data.\n *\n * @function loadContent\n * @param {Object} contentData\n * @returns {Boolean} Return true if the content started loading OK.\n */\n loadContent: function loadContent(contentData) {\n if (!contentData) {\n this.status = 'Missing contentData';\n console.error(this.field.id, this.field.name, 'invalid contentData');\n return false;\n }\n\n var simpleContentData = {\n title: contentData.name,\n contentId: contentData.id,\n duration: contentData.duration,\n config: this.field.config,\n baseUrl: this.baseUrl,\n type: contentData.type,\n fieldHeight: this.$el.offsetHeight,\n fieldWidth: this.$el.offsetWidth\n }; // Flatten render_details\n\n Object.keys(contentData.render_details).forEach(function (key) {\n simpleContentData[key] = contentData.render_details[key];\n });\n this.contentType = 'Concerto' + contentData.type;\n this.currentContent = [simpleContentData]; // console.debug('scheduling next content load for ', simpleContentData.duration * 1000)\n\n this.scheduleNextContent(simpleContentData.duration * 1000);\n return true;\n },\n loadNextContent: function loadNextContent() {\n var newContent = this.contentQueue.shift(); // If we got nothing from the queue or it is empty then fetch more, but continue on (since we might\n // have grabbed the last item from the queue and still need to show it).\n\n if (!newContent || this.contentQueue.length < 1) {\n // console.debug(this.field.id, this.field.name, 'queue is empty now so fetching more')\n this.fetchContent();\n }\n\n if (!newContent) {\n // This happens when we empty the queue and the fetchContent routine hasn't completed yet.\n // There was no content in the queue, try again in a few seconds.\n this.scheduleNextContent(10 * 1000);\n return false;\n } // If we have a current item and the new item is the same, then if we are supposed to suppress it, skip the new item.\n // This does not apply to RemoteVideo content since that should restart the video.\n\n\n if (this.currentContent && this.currentContent.length > 0 && this.currentContent[0].contentId === newContent.id && this.suppressRepeatingContent && newContent['type'] !== 'RemoteVideo') {\n this.status = 'skipping same piece of content: ' + newContent.id + ' - ' + newContent.name; // console.debug(Date(), this.field.id, this.field.name, this.status, this.contentQueue.length)\n // if there is more stuff in the queue, then go right to the next item, otherwise, we dont want to thrash if we only have one item on the feed,\n // peek in the queue and see if it is filled with the same\n\n var delay = 1;\n\n if (this.contentQueue.length == 0 || this.contentQueue.length == 1 && this.contentQueue[0].id === newContent.id) {\n // console.debug('showing repeat content anyway since it appears to be the only item')\n this.currentContent[0].duration = newContent.duration;\n delay = newContent.duration * 1000;\n }\n\n this.scheduleNextContent(delay);\n return true;\n } // If we have a current item, but the new item is empty AND the field is supposed to leave the last item shown, then skip the new item\n // and check for a new item in 10 seconds-- not the items duration again since we are already beyond that.\n\n\n if (this.currentContent && this.currentContent.length > 0 && newContent.type === 'Empty' && !this.clearContentWhenEmpty) {\n this.status = 'leaving last piece of content, trying again in 10 seconds';\n console.debug(this.field.id, this.field.name, this.status);\n this.scheduleNextContent(10 * 1000);\n return true;\n }\n\n if (!this.loadContent(newContent)) {\n // The content failed to load.\n console.log(this.field.id, this.field.name, 'Unable to load ' + newContent.type + ' content');\n this.contentErrorCount++; // Allow the field to retry 5 times quickly.\n\n if (this.contentErrorCount <= 5) {\n // Move on to the next content -- instead of calling recursively, use the scheduler\n // this.loadNextContent();\n if (this.debouncedScheduleNextContent !== null) {\n // if there is a pending call then do it now\n this.debouncedScheduleNextContent.flush();\n } else {\n this.scheduleNextContent(10 * 1000);\n this.status = 'Retrying ' + this.contentErrorCount + ' in 10 seconds.';\n console.debug(this.field.id, this.field.name, this.status);\n }\n } else {\n // try again in half minute increments up to ten minutes since we are having problems fetching data\n var retryDuration = Math.min((this.contentErrorCount - 1) * 30, 1200);\n this.status = 'Retrying ' + this.contentErrorCount + ' in ' + retryDuration + ' seconds.';\n console.debug(this.field.id, this.field.name, this.status);\n this.scheduleNextContent(retryDuration * 1000);\n }\n\n return false;\n } else {\n // The content loaded sucessfully.\n this.contentErrorCount = 0;\n this.lastUpdated = Date.now();\n this.status = 'Content ' + this.currentContent[0].contentId + ' - ' + this.currentContent[0].title;\n return true;\n }\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPyEuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4vbm9kZV9tb2R1bGVzL2NhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvaW5kZXguanM/IS4vc3JjL2NvbXBvbmVudHMvQ29uY2VydG9GaWVsZC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL0NvbmNlcnRvRmllbGQudnVlP2I0NjUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiY29uY2VydG8tZmllbGRcIlxuICAgIDpmaWVsZC1pZD1cImZpZWxkLmlkXCJcbiAgICA6ZmllbGQtbmFtZT1cImZpZWxkLm5hbWVcIlxuICAgIEBjbGljaz1cImZvcmNlTmV4dENvbnRlbnRcIlxuICAgIEBjb25jZXJ0b3RpY2s9XCJjb25jZXJ0b1RpY2tlZFwiXG4gID5cbiAgICA8ZGl2IHYtaWY9XCJkZWJ1Z1wiIGNsYXNzPVwiZGVidWctZmllbGRcIiA6dGl0bGU9XCJkZWJ1Z0ZpZWxkVGl0bGVcIj5GaWVsZCB7e2ZpZWxkLmlkIH19IC0ge3tmaWVsZC5uYW1lfX08L2Rpdj5cbiAgICAgIDx0cmFuc2l0aW9uIG5hbWU9XCJjdXN0b20tY2xhc3Nlcy10cmFuc2l0aW9uXCIgOmVudGVyLWFjdGl2ZS1jbGFzcz1cInRyYW5zaXRpb25JblwiIDpsZWF2ZS1hY3RpdmUtY2xhc3M9XCJ0cmFuc2l0aW9uT3V0XCI+XG4gICAgICAgIDxjb21wb25lbnQgdi1mb3I9XCJjb250ZW50IGluIGN1cnJlbnRDb250ZW50XCIgOmtleT1cImNvbnRlbnQuY29udGVudElkXCIgdi1iaW5kOmlzPVwiY29udGVudFR5cGVcIiA6Y29udGVudD1cImNvbnRlbnRcIiA6c3R5bGU9XCJmaWVsZC5zdHlsZVwiID48L2NvbXBvbmVudD5cbiAgICAgIDwvdHJhbnNpdGlvbj5cbiAgICA8ZGl2IHYtaWY9XCJkZWJ1Z1wiIGNsYXNzPVwiZGVidWctZmllbGQtc3RhdHVzXCI+e3tzdGF0dXN9fTwvZGl2PlxuICAgIDxkaXYgdi1pZj1cImRlYnVnXCIgY2xhc3M9XCJkZWJ1Zy1maWVsZC1kdXJhdGlvblwiPnt7IGluSW5mbyB9fXt7ZHVyYXRpb259fXt7IG91dEluZm8gfX08L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuICAvKiBlc2xpbnQgbm8tY29uc29sZTogMCAqL1xuXG4gIGltcG9ydCBheGlvcyBmcm9tICdheGlvcydcbiAgaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzJ1xuXG4gIGltcG9ydCBDb25jZXJ0b0NsaWVudFRpbWUgZnJvbSBcIi4vQ29uY2VydG9DbGllbnRUaW1lXCJcbiAgaW1wb3J0IENvbmNlcnRvRW1wdHkgZnJvbSBcIi4vQ29uY2VydG9FbXB0eVwiXG4gIGltcG9ydCBDb25jZXJ0b0dyYXBoaWMgZnJvbSBcIi4vQ29uY2VydG9HcmFwaGljXCJcbiAgaW1wb3J0IENvbmNlcnRvSHRtbFRleHQgZnJvbSBcIi4vQ29uY2VydG9IdG1sVGV4dFwiXG4gIGltcG9ydCBDb25jZXJ0b0lmcmFtZSBmcm9tIFwiLi9Db25jZXJ0b0lmcmFtZVwiXG4gIGltcG9ydCBDb25jZXJ0b1JlbW90ZVZpZGVvIGZyb20gXCIuL0NvbmNlcnRvUmVtb3RlVmlkZW9cIlxuICBpbXBvcnQgQ29uY2VydG9UaWNrZXIgZnJvbSBcIi4vQ29uY2VydG9UaWNrZXJcIlxuXG4gIGV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnQ29uY2VydG9GaWVsZCcsXG4gICAgcHJvcHM6IHtcbiAgICAgIGJhc2VVcmw6IFN0cmluZyxcbiAgICAgIGRlYnVnOiBCb29sZWFuLFxuICAgICAgZmllbGQ6IE9iamVjdCxcbiAgICAgIGZyb250ZW5kS2V5OiBTdHJpbmcsXG4gICAgICBsb2NhbGU6IFN0cmluZyxcbiAgICAgIHNjcmVlbklkOiBOdW1iZXIsXG4gICAgICB0aW1lem9uZTogU3RyaW5nXG4gICAgfSxcbiAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnRRdWV1ZTogW10sXG4gICAgICAgIGNvbnRlbnRFcnJvckNvdW50OiAwLFxuICAgICAgICBjb250ZW50VHlwZTogbnVsbCxcbiAgICAgICAgY3VycmVudENvbnRlbnQ6IG51bGwsXG4gICAgICAgIGRlYm91bmNlZFNjaGVkdWxlTmV4dENvbnRlbnQ6IG51bGwsXG4gICAgICAgIGxhc3RVcGRhdGVkOiAwLFxuICAgICAgICBzdGF0dXM6ICcnXG4gICAgICB9XG4gICAgfSxcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICAvLyB0aGUgXCJjYW5uZWRcIiBjb250ZW50XG4gICAgICBDb25jZXJ0b0NsaWVudFRpbWUsXG4gICAgICBDb25jZXJ0b0VtcHR5LFxuICAgICAgQ29uY2VydG9HcmFwaGljLFxuICAgICAgQ29uY2VydG9IdG1sVGV4dCxcbiAgICAgIENvbmNlcnRvSWZyYW1lLFxuICAgICAgQ29uY2VydG9SZW1vdGVWaWRlbyxcbiAgICAgIENvbmNlcnRvVGlja2VyLFxuICAgIH0sXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGRlYnVnRmllbGRUaXRsZSgpIHtcbiAgICAgICAgbGV0IGluZm8gPSBbXVxuICAgICAgICBpZiAodGhpcy5maWVsZCkge1xuICAgICAgICAgIGlmICh0aGlzLmZpZWxkLnN0eWxlKSB7XG4gICAgICAgICAgICBpbmZvLnB1c2goJ3N0eWxlOiAnICsgdGhpcy5maWVsZC5zdHlsZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWVsZC5jb25maWcpLmZvckVhY2goa2V5ID0+IGluZm8ucHVzaChrZXkgKyAnOiAnICsgdGhpcy5maWVsZC5jb25maWdba2V5XSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZm8uam9pbignIFxcbiAnKTtcbiAgICAgIH0sXG4gICAgICBjbGVhckNvbnRlbnRXaGVuRW1wdHkoKSB7XG4gICAgICAgIC8vIGZpbmQgb3V0IGlmIHRoaXMgZmllbGQgc2hvdWxkIGNsZWFyIHRoZSBsYXN0IGNvbnRlbnQgd2hlbiBpdCBpcyBlbXB0eSAoZGVmYXVsdCB0byB0cnVlKVxuICAgICAgICBsZXQgY2xlYXJDb250ZW50ID0gdGhpcy5maWVsZC5jb25maWdbJ3NjcmVlbnNfY2xlYXJfbGFzdF9jb250ZW50J11cbiAgICAgICAgaWYgKGNsZWFyQ29udGVudCA9PSBudWxsIHx8IHR5cGVvZiBjbGVhckNvbnRlbnQgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBjbGVhckNvbnRlbnQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsZWFyQ29udGVudFxuICAgICAgfSxcbiAgICAgIGR1cmF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENvbnRlbnQgJiYgdGhpcy5jdXJyZW50Q29udGVudC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q29udGVudFswXS5kdXJhdGlvblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJ1xuICAgICAgfSxcbiAgICAgIGVtcHR5Q29udGVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZHVyYXRpb246IDEwLFxuICAgICAgICAgIGlkOiBEYXRlLm5vdygpLFxuICAgICAgICAgIG5hbWU6ICdFbXB0eSBDb250ZW50IC0gV2FpdGluZycsXG4gICAgICAgICAgdHlwZTogJ0VtcHR5JyxcbiAgICAgICAgICByZW5kZXJfZGV0YWlsczoge31cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGluSW5mbygpIHtcbiAgICAgICAgbGV0IGluZm8gPSAnJ1xuICAgICAgICBpZiAodGhpcy5maWVsZCAmJiB0aGlzLmZpZWxkLmNvbmZpZyAmJiB0aGlzLmZpZWxkLmNvbmZpZy5lbnRyeV90cmFuc2l0aW9uKVxuICAgICAgICAgIGluZm8gPSB0aGlzLmZpZWxkLmNvbmZpZy5lbnRyeV90cmFuc2l0aW9uICsgJyAtICdcbiAgICAgICAgcmV0dXJuIGluZm9cbiAgICAgIH0sXG4gICAgICBvdXRJbmZvKCkge1xuICAgICAgICBsZXQgaW5mbyA9ICcnXG4gICAgICAgIGlmICh0aGlzLmZpZWxkICYmIHRoaXMuZmllbGQuY29uZmlnICYmIHRoaXMuZmllbGQuY29uZmlnLmV4aXRfdHJhbnNpdGlvbilcbiAgICAgICAgICBpbmZvID0gJyAtICcgKyB0aGlzLmZpZWxkLmNvbmZpZy5leGl0X3RyYW5zaXRpb25cbiAgICAgICAgcmV0dXJuIGluZm9cbiAgICAgIH0sXG4gICAgICBzdXBwcmVzc1JlcGVhdGluZ0NvbnRlbnQoKSB7XG4gICAgICAgIC8vIGZpbmQgb3V0IGlmIHdlIHNob3VsZCBkaXNwbGF5IHJlcGVhdCBjb250ZW50IChkZWZhdWx0IHRvIGZhbHNlKVxuICAgICAgICBsZXQgcmVwZWF0Q29udGVudCA9IHRoaXMuZmllbGQuY29uZmlnWydyZXBlYXRfY29udGVudCddICYmIHRoaXMuZmllbGQuY29uZmlnWydyZXBlYXRfY29udGVudCddID09PSAnUmVsb2FkJ1xuICAgICAgICByZXR1cm4gIXJlcGVhdENvbnRlbnRcbiAgICAgIH0sXG4gICAgICB0cmFuc2l0aW9uSW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZGVmYXVsdCB0byBmYWRlIGluXG4gICAgICAgIGxldCB0cmFuc2l0aW9uID0gJ2FuaW1hdGVkIGZhZGVJbidcbiAgICAgICAgLy8gbWFwIG9sZCBzZXR0aW5ncyB0byBuZXcgc2V0dGluZ3NcblxuICAgICAgICBpZiAodGhpcy5maWVsZC5jb25maWcgJiYgdGhpcy5maWVsZC5jb25maWcuZW50cnlfdHJhbnNpdGlvbikge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5maWVsZC5jb25maWcuZW50cnlfdHJhbnNpdGlvbikge1xuICAgICAgICAgICAgY2FzZSAnZmFkZS1pbi1hbmltYXRpb24nOlxuICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gJ2FuaW1hdGVkIGZhZGVJbidcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NjYWxlLXVwLWFuaW1hdGlvbic6XG4gICAgICAgICAgICAgIHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgem9vbUluJ1xuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAnc2xpZGUtbGVmdC1hbmltYXRpb24nOlxuICAgICAgICAgICAgY2FzZSAnc2xpZGUtZnJvbS1yaWdodC1hbmltYXRpb24nOlxuICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gJ2FuaW1hdGVkIHNsaWRlSW5SaWdodCdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLXJpZ2h0LWFuaW1hdGlvbic6XG4gICAgICAgICAgICBjYXNlICdzbGlkZS1mcm9tLWxlZnQtYW5pbWF0aW9uJzpcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9ICdhbmltYXRlZCBzbGlkZUluTGVmdCdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLWRvd24tYW5pbWF0aW9uJzpcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9ICdhbmltYXRlZCBzbGlkZUluRG93bidcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLXVwLWFuaW1hdGlvbic6XG4gICAgICAgICAgICAgIHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgc2xpZGVJblVwJ1xuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9IHRoaXMuZmllbGQuY29uZmlnLmVudHJ5X3RyYW5zaXRpb25cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zaXRpb25cbiAgICAgIH0sXG4gICAgICB0cmFuc2l0aW9uT3V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGRlZmF1bHQgdG8gZmFkZSBvdXRcbiAgICAgICAgbGV0IHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgZmFkZU91dCdcbiAgICAgICAgLy8gbWFwIG9sZCBzZXR0aW5ncyB0byBuZXcgc2V0dGluZ3NcbiAgICAgICAgaWYgKHRoaXMuZmllbGQuY29uZmlnICYmIHRoaXMuZmllbGQuY29uZmlnLmV4aXRfdHJhbnNpdGlvbikge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5maWVsZC5jb25maWcuZXhpdF90cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdmYWRlLW91dC1hbmltYXRpb24nOlxuICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gJ2FuaW1hdGVkIGZhZGVPdXQnXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdzY2FsZS1kb3duLWFuaW1hdGlvbic6XG4gICAgICAgICAgICAgIHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgem9vbU91dCdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLWxlZnQtYW5pbWF0aW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLWZyb20tcmlnaHQtYW5pbWF0aW9uJzpcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9ICdhbmltYXRlZCBzbGlkZU91dExlZnQnXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdzbGlkZS1yaWdodC1hbmltYXRpb24nOlxuICAgICAgICAgICAgY2FzZSAnc2xpZGUtZnJvbS1sZWZ0LWFuaW1hdGlvbic6XG4gICAgICAgICAgICAgIHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgc2xpZGVPdXRSaWdodCdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLXVwLWFuaW1hdGlvbic6XG4gICAgICAgICAgICAgIHRyYW5zaXRpb24gPSAnYW5pbWF0ZWQgc2xpZGVPdXRVcCdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3NsaWRlLWRvd24tYW5pbWF0aW9uJzpcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9ICdhbmltYXRlZCBzbGlkZU91dERvd24nXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gdGhpcy5maWVsZC5jb25maWcuZXhpdF90cmFuc2l0aW9uXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2l0aW9uXG4gICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZmV0Y2hDb250ZW50KClcbiAgICAgIC8vdGhpcy5sb2FkTmV4dENvbnRlbnQoKVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgY29uY2VydG9UaWNrZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgdGhpcy5kZWNyZW1lbnREdXJhdGlvbigpXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRlY3JlbWVudER1cmF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29udGVudCAmJiB0aGlzLmN1cnJlbnRDb250ZW50Lmxlbmd0aCA+IDAgJiYgdGhpcy5jdXJyZW50Q29udGVudFswXS5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDb250ZW50WzBdLmR1cmF0aW9uLS1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gYWxsb3dzIHVzZXIgdG8gY2xpY2sgdGhyb3VnaCBjb250ZW50XG4gICAgICBmb3JjZU5leHRDb250ZW50KCkge1xuICAgICAgICBpZiAodGhpcy5kZWJvdW5jZWRTY2hlZHVsZU5leHRDb250ZW50KSB7XG4gICAgICAgICAgdGhpcy5kZWJvdW5jZWRTY2hlZHVsZU5leHRDb250ZW50LmZsdXNoKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlTmV4dENvbnRlbnQoMSlcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gY2hlY2sgZm9yIGZyb250ZW5kIGtleSBtaXNtYXRjaCAod2hpY2ggc2ltcGx5IG1lYW5zIHRoZSBzZXJ2ZXIgd2FudHMgdXMgdG8gcmVsb2FkIHRoZSBzY3JlZW4pXG4gICAgICAvLyBidXQgd2Ugd2lsbCBkZWxlZ2F0ZSB0aGF0IHRvIHRoZSBzY3JlZW4gY29tcG9uZW50XG4gICAgICBpc1NhbWVGcm9udGVuZEtleShrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJvbnRlbmRLZXkgJiYga2V5ICYmIGtleSAhPT0gdGhpcy5mcm9udGVuZEtleSkge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ2RpZmZlcmVudCBmcm9udGVuZC1rZXkgZGV0ZWN0ZWQnKVxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2Zyb250ZW5kLWtleS1jaGFuZ2VkJylcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcblxuICAgICAgZmV0Y2hDb250ZW50KCkge1xuICAgICAgICAvLyBjb25zb2xlLmRlYnVnKERhdGUoKSwgdGhpcy5maWVsZC5pZCwgdGhpcy5maWVsZC5uYW1lLCAnZmV0Y2hpbmcgY29udGVudCcpXG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ2ZldGNoaW5nIGNvbnRlbnQnXG4gICAgICAgIC8vIHNlbmQgdGhlIGZpZWxkJ3MgY29udGFpbmVyJ3MgZGltZW5zaW9ucyB0byB0aGUgc2VydmVyIGp1c3QgaW4gY2FzZSBpdCB3YW50cyB0byB1c2UgdGhlbVxuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLiRlbC5wYXJlbnRFbGVtZW50LmNsaWVudFdpZHRoXG4gICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLiRlbC5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodFxuICAgICAgICBsZXQgdXJsID0gdXRpbHMucHJlZml4V2l0aEJhc2UoXCIvZnJvbnRlbmQvXCIgKyB0aGlzLnNjcmVlbklkICsgXCIvZmllbGRzL1wiICsgdGhpcy5maWVsZC5pZCArIFwiL2NvbnRlbnRzLmpzb24/d2lkdGg9XCIgKyB3aWR0aCArICcmaGVpZ2h0PScgKyBoZWlnaHQsIHRoaXMuYmFzZVVybCk7XG4gICAgICAgIHJldHVybiBheGlvcy5nZXQodXJsKVxuICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSByZXNwb25zZS5kYXRhXG4gICAgICAgICAgICBsZXQga2V5ID0gcmVzcG9uc2UuaGVhZGVyc1sneC1jb25jZXJ0by1mcm9udGVuZC1zZXR1cC1rZXknXVxuXG4gICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3MgdGhlIGNvbnRlbnRzIGlmIHRoZSBmcm9udGVuZCBrZXkgaXMgdGhlIHNhbWUgb3RoZXJ3aXNlIHRoZSBzY3JlZW4gaXMgZ29pbmcgdG8gcmVsb2FkIHRoZSBwYWdlIGFueXdheSBzbyBkb250IGJvdGhlclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTYW1lRnJvbnRlbmRLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAvLyBzaW5jZSB0aGVyZSByZWFsbHkgaXMgbm8gZGF0YSBmb3IgdGhlIFRpbWUgZmllbGQsIG1vY2sgdXAgYW4gZW50cnlcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZmllbGQubmFtZSA9PT0gXCJUaW1lXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHRoaXMudGltZXpvbmUgfHwgJ05vIHRpbWV6b25lIHNwZWNpZmllZCdcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyArPSAnLCAnICsgKHRoaXMubG9jYWxlIHx8ICdObyBsb2NhbGUgc3BlY2lmaWVkJylcbiAgICAgICAgICAgICAgICBkYXRhID0gW3tcbiAgICAgICAgICAgICAgICAgICdkdXJhdGlvbic6IDE1LFxuICAgICAgICAgICAgICAgICAgJ2lkJzogRGF0ZS5ub3coKSwgLy8gbXVzdCBiZSBkaWZmZXJpbmcgc28gZWFjaCBpdGVtIGlzIHRyZWF0ZWQgYXMgbmV3IGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICduYW1lJzogJ1N5c3RlbSBUaW1lJyxcbiAgICAgICAgICAgICAgICAgICd0eXBlJzogJ0NsaWVudFRpbWUnLFxuICAgICAgICAgICAgICAgICAgJ3JlbmRlcl9kZXRhaWxzJzogeyd0aW1lem9uZSc6IHRoaXMudGltZXpvbmUsICdsb2NhbGUnOiB0aGlzLmxvY2FsZX1cbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdubyBjb250ZW50IHJldHVybmVkLCB0cnlpbmcgYWdhaW4gaW4gMTAgc2Vjb25kcydcbiAgICAgICAgICAgICAgICBkYXRhID0gWyB0aGlzLmVtcHR5Q29udGVudCBdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZGVidWcodGhpcy5maWVsZC5pZCwgdGhpcy5maWVsZC5uYW1lLCAnZGF0YScsIGRhdGEpXG4gICAgICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIHF1ZXVlXG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLmNvbnRlbnRRdWV1ZSwgZGF0YSk7XG4gICAgICAgICAgICAvLyBkb250IHdhaXQgdG8gc2hvdyBpdCBpZiB3ZSBhcmUgY3VycmVudGx5IG5vdCBzaG93aW5nIGFueXRoaW5nXG4gICAgICAgICAgICBpZiAoKCF0aGlzLmN1cnJlbnRDb250ZW50IHx8IHRoaXMuY3VycmVudENvbnRlbnQudHlwZSA9PSAnRW1wdHknKSAmJiB0aGlzLmNvbnRlbnRRdWV1ZS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlTmV4dENvbnRlbnQoMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9IFwiQW4gZXJyb3IgaGFzIG9jY3VycmVkIFwiICsgZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgbGV0IGRhdGEgPSBbe1xuICAgICAgICAgICAgICAnZHVyYXRpb24nOiAxMCxcbiAgICAgICAgICAgICAgJ2lkJzogRGF0ZS5ub3coKSwgLy8gbXVzdCBiZSBkaWZmZXJpbmcgc28gZWFjaCBpdGVtIGlzIHRyZWF0ZWQgYXMgbmV3IGNvbnRlbnRcbiAgICAgICAgICAgICAgJ25hbWUnOiAnRXJyb3InLFxuICAgICAgICAgICAgICAndHlwZSc6ICdIdG1sVGV4dCcsXG4gICAgICAgICAgICAgICdyZW5kZXJfZGV0YWlscyc6IHsgZGF0YTogJ0FuIGVycm9yIGhhcyBvY2N1cnJlZCAtICcgKyBlcnJvci5tZXNzYWdlIH1cbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAvLyBhbiBlcnJvciBvY3VycmVkLCBzbyB0ZWxsIHRoZSBzY3JlZW4gdG8gcmVsb2FkIC0tIGl0IGhhcyBhIG5pY2VyIGVycm9yIG1zZ1xuICAgICAgICAgICAgdGhpcy4kZW1pdCgnZnJvbnRlbmQta2V5LWNoYW5nZWQnKVxuICAgICAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgICB9KVxuICAgICAgfSxcblxuXG4gICAgICAvKipcbiAgICAgICAqIFNjaGVkdWxlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgbmV4dCBwaWVjZSBvZiBjb250ZW50IGZvciB0aGlzIGZpZWxkLlxuICAgICAgICpcbiAgICAgICAqIEBmdW5jdGlvbiBzY2hlZHVsZU5leHRDb250ZW50XG4gICAgICAgKiBAcGFyYW0ge051bWJlcn0gbXNUb1dhaXQgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0LlxuICAgICAgICovXG4gICAgICBzY2hlZHVsZU5leHRDb250ZW50KG1zVG9XYWl0KSB7XG4gICAgICAgIGlmICh0aGlzLmRlYm91bmNlZFNjaGVkdWxlTmV4dENvbnRlbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKHRoaXMuZmllbGQuaWQsIHRoaXMuZmllbGQubmFtZSwgJ2lnbm9yaW5nIHNjaGVkdWxlIG5leHQgY29udGVudCByZXF1ZXN0IHNpbmNlIGFscmVhZHkgcGVuZGluZycpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8ga2VlcCB0cmFjayBvZiBvdXIgZGVib3VuY2VkIGZ1bmN0aW9uIHNvIHdlIGNhbiBmbHVzaCBpdCBsYXRlciBpZiBuZWVkZWQsIGJ1dCBpZiB3ZSd2ZSBiZWVuIGNhbGxlZCBhbHJlYWR5XG4gICAgICAgIC8vIHRoZW4gY2xlYXIgb3VyIHRyYWNrIHNvIHdlIGRvbnQgdHJ5IGFuZCBmbHVzaCBpdCBsYXRlci5cbiAgICAgICAgdGhpcy5kZWJvdW5jZWRTY2hlZHVsZU5leHRDb250ZW50ID0gdXRpbHMuZGVib3VuY2UoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVib3VuY2VkU2NoZWR1bGVOZXh0Q29udGVudCA9IG51bGxcbiAgICAgICAgICB0aGlzLmxvYWROZXh0Q29udGVudCgpXG4gICAgICAgIH0sIG1zVG9XYWl0KVxuICAgICAgICB0aGlzLmRlYm91bmNlZFNjaGVkdWxlTmV4dENvbnRlbnQoKVxuICAgICAgfSxcblxuXG4gICAgICAvKipcbiAgICAgICAqIExvYWQgYSBwaWVjZSBvZiBjb250ZW50IGJhc2VkIG9uIHRoZSBjb250ZW50IGRhdGEuXG4gICAgICAgKlxuICAgICAgICogQGZ1bmN0aW9uIGxvYWRDb250ZW50XG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGVudERhdGFcbiAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29udGVudCBzdGFydGVkIGxvYWRpbmcgT0suXG4gICAgICAgKi9cbiAgICAgIGxvYWRDb250ZW50IChjb250ZW50RGF0YSkge1xuICAgICAgICBpZiAoIWNvbnRlbnREYXRhKSB7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSAnTWlzc2luZyBjb250ZW50RGF0YSdcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHRoaXMuZmllbGQuaWQsIHRoaXMuZmllbGQubmFtZSwgJ2ludmFsaWQgY29udGVudERhdGEnKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaW1wbGVDb250ZW50RGF0YSA9IHtcbiAgICAgICAgICB0aXRsZTogY29udGVudERhdGEubmFtZSxcbiAgICAgICAgICBjb250ZW50SWQ6IGNvbnRlbnREYXRhLmlkLFxuICAgICAgICAgIGR1cmF0aW9uOiBjb250ZW50RGF0YS5kdXJhdGlvbixcbiAgICAgICAgICBjb25maWc6IHRoaXMuZmllbGQuY29uZmlnLFxuICAgICAgICAgIGJhc2VVcmw6IHRoaXMuYmFzZVVybCxcbiAgICAgICAgICB0eXBlOiBjb250ZW50RGF0YS50eXBlLFxuICAgICAgICAgIGZpZWxkSGVpZ2h0OiB0aGlzLiRlbC5vZmZzZXRIZWlnaHQsXG4gICAgICAgICAgZmllbGRXaWR0aDogdGhpcy4kZWwub2Zmc2V0V2lkdGhcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBGbGF0dGVuIHJlbmRlcl9kZXRhaWxzXG4gICAgICAgIE9iamVjdC5rZXlzKGNvbnRlbnREYXRhLnJlbmRlcl9kZXRhaWxzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIHNpbXBsZUNvbnRlbnREYXRhW2tleV0gPSBjb250ZW50RGF0YS5yZW5kZXJfZGV0YWlsc1trZXldO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gJ0NvbmNlcnRvJyArIGNvbnRlbnREYXRhLnR5cGU7XG4gICAgICAgIHRoaXMuY3VycmVudENvbnRlbnQgPSBbc2ltcGxlQ29udGVudERhdGFdO1xuXG4gICAgICAgIC8vIGNvbnNvbGUuZGVidWcoJ3NjaGVkdWxpbmcgbmV4dCBjb250ZW50IGxvYWQgZm9yICcsIHNpbXBsZUNvbnRlbnREYXRhLmR1cmF0aW9uICogMTAwMClcbiAgICAgICAgdGhpcy5zY2hlZHVsZU5leHRDb250ZW50KHNpbXBsZUNvbnRlbnREYXRhLmR1cmF0aW9uICogMTAwMClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG5cbiAgICAgIGxvYWROZXh0Q29udGVudCAoKSB7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gdGhpcy5jb250ZW50UXVldWUuc2hpZnQoKTtcblxuICAgICAgICAvLyBJZiB3ZSBnb3Qgbm90aGluZyBmcm9tIHRoZSBxdWV1ZSBvciBpdCBpcyBlbXB0eSB0aGVuIGZldGNoIG1vcmUsIGJ1dCBjb250aW51ZSBvbiAoc2luY2Ugd2UgbWlnaHRcbiAgICAgICAgLy8gaGF2ZSBncmFiYmVkIHRoZSBsYXN0IGl0ZW0gZnJvbSB0aGUgcXVldWUgYW5kIHN0aWxsIG5lZWQgdG8gc2hvdyBpdCkuXG4gICAgICAgIGlmICghbmV3Q29udGVudCB8fCB0aGlzLmNvbnRlbnRRdWV1ZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5kZWJ1Zyh0aGlzLmZpZWxkLmlkLCB0aGlzLmZpZWxkLm5hbWUsICdxdWV1ZSBpcyBlbXB0eSBub3cgc28gZmV0Y2hpbmcgbW9yZScpXG4gICAgICAgICAgdGhpcy5mZXRjaENvbnRlbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV3Q29udGVudCkge1xuICAgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHdlIGVtcHR5IHRoZSBxdWV1ZSBhbmQgdGhlIGZldGNoQ29udGVudCByb3V0aW5lIGhhc24ndCBjb21wbGV0ZWQgeWV0LlxuICAgICAgICAgIC8vIFRoZXJlIHdhcyBubyBjb250ZW50IGluIHRoZSBxdWV1ZSwgdHJ5IGFnYWluIGluIGEgZmV3IHNlY29uZHMuXG4gICAgICAgICAgdGhpcy5zY2hlZHVsZU5leHRDb250ZW50KDEwICogMTAwMCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH0gXG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGN1cnJlbnQgaXRlbSBhbmQgdGhlIG5ldyBpdGVtIGlzIHRoZSBzYW1lLCB0aGVuIGlmIHdlIGFyZSBzdXBwb3NlZCB0byBzdXBwcmVzcyBpdCwgc2tpcCB0aGUgbmV3IGl0ZW0uXG4gICAgICAgIC8vIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gUmVtb3RlVmlkZW8gY29udGVudCBzaW5jZSB0aGF0IHNob3VsZCByZXN0YXJ0IHRoZSB2aWRlby5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENvbnRlbnQgJiYgdGhpcy5jdXJyZW50Q29udGVudC5sZW5ndGggPiAwICYmIHRoaXMuY3VycmVudENvbnRlbnRbMF0uY29udGVudElkID09PSBuZXdDb250ZW50LmlkICYmIHRoaXMuc3VwcHJlc3NSZXBlYXRpbmdDb250ZW50ICYmIG5ld0NvbnRlbnRbJ3R5cGUnXSAhPT0gJ1JlbW90ZVZpZGVvJykge1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ3NraXBwaW5nIHNhbWUgcGllY2Ugb2YgY29udGVudDogJyArIG5ld0NvbnRlbnQuaWQgKyAnIC0gJyArIG5ld0NvbnRlbnQubmFtZVxuICAgICAgICAgIC8vIGNvbnNvbGUuZGVidWcoRGF0ZSgpLCB0aGlzLmZpZWxkLmlkLCB0aGlzLmZpZWxkLm5hbWUsIHRoaXMuc3RhdHVzLCB0aGlzLmNvbnRlbnRRdWV1ZS5sZW5ndGgpXG4gICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbW9yZSBzdHVmZiBpbiB0aGUgcXVldWUsIHRoZW4gZ28gcmlnaHQgdG8gdGhlIG5leHQgaXRlbSwgb3RoZXJ3aXNlLCB3ZSBkb250IHdhbnQgdG8gdGhyYXNoIGlmIHdlIG9ubHkgaGF2ZSBvbmUgaXRlbSBvbiB0aGUgZmVlZCxcbiAgICAgICAgICAvLyBwZWVrIGluIHRoZSBxdWV1ZSBhbmQgc2VlIGlmIGl0IGlzIGZpbGxlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgbGV0IGRlbGF5ID0gMVxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRRdWV1ZS5sZW5ndGggPT0gMCB8fCAodGhpcy5jb250ZW50UXVldWUubGVuZ3RoID09IDEgJiYgdGhpcy5jb250ZW50UXVldWVbMF0uaWQgPT09IG5ld0NvbnRlbnQuaWQpKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmRlYnVnKCdzaG93aW5nIHJlcGVhdCBjb250ZW50IGFueXdheSBzaW5jZSBpdCBhcHBlYXJzIHRvIGJlIHRoZSBvbmx5IGl0ZW0nKVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29udGVudFswXS5kdXJhdGlvbiA9IG5ld0NvbnRlbnQuZHVyYXRpb25cbiAgICAgICAgICAgIGRlbGF5ID0gbmV3Q29udGVudC5kdXJhdGlvbiAqIDEwMDBcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZU5leHRDb250ZW50KGRlbGF5KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBjdXJyZW50IGl0ZW0sIGJ1dCB0aGUgbmV3IGl0ZW0gaXMgZW1wdHkgQU5EIHRoZSBmaWVsZCBpcyBzdXBwb3NlZCB0byBsZWF2ZSB0aGUgbGFzdCBpdGVtIHNob3duLCB0aGVuIHNraXAgdGhlIG5ldyBpdGVtXG4gICAgICAgIC8vIGFuZCBjaGVjayBmb3IgYSBuZXcgaXRlbSBpbiAxMCBzZWNvbmRzLS0gbm90IHRoZSBpdGVtcyBkdXJhdGlvbiBhZ2FpbiBzaW5jZSB3ZSBhcmUgYWxyZWFkeSBiZXlvbmQgdGhhdC5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENvbnRlbnQgJiYgdGhpcy5jdXJyZW50Q29udGVudC5sZW5ndGggPiAwICYmIG5ld0NvbnRlbnQudHlwZSA9PT0gJ0VtcHR5JyAmJiAhdGhpcy5jbGVhckNvbnRlbnRXaGVuRW1wdHkpIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdsZWF2aW5nIGxhc3QgcGllY2Ugb2YgY29udGVudCwgdHJ5aW5nIGFnYWluIGluIDEwIHNlY29uZHMnXG4gICAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmZpZWxkLmlkLCB0aGlzLmZpZWxkLm5hbWUsIHRoaXMuc3RhdHVzKVxuICAgICAgICAgIHRoaXMuc2NoZWR1bGVOZXh0Q29udGVudCgxMCAqIDEwMDApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvYWRDb250ZW50KG5ld0NvbnRlbnQpKSB7XG4gICAgICAgICAgLy8gVGhlIGNvbnRlbnQgZmFpbGVkIHRvIGxvYWQuXG4gICAgICAgICAgY29uc29sZS5sb2codGhpcy5maWVsZC5pZCwgdGhpcy5maWVsZC5uYW1lLCAnVW5hYmxlIHRvIGxvYWQgJyArIG5ld0NvbnRlbnQudHlwZSArICcgY29udGVudCcpXG4gICAgICAgICAgdGhpcy5jb250ZW50RXJyb3JDb3VudCsrO1xuICAgICAgICAgIC8vIEFsbG93IHRoZSBmaWVsZCB0byByZXRyeSA1IHRpbWVzIHF1aWNrbHkuXG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudEVycm9yQ291bnQgPD0gNSkge1xuICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBjb250ZW50IC0tIGluc3RlYWQgb2YgY2FsbGluZyByZWN1cnNpdmVseSwgdXNlIHRoZSBzY2hlZHVsZXJcbiAgICAgICAgICAgIC8vIHRoaXMubG9hZE5leHRDb250ZW50KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWJvdW5jZWRTY2hlZHVsZU5leHRDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBjYWxsIHRoZW4gZG8gaXQgbm93XG4gICAgICAgICAgICAgIHRoaXMuZGVib3VuY2VkU2NoZWR1bGVOZXh0Q29udGVudC5mbHVzaCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlTmV4dENvbnRlbnQoMTAgKiAxMDAwKTtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnUmV0cnlpbmcgJyArIHRoaXMuY29udGVudEVycm9yQ291bnQgKyAnIGluIDEwIHNlY29uZHMuJ1xuICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKHRoaXMuZmllbGQuaWQsIHRoaXMuZmllbGQubmFtZSwgdGhpcy5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0cnkgYWdhaW4gaW4gaGFsZiBtaW51dGUgaW5jcmVtZW50cyB1cCB0byB0ZW4gbWludXRlcyBzaW5jZSB3ZSBhcmUgaGF2aW5nIHByb2JsZW1zIGZldGNoaW5nIGRhdGFcbiAgICAgICAgICAgIGxldCByZXRyeUR1cmF0aW9uID0gTWF0aC5taW4oKHRoaXMuY29udGVudEVycm9yQ291bnQgLSAxKSAqIDMwLCAxMjAwKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ1JldHJ5aW5nICcgKyB0aGlzLmNvbnRlbnRFcnJvckNvdW50ICsgJyBpbiAnICsgcmV0cnlEdXJhdGlvbiArICcgc2Vjb25kcy4nXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHRoaXMuZmllbGQuaWQsIHRoaXMuZmllbGQubmFtZSwgdGhpcy5zdGF0dXMpO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZU5leHRDb250ZW50KHJldHJ5RHVyYXRpb24gKiAxMDAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIGNvbnRlbnQgbG9hZGVkIHN1Y2Vzc2Z1bGx5LlxuICAgICAgICAgIHRoaXMuY29udGVudEVycm9yQ291bnQgPSAwXG4gICAgICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IERhdGUubm93KClcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdDb250ZW50ICcgKyB0aGlzLmN1cnJlbnRDb250ZW50WzBdLmNvbnRlbnRJZCArICcgLSAnICsgdGhpcy5jdXJyZW50Q29udGVudFswXS50aXRsZVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICB9LFxuICAgIH1cbiAgfVxuPC9zY3JpcHQ+XG5cbjxzdHlsZT5cbiAgLmNvbmNlcnRvLWZpZWxkIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCVcbiAgfVxuPC9zdHlsZT4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBVUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUF2QkE7QUF5QkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBdkJBO0FBeUJBO0FBQ0E7QUFBQTtBQUNBO0FBckhBO0FBdUhBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBbk9BO0FBM0pBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/ConcertoField.vue?vue&type=script&lang=js&\n");
1154
1154
 
1155
1155
  /***/ }),
1156
1156
 
@@ -1210,7 +1210,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core
1210
1210
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
1211
1211
 
1212
1212
  "use strict";
1213
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n/* harmony import */ var _ConcertoField_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ConcertoField.vue */ \"./src/components/ConcertoField.vue\");\n\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* eslint no-console: 0 */\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'ConcertoScreen',\n components: {\n ConcertoField: _ConcertoField_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n data: function data() {\n return {\n setup: null,\n setupKey: null,\n status: null\n };\n },\n props: {\n debug: Boolean,\n screen: Object\n },\n computed: {\n backgroundImage: function backgroundImage() {\n var style = '';\n\n if (this.setup && this.setup.template && this.setup.template.path) {\n var url = _utils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prefixWithBase(this.setup.template.path, this.screen.baseUrl);\n style = \"background-image: url('\" + url + \"');\";\n }\n\n return style;\n },\n templateElementId: function templateElementId() {\n return 'template_' + this.setup.template.id;\n }\n },\n created: function created() {\n var _this = this;\n\n // trigger an event on the fields every second so they can update their debug duration label\n setInterval(function () {\n _this.$el.querySelectorAll('.concerto-field').forEach(function (el) {\n var ev = new Event('concertotick');\n el.dispatchEvent(ev);\n });\n }, 1000);\n },\n mounted: function mounted() {\n this.fetchSetup();\n },\n methods: {\n fieldInfo: function fieldInfo(position) {\n var field = {\n style: position.style\n };\n Object.keys(position.field).forEach(function (key) {\n field[key] = position.field[key];\n });\n return field;\n },\n fetchSetup: function fetchSetup() {\n var _this2 = this;\n\n this.status = \"fetching screen configuration...\";\n var url = this.screen.baseUrl + '/frontend/' + this.screen.id + '/setup.json';\n return axios__WEBPACK_IMPORTED_MODULE_2___default.a.get(url).then(function (response) {\n _this2.setup = response.data;\n _this2.setupKey = response.headers['x-concerto-frontend-setup-key'];\n _this2.status = null; // force the observer to resolve\n // console.debug('data', JSON.parse(JSON.stringify(this.setup)), 'key', this.setupKey)\n\n /* load the css if any */\n\n if (_this2.setup.template.css_path && _this2.setup.template.css_path != \"\") {\n var css_link = document.createElement(\"link\");\n css_link.type = \"text/css\";\n css_link.rel = \"stylesheet\";\n css_link.href = _utils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prefixWithBase(_this2.setup.template.css_path, _this2.screen.baseUrl);\n document.head.appendChild(css_link);\n }\n }).catch(function (error) {\n _this2.status = 'An error has ocurred - ' + error.message;\n console.error(_this2.status); // try again in 15 seconds, via event loop so we dont nest calls\n\n setTimeout(_this2.fetchSetup, 15 * 1000);\n });\n },\n frontendKeyChanged: function frontendKeyChanged() {\n console.debug('got notified that the frontend key has changed!');\n document.location.reload();\n },\n positionElementId: function positionElementId(position) {\n return 'position_' + position.id;\n },\n positionStyle: function positionStyle(position) {\n var style = \"left: \" + (position.left * 100).toFixed(2) + \"%; \" + \"top: \" + (position.top * 100).toFixed(2) + \"%; \" + \"width: \" + ((position.right - position.left) * 100).toFixed(2) + \"%; \" + \"height: \" + ((position.bottom - position.top) * 100).toFixed(2) + \"%;\";\n return style;\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPyEuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4vbm9kZV9tb2R1bGVzL2NhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvaW5kZXguanM/IS4vc3JjL2NvbXBvbmVudHMvQ29uY2VydG9TY3JlZW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9Db25jZXJ0b1NjcmVlbi52dWU/Y2RhMSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJjb25jZXJ0by1zY3JlZW5cIiA6Y2xhc3M9XCJ7ZGVidWc6IGRlYnVnLCBwcmV2aWV3OiBzY3JlZW4uaXNQcmV2aWV3fVwiPlxuICAgIDxkaXYgdi1pZj1cImRlYnVnICYmIHNldHVwXCIgY2xhc3M9XCJkZWJ1Zy1zY3JlZW5cIj5TY3JlZW4ge3tzZXR1cC5pZH19IC0ge3tzZXR1cC5uYW1lfX08L2Rpdj5cbiAgICA8ZGl2IHYtaWY9XCJzZXR1cCAmJiBzZXR1cC50ZW1wbGF0ZVwiIDppZD1cInRlbXBsYXRlRWxlbWVudElkXCIgY2xhc3M9XCJjb25jZXJ0by10ZW1wbGF0ZVwiIDpzdHlsZT1cImJhY2tncm91bmRJbWFnZVwiPlxuICAgICAgPGRpdiB2LWlmPVwiZGVidWdcIiBjbGFzcz1cImRlYnVnLXRlbXBsYXRlXCI+VGVtcGxhdGUge3tzZXR1cC50ZW1wbGF0ZS5pZH19IC0ge3tzZXR1cC50ZW1wbGF0ZS5uYW1lfX08L2Rpdj5cbiAgICAgIDxkaXYgdi1mb3I9XCJwb3NpdGlvbiBpbiBzZXR1cC50ZW1wbGF0ZS5wb3NpdGlvbnNcIiA6a2V5PVwicG9zaXRpb24uaWRcIiBjbGFzcz1cImNvbmNlcnRvLXBvc2l0aW9uXCIgOmlkPVwicG9zaXRpb25FbGVtZW50SWQocG9zaXRpb24pXCIgOnN0eWxlPVwicG9zaXRpb25TdHlsZShwb3NpdGlvbilcIj5cbiAgICAgICAgPGRpdiB2LWlmPVwiZGVidWdcIiBjbGFzcz1cImRlYnVnLXBvc2l0aW9uXCIgOnRpdGxlPVwicG9zaXRpb25TdHlsZShwb3NpdGlvbilcIj5Qb3NpdGlvbiB7e3Bvc2l0aW9uLmlkfX08L2Rpdj5cbiAgICAgICAgPGNvbmNlcnRvLWZpZWxkIDpzY3JlZW4taWQ9XCJzZXR1cC5pZFwiIDpmaWVsZD1cImZpZWxkSW5mbyhwb3NpdGlvbilcIiA6YmFzZS11cmw9XCJzY3JlZW4uYmFzZVVybFwiIDp0aW1lem9uZT1cInNldHVwLnRpbWVfem9uZVwiIDpsb2NhbGU9XCJzZXR1cC5sb2NhbGVcIiA6ZGVidWc9XCJkZWJ1Z1wiIDpmcm9udGVuZC1rZXk9XCJzZXR1cEtleVwiIEBmcm9udGVuZC1rZXktY2hhbmdlZD1cImZyb250ZW5kS2V5Q2hhbmdlZFwiPlxuICAgICAgICA8L2NvbmNlcnRvLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiB2LWlmPVwiZGVidWcgJiYgc3RhdHVzXCIgY2xhc3M9XCJkZWJ1Zy1zY3JlZW4tc3RhdHVzXCI+XG4gICAgICA8ZGl2Pnt7c3RhdHVzfX08L2Rpdj5cbiAgICAgIDxzbWFsbD4ocmV0cnlpbmcgZXZlcnkgMTUgc2Vjb25kcyk8L3NtYWxsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG4gIC8qIGVzbGludCBuby1jb25zb2xlOiAwICovXG5cbiAgaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJ1xuICBpbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMnXG4gIGltcG9ydCBDb25jZXJ0b0ZpZWxkIGZyb20gJy4vQ29uY2VydG9GaWVsZC52dWUnXG5cbiAgZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdDb25jZXJ0b1NjcmVlbicsXG4gICAgY29tcG9uZW50czoge1xuICAgICAgQ29uY2VydG9GaWVsZFxuICAgIH0sXG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR1cDogbnVsbCxcbiAgICAgICAgc2V0dXBLZXk6IG51bGwsXG4gICAgICAgIHN0YXR1czogbnVsbFxuICAgICAgfVxuICAgIH0sXG4gICAgcHJvcHM6IHtcbiAgICAgIGRlYnVnOiBCb29sZWFuLFxuICAgICAgc2NyZWVuOiBPYmplY3RcbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBiYWNrZ3JvdW5kSW1hZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHN0eWxlID0gJydcbiAgICAgICAgaWYgKHRoaXMuc2V0dXAgJiYgdGhpcy5zZXR1cC50ZW1wbGF0ZSAmJiB0aGlzLnNldHVwLnRlbXBsYXRlLnBhdGgpIHtcbiAgICAgICAgICBsZXQgdXJsID0gdXRpbHMucHJlZml4V2l0aEJhc2UodGhpcy5zZXR1cC50ZW1wbGF0ZS5wYXRoLCB0aGlzLnNjcmVlbi5iYXNlVXJsKVxuICAgICAgICAgIHN0eWxlID0gXCJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ1wiICsgdXJsICsgXCInKTtcIlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHlsZVxuICAgICAgfSxcbiAgICAgIHRlbXBsYXRlRWxlbWVudElkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAndGVtcGxhdGVfJyArIHRoaXMuc2V0dXAudGVtcGxhdGUuaWRcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGVkKCkge1xuICAgICAgLy8gdHJpZ2dlciBhbiBldmVudCBvbiB0aGUgZmllbGRzIGV2ZXJ5IHNlY29uZCBzbyB0aGV5IGNhbiB1cGRhdGUgdGhlaXIgZGVidWcgZHVyYXRpb24gbGFiZWxcbiAgICAgIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLmNvbmNlcnRvLWZpZWxkJykuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICBsZXQgZXYgPSBuZXcgRXZlbnQoJ2NvbmNlcnRvdGljaycpXG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChldilcbiAgICAgICAgfSlcbiAgICAgIH0sIDEwMDApXG4gICAgfSxcblxuICAgIG1vdW50ZWQoKSB7XG4gICAgICB0aGlzLmZldGNoU2V0dXAoKVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBmaWVsZEluZm8ocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGZpZWxkID0ge1xuICAgICAgICAgIHN0eWxlOiBwb3NpdGlvbi5zdHlsZVxuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKHBvc2l0aW9uLmZpZWxkKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIGZpZWxkW2tleV0gPSBwb3NpdGlvbi5maWVsZFtrZXldO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmllbGRcbiAgICAgIH0sXG5cbiAgICAgIGZldGNoU2V0dXAoKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gXCJmZXRjaGluZyBzY3JlZW4gY29uZmlndXJhdGlvbi4uLlwiXG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnNjcmVlbi5iYXNlVXJsICsgJy9mcm9udGVuZC8nICsgdGhpcy5zY3JlZW4uaWQgKyAnL3NldHVwLmpzb24nXG4gICAgICAgIHJldHVybiBheGlvcy5nZXQodXJsKVxuICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHJlc3BvbnNlLmRhdGFcbiAgICAgICAgICAgIHRoaXMuc2V0dXBLZXkgPSByZXNwb25zZS5oZWFkZXJzWyd4LWNvbmNlcnRvLWZyb250ZW5kLXNldHVwLWtleSddXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9IG51bGxcbiAgICAgICAgICAgIC8vIGZvcmNlIHRoZSBvYnNlcnZlciB0byByZXNvbHZlXG4gICAgICAgICAgICAvLyBjb25zb2xlLmRlYnVnKCdkYXRhJywgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnNldHVwKSksICdrZXknLCB0aGlzLnNldHVwS2V5KVxuXG4gICAgICAgICAgICAvKiBsb2FkIHRoZSBjc3MgaWYgYW55ICovXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR1cC50ZW1wbGF0ZS5jc3NfcGF0aCAmJiB0aGlzLnNldHVwLnRlbXBsYXRlLmNzc19wYXRoICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgbGV0IGNzc19saW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgICAgICAgIGNzc19saW5rLnR5cGUgPSBcInRleHQvY3NzXCI7XG4gICAgICAgICAgICAgIGNzc19saW5rLnJlbCA9IFwic3R5bGVzaGVldFwiO1xuICAgICAgICAgICAgICBjc3NfbGluay5ocmVmID0gdXRpbHMucHJlZml4V2l0aEJhc2UodGhpcy5zZXR1cC50ZW1wbGF0ZS5jc3NfcGF0aCwgdGhpcy5zY3JlZW4uYmFzZVVybCk7XG4gICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoY3NzX2xpbmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnQW4gZXJyb3IgaGFzIG9jdXJyZWQgLSAnICsgZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLnN0YXR1cylcbiAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBpbiAxNSBzZWNvbmRzLCB2aWEgZXZlbnQgbG9vcCBzbyB3ZSBkb250IG5lc3QgY2FsbHNcbiAgICAgICAgICAgIHNldFRpbWVvdXQodGhpcy5mZXRjaFNldHVwLCAxNSAqIDEwMDApXG4gICAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZnJvbnRlbmRLZXlDaGFuZ2VkKCkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdnb3Qgbm90aWZpZWQgdGhhdCB0aGUgZnJvbnRlbmQga2V5IGhhcyBjaGFuZ2VkIScpXG4gICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfSxcbiAgICAgIHBvc2l0aW9uRWxlbWVudElkOiBmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuICdwb3NpdGlvbl8nICsgcG9zaXRpb24uaWRcbiAgICAgIH0sXG4gICAgICBwb3NpdGlvblN0eWxlOiBmdW5jdGlvbihwb3NpdGlvbikge1xuICAgICAgICBsZXQgc3R5bGUgPSBcImxlZnQ6IFwiICsgKHBvc2l0aW9uLmxlZnQgKiAxMDApLnRvRml4ZWQoMikgKyBcIiU7IFwiICtcbiAgICAgICAgICBcInRvcDogXCIgKyAocG9zaXRpb24udG9wICogMTAwKS50b0ZpeGVkKDIpICsgXCIlOyBcIiArIFxuICAgICAgICAgIFwid2lkdGg6IFwiICsgKChwb3NpdGlvbi5yaWdodCAtIHBvc2l0aW9uLmxlZnQpICogMTAwKS50b0ZpeGVkKDIpICsgXCIlOyBcIiArIFxuICAgICAgICAgIFwiaGVpZ2h0OiBcIiArICgocG9zaXRpb24uYm90dG9tIC0gcG9zaXRpb24udG9wKSAqIDEwMCkudG9GaXhlZCgyKSArIFwiJTtcIjtcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgfSxcbiAgICB9XG4gIH1cbjwvc2NyaXB0PlxuXG48IS0tIEFkZCBcInNjb3BlZFwiIGF0dHJpYnV0ZSB0byBsaW1pdCBDU1MgdG8gdGhpcyBjb21wb25lbnQgb25seSAtLT5cbjxzdHlsZT5cbiAgLmRlYnVnLXNjcmVlbiwgLmRlYnVnLXNjcmVlbi1zdGF0dXMsIC5kZWJ1Zy10ZW1wbGF0ZSwgLmRlYnVnLXBvc2l0aW9uLCAuZGVidWctZmllbGQsIC5kZWJ1Zy1maWVsZC1zdGF0dXMsIC5kZWJ1Zy1maWVsZC1kdXJhdGlvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGZvbnQtZmFtaWx5OiAnRnJhbmtsaW4gR290aGljIE1lZGl1bScsICdBcmlhbCBOYXJyb3cnLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgZm9udC1zaXplOiAuNmVtO1xuICAgIHBhZGRpbmc6IC4yNWVtIDFlbTtcbiAgICB6LWluZGV4OiAxMDAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTtcbiAgICBvcGFjaXR5OiAuNTtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIH1cbiAgLmRlYnVnLXNjcmVlbiwgLmRlYnVnLXBvc2l0aW9uIHtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiB1bnNldDtcbiAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogLjVlbTtcbiAgfVxuICAuZGVidWctZmllbGQsIC5kZWJ1Zy10ZW1wbGF0ZSB7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogLjVlbTtcbiAgfVxuICAuZGVidWctZmllbGQtZHVyYXRpb24ge1xuICAgIGxlZnQ6IHVuc2V0O1xuICAgIHRvcDogdW5zZXQ7XG4gICAgYm90dG9tOiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IC41ZW07XG4gIH1cbiAgLmRlYnVnLWZpZWxkLXN0YXR1cyAge1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiB1bnNldDtcbiAgICBib3R0b206IDA7XG4gICAgcmlnaHQ6IHVuc2V0O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAuNWVtO1xuICB9XG4gIC5kZWJ1Zy1zY3JlZW4tc3RhdHVzIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGZvbnQtc2l6ZToyZW07XG4gICAgb3BhY2l0eTogMTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7XG4gICAgY29sb3I6ICMyMjI7XG4gIH1cbiAgLmRlYnVnLXNjcmVlbi1zdGF0dXMgc21hbGwge1xuICAgIGZvbnQtc2l6ZTogLjVlbTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gIH1cbiAgZGl2W2NsYXNzXj1cImRlYnVnLVwiXTpob3ZlciB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB6LWluZGV4OiAyMDAwO1xuICB9XG5cbiAgLmNvbmNlcnRvLXNjcmVlbiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBjdXJzb3I6IG5vbmU7XG4gIH1cbiAgLmNvbmNlcnRvLXNjcmVlbi5wcmV2aWV3LCAuY29uY2VydG8tc2NyZWVuLmRlYnVnIHtcbiAgICBjdXJzb3I6IGF1dG87XG4gIH1cbiAgLmNvbmNlcnRvLXBvc2l0aW9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAuZGVidWcgLmNvbmNlcnRvLXBvc2l0aW9uIHtcbiAgICBib3JkZXI6IGRhc2hlZCAxcHggZ3JheTtcbiAgfVxuICAuY29uY2VydG8tdGVtcGxhdGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICB9XG48L3N0eWxlPlxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQWFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFwREE7QUEzQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/ConcertoScreen.vue?vue&type=script&lang=js&\n");
1213
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n/* harmony import */ var _ConcertoField_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ConcertoField.vue */ \"./src/components/ConcertoField.vue\");\n\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* eslint no-console: 0 */\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'ConcertoScreen',\n components: {\n ConcertoField: _ConcertoField_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n data: function data() {\n return {\n setup: null,\n setupKey: null,\n status: null\n };\n },\n props: {\n debug: Boolean,\n screen: Object\n },\n computed: {\n backgroundImage: function backgroundImage() {\n var style = '';\n\n if (this.setup && this.setup.template && this.setup.template.path) {\n var url = _utils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prefixWithBase(this.setup.template.path, this.screen.baseUrl);\n style = \"background-image: url('\" + url + \"');\";\n }\n\n return style;\n },\n templateElementId: function templateElementId() {\n return 'template_' + this.setup.template.id;\n }\n },\n created: function created() {\n var _this = this;\n\n // trigger an event on the fields every second so they can update their debug duration label\n setInterval(function () {\n _this.$el.querySelectorAll('.concerto-field').forEach(function (el) {\n var ev = new Event('concertotick');\n el.dispatchEvent(ev);\n });\n }, 1000);\n },\n mounted: function mounted() {\n this.fetchSetup();\n },\n methods: {\n fieldInfo: function fieldInfo(position) {\n var field = {\n style: position.style\n };\n Object.keys(position.field).forEach(function (key) {\n field[key] = position.field[key];\n });\n return field;\n },\n fetchSetup: function fetchSetup() {\n var _this2 = this;\n\n this.status = \"fetching screen configuration...\"; // send the \"screen's\" resolution\n\n var width = this.$el.clientWidth;\n var height = this.$el.clientHeight;\n var url = this.screen.baseUrl + '/frontend/' + this.screen.id + '/setup.json?width=' + width + '&height=' + height;\n return axios__WEBPACK_IMPORTED_MODULE_2___default.a.get(url).then(function (response) {\n _this2.setup = response.data;\n _this2.setupKey = response.headers['x-concerto-frontend-setup-key'];\n _this2.status = null; // force the observer to resolve\n // console.debug('data', JSON.parse(JSON.stringify(this.setup)), 'key', this.setupKey)\n\n /* load the css if any */\n\n if (_this2.setup.template.css_path && _this2.setup.template.css_path != \"\") {\n var css_link = document.createElement(\"link\");\n css_link.type = \"text/css\";\n css_link.rel = \"stylesheet\";\n css_link.href = _utils__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prefixWithBase(_this2.setup.template.css_path, _this2.screen.baseUrl);\n document.head.appendChild(css_link);\n }\n }).catch(function (error) {\n _this2.status = 'An error has ocurred - ' + error.message;\n console.error(_this2.status); // try again in 15 seconds, via event loop so we dont nest calls\n\n setTimeout(_this2.fetchSetup, 15 * 1000);\n });\n },\n frontendKeyChanged: function frontendKeyChanged() {\n console.debug('got notified that the frontend key has changed!');\n document.location.reload();\n },\n positionElementId: function positionElementId(position) {\n return 'position_' + position.id;\n },\n positionStyle: function positionStyle(position) {\n var style = \"left: \" + (position.left * 100).toFixed(2) + \"%; \" + \"top: \" + (position.top * 100).toFixed(2) + \"%; \" + \"width: \" + ((position.right - position.left) * 100).toFixed(2) + \"%; \" + \"height: \" + ((position.bottom - position.top) * 100).toFixed(2) + \"%;\";\n return style;\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPyEuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4vbm9kZV9tb2R1bGVzL2NhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvaW5kZXguanM/IS4vc3JjL2NvbXBvbmVudHMvQ29uY2VydG9TY3JlZW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9Db25jZXJ0b1NjcmVlbi52dWU/Y2RhMSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJjb25jZXJ0by1zY3JlZW5cIiA6Y2xhc3M9XCJ7ZGVidWc6IGRlYnVnLCBwcmV2aWV3OiBzY3JlZW4uaXNQcmV2aWV3fVwiPlxuICAgIDxkaXYgdi1pZj1cImRlYnVnICYmIHNldHVwXCIgY2xhc3M9XCJkZWJ1Zy1zY3JlZW5cIj5TY3JlZW4ge3tzZXR1cC5pZH19IC0ge3tzZXR1cC5uYW1lfX08L2Rpdj5cbiAgICA8ZGl2IHYtaWY9XCJzZXR1cCAmJiBzZXR1cC50ZW1wbGF0ZVwiIDppZD1cInRlbXBsYXRlRWxlbWVudElkXCIgY2xhc3M9XCJjb25jZXJ0by10ZW1wbGF0ZVwiIDpzdHlsZT1cImJhY2tncm91bmRJbWFnZVwiPlxuICAgICAgPGRpdiB2LWlmPVwiZGVidWdcIiBjbGFzcz1cImRlYnVnLXRlbXBsYXRlXCI+VGVtcGxhdGUge3tzZXR1cC50ZW1wbGF0ZS5pZH19IC0ge3tzZXR1cC50ZW1wbGF0ZS5uYW1lfX08L2Rpdj5cbiAgICAgIDxkaXYgdi1mb3I9XCJwb3NpdGlvbiBpbiBzZXR1cC50ZW1wbGF0ZS5wb3NpdGlvbnNcIiA6a2V5PVwicG9zaXRpb24uaWRcIiBjbGFzcz1cImNvbmNlcnRvLXBvc2l0aW9uXCIgOmlkPVwicG9zaXRpb25FbGVtZW50SWQocG9zaXRpb24pXCIgOnN0eWxlPVwicG9zaXRpb25TdHlsZShwb3NpdGlvbilcIj5cbiAgICAgICAgPGRpdiB2LWlmPVwiZGVidWdcIiBjbGFzcz1cImRlYnVnLXBvc2l0aW9uXCIgOnRpdGxlPVwicG9zaXRpb25TdHlsZShwb3NpdGlvbilcIj5Qb3NpdGlvbiB7e3Bvc2l0aW9uLmlkfX08L2Rpdj5cbiAgICAgICAgPGNvbmNlcnRvLWZpZWxkIDpzY3JlZW4taWQ9XCJzZXR1cC5pZFwiIDpmaWVsZD1cImZpZWxkSW5mbyhwb3NpdGlvbilcIiA6YmFzZS11cmw9XCJzY3JlZW4uYmFzZVVybFwiIDp0aW1lem9uZT1cInNldHVwLnRpbWVfem9uZVwiIDpsb2NhbGU9XCJzZXR1cC5sb2NhbGVcIiA6ZGVidWc9XCJkZWJ1Z1wiIDpmcm9udGVuZC1rZXk9XCJzZXR1cEtleVwiIEBmcm9udGVuZC1rZXktY2hhbmdlZD1cImZyb250ZW5kS2V5Q2hhbmdlZFwiPlxuICAgICAgICA8L2NvbmNlcnRvLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiB2LWlmPVwiZGVidWcgJiYgc3RhdHVzXCIgY2xhc3M9XCJkZWJ1Zy1zY3JlZW4tc3RhdHVzXCI+XG4gICAgICA8ZGl2Pnt7c3RhdHVzfX08L2Rpdj5cbiAgICAgIDxzbWFsbD4ocmV0cnlpbmcgZXZlcnkgMTUgc2Vjb25kcyk8L3NtYWxsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG4gIC8qIGVzbGludCBuby1jb25zb2xlOiAwICovXG5cbiAgaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJ1xuICBpbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMnXG4gIGltcG9ydCBDb25jZXJ0b0ZpZWxkIGZyb20gJy4vQ29uY2VydG9GaWVsZC52dWUnXG5cbiAgZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdDb25jZXJ0b1NjcmVlbicsXG4gICAgY29tcG9uZW50czoge1xuICAgICAgQ29uY2VydG9GaWVsZFxuICAgIH0sXG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR1cDogbnVsbCxcbiAgICAgICAgc2V0dXBLZXk6IG51bGwsXG4gICAgICAgIHN0YXR1czogbnVsbFxuICAgICAgfVxuICAgIH0sXG4gICAgcHJvcHM6IHtcbiAgICAgIGRlYnVnOiBCb29sZWFuLFxuICAgICAgc2NyZWVuOiBPYmplY3RcbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBiYWNrZ3JvdW5kSW1hZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHN0eWxlID0gJydcbiAgICAgICAgaWYgKHRoaXMuc2V0dXAgJiYgdGhpcy5zZXR1cC50ZW1wbGF0ZSAmJiB0aGlzLnNldHVwLnRlbXBsYXRlLnBhdGgpIHtcbiAgICAgICAgICBsZXQgdXJsID0gdXRpbHMucHJlZml4V2l0aEJhc2UodGhpcy5zZXR1cC50ZW1wbGF0ZS5wYXRoLCB0aGlzLnNjcmVlbi5iYXNlVXJsKVxuICAgICAgICAgIHN0eWxlID0gXCJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ1wiICsgdXJsICsgXCInKTtcIlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHlsZVxuICAgICAgfSxcbiAgICAgIHRlbXBsYXRlRWxlbWVudElkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAndGVtcGxhdGVfJyArIHRoaXMuc2V0dXAudGVtcGxhdGUuaWRcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGVkKCkge1xuICAgICAgLy8gdHJpZ2dlciBhbiBldmVudCBvbiB0aGUgZmllbGRzIGV2ZXJ5IHNlY29uZCBzbyB0aGV5IGNhbiB1cGRhdGUgdGhlaXIgZGVidWcgZHVyYXRpb24gbGFiZWxcbiAgICAgIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLmNvbmNlcnRvLWZpZWxkJykuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICBsZXQgZXYgPSBuZXcgRXZlbnQoJ2NvbmNlcnRvdGljaycpXG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChldilcbiAgICAgICAgfSlcbiAgICAgIH0sIDEwMDApXG4gICAgfSxcblxuICAgIG1vdW50ZWQoKSB7XG4gICAgICB0aGlzLmZldGNoU2V0dXAoKVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBmaWVsZEluZm8ocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGZpZWxkID0ge1xuICAgICAgICAgIHN0eWxlOiBwb3NpdGlvbi5zdHlsZVxuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKHBvc2l0aW9uLmZpZWxkKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIGZpZWxkW2tleV0gPSBwb3NpdGlvbi5maWVsZFtrZXldO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmllbGRcbiAgICAgIH0sXG5cbiAgICAgIGZldGNoU2V0dXAoKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gXCJmZXRjaGluZyBzY3JlZW4gY29uZmlndXJhdGlvbi4uLlwiXG4gICAgICAgIC8vIHNlbmQgdGhlIFwic2NyZWVuJ3NcIiByZXNvbHV0aW9uXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuJGVsLmNsaWVudFdpZHRoO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy4kZWwuY2xpZW50SGVpZ2h0O1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5zY3JlZW4uYmFzZVVybCArICcvZnJvbnRlbmQvJyArIHRoaXMuc2NyZWVuLmlkICsgJy9zZXR1cC5qc29uP3dpZHRoPScgKyB3aWR0aCArICcmaGVpZ2h0PScgKyBoZWlnaHRcbiAgICAgICAgcmV0dXJuIGF4aW9zLmdldCh1cmwpXG4gICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldHVwID0gcmVzcG9uc2UuZGF0YVxuICAgICAgICAgICAgdGhpcy5zZXR1cEtleSA9IHJlc3BvbnNlLmhlYWRlcnNbJ3gtY29uY2VydG8tZnJvbnRlbmQtc2V0dXAta2V5J11cbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gbnVsbFxuICAgICAgICAgICAgLy8gZm9yY2UgdGhlIG9ic2VydmVyIHRvIHJlc29sdmVcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZGVidWcoJ2RhdGEnLCBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2V0dXApKSwgJ2tleScsIHRoaXMuc2V0dXBLZXkpXG5cbiAgICAgICAgICAgIC8qIGxvYWQgdGhlIGNzcyBpZiBhbnkgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnNldHVwLnRlbXBsYXRlLmNzc19wYXRoICYmIHRoaXMuc2V0dXAudGVtcGxhdGUuY3NzX3BhdGggIT0gXCJcIikge1xuICAgICAgICAgICAgICBsZXQgY3NzX2xpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcbiAgICAgICAgICAgICAgY3NzX2xpbmsudHlwZSA9IFwidGV4dC9jc3NcIjtcbiAgICAgICAgICAgICAgY3NzX2xpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XG4gICAgICAgICAgICAgIGNzc19saW5rLmhyZWYgPSB1dGlscy5wcmVmaXhXaXRoQmFzZSh0aGlzLnNldHVwLnRlbXBsYXRlLmNzc19wYXRoLCB0aGlzLnNjcmVlbi5iYXNlVXJsKTtcbiAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjc3NfbGluayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdBbiBlcnJvciBoYXMgb2N1cnJlZCAtICcgKyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHRoaXMuc3RhdHVzKVxuICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGluIDE1IHNlY29uZHMsIHZpYSBldmVudCBsb29wIHNvIHdlIGRvbnQgbmVzdCBjYWxsc1xuICAgICAgICAgICAgc2V0VGltZW91dCh0aGlzLmZldGNoU2V0dXAsIDE1ICogMTAwMClcbiAgICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmcm9udGVuZEtleUNoYW5nZWQoKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ2dvdCBub3RpZmllZCB0aGF0IHRoZSBmcm9udGVuZCBrZXkgaGFzIGNoYW5nZWQhJylcbiAgICAgICAgZG9jdW1lbnQubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9LFxuICAgICAgcG9zaXRpb25FbGVtZW50SWQ6IGZ1bmN0aW9uIChwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gJ3Bvc2l0aW9uXycgKyBwb3NpdGlvbi5pZFxuICAgICAgfSxcbiAgICAgIHBvc2l0aW9uU3R5bGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBzdHlsZSA9IFwibGVmdDogXCIgKyAocG9zaXRpb24ubGVmdCAqIDEwMCkudG9GaXhlZCgyKSArIFwiJTsgXCIgK1xuICAgICAgICAgIFwidG9wOiBcIiArIChwb3NpdGlvbi50b3AgKiAxMDApLnRvRml4ZWQoMikgKyBcIiU7IFwiICsgXG4gICAgICAgICAgXCJ3aWR0aDogXCIgKyAoKHBvc2l0aW9uLnJpZ2h0IC0gcG9zaXRpb24ubGVmdCkgKiAxMDApLnRvRml4ZWQoMikgKyBcIiU7IFwiICsgXG4gICAgICAgICAgXCJoZWlnaHQ6IFwiICsgKChwb3NpdGlvbi5ib3R0b20gLSBwb3NpdGlvbi50b3ApICogMTAwKS50b0ZpeGVkKDIpICsgXCIlO1wiO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LFxuICAgIH1cbiAgfVxuPC9zY3JpcHQ+XG5cbjwhLS0gQWRkIFwic2NvcGVkXCIgYXR0cmlidXRlIHRvIGxpbWl0IENTUyB0byB0aGlzIGNvbXBvbmVudCBvbmx5IC0tPlxuPHN0eWxlPlxuICAuZGVidWctc2NyZWVuLCAuZGVidWctc2NyZWVuLXN0YXR1cywgLmRlYnVnLXRlbXBsYXRlLCAuZGVidWctcG9zaXRpb24sIC5kZWJ1Zy1maWVsZCwgLmRlYnVnLWZpZWxkLXN0YXR1cywgLmRlYnVnLWZpZWxkLWR1cmF0aW9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZm9udC1mYW1pbHk6ICdGcmFua2xpbiBHb3RoaWMgTWVkaXVtJywgJ0FyaWFsIE5hcnJvdycsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICBmb250LXNpemU6IC42ZW07XG4gICAgcGFkZGluZzogLjI1ZW0gMWVtO1xuICAgIHotaW5kZXg6IDEwMDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xuICAgIG9wYWNpdHk6IC41O1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgfVxuICAuZGVidWctc2NyZWVuLCAuZGVidWctcG9zaXRpb24ge1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IHVuc2V0O1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAuNWVtO1xuICB9XG4gIC5kZWJ1Zy1maWVsZCwgLmRlYnVnLXRlbXBsYXRlIHtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAuNWVtO1xuICB9XG4gIC5kZWJ1Zy1maWVsZC1kdXJhdGlvbiB7XG4gICAgbGVmdDogdW5zZXQ7XG4gICAgdG9wOiB1bnNldDtcbiAgICBib3R0b206IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogLjVlbTtcbiAgfVxuICAuZGVidWctZmllbGQtc3RhdHVzICB7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IHVuc2V0O1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogdW5zZXQ7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IC41ZW07XG4gIH1cbiAgLmRlYnVnLXNjcmVlbi1zdGF0dXMge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC1zaXplOjJlbTtcbiAgICBvcGFjaXR5OiAxO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcbiAgICBjb2xvcjogIzIyMjtcbiAgfVxuICAuZGVidWctc2NyZWVuLXN0YXR1cyBzbWFsbCB7XG4gICAgZm9udC1zaXplOiAuNWVtO1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgfVxuICBkaXZbY2xhc3NePVwiZGVidWctXCJdOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHotaW5kZXg6IDIwMDA7XG4gIH1cblxuICAuY29uY2VydG8tc2NyZWVuIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGN1cnNvcjogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuOyAvKiBubyBzY3JvbGxiYXJzICovXG4gIH1cbiAgLmNvbmNlcnRvLXNjcmVlbi5wcmV2aWV3LCAuY29uY2VydG8tc2NyZWVuLmRlYnVnIHtcbiAgICBjdXJzb3I6IGF1dG87XG4gIH1cbiAgLmNvbmNlcnRvLXBvc2l0aW9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAuZGVidWcgLmNvbmNlcnRvLXBvc2l0aW9uIHtcbiAgICBib3JkZXI6IGRhc2hlZCAxcHggZ3JheTtcbiAgfVxuICAuY29uY2VydG8tdGVtcGxhdGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICB9XG48L3N0eWxlPlxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQWFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUF2REE7QUEzQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/ConcertoScreen.vue?vue&type=script&lang=js&\n");
1214
1214
 
1215
1215
  /***/ }),
1216
1216
 
@@ -2398,7 +2398,7 @@ eval("exports = module.exports = __webpack_require__(/*! ../../node_modules/css-
2398
2398
  /*! no static exports found */
2399
2399
  /***/ (function(module, exports, __webpack_require__) {
2400
2400
 
2401
- eval("exports = module.exports = __webpack_require__(/*! ../../node_modules/css-loader/lib/css-base.js */ \"./node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"\\n.debug-screen, .debug-screen-status, .debug-template, .debug-position, .debug-field, .debug-field-status, .debug-field-duration {\\n position: absolute;\\n font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;\\n top: 0;\\n right: 0;\\n font-size: .6em;\\n padding: .25em 1em;\\n z-index: 1000;\\n background-color: lightgray;\\n opacity: .5;\\n display: inline;\\n font-weight: bold;\\n}\\n.debug-screen, .debug-position {\\n left: 0;\\n right: unset;\\n border-bottom-right-radius: .5em;\\n}\\n.debug-field, .debug-template {\\n border-bottom-left-radius: .5em;\\n}\\n.debug-field-duration {\\n left: unset;\\n top: unset;\\n bottom: 0;\\n right: 0;\\n display: block;\\n overflow: auto;\\n border-top-left-radius: .5em;\\n}\\n.debug-field-status {\\n left: 0;\\n top: unset;\\n bottom: 0;\\n right: unset;\\n display: block;\\n overflow: auto;\\n border-top-right-radius: .5em;\\n}\\n.debug-screen-status {\\n padding: 0;\\n font-size:2em;\\n opacity: 1;\\n display: -webkit-box;\\n display: -ms-flexbox;\\n display: flex;\\n -webkit-box-orient: vertical;\\n -webkit-box-direction: normal;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n -webkit-box-align: center;\\n -ms-flex-align: center;\\n align-items: center;\\n -webkit-box-pack: center;\\n -ms-flex-pack: center;\\n justify-content: center;\\n height: 100%;\\n width: 100%;\\n background-color: black;\\n color: #222;\\n}\\n.debug-screen-status small {\\n font-size: .5em;\\n font-style: italic;\\n}\\ndiv[class^=\\\"debug-\\\"]:hover {\\n opacity: 1;\\n z-index: 2000;\\n}\\n.concerto-screen {\\n display: block;\\n position: relative;\\n width: 100%;\\n height: 100%;\\n cursor: none;\\n}\\n.concerto-screen.preview, .concerto-screen.debug {\\n cursor: auto;\\n}\\n.concerto-position {\\n position: absolute;\\n overflow: hidden;\\n}\\n.debug .concerto-position {\\n border: dashed 1px gray;\\n}\\n.concerto-template {\\n width: 100%;\\n height: 100%;\\n background-size: 100% 100%;\\n background-repeat: no-repeat;\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPyEuL25vZGVfbW9kdWxlcy9jYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL0NvbmNlcnRvU2NyZWVuLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9Y3NzJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL0NvbmNlcnRvU2NyZWVuLnZ1ZT9iZTIyIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoZmFsc2UpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmRlYnVnLXNjcmVlbiwgLmRlYnVnLXNjcmVlbi1zdGF0dXMsIC5kZWJ1Zy10ZW1wbGF0ZSwgLmRlYnVnLXBvc2l0aW9uLCAuZGVidWctZmllbGQsIC5kZWJ1Zy1maWVsZC1zdGF0dXMsIC5kZWJ1Zy1maWVsZC1kdXJhdGlvbiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBmb250LWZhbWlseTogJ0ZyYW5rbGluIEdvdGhpYyBNZWRpdW0nLCAnQXJpYWwgTmFycm93JywgQXJpYWwsIHNhbnMtc2VyaWY7XFxuICB0b3A6IDA7XFxuICByaWdodDogMDtcXG4gIGZvbnQtc2l6ZTogLjZlbTtcXG4gIHBhZGRpbmc6IC4yNWVtIDFlbTtcXG4gIHotaW5kZXg6IDEwMDA7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyYXk7XFxuICBvcGFjaXR5OiAuNTtcXG4gIGRpc3BsYXk6IGlubGluZTtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4uZGVidWctc2NyZWVuLCAuZGVidWctcG9zaXRpb24ge1xcbiAgbGVmdDogMDtcXG4gIHJpZ2h0OiB1bnNldDtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAuNWVtO1xcbn1cXG4uZGVidWctZmllbGQsIC5kZWJ1Zy10ZW1wbGF0ZSB7XFxuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAuNWVtO1xcbn1cXG4uZGVidWctZmllbGQtZHVyYXRpb24ge1xcbiAgbGVmdDogdW5zZXQ7XFxuICB0b3A6IHVuc2V0O1xcbiAgYm90dG9tOiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG92ZXJmbG93OiBhdXRvO1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogLjVlbTtcXG59XFxuLmRlYnVnLWZpZWxkLXN0YXR1cyAge1xcbiAgbGVmdDogMDtcXG4gIHRvcDogdW5zZXQ7XFxuICBib3R0b206IDA7XFxuICByaWdodDogdW5zZXQ7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG92ZXJmbG93OiBhdXRvO1xcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IC41ZW07XFxufVxcbi5kZWJ1Zy1zY3JlZW4tc3RhdHVzIHtcXG4gIHBhZGRpbmc6IDA7XFxuICBmb250LXNpemU6MmVtO1xcbiAgb3BhY2l0eTogMTtcXG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcXG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcXG4gICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgLXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xcbiAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjtcXG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6IGJsYWNrO1xcbiAgY29sb3I6ICMyMjI7XFxufVxcbi5kZWJ1Zy1zY3JlZW4tc3RhdHVzIHNtYWxsIHtcXG4gIGZvbnQtc2l6ZTogLjVlbTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG59XFxuZGl2W2NsYXNzXj1cXFwiZGVidWctXFxcIl06aG92ZXIge1xcbiAgb3BhY2l0eTogMTtcXG4gIHotaW5kZXg6IDIwMDA7XFxufVxcbi5jb25jZXJ0by1zY3JlZW4ge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGN1cnNvcjogbm9uZTtcXG59XFxuLmNvbmNlcnRvLXNjcmVlbi5wcmV2aWV3LCAuY29uY2VydG8tc2NyZWVuLmRlYnVnIHtcXG4gIGN1cnNvcjogYXV0bztcXG59XFxuLmNvbmNlcnRvLXBvc2l0aW9uIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcbi5kZWJ1ZyAuY29uY2VydG8tcG9zaXRpb24ge1xcbiAgYm9yZGVyOiBkYXNoZWQgMXB4IGdyYXk7XFxufVxcbi5jb25jZXJ0by10ZW1wbGF0ZSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG59XFxuXCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/ConcertoScreen.vue?vue&type=style&index=0&lang=css&\n");
2401
+ eval("exports = module.exports = __webpack_require__(/*! ../../node_modules/css-loader/lib/css-base.js */ \"./node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"\\n.debug-screen, .debug-screen-status, .debug-template, .debug-position, .debug-field, .debug-field-status, .debug-field-duration {\\n position: absolute;\\n font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;\\n top: 0;\\n right: 0;\\n font-size: .6em;\\n padding: .25em 1em;\\n z-index: 1000;\\n background-color: lightgray;\\n opacity: .5;\\n display: inline;\\n font-weight: bold;\\n}\\n.debug-screen, .debug-position {\\n left: 0;\\n right: unset;\\n border-bottom-right-radius: .5em;\\n}\\n.debug-field, .debug-template {\\n border-bottom-left-radius: .5em;\\n}\\n.debug-field-duration {\\n left: unset;\\n top: unset;\\n bottom: 0;\\n right: 0;\\n display: block;\\n overflow: auto;\\n border-top-left-radius: .5em;\\n}\\n.debug-field-status {\\n left: 0;\\n top: unset;\\n bottom: 0;\\n right: unset;\\n display: block;\\n overflow: auto;\\n border-top-right-radius: .5em;\\n}\\n.debug-screen-status {\\n padding: 0;\\n font-size:2em;\\n opacity: 1;\\n display: -webkit-box;\\n display: -ms-flexbox;\\n display: flex;\\n -webkit-box-orient: vertical;\\n -webkit-box-direction: normal;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n -webkit-box-align: center;\\n -ms-flex-align: center;\\n align-items: center;\\n -webkit-box-pack: center;\\n -ms-flex-pack: center;\\n justify-content: center;\\n height: 100%;\\n width: 100%;\\n background-color: black;\\n color: #222;\\n}\\n.debug-screen-status small {\\n font-size: .5em;\\n font-style: italic;\\n}\\ndiv[class^=\\\"debug-\\\"]:hover {\\n opacity: 1;\\n z-index: 2000;\\n}\\n.concerto-screen {\\n display: block;\\n position: relative;\\n width: 100%;\\n height: 100%;\\n cursor: none;\\n overflow: hidden; /* no scrollbars */\\n}\\n.concerto-screen.preview, .concerto-screen.debug {\\n cursor: auto;\\n}\\n.concerto-position {\\n position: absolute;\\n overflow: hidden;\\n}\\n.debug .concerto-position {\\n border: dashed 1px gray;\\n}\\n.concerto-template {\\n width: 100%;\\n height: 100%;\\n background-size: 100% 100%;\\n background-repeat: no-repeat;\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPyEuL25vZGVfbW9kdWxlcy9jYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL0NvbmNlcnRvU2NyZWVuLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9Y3NzJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL0NvbmNlcnRvU2NyZWVuLnZ1ZT9iZTIyIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoZmFsc2UpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmRlYnVnLXNjcmVlbiwgLmRlYnVnLXNjcmVlbi1zdGF0dXMsIC5kZWJ1Zy10ZW1wbGF0ZSwgLmRlYnVnLXBvc2l0aW9uLCAuZGVidWctZmllbGQsIC5kZWJ1Zy1maWVsZC1zdGF0dXMsIC5kZWJ1Zy1maWVsZC1kdXJhdGlvbiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBmb250LWZhbWlseTogJ0ZyYW5rbGluIEdvdGhpYyBNZWRpdW0nLCAnQXJpYWwgTmFycm93JywgQXJpYWwsIHNhbnMtc2VyaWY7XFxuICB0b3A6IDA7XFxuICByaWdodDogMDtcXG4gIGZvbnQtc2l6ZTogLjZlbTtcXG4gIHBhZGRpbmc6IC4yNWVtIDFlbTtcXG4gIHotaW5kZXg6IDEwMDA7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyYXk7XFxuICBvcGFjaXR5OiAuNTtcXG4gIGRpc3BsYXk6IGlubGluZTtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4uZGVidWctc2NyZWVuLCAuZGVidWctcG9zaXRpb24ge1xcbiAgbGVmdDogMDtcXG4gIHJpZ2h0OiB1bnNldDtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAuNWVtO1xcbn1cXG4uZGVidWctZmllbGQsIC5kZWJ1Zy10ZW1wbGF0ZSB7XFxuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAuNWVtO1xcbn1cXG4uZGVidWctZmllbGQtZHVyYXRpb24ge1xcbiAgbGVmdDogdW5zZXQ7XFxuICB0b3A6IHVuc2V0O1xcbiAgYm90dG9tOiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG92ZXJmbG93OiBhdXRvO1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogLjVlbTtcXG59XFxuLmRlYnVnLWZpZWxkLXN0YXR1cyAge1xcbiAgbGVmdDogMDtcXG4gIHRvcDogdW5zZXQ7XFxuICBib3R0b206IDA7XFxuICByaWdodDogdW5zZXQ7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG92ZXJmbG93OiBhdXRvO1xcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IC41ZW07XFxufVxcbi5kZWJ1Zy1zY3JlZW4tc3RhdHVzIHtcXG4gIHBhZGRpbmc6IDA7XFxuICBmb250LXNpemU6MmVtO1xcbiAgb3BhY2l0eTogMTtcXG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcXG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcXG4gICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgLXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xcbiAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjtcXG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6IGJsYWNrO1xcbiAgY29sb3I6ICMyMjI7XFxufVxcbi5kZWJ1Zy1zY3JlZW4tc3RhdHVzIHNtYWxsIHtcXG4gIGZvbnQtc2l6ZTogLjVlbTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG59XFxuZGl2W2NsYXNzXj1cXFwiZGVidWctXFxcIl06aG92ZXIge1xcbiAgb3BhY2l0eTogMTtcXG4gIHotaW5kZXg6IDIwMDA7XFxufVxcbi5jb25jZXJ0by1zY3JlZW4ge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGN1cnNvcjogbm9uZTtcXG4gIG92ZXJmbG93OiBoaWRkZW47IC8qIG5vIHNjcm9sbGJhcnMgKi9cXG59XFxuLmNvbmNlcnRvLXNjcmVlbi5wcmV2aWV3LCAuY29uY2VydG8tc2NyZWVuLmRlYnVnIHtcXG4gIGN1cnNvcjogYXV0bztcXG59XFxuLmNvbmNlcnRvLXBvc2l0aW9uIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcbi5kZWJ1ZyAuY29uY2VydG8tcG9zaXRpb24ge1xcbiAgYm9yZGVyOiBkYXNoZWQgMXB4IGdyYXk7XFxufVxcbi5jb25jZXJ0by10ZW1wbGF0ZSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG59XFxuXCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/ConcertoScreen.vue?vue&type=style&index=0&lang=css&\n");
2402
2402
 
2403
2403
  /***/ }),
2404
2404
 
@@ -1,3 +1,3 @@
1
1
  module ConcertoFrontendVue
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.9"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: concerto_frontend_vue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marvin Frederickson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-26 00:00:00.000000000 Z
11
+ date: 2019-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails