module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/"; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 46); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports) { module.exports = require("react"); /***/ }), /* 1 */ /***/ (function(module, exports) { module.exports = require("react-redux"); /***/ }), /* 2 */ /***/ (function(module, exports) { module.exports = require("winston"); /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function SiteConfig() { var _this = this; this.analytics = { googleId: 'default' }; this.assetDefaults = { title: 'Spee.ch', thumbnail: 'https://spee.ch/assets/img/video_thumb_default.png', description: 'Open-source, decentralized image and video sharing.' }; this.auth = { sessionKey: 'default' }; this.details = { title: 'Spee.h Dev1', host: 'https://dev1.spee.ch', description: 'Open-source, decentralized image and video sharing.' }; this.publishing = { additionalClaimAddresses: [], disabled: false, disabledMessage: 'Please check back soon.', primaryClaimAddress: 'default', thumbnailChannel: 'default', thumbnailChannelId: 'default', uploadDirectory: '/home/lbry/Uploads' }; this.configure = function (config) { if (!config) { return console.log('No site config received.'); } var analytics = config.analytics, publishing = config.publishing, details = config.details, assetDefaults = config.assetDefaults, auth = config.auth; _this.analytics = analytics; _this.assetDefaults = assetDefaults; _this.auth = auth; _this.details = details; _this.publishing = publishing; }; }; module.exports = new SiteConfig(); /***/ }), /* 4 */ /***/ (function(module, exports) { module.exports = require("react-router-dom"); /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.selectFile = selectFile; exports.clearFile = clearFile; exports.updateMetadata = updateMetadata; exports.updateClaim = updateClaim; exports.setPublishInChannel = setPublishInChannel; exports.updatePublishStatus = updatePublishStatus; exports.updateError = updateError; exports.updateSelectedChannel = updateSelectedChannel; exports.toggleMetadataInputs = toggleMetadataInputs; exports.onNewThumbnail = onNewThumbnail; exports.startPublish = startPublish; var _publish_action_types = __webpack_require__(34); var actions = _interopRequireWildcard(_publish_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // export action creators function selectFile(file) { return { type: actions.FILE_SELECTED, data: file }; }; function clearFile() { return { type: actions.FILE_CLEAR }; }; function updateMetadata(name, value) { return { type: actions.METADATA_UPDATE, data: { name: name, value: value } }; }; function updateClaim(value) { return { type: actions.CLAIM_UPDATE, data: value }; }; function setPublishInChannel(channel) { return { type: actions.SET_PUBLISH_IN_CHANNEL, channel: channel }; }; function updatePublishStatus(status, message) { return { type: actions.PUBLISH_STATUS_UPDATE, data: { status: status, message: message } }; }; function updateError(name, value) { return { type: actions.ERROR_UPDATE, data: { name: name, value: value } }; }; function updateSelectedChannel(channelName) { return { type: actions.SELECTED_CHANNEL_UPDATE, data: channelName }; }; function toggleMetadataInputs(showMetadataInputs) { return { type: actions.TOGGLE_METADATA_INPUTS, data: showMetadataInputs }; }; function onNewThumbnail(file) { return { type: actions.THUMBNAIL_NEW, data: file }; }; function startPublish(history) { return { type: actions.PUBLISH_START, data: { history: history } }; } /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Sequelize = __webpack_require__(26); var logger = __webpack_require__(2); console.log('exporting sequelize models'); var _require = __webpack_require__(23), database = _require.database, username = _require.username, password = _require.password; var db = {}; // set sequelize options var sequelize = new Sequelize(database, username, password, { host: 'localhost', dialect: 'mysql', dialectOptions: { decimalNumbers: true }, // fix to ensure DECIMAL will not be stored as a string logging: false, pool: { max: 5, min: 0, idle: 10000, acquire: 10000 } }); // establish mysql connection sequelize.authenticate().then(function () { logger.info('Sequelize has established mysql connection successfully.'); }).catch(function (err) { logger.error('Sequelize was unable to connect to the database:', err); }); // manually add each model to the db object var Certificate = __webpack_require__(66); var Channel = __webpack_require__(67); var Claim = __webpack_require__(68); var File = __webpack_require__(69); var Request = __webpack_require__(70); var User = __webpack_require__(71); db['Certificate'] = sequelize.import('Certificate', Certificate); db['Channel'] = sequelize.import('Channel', Channel); db['Claim'] = sequelize.import('Claim', Claim); db['File'] = sequelize.import('File', File); db['Request'] = sequelize.import('Request', Request); db['User'] = sequelize.import('User', User); // run model.association for each model in the db object that has an association Object.keys(db).forEach(function (modelName) { if (db[modelName].associate) { logger.info('Associating model:', modelName); db[modelName].associate(db); } }); db.sequelize = sequelize; db.Sequelize = Sequelize; // add an 'upsert' method to the db object db.upsert = function (Model, values, condition, tableName) { return Model.findOne({ where: condition }).then(function (obj) { if (obj) { // update logger.debug('updating record in db.' + tableName); return obj.update(values); } else { // insert logger.debug('creating record in db.' + tableName); return Model.create(values); } }).catch(function (error) { logger.error(tableName + '.upsert error', error); throw error; }); }; module.exports = db; /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _channel = __webpack_require__(19); var _view = __webpack_require__(91); var _view2 = _interopRequireDefault(_view); var _publish = __webpack_require__(5); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel; return { channelName: channel.loggedInChannel.name, channelShortId: channel.loggedInChannel.shortId, channelLongId: channel.loggedInChannel.longId }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onChannelLogin: function onChannelLogin(name, shortId, longId) { dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId)); dispatch((0, _publish.updateSelectedChannel)(name)); }, onChannelLogout: function onChannelLogout() { dispatch((0, _channel.updateLoggedInChannel)(null, null, null)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.onHandleShowPageUri = onHandleShowPageUri; exports.onRequestError = onRequestError; exports.onNewChannelRequest = onNewChannelRequest; exports.onNewAssetRequest = onNewAssetRequest; exports.onRequestUpdate = onRequestUpdate; exports.addRequestToRequestList = addRequestToRequestList; exports.addAssetToAssetList = addAssetToAssetList; exports.addNewChannelToChannelList = addNewChannelToChannelList; exports.onUpdateChannelClaims = onUpdateChannelClaims; exports.updateChannelClaims = updateChannelClaims; exports.fileRequested = fileRequested; exports.updateFileAvailability = updateFileAvailability; exports.updateDisplayAssetError = updateDisplayAssetError; var _show_action_types = __webpack_require__(12); var actions = _interopRequireWildcard(_show_action_types); var _show_request_types = __webpack_require__(43); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // basic request parsing function onHandleShowPageUri(params) { return { type: actions.HANDLE_SHOW_URI, data: params }; }; function onRequestError(error) { return { type: actions.REQUEST_ERROR, data: error }; }; function onNewChannelRequest(channelName, channelId) { var requestType = _show_request_types.CHANNEL; var requestId = 'cr#' + channelName + '#' + channelId; return { type: actions.CHANNEL_REQUEST_NEW, data: { requestType: requestType, requestId: requestId, channelName: channelName, channelId: channelId } }; }; function onNewAssetRequest(name, id, channelName, channelId, extension) { var requestType = extension ? _show_request_types.ASSET_LITE : _show_request_types.ASSET_DETAILS; var requestId = 'ar#' + name + '#' + id + '#' + channelName + '#' + channelId; return { type: actions.ASSET_REQUEST_NEW, data: { requestType: requestType, requestId: requestId, name: name, modifier: { id: id, channel: { name: channelName, id: channelId } } } }; }; function onRequestUpdate(requestType, requestId) { return { type: actions.REQUEST_UPDATE, data: { requestType: requestType, requestId: requestId } }; }; function addRequestToRequestList(id, error, key) { return { type: actions.REQUEST_LIST_ADD, data: { id: id, error: error, key: key } }; }; // asset actions function addAssetToAssetList(id, error, name, claimId, shortId, claimData) { return { type: actions.ASSET_ADD, data: { id: id, error: error, name: name, claimId: claimId, shortId: shortId, claimData: claimData } }; } // channel actions function addNewChannelToChannelList(id, name, shortId, longId, claimsData) { return { type: actions.CHANNEL_ADD, data: { id: id, name: name, shortId: shortId, longId: longId, claimsData: claimsData } }; }; function onUpdateChannelClaims(channelKey, name, longId, page) { return { type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC, data: { channelKey: channelKey, name: name, longId: longId, page: page } }; }; function updateChannelClaims(channelListId, claimsData) { return { type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS, data: { channelListId: channelListId, claimsData: claimsData } }; }; // display a file function fileRequested(name, claimId) { return { type: actions.FILE_REQUESTED, data: { name: name, claimId: claimId } }; }; function updateFileAvailability(status) { return { type: actions.FILE_AVAILABILITY_UPDATE, data: status }; }; function updateDisplayAssetError(error) { return { type: actions.DISPLAY_ASSET_ERROR, data: error }; }; /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactHelmet = __webpack_require__(14); var _reactHelmet2 = _interopRequireDefault(_reactHelmet); var _propTypes = __webpack_require__(10); var _propTypes2 = _interopRequireDefault(_propTypes); var _pageTitle = __webpack_require__(88); var _metaTags = __webpack_require__(89); var _canonicalLink = __webpack_require__(90); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var SEO = function (_React$Component) { _inherits(SEO, _React$Component); function SEO() { _classCallCheck(this, SEO); return _possibleConstructorReturn(this, (SEO.__proto__ || Object.getPrototypeOf(SEO)).apply(this, arguments)); } _createClass(SEO, [{ key: 'render', value: function render() { var _props = this.props, pageTitle = _props.pageTitle, asset = _props.asset, channel = _props.channel, pageUri = _props.pageUri; pageTitle = (0, _pageTitle.createPageTitle)(pageTitle); var metaTags = (0, _metaTags.createMetaTags)(asset, channel); var canonicalLink = (0, _canonicalLink.createCanonicalLink)(asset, channel, pageUri); return _react2.default.createElement(_reactHelmet2.default, { title: pageTitle, meta: metaTags, link: [{ rel: 'canonical', href: canonicalLink }] }); } }]); return SEO; }(_react2.default.Component); ; SEO.propTypes = { pageTitle: _propTypes2.default.string, pageUri: _propTypes2.default.string, channel: _propTypes2.default.object, asset: _propTypes2.default.object }; exports.default = SEO; /***/ }), /* 10 */ /***/ (function(module, exports) { module.exports = require("prop-types"); /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); exports.default = request; __webpack_require__(94); /** * Parses the JSON returned by a network request * * @param {object} response A response from a network request * * @return {object} The parsed JSON from the request */ function parseJSON(response) { if (response.status === 204 || response.status === 205) { return null; } return response.json(); } /** * Parses the status returned by a network request * * @param {object} response A response from a network request * @param {object} response The parsed JSON from the network request * * @return {object | undefined} Returns object with status and statusText, or undefined */ function checkStatus(response, jsonResponse) { if (response.status >= 200 && response.status < 300) { return jsonResponse; } var error = new Error(jsonResponse.message); error.response = response; throw error; } /** * Requests a URL, returning a promise * * @param {string} url The URL we want to request * @param {object} [options] The options we want to pass to "fetch" * * @return {object} The response data */ function request(url, options) { return fetch(url, options).then(function (response) { return Promise.all([response, parseJSON(response)]); }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), response = _ref2[0], jsonResponse = _ref2[1]; return checkStatus(response, jsonResponse); }); } /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // request actions var HANDLE_SHOW_URI = exports.HANDLE_SHOW_URI = 'HANDLE_SHOW_URI'; var REQUEST_ERROR = exports.REQUEST_ERROR = 'REQUEST_ERROR'; var REQUEST_UPDATE = exports.REQUEST_UPDATE = 'REQUEST_UPDATE'; var ASSET_REQUEST_NEW = exports.ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW'; var CHANNEL_REQUEST_NEW = exports.CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW'; var REQUEST_LIST_ADD = exports.REQUEST_LIST_ADD = 'REQUEST_LIST_ADD'; // asset actions var ASSET_ADD = exports.ASSET_ADD = 'ASSET_ADD'; // channel actions var CHANNEL_ADD = exports.CHANNEL_ADD = 'CHANNEL_ADD'; var CHANNEL_CLAIMS_UPDATE_ASYNC = exports.CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC'; var CHANNEL_CLAIMS_UPDATE_SUCCESS = exports.CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS'; // asset/file display actions var FILE_REQUESTED = exports.FILE_REQUESTED = 'FILE_REQUESTED'; var FILE_AVAILABILITY_UPDATE = exports.FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE'; var DISPLAY_ASSET_ERROR = exports.DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR'; /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var selectAsset = exports.selectAsset = function selectAsset(show) { var request = show.requestList[show.request.id]; var assetKey = request.key; return show.assetList[assetKey]; }; var selectShowState = exports.selectShowState = function selectShowState(state) { return state.show; }; /***/ }), /* 14 */ /***/ (function(module, exports) { module.exports = require("react-helmet"); /***/ }), /* 15 */ /***/ (function(module, exports) { module.exports = require("redux-saga/effects"); /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var axios = __webpack_require__(63); var logger = __webpack_require__(2); var _require = __webpack_require__(64), _require$api = _require.api, apiHost = _require$api.apiHost, apiPort = _require$api.apiPort; var lbryApiUri = 'http://' + apiHost + ':' + apiPort; var _require2 = __webpack_require__(17), chooseGaLbrynetPublishLabel = _require2.chooseGaLbrynetPublishLabel, sendGATimingEvent = _require2.sendGATimingEvent; var handleLbrynetResponse = function handleLbrynetResponse(_ref, resolve, reject) { var data = _ref.data; logger.debug('lbry api data:', data); if (data.result) { // check for an error if (data.result.error) { logger.debug('Lbrynet api error:', data.result.error); reject(new Error(data.result.error)); return; }; resolve(data.result); return; } // fallback in case it just timed out reject(JSON.stringify(data)); }; module.exports = { publishClaim: function publishClaim(publishParams) { logger.debug('lbryApi >> Publishing claim to "' + publishParams.name + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'publish', params: publishParams }).then(function (response) { sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); }, getClaim: function getClaim(uri) { logger.debug('lbryApi >> Getting Claim for "' + uri + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'get', params: { uri: uri, timeout: 20 } }).then(function (response) { sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); }, getClaimList: function getClaimList(claimName) { logger.debug('lbryApi >> Getting claim_list for "' + claimName + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'claim_list', params: { name: claimName } }).then(function (response) { sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); }, resolveUri: function resolveUri(uri) { logger.debug('lbryApi >> Resolving URI for "' + uri + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'resolve', params: { uri: uri } }).then(function (_ref2) { var data = _ref2.data; sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now()); if (data.result[uri].error) { // check for errors reject(data.result[uri].error); } else { // if no errors, resolve resolve(data.result[uri]); } }).catch(function (error) { reject(error); }); }); }, getDownloadDirectory: function getDownloadDirectory() { logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'settings_get' }).then(function (_ref3) { var data = _ref3.data; sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now()); if (data.result) { resolve(data.result.download_directory); } else { return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.'); } }).catch(function (error) { logger.error('Lbrynet Error:', error); resolve('/home/lbry/Downloads/'); }); }); }, createChannel: function createChannel(name) { logger.debug('lbryApi >> Creating channel for ' + name + '...'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'channel_new', params: { channel_name: name, amount: 0.1 } }).then(function (response) { sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); } }; /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var ua = __webpack_require__(65); var _require = __webpack_require__(3), googleId = _require.analytics.googleId, title = _require.details.title; function createServeEventParams(headers, ip, originalUrl) { return { eventCategory: 'client requests', eventAction: 'serve request', eventLabel: originalUrl, ipOverride: ip, userAgentOverride: headers['user-agent'] }; }; function createPublishTimingEventParams(category, variable, label, startTime, endTime) { var duration = endTime - startTime; return { userTimingCategory: category, userTimingVariableName: variable, userTimingTime: duration, userTimingLabel: label }; }; function sendGoogleAnalyticsEvent(ip, params) { var visitorId = ip.replace(/\./g, '-'); var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true }); visitor.event(params, function (err) { if (err) { logger.error('Google Analytics Event Error >>', err); } }); }; function sendGoogleAnalyticsTiming(visitorId, params) { var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true }); visitor.timing(params, function (err) { if (err) { logger.error('Google Analytics Event Error >>', err); } logger.debug('Timing event successfully sent to google analytics'); }); }; module.exports = { sendGAServeEvent: function sendGAServeEvent(headers, ip, originalUrl) { var params = createServeEventParams(headers, ip, originalUrl); sendGoogleAnalyticsEvent(ip, params); }, sendGATimingEvent: function sendGATimingEvent(category, variable, label, startTime, endTime) { var params = createPublishTimingEventParams(category, variable, label, startTime, endTime); sendGoogleAnalyticsTiming(title, params); }, chooseGaLbrynetPublishLabel: function chooseGaLbrynetPublishLabel(_ref) { var channelName = _ref.channel_name, channelId = _ref.channel_id; return channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM'; } }; /***/ }), /* 18 */ /***/ (function(module, exports) { module.exports = require("redux"); /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateLoggedInChannel = updateLoggedInChannel; var _channel_action_types = __webpack_require__(36); var actions = _interopRequireWildcard(_channel_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // export action creators function updateLoggedInChannel(name, shortId, longId) { return { type: actions.CHANNEL_UPDATE, data: { name: name, shortId: shortId, longId: longId } }; }; /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(10); var _propTypes2 = _interopRequireDefault(_propTypes); var _ActiveStatusBar = __webpack_require__(116); var _ActiveStatusBar2 = _interopRequireDefault(_ActiveStatusBar); var _InactiveStatusBar = __webpack_require__(117); var _InactiveStatusBar2 = _interopRequireDefault(_InactiveStatusBar); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ProgressBar = function (_React$Component) { _inherits(ProgressBar, _React$Component); function ProgressBar(props) { _classCallCheck(this, ProgressBar); var _this = _possibleConstructorReturn(this, (ProgressBar.__proto__ || Object.getPrototypeOf(ProgressBar)).call(this, props)); _this.state = { bars: [], index: 0, incrementer: 1 }; _this.createBars = _this.createBars.bind(_this); _this.startProgressBar = _this.startProgressBar.bind(_this); _this.updateProgressBar = _this.updateProgressBar.bind(_this); _this.stopProgressBar = _this.stopProgressBar.bind(_this); return _this; } _createClass(ProgressBar, [{ key: 'componentDidMount', value: function componentDidMount() { this.createBars(); this.startProgressBar(); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.stopProgressBar(); } }, { key: 'createBars', value: function createBars() { var bars = []; for (var i = 0; i <= this.props.size; i++) { bars.push({ isActive: false }); } this.setState({ bars: bars }); } }, { key: 'startProgressBar', value: function startProgressBar() { this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300); } }, { key: 'updateProgressBar', value: function updateProgressBar() { var index = this.state.index; var incrementer = this.state.incrementer; var bars = this.state.bars; // flip incrementer if necessary, to stay in bounds if (index < 0 || index > this.props.size) { incrementer = incrementer * -1; index += incrementer; } // update the indexed bar if (incrementer > 0) { bars[index].isActive = true; } else { bars[index].isActive = false; }; // increment index index += incrementer; // update state this.setState({ bars: bars, incrementer: incrementer, index: index }); } }, { key: 'stopProgressBar', value: function stopProgressBar() { clearInterval(this.updateInterval); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', null, this.state.bars.map(function (bar, index) { return bar.isActive ? _react2.default.createElement(_ActiveStatusBar2.default, { key: index }) : _react2.default.createElement(_InactiveStatusBar2.default, { key: index }); }) ); } }]); return ProgressBar; }(_react2.default.Component); ; ProgressBar.propTypes = { size: _propTypes2.default.number.isRequired }; exports.default = ProgressBar; /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(10); var _propTypes2 = _interopRequireDefault(_propTypes); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ErrorPage = function (_React$Component) { _inherits(ErrorPage, _React$Component); function ErrorPage() { _classCallCheck(this, ErrorPage); return _possibleConstructorReturn(this, (ErrorPage.__proto__ || Object.getPrototypeOf(ErrorPage)).apply(this, arguments)); } _createClass(ErrorPage, [{ key: 'render', value: function render() { var error = this.props.error; return _react2.default.createElement( 'div', null, _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'p', null, error ) ) ); } }]); return ErrorPage; }(_react2.default.Component); ; ErrorPage.propTypes = { error: _propTypes2.default.string.isRequired }; exports.default = ErrorPage; /***/ }), /* 22 */ /***/ (function(module, exports) { module.exports = require("passport"); /***/ }), /* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function MysqlConfig() { var _this = this; this.database = 'default'; this.username = 'default'; this.password = 'default'; this.configure = function (config) { if (!config) { return console.log('No MySQL config received.'); } var database = config.database, username = config.username, password = config.password; _this.database = database; _this.username = username; _this.password = password; }; }; module.exports = new MysqlConfig(); /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function SlackConfig() { var _this = this; this.slackWebHook = 'default'; this.slackErrorChannel = 'default'; this.slackInfoChannel = 'default'; this.configure = function (config) { if (!config) { return console.log('No slack config received.'); } var slackWebHook = config.slackWebHook, slackErrorChannel = config.slackErrorChannel, slackInfoChannel = config.slackInfoChannel; _this.slackWebHook = slackWebHook; _this.slackErrorChannel = slackErrorChannel; _this.slackInfoChannel = slackInfoChannel; }; }; module.exports = new SlackConfig(); /***/ }), /* 25 */ /***/ (function(module, exports) { module.exports = require("passport-local"); /***/ }), /* 26 */ /***/ (function(module, exports) { module.exports = require("sequelize"); /***/ }), /* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = { returnShortId: function returnShortId(claimsArray, longId) { var claimIndex = void 0; var shortId = longId.substring(0, 1); // default short id is the first letter var shortIdLength = 0; // find the index of this claim id claimIndex = claimsArray.findIndex(function (element) { return element.claimId === longId; }); if (claimIndex < 0) { throw new Error('claim id not found in claims list'); } // get an array of all claims with lower height var possibleMatches = claimsArray.slice(0, claimIndex); // remove certificates with the same prefixes until none are left. while (possibleMatches.length > 0) { shortIdLength += 1; shortId = longId.substring(0, shortIdLength); possibleMatches = possibleMatches.filter(function (element) { return element.claimId && element.claimId.substring(0, shortIdLength) === shortId; }); } return shortId; } }; /***/ }), /* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var fs = __webpack_require__(78); var _require = __webpack_require__(3), details = _require.details, publishing = _require.publishing; module.exports = { parsePublishApiRequestBody: function parsePublishApiRequestBody(_ref) { var name = _ref.name, nsfw = _ref.nsfw, license = _ref.license, title = _ref.title, description = _ref.description, thumbnail = _ref.thumbnail; // validate name if (!name) { throw new Error('no name field found in request'); } var invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name); if (invalidNameCharacters) { throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and "-"'); } // optional parameters nsfw = nsfw === 'true'; license = license || null; title = title || null; description = description || null; thumbnail = thumbnail || null; // return results return { name: name, nsfw: nsfw, license: license, title: title, description: description, thumbnail: thumbnail }; }, parsePublishApiRequestFiles: function parsePublishApiRequestFiles(_ref2) { var file = _ref2.file, thumbnail = _ref2.thumbnail; // make sure a file was provided if (!file) { throw new Error('no file with key of [file] found in request'); } if (!file.path) { throw new Error('no file path found'); } if (!file.type) { throw new Error('no file type found'); } if (!file.size) { throw new Error('no file type found'); } // validate the file name if (/'/.test(file.name)) { throw new Error('apostrophes are not allowed in the file name'); } // validate the file module.exports.validateFileTypeAndSize(file); // return results return { fileName: file.name, filePath: file.path, fileType: file.type, thumbnailFileName: thumbnail ? thumbnail.name : null, thumbnailFilePath: thumbnail ? thumbnail.path : null, thumbnailFileType: thumbnail ? thumbnail.type : null }; }, validateFileTypeAndSize: function validateFileTypeAndSize(file) { // check file type and size switch (file.type) { case 'image/jpeg': case 'image/jpg': case 'image/png': if (file.size > 10000000) { logger.debug('publish > file validation > .jpeg/.jpg/.png was too big'); throw new Error('Sorry, images are limited to 10 megabytes.'); } break; case 'image/gif': if (file.size > 50000000) { logger.debug('publish > file validation > .gif was too big'); throw new Error('Sorry, .gifs are limited to 50 megabytes.'); } break; case 'video/mp4': if (file.size > 50000000) { logger.debug('publish > file validation > .mp4 was too big'); throw new Error('Sorry, videos are limited to 50 megabytes.'); } break; default: logger.debug('publish > file validation > unrecognized file type'); throw new Error('The ' + file.type + ' content type is not supported. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.'); } return file; }, createBasicPublishParams: function createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail) { logger.debug('Creating Publish Parameters'); // provide defaults for title if (title === null || title.trim() === '') { title = name; } // provide default for description if (description === null || description.trim() === '') { description = ''; } // provide default for license if (license === null || license.trim() === '') { license = ' '; // default to empty string } // create the publish params var publishParams = { name: name, file_path: filePath, bid: 0.01, metadata: { description: description, title: title, author: details.title, language: 'en', license: license, nsfw: nsfw }, claim_address: publishing.primaryClaimAddress }; // add thumbnail to channel if video if (thumbnail) { publishParams['metadata']['thumbnail'] = thumbnail; } return publishParams; }, createThumbnailPublishParams: function createThumbnailPublishParams(thumbnailFilePath, claimName, license, nsfw) { if (!thumbnailFilePath) { return; } logger.debug('Creating Thumbnail Publish Parameters'); // create the publish params return { name: claimName + '-thumb', file_path: thumbnailFilePath, bid: 0.01, metadata: { title: claimName + ' thumbnail', description: 'a thumbnail for ' + claimName, author: details.title, language: 'en', license: license, nsfw: nsfw }, claim_address: publishing.primaryClaimAddress, channel_name: publishing.thumbnailChannel, channel_id: publishing.thumbnailChannelId }; }, deleteTemporaryFile: function deleteTemporaryFile(filePath) { fs.unlink(filePath, function (err) { if (err) { logger.error('error deleting temporary file ' + filePath); throw err; } logger.debug('successfully deleted ' + filePath); }); }, addGetResultsToFileData: function addGetResultsToFileData(fileInfo, getResult) { fileInfo.fileName = getResult.file_name; fileInfo.filePath = getResult.download_path; return fileInfo; }, createFileData: function createFileData(_ref3) { var name = _ref3.name, claimId = _ref3.claimId, outpoint = _ref3.outpoint, height = _ref3.height, address = _ref3.address, nsfw = _ref3.nsfw, contentType = _ref3.contentType; return { name: name, claimId: claimId, outpoint: outpoint, height: height, address: address, fileName: '', filePath: '', fileType: contentType, nsfw: nsfw }; } }; /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var logger = __webpack_require__(2); module.exports = { handleErrorResponse: function handleErrorResponse(originalUrl, ip, error, res) { logger.error('Error on ' + originalUrl, module.exports.useObjectPropertiesIfNoKeys(error)); var _module$exports$retur = module.exports.returnErrorMessageAndStatus(error), _module$exports$retur2 = _slicedToArray(_module$exports$retur, 2), status = _module$exports$retur2[0], message = _module$exports$retur2[1]; res.status(status).json(module.exports.createErrorResponsePayload(status, message)); }, returnErrorMessageAndStatus: function returnErrorMessageAndStatus(error) { var status = void 0, message = void 0; // check for daemon being turned off if (error.code === 'ECONNREFUSED') { status = 503; message = 'Connection refused. The daemon may not be running.'; // fallback for everything else } else { status = 400; if (error.message) { message = error.message; } else { message = error; }; }; return [status, message]; }, useObjectPropertiesIfNoKeys: function useObjectPropertiesIfNoKeys(err) { if (Object.keys(err).length === 0) { var newErrorObject = {}; Object.getOwnPropertyNames(err).forEach(function (key) { newErrorObject[key] = err[key]; }); return newErrorObject; } return err; }, createErrorResponsePayload: function createErrorResponsePayload(status, message) { return { status: status, success: false, message: message }; } }; /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var db = __webpack_require__(6); var logger = __webpack_require__(2); var _require = __webpack_require__(80), returnPaginatedChannelClaims = _require.returnPaginatedChannelClaims; var NO_CHANNEL = 'NO_CHANNEL'; var NO_CLAIM = 'NO_CLAIM'; var NO_FILE = 'NO_FILE'; module.exports = { getClaimId: function getClaimId(channelName, channelClaimId, name, claimId) { if (channelName) { return module.exports.getClaimIdByChannel(channelName, channelClaimId, name); } else { return module.exports.getClaimIdByClaim(name, claimId); } }, getClaimIdByClaim: function getClaimIdByClaim(claimName, claimId) { logger.debug('getClaimIdByClaim(' + claimName + ', ' + claimId + ')'); return new Promise(function (resolve, reject) { db.Claim.getLongClaimId(claimName, claimId).then(function (longClaimId) { if (!longClaimId) { resolve(NO_CLAIM); } resolve(longClaimId); }).catch(function (error) { reject(error); }); }); }, getClaimIdByChannel: function getClaimIdByChannel(channelName, channelClaimId, claimName) { logger.debug('getClaimIdByChannel(' + channelName + ', ' + channelClaimId + ', ' + claimName + ')'); return new Promise(function (resolve, reject) { db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id .then(function (longChannelId) { if (!longChannelId) { return [null, null]; } return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]); // 2. get the long claim id }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), longChannelId = _ref2[0], longClaimId = _ref2[1]; if (!longChannelId) { return resolve(NO_CHANNEL); } if (!longClaimId) { return resolve(NO_CLAIM); } resolve(longClaimId); }).catch(function (error) { reject(error); }); }); }, getChannelData: function getChannelData(channelName, channelClaimId, page) { return new Promise(function (resolve, reject) { // 1. get the long channel Id (make sure channel exists) db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) { if (!longChannelClaimId) { return [null, null, null]; } // 2. get the short ID and all claims for that channel return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]); }).then(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), longChannelClaimId = _ref4[0], shortChannelClaimId = _ref4[1]; if (!longChannelClaimId) { return resolve(NO_CHANNEL); } // 3. return all the channel information resolve({ channelName: channelName, longChannelClaimId: longChannelClaimId, shortChannelClaimId: shortChannelClaimId }); }).catch(function (error) { reject(error); }); }); }, getChannelClaims: function getChannelClaims(channelName, channelClaimId, page) { return new Promise(function (resolve, reject) { // 1. get the long channel Id (make sure channel exists) db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) { if (!longChannelClaimId) { return [null, null, null]; } // 2. get the short ID and all claims for that channel return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]); }).then(function (_ref5) { var _ref6 = _slicedToArray(_ref5, 2), longChannelClaimId = _ref6[0], channelClaimsArray = _ref6[1]; if (!longChannelClaimId) { return resolve(NO_CHANNEL); } // 3. format the data for the view, including pagination var paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page); // 4. return all the channel information and contents resolve(paginatedChannelViewData); }).catch(function (error) { reject(error); }); }); }, getLocalFileRecord: function getLocalFileRecord(claimId, name) { return db.File.findOne({ where: { claimId: claimId, name: name } }).then(function (file) { if (!file) { return NO_FILE; } return file.dataValues; }); } }; /***/ }), /* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _server = __webpack_require__(32); var _redux = __webpack_require__(18); var _reducers = __webpack_require__(33); var _reducers2 = _interopRequireDefault(_reducers); var _reactRedux = __webpack_require__(1); var _reactRouterDom = __webpack_require__(4); var _GAListener = __webpack_require__(38); var _GAListener2 = _interopRequireDefault(_GAListener); var _app = __webpack_require__(39); var _app2 = _interopRequireDefault(_app); var _renderFullPage = __webpack_require__(45); var _renderFullPage2 = _interopRequireDefault(_renderFullPage); var _reactHelmet = __webpack_require__(14); var _reactHelmet2 = _interopRequireDefault(_reactHelmet); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } module.exports = function (req, res) { var context = {}; // create a new Redux store instance var store = (0, _redux.createStore)(_reducers2.default); // render component to a string var html = (0, _server.renderToString)(_react2.default.createElement( _reactRedux.Provider, { store: store }, _react2.default.createElement( _reactRouterDom.StaticRouter, { location: req.url, context: context }, _react2.default.createElement( _GAListener2.default, null, _react2.default.createElement(_app2.default, null) ) ) )); // get head tags from helmet var helmet = _reactHelmet2.default.renderStatic(); // check for a redirect if (context.url) { // Somewhere a `` was rendered return res.redirect(301, context.url); } else {} // we're good, send the response // get the initial state from our Redux store var preloadedState = store.getState(); // send the rendered page back to the client res.send((0, _renderFullPage2.default)(helmet, html, preloadedState)); }; /***/ }), /* 32 */ /***/ (function(module, exports) { module.exports = require("react-dom/server"); /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _redux = __webpack_require__(18); var _publish = __webpack_require__(82); var _publish2 = _interopRequireDefault(_publish); var _channel = __webpack_require__(83); var _channel2 = _interopRequireDefault(_channel); var _show = __webpack_require__(84); var _show2 = _interopRequireDefault(_show); var _site = __webpack_require__(85); var _site2 = _interopRequireDefault(_site); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = (0, _redux.combineReducers)({ channel: _channel2.default, publish: _publish2.default, show: _show2.default, site: _site2.default }); /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var FILE_SELECTED = exports.FILE_SELECTED = 'FILE_SELECTED'; var FILE_CLEAR = exports.FILE_CLEAR = 'FILE_CLEAR'; var METADATA_UPDATE = exports.METADATA_UPDATE = 'METADATA_UPDATE'; var CLAIM_UPDATE = exports.CLAIM_UPDATE = 'CLAIM_UPDATE'; var SET_PUBLISH_IN_CHANNEL = exports.SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL'; var PUBLISH_STATUS_UPDATE = exports.PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE'; var ERROR_UPDATE = exports.ERROR_UPDATE = 'ERROR_UPDATE'; var SELECTED_CHANNEL_UPDATE = exports.SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE'; var TOGGLE_METADATA_INPUTS = exports.TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS'; var THUMBNAIL_NEW = exports.THUMBNAIL_NEW = 'THUMBNAIL_NEW'; var PUBLISH_START = exports.PUBLISH_START = 'PUBLISH_START'; /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LOGIN = exports.LOGIN = 'Existing'; var CREATE = exports.CREATE = 'New'; /***/ }), /* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CHANNEL_UPDATE = exports.CHANNEL_UPDATE = 'CHANNEL_UPDATE'; /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LOCAL_CHECK = exports.LOCAL_CHECK = 'LOCAL_CHECK'; var UNAVAILABLE = exports.UNAVAILABLE = 'UNAVAILABLE'; var ERROR = exports.ERROR = 'ERROR'; var AVAILABLE = exports.AVAILABLE = 'AVAILABLE'; /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactGa = __webpack_require__(86); var _reactGa2 = _interopRequireDefault(_reactGa); var _reactRouterDom = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _require = __webpack_require__(3), googleId = _require.analytics; _reactGa2.default.initialize(googleId); var GAListener = function (_React$Component) { _inherits(GAListener, _React$Component); function GAListener() { _classCallCheck(this, GAListener); return _possibleConstructorReturn(this, (GAListener.__proto__ || Object.getPrototypeOf(GAListener)).apply(this, arguments)); } _createClass(GAListener, [{ key: 'componentDidMount', value: function componentDidMount() { this.sendPageView(this.props.history.location); this.props.history.listen(this.sendPageView); } }, { key: 'sendPageView', value: function sendPageView(location) { _reactGa2.default.set({ page: location.pathname }); _reactGa2.default.pageview(location.pathname); } }, { key: 'render', value: function render() { return this.props.children; } }]); return GAListener; }(_react2.default.Component); exports.default = (0, _reactRouterDom.withRouter)(GAListener); /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); var _HomePage = __webpack_require__(87); var _HomePage2 = _interopRequireDefault(_HomePage); var _AboutPage = __webpack_require__(123); var _AboutPage2 = _interopRequireDefault(_AboutPage); var _LoginPage = __webpack_require__(124); var _LoginPage2 = _interopRequireDefault(_LoginPage); var _ShowPage = __webpack_require__(126); var _ShowPage2 = _interopRequireDefault(_ShowPage); var _FourOhFourPage = __webpack_require__(142); var _FourOhFourPage2 = _interopRequireDefault(_FourOhFourPage); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var App = function App() { return _react2.default.createElement( _reactRouterDom.Switch, null, _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/', component: _HomePage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/about', component: _AboutPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/login', component: _LoginPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:identifier/:claim', component: _ShowPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:claim', component: _ShowPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { component: _FourOhFourPage2.default }) ); }; exports.default = App; /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(5); var _view = __webpack_require__(97); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var publish = _ref.publish; return { file: publish.file, thumbnail: publish.thumbnail, fileError: publish.error.file }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { selectFile: function selectFile(file) { dispatch((0, _publish.selectFile)(file)); }, setFileError: function setFileError(value) { dispatch((0, _publish.clearFile)()); dispatch((0, _publish.updateError)('file', value)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _channel = __webpack_require__(19); var _view = __webpack_require__(114); var _view2 = _interopRequireDefault(_view); var _publish = __webpack_require__(5); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onChannelLogin: function onChannelLogin(name, shortId, longId) { dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId)); dispatch((0, _publish.updateSelectedChannel)(name)); } }; }; exports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default); /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _channel = __webpack_require__(19); var _view = __webpack_require__(115); var _view2 = _interopRequireDefault(_view); var _publish = __webpack_require__(5); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onChannelLogin: function onChannelLogin(name, shortId, longId) { dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId)); dispatch((0, _publish.updateSelectedChannel)(name)); } }; }; exports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default); /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CHANNEL = exports.CHANNEL = 'CHANNEL'; var ASSET_LITE = exports.ASSET_LITE = 'ASSET_LITE'; var ASSET_DETAILS = exports.ASSET_DETAILS = 'ASSET_DETAILS'; /***/ }), /* 44 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(130); var _view2 = _interopRequireDefault(_view); var _show = __webpack_require__(8); var _show2 = __webpack_require__(13); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select error and status var error = show.displayAsset.error; var status = show.displayAsset.status; // select asset var asset = (0, _show2.selectAsset)(show); // return props return { error: error, status: status, asset: asset }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onFileRequest: function onFileRequest(name, claimId) { dispatch((0, _show.fileRequested)(name, claimId)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (helmet, html, preloadedState) { // take the html and preloadedState and return the full page return '\n \n \n \n \n \n \n \n ' + helmet.title.toString() + '\n ' + helmet.meta.toString() + '\n ' + helmet.link.toString() + '\n \n \n \n \n \n \n \n \n
\n
' + html + '
\n
\n \n \n \n \n '; }; /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(47); __webpack_require__(48); module.exports = __webpack_require__(49); /***/ }), /* 47 */ /***/ (function(module, exports) { module.exports = require("babel-polyfill"); /***/ }), /* 48 */ /***/ (function(module, exports) { module.exports = require("whatwg-fetch"); /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // app dependencies var express = __webpack_require__(50); var bodyParser = __webpack_require__(51); var expressHandlebars = __webpack_require__(52); var Handlebars = __webpack_require__(53); var helmet = __webpack_require__(54); var passport = __webpack_require__(22); var _require = __webpack_require__(55), populateLocalsDotUser = _require.populateLocalsDotUser, serializeSpeechUser = _require.serializeSpeechUser, deserializeSpeechUser = _require.deserializeSpeechUser; var cookieSession = __webpack_require__(56); var http = __webpack_require__(57); // logging dependencies var logger = __webpack_require__(2); function SpeechServer(_ref) { var _this = this; var mysqlConfig = _ref.mysqlConfig, siteConfig = _ref.siteConfig, slackConfig = _ref.slackConfig; this.PORT = 3000; this.start = function () { _this.configureConfigFiles(); _this.configureLogging(); _this.configureApp(); _this.configureServer(); _this.startServer(); }; this.configureConfigFiles = function () { var mysqlAppConfig = __webpack_require__(23); mysqlAppConfig.configure(mysqlConfig); var siteAppConfig = __webpack_require__(3); siteAppConfig.configure(siteConfig); var slackAppConfig = __webpack_require__(24); slackAppConfig.configure(slackConfig); }; this.configureLogging = function () { __webpack_require__(58)(logger); __webpack_require__(60)(logger); }; this.configureApp = function () { var app = express(); // create an Express application // trust the proxy to get ip address for us app.enable('trust proxy'); // add middleware app.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties app.use(express.static(__dirname + '/public')); // 'express.static' to serve static files from public directory app.use(bodyParser.json()); // 'body parser' for parsing application/json app.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded app.use(function (req, res, next) { // custom logging middleware to log all incoming http requests logger.verbose('Request on ' + req.originalUrl + ' from ' + req.ip); next(); }); // configure passport passport.serializeUser(serializeSpeechUser); passport.deserializeUser(deserializeSpeechUser); var localSignupStrategy = __webpack_require__(62); var localLoginStrategy = __webpack_require__(73); passport.use('local-signup', localSignupStrategy); passport.use('local-login', localLoginStrategy); // initialize passport app.use(cookieSession({ name: 'session', keys: [siteConfig.auth.sessionKey], maxAge: 24 * 60 * 60 * 1000 // i.e. 24 hours })); app.use(passport.initialize()); app.use(passport.session()); // configure handlebars & register it with express app var hbs = expressHandlebars.create({ defaultLayout: 'embed', handlebars: Handlebars }); app.engine('handlebars', hbs.engine); app.set('view engine', 'handlebars'); // middleware to pass user info back to client (for handlebars access), if user is logged in app.use(populateLocalsDotUser); // note: I don't think I need this any more? // set the routes on the app __webpack_require__(74)(app); __webpack_require__(75)(app); __webpack_require__(81)(app); __webpack_require__(143)(app); __webpack_require__(154)(app); _this.app = app; }; this.configureServer = function () { _this.server = http.Server(_this.app); }; this.startServer = function () { var db = __webpack_require__(6); // sync sequelize db.sequelize.sync() // start the server .then(function () { _this.server.listen(_this.PORT, function () { logger.info('Server is listening on PORT ' + _this.PORT); }); }).catch(function (error) { logger.error('Startup Error:', error); }); }; }; module.exports = SpeechServer; /***/ }), /* 50 */ /***/ (function(module, exports) { module.exports = require("express"); /***/ }), /* 51 */ /***/ (function(module, exports) { module.exports = require("body-parser"); /***/ }), /* 52 */ /***/ (function(module, exports) { module.exports = require("express-handlebars"); /***/ }), /* 53 */ /***/ (function(module, exports) { module.exports = require("handlebars"); /***/ }), /* 54 */ /***/ (function(module, exports) { module.exports = require("helmet"); /***/ }), /* 55 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); module.exports = { populateLocalsDotUser: function populateLocalsDotUser(req, res, next) { if (req.user) { logger.debug('populating res.locals.user'); res.locals.user = { id: req.user.id, userName: req.user.userName, channelName: req.user.channelName, channelClaimId: req.user.channelClaimId, shortChannelId: req.user.shortChannelId }; } next(); }, serializeSpeechUser: function serializeSpeechUser(user, done) { // returns user data to be serialized into session logger.debug('serializing user'); done(null, user); }, deserializeSpeechUser: function deserializeSpeechUser(user, done) { // deserializes session and populates additional info to req.user logger.debug('deserializing user'); done(null, user); } }; /***/ }), /* 56 */ /***/ (function(module, exports) { module.exports = require("cookie-session"); /***/ }), /* 57 */ /***/ (function(module, exports) { module.exports = require("http"); /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(59), logLevel = _require.logLevel; module.exports = function (winston) { // configure winston.configure({ transports: [new winston.transports.Console({ level: logLevel, timestamp: false, colorize: true, prettyPrint: true, handleExceptions: true, humanReadableUnhandledException: true })] }); // test all the log levels winston.error('Level 0'); winston.warn('Level 1'); winston.info('Level 2'); winston.verbose('Level 3'); winston.debug('Level 4'); winston.silly('Level 5'); }; /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var loggerConfig = { logLevel: 'debug' // options: silly, debug, verbose, info }; module.exports = loggerConfig; /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var winstonSlackWebHook = __webpack_require__(61).SlackWebHook; var slackConfig = __webpack_require__(24); module.exports = function (winston) { var slackWebHook = slackConfig.slackWebHook, slackErrorChannel = slackConfig.slackErrorChannel, slackInfoChannel = slackConfig.slackInfoChannel; if (slackWebHook) { // add a transport for errors to slack if (slackErrorChannel) { winston.add(winstonSlackWebHook, { name: 'slack-errors-transport', level: 'warn', webhookUrl: slackWebHook, channel: slackErrorChannel, username: 'spee.ch', iconEmoji: ':face_with_head_bandage:' }); }; if (slackInfoChannel) { winston.add(winstonSlackWebHook, { name: 'slack-info-transport', level: 'info', webhookUrl: slackWebHook, channel: slackInfoChannel, username: 'spee.ch', iconEmoji: ':nerd_face:' }); }; // send test message winston.error('Slack "error" logging is online.'); winston.info('Slack "info" logging is online.'); } else { winston.warn('Slack logging is not enabled because no slackWebHook config var provided.'); } }; /***/ }), /* 61 */ /***/ (function(module, exports) { module.exports = require("winston-slack-webhook"); /***/ }), /* 62 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var PassportLocalStrategy = __webpack_require__(25).Strategy; var lbryApi = __webpack_require__(16); var logger = __webpack_require__(2); var db = __webpack_require__(6); module.exports = new PassportLocalStrategy({ usernameField: 'username', passwordField: 'password' }, function (username, password, done) { logger.verbose('new channel signup request. user: ' + username + ' pass: ' + password + ' .'); var userInfo = {}; // server-side validaton of inputs (username, password) // create the channel and retrieve the metadata return lbryApi.createChannel('@' + username).then(function (tx) { // create user record var userData = { userName: username, password: password }; logger.verbose('userData >', userData); // create user record var channelData = { channelName: '@' + username, channelClaimId: tx.claim_id }; logger.verbose('channelData >', channelData); // create certificate record var certificateData = { claimId: tx.claim_id, name: '@' + username // address, }; logger.verbose('certificateData >', certificateData); // save user and certificate to db return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]); }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 3), newUser = _ref2[0], newChannel = _ref2[1], newCertificate = _ref2[2]; logger.verbose('user and certificate successfully created'); // store the relevant newUser info to be passed back for req.User userInfo['id'] = newUser.id; userInfo['userName'] = newUser.userName; userInfo['channelName'] = newChannel.channelName; userInfo['channelClaimId'] = newChannel.channelClaimId; // associate the instances return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]); }).then(function () { logger.verbose('user and certificate successfully associated'); return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName); }).then(function (shortChannelId) { userInfo['shortChannelId'] = shortChannelId; return done(null, userInfo); }).catch(function (error) { logger.error('signup error', error); return done(error); }); }); /***/ }), /* 63 */ /***/ (function(module, exports) { module.exports = require("axios"); /***/ }), /* 64 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var lbryConfig = { api: { apiHost: 'localhost', apiPort: '5279' } }; module.exports = lbryConfig; /***/ }), /* 65 */ /***/ (function(module, exports) { module.exports = require("universal-analytics"); /***/ }), /* 66 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var _require = __webpack_require__(27), returnShortId = _require.returnShortId; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, INTEGER = _ref.INTEGER, TEXT = _ref.TEXT, DECIMAL = _ref.DECIMAL; var Certificate = sequelize.define('Certificate', { address: { type: STRING, default: null }, amount: { type: DECIMAL(19, 8), default: null }, claimId: { type: STRING, default: null }, claimSequence: { type: INTEGER, default: null }, decodedClaim: { type: BOOLEAN, default: null }, depth: { type: INTEGER, default: null }, effectiveAmount: { type: DECIMAL(19, 8), default: null }, hasSignature: { type: BOOLEAN, default: null }, height: { type: INTEGER, default: null }, hex: { type: TEXT('long'), default: null }, name: { type: STRING, default: null }, nout: { type: INTEGER, default: null }, txid: { type: STRING, default: null }, validAtHeight: { type: INTEGER, default: null }, outpoint: { type: STRING, default: null }, valueVersion: { type: STRING, default: null }, claimType: { type: STRING, default: null }, certificateVersion: { type: STRING, default: null }, keyType: { type: STRING, default: null }, publicKey: { type: TEXT('long'), default: null } }, { freezeTableName: true }); Certificate.associate = function (db) { Certificate.belongsTo(db.Channel, { foreignKey: { allowNull: true } }); }; Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) { var _this = this; logger.debug('getShortChannelIdFromLongChannelId ' + channelName + ':' + longChannelId); return new Promise(function (resolve, reject) { _this.findAll({ where: { name: channelName }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: throw new Error('No channel(s) found with that channel name'); default: return resolve(returnShortId(result, longChannelId)); } }).catch(function (error) { reject(error); }); }); }; Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) { var _this2 = this; logger.debug('getLongChannelIdFromShortChannelId(' + channelName + ', ' + channelClaimId + ')'); return new Promise(function (resolve, reject) { _this2.findAll({ where: { name: channelName, claimId: { $like: channelClaimId + '%' } }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); default: // note results must be sorted return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Certificate.getLongChannelIdFromChannelName = function (channelName) { var _this3 = this; logger.debug('getLongChannelIdFromChannelName(' + channelName + ')'); return new Promise(function (resolve, reject) { _this3.findAll({ where: { name: channelName }, order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); default: return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Certificate.validateLongChannelId = function (name, claimId) { var _this4 = this; logger.debug('validateLongChannelId(' + name + ', ' + claimId + ')'); return new Promise(function (resolve, reject) { _this4.findOne({ where: { name: name, claimId: claimId } }).then(function (result) { if (!result) { return resolve(null); }; resolve(claimId); }).catch(function (error) { reject(error); }); }); }; Certificate.getLongChannelId = function (channelName, channelClaimId) { logger.debug('getLongChannelId(' + channelName + ', ' + channelClaimId + ')'); if (channelClaimId && channelClaimId.length === 40) { // if a full channel id is provided return this.validateLongChannelId(channelName, channelClaimId); } else if (channelClaimId && channelClaimId.length < 40) { // if a short channel id is provided return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId); } else { return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided } }; return Certificate; }; /***/ }), /* 67 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING; var Channel = sequelize.define('Channel', { channelName: { type: STRING, allowNull: false }, channelClaimId: { type: STRING, allowNull: false } }, { freezeTableName: true }); Channel.associate = function (db) { Channel.belongsTo(db.User); Channel.hasOne(db.Certificate); }; return Channel; }; /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var _require = __webpack_require__(27), returnShortId = _require.returnShortId; var _require2 = __webpack_require__(3), defaultThumbnail = _require2.assetDefaults.thumbnail, host = _require2.details.host; function determineFileExtensionFromContentType(contentType) { switch (contentType) { case 'image/jpeg': case 'image/jpg': return 'jpeg'; case 'image/png': return 'png'; case 'image/gif': return 'gif'; case 'video/mp4': return 'mp4'; default: logger.debug('setting unknown file type as file extension jpeg'); return 'jpeg'; } }; function determineThumbnail(storedThumbnail, defaultThumbnail) { if (storedThumbnail === '') { return defaultThumbnail; } return storedThumbnail; }; function prepareClaimData(claim) { // logger.debug('preparing claim data based on resolved data:', claim); claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail); claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType); claim['host'] = host; return claim; }; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, INTEGER = _ref.INTEGER, TEXT = _ref.TEXT, DECIMAL = _ref.DECIMAL; var Claim = sequelize.define('Claim', { address: { type: STRING, default: null }, amount: { type: DECIMAL(19, 8), default: null }, claimId: { type: STRING, default: null }, claimSequence: { type: INTEGER, default: null }, decodedClaim: { type: BOOLEAN, default: null }, depth: { type: INTEGER, default: null }, effectiveAmount: { type: DECIMAL(19, 8), default: null }, hasSignature: { type: BOOLEAN, default: null }, height: { type: INTEGER, default: null }, hex: { type: TEXT('long'), default: null }, name: { type: STRING, default: null }, nout: { type: INTEGER, default: null }, txid: { type: STRING, default: null }, validAtHeight: { type: INTEGER, default: null }, outpoint: { type: STRING, default: null }, claimType: { type: STRING, default: null }, certificateId: { type: STRING, default: null }, author: { type: STRING, default: null }, description: { type: TEXT('long'), default: null }, language: { type: STRING, default: null }, license: { type: STRING, default: null }, licenseUrl: { type: STRING, default: null }, nsfw: { type: BOOLEAN, default: null }, preview: { type: STRING, default: null }, thumbnail: { type: STRING, default: null }, title: { type: STRING, default: null }, metadataVersion: { type: STRING, default: null }, contentType: { type: STRING, default: null }, source: { type: STRING, default: null }, sourceType: { type: STRING, default: null }, sourceVersion: { type: STRING, default: null }, streamVersion: { type: STRING, default: null }, valueVersion: { type: STRING, default: null }, channelName: { type: STRING, allowNull: true, default: null } }, { freezeTableName: true }); Claim.associate = function (db) { Claim.belongsTo(db.File, { foreignKey: { allowNull: true } }); }; Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) { var _this = this; logger.debug('Claim.getShortClaimIdFromLongClaimId for ' + claimName + '#' + claimId); return new Promise(function (resolve, reject) { _this.findAll({ where: { name: claimName }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: throw new Error('No claim(s) found with that claim name'); default: resolve(returnShortId(result, claimId)); } }).catch(function (error) { reject(error); }); }); }; Claim.getAllChannelClaims = function (channelClaimId) { var _this2 = this; logger.debug('Claim.getAllChannelClaims for ' + channelClaimId); return new Promise(function (resolve, reject) { _this2.findAll({ where: { certificateId: channelClaimId }, order: [['height', 'ASC']], raw: true // returns an array of only data, not an array of instances }).then(function (channelClaimsArray) { // logger.debug('channelclaimsarray length:', channelClaimsArray.length); switch (channelClaimsArray.length) { case 0: return resolve(null); default: channelClaimsArray.forEach(function (claim) { claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType); claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail); return claim; }); return resolve(channelClaimsArray); } }).catch(function (error) { reject(error); }); }); }; Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) { var _this3 = this; logger.debug('finding claim id for claim ' + claimName + ' from channel ' + channelClaimId); return new Promise(function (resolve, reject) { _this3.findAll({ where: { name: claimName, certificateId: channelClaimId }, order: [['id', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); case 1: return resolve(result[0].claimId); default: logger.error(result.length + ' records found for "' + claimName + '" in channel "' + channelClaimId + '"'); return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Claim.getLongClaimIdFromShortClaimId = function (name, shortId) { var _this4 = this; return new Promise(function (resolve, reject) { _this4.findAll({ where: { name: name, claimId: { $like: shortId + '%' } }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); default: // note results must be sorted return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Claim.getTopFreeClaimIdByClaimName = function (name) { var _this5 = this; return new Promise(function (resolve, reject) { _this5.findAll({ where: { name: name }, order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] // note: maybe height and effective amount need to switch? }).then(function (result) { logger.debug('length of result', result.length); switch (result.length) { case 0: return resolve(null); default: return resolve(result[0].dataValues.claimId); } }).catch(function (error) { reject(error); }); }); }; Claim.validateLongClaimId = function (name, claimId) { var _this6 = this; return new Promise(function (resolve, reject) { _this6.findOne({ where: { name: name, claimId: claimId } }).then(function (result) { if (!result) { return resolve(null); }; resolve(claimId); }).catch(function (error) { reject(error); }); }); }; Claim.getLongClaimId = function (claimName, claimId) { logger.debug('getLongClaimId(' + claimName + ', ' + claimId + ')'); if (claimId && claimId.length === 40) { // if a full claim id is provided return this.validateLongClaimId(claimName, claimId); } else if (claimId && claimId.length < 40) { return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided } else { return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided } }; Claim.resolveClaim = function (name, claimId) { var _this7 = this; logger.debug('Claim.resolveClaim: ' + name + ' ' + claimId); return new Promise(function (resolve, reject) { _this7.findAll({ where: { name: name, claimId: claimId } }).then(function (claimArray) { switch (claimArray.length) { case 0: return resolve(null); case 1: return resolve(prepareClaimData(claimArray[0].dataValues)); default: logger.error('more than one record matches ' + name + '#' + claimId + ' in db.Claim'); return resolve(prepareClaimData(claimArray[0].dataValues)); } }).catch(function (error) { reject(error); }); }); }; return Claim; }; /***/ }), /* 69 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, INTEGER = _ref.INTEGER; var File = sequelize.define('File', { name: { type: STRING, allowNull: false }, claimId: { type: STRING, allowNull: false }, address: { type: STRING, allowNull: false }, outpoint: { type: STRING, allowNull: false }, height: { type: INTEGER, allowNull: false, default: 0 }, fileName: { type: STRING, allowNull: false }, filePath: { type: STRING, allowNull: false }, fileType: { type: STRING }, nsfw: { type: BOOLEAN, allowNull: false, defaultValue: false }, trendingEligible: { type: BOOLEAN, allowNull: false, defaultValue: true } }, { freezeTableName: true }); File.associate = function (db) { File.hasMany(db.Request); File.hasOne(db.Claim); }; File.getRecentClaims = function () { return this.findAll({ where: { nsfw: false, trendingEligible: true }, order: [['createdAt', 'DESC']], limit: 25 }); }; return File; }; /***/ }), /* 70 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, TEXT = _ref.TEXT; var Request = sequelize.define('Request', { action: { type: STRING, allowNull: false }, url: { type: STRING, allowNull: false }, ipAddress: { type: STRING, allowNull: true }, result: { type: TEXT('long'), allowNull: true, default: null } }, { freezeTableName: true }); Request.associate = function (db) { Request.belongsTo(db.File, { foreignKey: { allowNull: true } }); }; return Request; }; /***/ }), /* 71 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var bcrypt = __webpack_require__(72); var logger = __webpack_require__(2); module.exports = function (sequelize, _ref) { var STRING = _ref.STRING; var User = sequelize.define('User', { userName: { type: STRING, allowNull: false }, password: { type: STRING, allowNull: false } }, { freezeTableName: true }); User.associate = function (db) { User.hasOne(db.Channel); }; User.prototype.comparePassword = function (password) { return bcrypt.compare(password, this.password); }; User.prototype.changePassword = function (newPassword) { var _this = this; return new Promise(function (resolve, reject) { // generate a salt string to use for hashing bcrypt.genSalt(function (saltError, salt) { if (saltError) { logger.error('salt error', saltError); reject(saltError); return; } // generate a hashed version of the user's password bcrypt.hash(newPassword, salt, function (hashError, hash) { // if there is an error with the hash generation return the error if (hashError) { logger.error('hash error', hashError); reject(hashError); return; } // replace the current password with the new hash _this.update({ password: hash }).then(function () { resolve(); }).catch(function (error) { reject(error); }); }); }); }); }; // pre-save hook method to hash the user's password before the user's info is saved to the db. User.hook('beforeCreate', function (user, options) { logger.debug('User.beforeCreate hook...'); return new Promise(function (resolve, reject) { // generate a salt string to use for hashing bcrypt.genSalt(function (saltError, salt) { if (saltError) { logger.error('salt error', saltError); reject(saltError); return; } // generate a hashed version of the user's password bcrypt.hash(user.password, salt, function (hashError, hash) { // if there is an error with the hash generation return the error if (hashError) { logger.error('hash error', hashError); reject(hashError); return; } // replace the password string with the hash password value user.password = hash; resolve(); }); }); }); }); return User; }; /***/ }), /* 72 */ /***/ (function(module, exports) { module.exports = require("bcrypt"); /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var PassportLocalStrategy = __webpack_require__(25).Strategy; var logger = __webpack_require__(2); var db = __webpack_require__(6); var returnUserAndChannelInfo = function returnUserAndChannelInfo(userInstance) { return new Promise(function (resolve, reject) { var userInfo = {}; userInfo['id'] = userInstance.id; userInfo['userName'] = userInstance.userName; userInstance.getChannel().then(function (_ref) { var channelName = _ref.channelName, channelClaimId = _ref.channelClaimId; userInfo['channelName'] = channelName; userInfo['channelClaimId'] = channelClaimId; return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName); }).then(function (shortChannelId) { userInfo['shortChannelId'] = shortChannelId; resolve(userInfo); }).catch(function (error) { reject(error); }); }); }; module.exports = new PassportLocalStrategy({ usernameField: 'username', passwordField: 'password' }, function (username, password, done) { return db.User.findOne({ where: { userName: username } }).then(function (user) { if (!user) { logger.debug('no user found'); return done(null, false, { message: 'Incorrect username or password' }); } return user.comparePassword(password).then(function (isMatch) { if (!isMatch) { logger.debug('incorrect password'); return done(null, false, { message: 'Incorrect username or password' }); } logger.debug('Password was a match, returning User'); return returnUserAndChannelInfo(user).then(function (userInfo) { return done(null, userInfo); }).catch(function (error) { return error; }); }).catch(function (error) { return error; }); }).catch(function (error) { return done(error); }); }); /***/ }), /* 74 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var passport = __webpack_require__(22); module.exports = function (app) { // route for sign up app.post('/signup', passport.authenticate('local-signup'), function (req, res) { logger.verbose('successful signup for ' + req.user.channelName); res.status(200).json({ success: true, channelName: req.user.channelName, channelClaimId: req.user.channelClaimId, shortChannelId: req.user.shortChannelId }); }); // route for log in app.post('/login', function (req, res, next) { passport.authenticate('local-login', function (err, user, info) { logger.debug('info:', info); if (err) { return next(err); } if (!user) { return res.status(400).json({ success: false, message: info.message }); } logger.debug('successful login'); req.logIn(user, function (err) { if (err) { return next(err); } return res.status(200).json({ success: true, channelName: req.user.channelName, channelClaimId: req.user.channelClaimId, shortChannelId: req.user.shortChannelId }); }); })(req, res, next); }); // route to log out app.get('/logout', function (req, res) { req.logout(); res.status(200).json({ success: true, message: 'you successfully logged out' }); }); // see if user is authenticated, and return credentials if so app.get('/user', function (req, res) { if (req.user) { res.status(200).json({ success: true, data: req.user }); } else { res.status(401).json({ success: false, message: 'user is not logged in' }); } }); }; /***/ }), /* 75 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var logger = __webpack_require__(2); var multipart = __webpack_require__(76); var _require = __webpack_require__(3), uploadDirectory = _require.publishing.uploadDirectory, host = _require.details.host; var multipartMiddleware = multipart({ uploadDir: uploadDirectory }); var db = __webpack_require__(6); var _require2 = __webpack_require__(77), claimNameIsAvailable = _require2.claimNameIsAvailable, checkChannelAvailability = _require2.checkChannelAvailability, publish = _require2.publish; var _require3 = __webpack_require__(16), getClaimList = _require3.getClaimList, resolveUri = _require3.resolveUri, getClaim = _require3.getClaim; var _require4 = __webpack_require__(28), addGetResultsToFileData = _require4.addGetResultsToFileData, createBasicPublishParams = _require4.createBasicPublishParams, createThumbnailPublishParams = _require4.createThumbnailPublishParams, parsePublishApiRequestBody = _require4.parsePublishApiRequestBody, parsePublishApiRequestFiles = _require4.parsePublishApiRequestFiles, createFileData = _require4.createFileData; var errorHandlers = __webpack_require__(29); var _require5 = __webpack_require__(17), sendGATimingEvent = _require5.sendGATimingEvent; var _require6 = __webpack_require__(79), authenticateUser = _require6.authenticateUser; var _require7 = __webpack_require__(30), getChannelData = _require7.getChannelData, getChannelClaims = _require7.getChannelClaims, getClaimId = _require7.getClaimId; var NO_CHANNEL = 'NO_CHANNEL'; var NO_CLAIM = 'NO_CLAIM'; module.exports = function (app) { // route to check whether site has published to a channel app.get('/api/channel/availability/:name', function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, name = _ref.params.name; var gaStartTime = Date.now(); checkChannelAvailability(name).then(function (availableName) { res.status(200).json(availableName); sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now()); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to get a short channel id from long channel Id app.get('/api/channel/short-id/:longId/:name', function (_ref2, res) { var ip = _ref2.ip, originalUrl = _ref2.originalUrl, params = _ref2.params; db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name).then(function (shortId) { res.status(200).json(shortId); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); app.get('/api/channel/data/:channelName/:channelClaimId', function (_ref3, res) { var ip = _ref3.ip, originalUrl = _ref3.originalUrl, body = _ref3.body, params = _ref3.params; var channelName = params.channelName; var channelClaimId = params.channelClaimId; if (channelClaimId === 'none') channelClaimId = null; getChannelData(channelName, channelClaimId, 0).then(function (data) { if (data === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'No matching channel was found' }); } res.status(200).json({ success: true, data: data }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); app.get('/api/channel/claims/:channelName/:channelClaimId/:page', function (_ref4, res) { var ip = _ref4.ip, originalUrl = _ref4.originalUrl, body = _ref4.body, params = _ref4.params; var channelName = params.channelName; var channelClaimId = params.channelClaimId; if (channelClaimId === 'none') channelClaimId = null; var page = params.page; getChannelClaims(channelName, channelClaimId, page).then(function (data) { if (data === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'No matching channel was found' }); } res.status(200).json({ success: true, data: data }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to run a claim_list request on the daemon app.get('/api/claim/list/:name', function (_ref5, res) { var ip = _ref5.ip, originalUrl = _ref5.originalUrl, params = _ref5.params; getClaimList(params.name).then(function (claimsList) { res.status(200).json(claimsList); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to get an asset app.get('/api/claim/get/:name/:claimId', function (_ref6, res) { var ip = _ref6.ip, originalUrl = _ref6.originalUrl, params = _ref6.params; var name = params.name; var claimId = params.claimId; // resolve the claim db.Claim.resolveClaim(name, claimId).then(function (resolveResult) { // make sure a claim actually exists at that uri if (!resolveResult) { throw new Error('No matching uri found in Claim table'); } var fileData = createFileData(resolveResult); // get the claim return Promise.all([fileData, getClaim(name + '#' + claimId)]); }).then(function (_ref7) { var _ref8 = _slicedToArray(_ref7, 2), fileData = _ref8[0], getResult = _ref8[1]; fileData = addGetResultsToFileData(fileData, getResult); return Promise.all([db.upsert(db.File, fileData, { name: name, claimId: claimId }, 'File'), getResult]); }).then(function (_ref9) { var _ref10 = _slicedToArray(_ref9, 2), fileRecord = _ref10[0], _ref10$ = _ref10[1], message = _ref10$.message, completed = _ref10$.completed; res.status(200).json({ success: true, message: message, completed: completed }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to check whether this site published to a claim app.get('/api/claim/availability/:name', function (_ref11, res) { var ip = _ref11.ip, originalUrl = _ref11.originalUrl, name = _ref11.params.name; var gaStartTime = Date.now(); claimNameIsAvailable(name).then(function (result) { res.status(200).json(result); sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now()); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to run a resolve request on the daemon app.get('/api/claim/resolve/:name/:claimId', function (_ref12, res) { var headers = _ref12.headers, ip = _ref12.ip, originalUrl = _ref12.originalUrl, params = _ref12.params; resolveUri(params.name + '#' + params.claimId).then(function (resolvedUri) { res.status(200).json(resolvedUri); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to run a publish request on the daemon app.post('/api/claim/publish', multipartMiddleware, function (_ref13, res) { var body = _ref13.body, files = _ref13.files, headers = _ref13.headers, ip = _ref13.ip, originalUrl = _ref13.originalUrl, user = _ref13.user; // define variables var channelName = void 0, channelId = void 0, channelPassword = void 0, description = void 0, fileName = void 0, filePath = void 0, fileType = void 0, gaStartTime = void 0, license = void 0, name = void 0, nsfw = void 0, thumbnail = void 0, thumbnailFileName = void 0, thumbnailFilePath = void 0, thumbnailFileType = void 0, title = void 0; // record the start time of the request gaStartTime = Date.now(); // validate the body and files of the request try { var _parsePublishApiReque = parsePublishApiRequestBody(body); // validateApiPublishRequest(body, files); name = _parsePublishApiReque.name; nsfw = _parsePublishApiReque.nsfw; license = _parsePublishApiReque.license; title = _parsePublishApiReque.title; description = _parsePublishApiReque.description; thumbnail = _parsePublishApiReque.thumbnail; var _parsePublishApiReque2 = parsePublishApiRequestFiles(files); fileName = _parsePublishApiReque2.fileName; filePath = _parsePublishApiReque2.filePath; fileType = _parsePublishApiReque2.fileType; thumbnailFileName = _parsePublishApiReque2.thumbnailFileName; thumbnailFilePath = _parsePublishApiReque2.thumbnailFilePath; thumbnailFileType = _parsePublishApiReque2.thumbnailFileType; channelName = body.channelName; channelId = body.channelId; channelPassword = body.channelPassword; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } // check channel authorization Promise.all([authenticateUser(channelName, channelId, channelPassword, user), claimNameIsAvailable(name), createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail), createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw)]).then(function (_ref14) { var _ref15 = _slicedToArray(_ref14, 4), _ref15$ = _ref15[0], channelName = _ref15$.channelName, channelClaimId = _ref15$.channelClaimId, validatedClaimName = _ref15[1], publishParams = _ref15[2], thumbnailPublishParams = _ref15[3]; // add channel details to the publish params if (channelName && channelClaimId) { publishParams['channel_name'] = channelName; publishParams['channel_id'] = channelClaimId; } // publish the thumbnail if (thumbnailPublishParams) { publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType); } // publish the asset return publish(publishParams, fileName, fileType); }).then(function (result) { res.status(200).json({ success: true, message: 'publish completed successfully', data: { name: name, claimId: result.claim_id, url: host + '/' + result.claim_id + '/' + name, lbryTx: result } }); // record the publish end time and send to google analytics sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now()); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to get a short claim id from long claim Id app.get('/api/claim/short-id/:longId/:name', function (_ref16, res) { var ip = _ref16.ip, originalUrl = _ref16.originalUrl, body = _ref16.body, params = _ref16.params; db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name).then(function (shortId) { res.status(200).json({ success: true, data: shortId }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); app.post('/api/claim/long-id', function (_ref17, res) { var ip = _ref17.ip, originalUrl = _ref17.originalUrl, body = _ref17.body, params = _ref17.params; logger.debug('body:', body); var channelName = body.channelName; var channelClaimId = body.channelClaimId; var claimName = body.claimName; var claimId = body.claimId; getClaimId(channelName, channelClaimId, claimName, claimId).then(function (result) { if (result === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'No matching channel could be found' }); } if (result === NO_CLAIM) { return res.status(404).json({ success: false, message: 'No matching claim id could be found' }); } res.status(200).json({ success: true, data: result }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); app.get('/api/claim/data/:claimName/:claimId', function (_ref18, res) { var ip = _ref18.ip, originalUrl = _ref18.originalUrl, body = _ref18.body, params = _ref18.params; var claimName = params.claimName; var claimId = params.claimId; if (claimId === 'none') claimId = null; db.Claim.resolveClaim(claimName, claimId).then(function (claimInfo) { if (!claimInfo) { return res.status(404).json({ success: false, message: 'No claim could be found' }); } res.status(200).json({ success: true, data: claimInfo }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to see if asset is available locally app.get('/api/file/availability/:name/:claimId', function (_ref19, res) { var ip = _ref19.ip, originalUrl = _ref19.originalUrl, params = _ref19.params; var name = params.name; var claimId = params.claimId; db.File.findOne({ where: { name: name, claimId: claimId } }).then(function (result) { if (result) { return res.status(200).json({ success: true, data: true }); } res.status(200).json({ success: true, data: false }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); }; /***/ }), /* 76 */ /***/ (function(module, exports) { module.exports = require("connect-multiparty"); /***/ }), /* 77 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var logger = __webpack_require__(2); var db = __webpack_require__(6); var lbryApi = __webpack_require__(16); var publishHelpers = __webpack_require__(28); var _require = __webpack_require__(3), _require$publishing = _require.publishing, primaryClaimAddress = _require$publishing.primaryClaimAddress, additionalClaimAddresses = _require$publishing.additionalClaimAddresses; var Sequelize = __webpack_require__(26); var Op = Sequelize.Op; module.exports = { publish: function publish(publishParams, fileName, fileType) { return new Promise(function (resolve, reject) { var publishResults = void 0, certificateId = void 0, channelName = void 0; // publish the file return lbryApi.publishClaim(publishParams).then(function (tx) { logger.info('Successfully published ' + publishParams.name + ' ' + fileName, tx); publishResults = tx; // get the channel information if (publishParams.channel_name) { logger.debug('this claim was published in channel: ' + publishParams.channel_name); return db.Channel.findOne({ where: { channelName: publishParams.channel_name } }); } else { logger.debug('this claim was not published in a channel'); return null; } }).then(function (channel) { // set channel information certificateId = null; channelName = null; if (channel) { certificateId = channel.channelClaimId; channelName = channel.channelName; } logger.debug('certificateId: ' + certificateId); }).then(function () { // create the File record var fileRecord = { name: publishParams.name, claimId: publishResults.claim_id, title: publishParams.metadata.title, description: publishParams.metadata.description, address: publishParams.claim_address, outpoint: publishResults.txid + ':' + publishResults.nout, height: 0, fileName: fileName, filePath: publishParams.file_path, fileType: fileType, nsfw: publishParams.metadata.nsfw }; // create the Claim record var claimRecord = { name: publishParams.name, claimId: publishResults.claim_id, title: publishParams.metadata.title, description: publishParams.metadata.description, address: publishParams.claim_address, thumbnail: publishParams.metadata.thumbnail, outpoint: publishResults.txid + ':' + publishResults.nout, height: 0, contentType: fileType, nsfw: publishParams.metadata.nsfw, amount: publishParams.bid, certificateId: certificateId, channelName: channelName }; // upsert criteria var upsertCriteria = { name: publishParams.name, claimId: publishResults.claim_id }; // upsert the records return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]); }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), file = _ref2[0], claim = _ref2[1]; logger.debug('File and Claim records successfully created'); return Promise.all([file.setClaim(claim), claim.setFile(file)]); }).then(function () { logger.debug('File and Claim records successfully associated'); resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim; }).catch(function (error) { logger.error('PUBLISH ERROR', error); publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file reject(error); }); }); }, claimNameIsAvailable: function claimNameIsAvailable(name) { var claimAddresses = additionalClaimAddresses || []; claimAddresses.push(primaryClaimAddress); // find any records where the name is used return db.Claim.findAll({ attributes: ['address'], where: { name: name, address: _defineProperty({}, Op.or, claimAddresses) } }).then(function (result) { if (result.length >= 1) { throw new Error('That claim is already in use'); }; return name; }).catch(function (error) { throw error; }); }, checkChannelAvailability: function checkChannelAvailability(name) { return db.Channel.findAll({ where: { channelName: name } }).then(function (result) { if (result.length >= 1) { throw new Error('That channel has already been claimed'); } return name; }).catch(function (error) { throw error; }); } }; /***/ }), /* 78 */ /***/ (function(module, exports) { module.exports = require("fs"); /***/ }), /* 79 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var db = __webpack_require__(6); var logger = __webpack_require__(2); module.exports = { authenticateUser: function authenticateUser(channelName, channelId, channelPassword, user) { // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided if (!channelName && !channelId) { return { channelName: null, channelClaimId: null }; } // case: channelName or channel Id are provided with user token if (user) { if (channelName && channelName !== user.channelName) { throw new Error('the provided channel name does not match user credentials'); } if (channelId && channelId !== user.channelClaimId) { throw new Error('the provided channel id does not match user credentials'); } return { channelName: user.channelName, channelClaimId: user.channelClaimId }; } // case: channelName or channel Id are provided with password instead of user token if (!channelPassword) throw new Error('no channel password provided'); return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword); }, authenticateChannelCredentials: function authenticateChannelCredentials(channelName, channelId, userPassword) { return new Promise(function (resolve, reject) { // hoisted variables var channelData = void 0; // build the params for finding the channel var channelFindParams = {}; if (channelName) channelFindParams['channelName'] = channelName; if (channelId) channelFindParams['channelClaimId'] = channelId; // find the channel db.Channel.findOne({ where: channelFindParams }).then(function (channel) { if (!channel) { logger.debug('no channel found'); throw new Error('Authentication failed, you do not have access to that channel'); } channelData = channel.get(); logger.debug('channel data:', channelData); return db.User.findOne({ where: { userName: channelData.channelName.substring(1) } }); }).then(function (user) { if (!user) { logger.debug('no user found'); throw new Error('Authentication failed, you do not have access to that channel'); } return user.comparePassword(userPassword); }).then(function (isMatch) { if (!isMatch) { logger.debug('incorrect password'); throw new Error('Authentication failed, you do not have access to that channel'); } logger.debug('...password was a match...'); resolve(channelData); }).catch(function (error) { reject(error); }); }); } }; /***/ }), /* 80 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var CLAIMS_PER_PAGE = 12; module.exports = { returnPaginatedChannelClaims: function returnPaginatedChannelClaims(channelName, longChannelClaimId, claims, page) { var totalPages = module.exports.determineTotalPages(claims); var paginationPage = module.exports.getPageFromQuery(page); var viewData = { channelName: channelName, longChannelClaimId: longChannelClaimId, claims: module.exports.extractPageFromClaims(claims, paginationPage), previousPage: module.exports.determinePreviousPage(paginationPage), currentPage: paginationPage, nextPage: module.exports.determineNextPage(totalPages, paginationPage), totalPages: totalPages, totalResults: module.exports.determineTotalClaims(claims) }; return viewData; }, getPageFromQuery: function getPageFromQuery(page) { if (page) { return parseInt(page); } return 1; }, extractPageFromClaims: function extractPageFromClaims(claims, pageNumber) { if (!claims) { return []; // if no claims, return this default } // logger.debug('claims is array?', Array.isArray(claims)); // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber)); var claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE; var claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE; var pageOfClaims = claims.slice(claimStartIndex, claimEndIndex); return pageOfClaims; }, determineTotalPages: function determineTotalPages(claims) { if (!claims) { return 0; } else { var totalClaims = claims.length; if (totalClaims < CLAIMS_PER_PAGE) { return 1; } var fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE); var remainder = totalClaims % CLAIMS_PER_PAGE; if (remainder === 0) { return fullPages; } return fullPages + 1; } }, determinePreviousPage: function determinePreviousPage(currentPage) { if (currentPage === 1) { return null; } return currentPage - 1; }, determineNextPage: function determineNextPage(totalPages, currentPage) { if (currentPage === totalPages) { return null; } return currentPage + 1; }, determineTotalClaims: function determineTotalClaims(claims) { if (!claims) { return 0; } return claims.length; } }; /***/ }), /* 81 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(3), host = _require.details; var handlePageRender = __webpack_require__(31); module.exports = function (app) { // route for the home page app.get('/', function (req, res) { handlePageRender(req, res); }); // route to display login page app.get('/login', function (req, res) { handlePageRender(req, res); }); // route to show 'about' page app.get('/about', function (req, res) { handlePageRender(req, res); }); // route to display a list of the trending images app.get('/trending', function (req, res) { res.status(301).redirect('/popular'); }); app.get('/popular', function (req, res) { handlePageRender(req, res); }); // route to display a list of the trending images app.get('/new', function (req, res) { handlePageRender(req, res); }); // route to send embedable video player (for twitter) app.get('/embed/:claimId/:name', function (_ref, res) { var params = _ref.params; var claimId = params.claimId; var name = params.name; // get and render the content res.status(200).render('embed', { layout: 'embed', host: host, claimId: claimId, name: name }); }); }; /***/ }), /* 82 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { case actions.FILE_SELECTED: return Object.assign({}, initialState, { // note: clears to initial state file: action.data }); case actions.FILE_CLEAR: return initialState; case actions.METADATA_UPDATE: return Object.assign({}, state, { metadata: Object.assign({}, state.metadata, _defineProperty({}, action.data.name, action.data.value)) }); case actions.CLAIM_UPDATE: return Object.assign({}, state, { claim: action.data }); case actions.SET_PUBLISH_IN_CHANNEL: return Object.assign({}, state, { publishInChannel: action.channel }); case actions.PUBLISH_STATUS_UPDATE: return Object.assign({}, state, { status: action.data }); case actions.ERROR_UPDATE: return Object.assign({}, state, { error: Object.assign({}, state.error, _defineProperty({}, action.data.name, action.data.value)) }); case actions.SELECTED_CHANNEL_UPDATE: return Object.assign({}, state, { selectedChannel: action.data }); case actions.TOGGLE_METADATA_INPUTS: return Object.assign({}, state, { showMetadataInputs: action.data }); case actions.THUMBNAIL_NEW: return Object.assign({}, state, { thumbnail: action.data }); default: return state; } }; var _publish_action_types = __webpack_require__(34); var actions = _interopRequireWildcard(_publish_action_types); var _publish_channel_select_states = __webpack_require__(35); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var _require = __webpack_require__(3), publishing = _require.publishing; var initialState = { disabled: publishing.disabled, disabledMessage: publishing.disabledMessage, publishInChannel: false, selectedChannel: _publish_channel_select_states.LOGIN, showMetadataInputs: false, status: { status: null, message: null }, error: { file: null, url: null, channel: null, publishSubmit: null }, file: null, claim: '', metadata: { title: '', description: '', license: '', nsfw: false }, thumbnail: null }; /***/ }), /* 83 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { case actions.CHANNEL_UPDATE: return Object.assign({}, state, { loggedInChannel: action.data }); default: return state; } }; var _channel_action_types = __webpack_require__(36); var actions = _interopRequireWildcard(_channel_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var initialState = { loggedInChannel: { name: null, shortId: null, longId: null } }; /***/ }), /* 84 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { // handle request case actions.REQUEST_ERROR: return Object.assign({}, state, { request: Object.assign({}, state.request, { error: action.data }) }); case actions.REQUEST_UPDATE: return Object.assign({}, state, { request: Object.assign({}, state.request, { type: action.data.requestType, id: action.data.requestId }) }); // store requests case actions.REQUEST_LIST_ADD: return Object.assign({}, state, { requestList: Object.assign({}, state.requestList, _defineProperty({}, action.data.id, { error: action.data.error, key: action.data.key })) }); // asset data case actions.ASSET_ADD: return Object.assign({}, state, { assetList: Object.assign({}, state.assetList, _defineProperty({}, action.data.id, { error: action.data.error, name: action.data.name, claimId: action.data.claimId, shortId: action.data.shortId, claimData: action.data.claimData })) }); // channel data case actions.CHANNEL_ADD: return Object.assign({}, state, { channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.id, { name: action.data.name, longId: action.data.longId, shortId: action.data.shortId, claimsData: action.data.claimsData })) }); case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS: return Object.assign({}, state, { channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.channelListId, Object.assign({}, state.channelList[action.data.channelListId], { claimsData: action.data.claimsData }))) }); // display an asset case actions.FILE_AVAILABILITY_UPDATE: return Object.assign({}, state, { displayAsset: Object.assign({}, state.displayAsset, { status: action.data }) }); case actions.DISPLAY_ASSET_ERROR: return Object.assign({}, state, { displayAsset: Object.assign({}, state.displayAsset, { error: action.data, status: _asset_display_states.ERROR }) }); default: return state; } }; var _show_action_types = __webpack_require__(12); var actions = _interopRequireWildcard(_show_action_types); var _asset_display_states = __webpack_require__(37); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var initialState = { request: { error: null, type: null, id: null }, requestList: {}, channelList: {}, assetList: {}, displayAsset: { error: null, status: _asset_display_states.LOCAL_CHECK } }; /***/ }), /* 85 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { default: return state; } }; var _require = __webpack_require__(3), host = _require.details.host; var initialState = { host: host }; /***/ }), /* 86 */ /***/ (function(module, exports) { module.exports = require("react-ga"); /***/ }), /* 87 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _SEO = __webpack_require__(9); var _SEO2 = _interopRequireDefault(_SEO); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _PublishTool = __webpack_require__(95); var _PublishTool2 = _interopRequireDefault(_PublishTool); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var HomePage = function (_React$Component) { _inherits(HomePage, _React$Component); function HomePage() { _classCallCheck(this, HomePage); return _possibleConstructorReturn(this, (HomePage.__proto__ || Object.getPrototypeOf(HomePage)).apply(this, arguments)); } _createClass(HomePage, [{ key: 'render', value: function render() { return _react2.default.createElement( 'div', { className: 'row row--tall flex-container--column' }, _react2.default.createElement(_SEO2.default, null), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--tall row--padded flex-container--column' }, _react2.default.createElement(_PublishTool2.default, null) ) ); } }]); return HomePage; }(_react2.default.Component); ; exports.default = HomePage; /***/ }), /* 88 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _require = __webpack_require__(3), title = _require.details.title; var createPageTitle = exports.createPageTitle = function createPageTitle(pageTitle) { if (!pageTitle) { return '' + title; } return title + ' - ' + pageTitle; }; /***/ }), /* 89 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _require = __webpack_require__(3), _require$details = _require.details, title = _require$details.title, host = _require$details.host, description = _require$details.description, _require$assetDefault = _require.assetDefaults, defaultThumbnail = _require$assetDefault.thumbnail, defaultDescription = _require$assetDefault.description; var determineOgThumbnailContentType = function determineOgThumbnailContentType(thumbnail) { if (thumbnail) { var fileExt = thumbnail.substring(thumbnail.lastIndexOf('.')); switch (fileExt) { case 'jpeg': case 'jpg': return 'image/jpeg'; case 'png': return 'image/png'; case 'gif': return 'image/gif'; case 'mp4': return 'video/mp4'; default: return 'image/jpeg'; } } return ''; }; var createBasicMetaTags = function createBasicMetaTags() { return [{ property: 'og:title', content: title }, { property: 'og:url', content: host }, { property: 'og:site_name', content: title }, { property: 'og:description', content: description }, { property: 'twitter:site', content: '@spee_ch' }, { property: 'twitter:card', content: 'summary' }]; }; var createChannelMetaTags = function createChannelMetaTags(channel) { var name = channel.name, longId = channel.longId; return [{ property: 'og:title', content: name + ' on ' + title }, { property: 'og:url', content: host + '/' + name + ':' + longId }, { property: 'og:site_name', content: title }, { property: 'og:description', content: name + ', a channel on ' + title }, { property: 'twitter:site', content: '@spee_ch' }, { property: 'twitter:card', content: 'summary' }]; }; var createAssetMetaTags = function createAssetMetaTags(asset) { var claimData = asset.claimData; var contentType = claimData.contentType; var embedUrl = host + '/' + claimData.claimId + '/' + claimData.name; var showUrl = host + '/' + claimData.claimId + '/' + claimData.name; var source = host + '/' + claimData.claimId + '/' + claimData.name + '.' + claimData.fileExt; var ogTitle = claimData.title || claimData.name; var ogDescription = claimData.description || defaultDescription; var ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail); var ogThumbnail = claimData.thumbnail || defaultThumbnail; var metaTags = [{ property: 'og:title', content: ogTitle }, { property: 'og:url', content: showUrl }, { property: 'og:site_name', content: title }, { property: 'og:description', content: ogDescription }, { property: 'og:image:width', content: 600 }, { property: 'og:image:height', content: 315 }, { property: 'twitter:site', content: '@spee_ch' }]; if (contentType === 'video/mp4' || contentType === 'video/webm') { metaTags.push({ property: 'og:video', content: source }); metaTags.push({ property: 'og:video:secure_url', content: source }); metaTags.push({ property: 'og:video:type', content: contentType }); metaTags.push({ property: 'og:image', content: ogThumbnail }); metaTags.push({ property: 'og:image:type', content: ogThumbnailContentType }); metaTags.push({ property: 'og:type', content: 'video' }); metaTags.push({ property: 'twitter:card', content: 'player' }); metaTags.push({ property: 'twitter:player', content: embedUrl }); metaTags.push({ property: 'twitter:player:width', content: 600 }); metaTags.push({ property: 'twitter:text:player_width', content: 600 }); metaTags.push({ property: 'twitter:player:height', content: 337 }); metaTags.push({ property: 'twitter:player:stream', content: source }); metaTags.push({ property: 'twitter:player:stream:content_type', content: contentType }); } else { metaTags.push({ property: 'og:image', content: source }); metaTags.push({ property: 'og:image:type', content: contentType }); metaTags.push({ property: 'og:type', content: 'article' }); metaTags.push({ property: 'twitter:card', content: 'summary_large_image' }); } return metaTags; }; var createMetaTags = exports.createMetaTags = function createMetaTags(asset, channel) { if (asset) { return createAssetMetaTags(asset); }; if (channel) { return createChannelMetaTags(channel); }; return createBasicMetaTags(); }; /***/ }), /* 90 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _require = __webpack_require__(3), host = _require.details.host; var createBasicCanonicalLink = function createBasicCanonicalLink(page) { if (!page) { return '' + host; }; return host + '/' + page; }; var createAssetCanonicalLink = function createAssetCanonicalLink(asset) { var channelName = void 0, certificateId = void 0, name = void 0, claimId = void 0; if (asset.claimData) { var _asset$claimData = asset.claimData; channelName = _asset$claimData.channelName; certificateId = _asset$claimData.certificateId; name = _asset$claimData.name; claimId = _asset$claimData.claimId; }; if (channelName) { return host + '/' + channelName + ':' + certificateId + '/' + name; }; return host + '/' + claimId + '/' + name; }; var createChannelCanonicalLink = function createChannelCanonicalLink(channel) { var name = channel.name, longId = channel.longId; return host + '/' + name + ':' + longId; }; var createCanonicalLink = exports.createCanonicalLink = function createCanonicalLink(asset, channel, page) { if (asset) { return createAssetCanonicalLink(asset); } if (channel) { return createChannelCanonicalLink(channel); } if (page) { return createBasicCanonicalLink(page); } return createBasicCanonicalLink(); }; /***/ }), /* 91 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); var _Logo = __webpack_require__(92); var _Logo2 = _interopRequireDefault(_Logo); var _NavBarChannelOptionsDropdown = __webpack_require__(93); var _NavBarChannelOptionsDropdown2 = _interopRequireDefault(_NavBarChannelOptionsDropdown); var _request = __webpack_require__(11); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var VIEW = 'VIEW'; var LOGOUT = 'LOGOUT'; var NavBar = function (_React$Component) { _inherits(NavBar, _React$Component); function NavBar(props) { _classCallCheck(this, NavBar); var _this = _possibleConstructorReturn(this, (NavBar.__proto__ || Object.getPrototypeOf(NavBar)).call(this, props)); _this.checkForLoggedInUser = _this.checkForLoggedInUser.bind(_this); _this.logoutUser = _this.logoutUser.bind(_this); _this.handleSelection = _this.handleSelection.bind(_this); return _this; } _createClass(NavBar, [{ key: 'componentDidMount', value: function componentDidMount() { // check to see if the user is already logged in this.checkForLoggedInUser(); } }, { key: 'checkForLoggedInUser', value: function checkForLoggedInUser() { var _this2 = this; var params = { credentials: 'include' }; (0, _request2.default)('/user', params).then(function (_ref) { var data = _ref.data; _this2.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId); }).catch(function (error) { console.log('/user error:', error.message); }); } }, { key: 'logoutUser', value: function logoutUser() { var _this3 = this; var params = { credentials: 'include' }; (0, _request2.default)('/logout', params).then(function () { _this3.props.onChannelLogout(); }).catch(function (error) { console.log('/logout error', error.message); }); } }, { key: 'handleSelection', value: function handleSelection(event) { var value = event.target.selectedOptions[0].value; switch (value) { case LOGOUT: this.logoutUser(); break; case VIEW: // redirect to channel page this.props.history.push('/' + this.props.channelName + ':' + this.props.channelLongId); break; default: break; } } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', { className: 'row row--wide nav-bar' }, _react2.default.createElement( 'div', { className: 'row row--padded row--short flex-container--row flex-container--space-between-center' }, _react2.default.createElement(_Logo2.default, null), _react2.default.createElement( 'div', { className: 'nav-bar--center' }, _react2.default.createElement( 'span', { className: 'nav-bar-tagline' }, 'Open-source, decentralized image and video sharing.' ) ), _react2.default.createElement( 'div', { className: 'nav-bar--right' }, _react2.default.createElement( _reactRouterDom.NavLink, { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/', exact: true }, 'Publish' ), _react2.default.createElement( _reactRouterDom.NavLink, { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/about' }, 'About' ), this.props.channelName ? _react2.default.createElement(_NavBarChannelOptionsDropdown2.default, { channelName: this.props.channelName, handleSelection: this.handleSelection, defaultSelection: this.props.channelName, VIEW: VIEW, LOGOUT: LOGOUT }) : _react2.default.createElement( _reactRouterDom.NavLink, { id: 'nav-bar-login-link', className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/login' }, 'Channel' ) ) ) ); } }]); return NavBar; }(_react2.default.Component); exports.default = (0, _reactRouterDom.withRouter)(NavBar); /***/ }), /* 92 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function Logo() { return _react2.default.createElement( 'svg', { version: '1.1', id: 'Layer_1', x: '0px', y: '0px', height: '24px', viewBox: '0 0 80 31', enableBackground: 'new 0 0 80 31', className: 'nav-bar-logo' }, _react2.default.createElement( _reactRouterDom.Link, { to: '/' }, _react2.default.createElement( 'title', null, 'Logo' ), _react2.default.createElement( 'desc', null, 'Spee.ch logo' ), _react2.default.createElement( 'g', { id: 'About' }, _react2.default.createElement( 'g', { id: 'Publish-Form-V2-_x28_filled_x29_', transform: 'translate(-42.000000, -23.000000)' }, _react2.default.createElement( 'g', { id: 'Group-17', transform: 'translate(42.000000, 22.000000)' }, _react2.default.createElement( 'text', { transform: 'matrix(1 0 0 1 0 20)', fontSize: '25', fontFamily: 'Roboto' }, 'Spee 10000000) { throw new Error('Sorry, images are limited to 10 megabytes.'); } break; case 'image/gif': if (file.size > 50000000) { throw new Error('Sorry, GIFs are limited to 50 megabytes.'); } break; case 'video/mp4': if (file.size > 50000000) { throw new Error('Sorry, videos are limited to 50 megabytes.'); } break; default: throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.'); } } }; /***/ }), /* 99 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(10); var _propTypes2 = _interopRequireDefault(_propTypes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Preview = function (_React$Component) { _inherits(Preview, _React$Component); function Preview(props) { _classCallCheck(this, Preview); var _this = _possibleConstructorReturn(this, (Preview.__proto__ || Object.getPrototypeOf(Preview)).call(this, props)); _this.state = { imgSource: '', defaultThumbnail: '/assets/img/video_thumb_default.png' }; return _this; } _createClass(Preview, [{ key: 'componentDidMount', value: function componentDidMount() { this.setPreviewImageSource(this.props.file); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(newProps) { if (newProps.file !== this.props.file) { this.setPreviewImageSource(newProps.file); } if (newProps.thumbnail !== this.props.thumbnail) { if (newProps.thumbnail) { this.setPreviewImageSourceFromFile(newProps.thumbnail); } else { this.setState({ imgSource: this.state.defaultThumbnail }); } } } }, { key: 'setPreviewImageSourceFromFile', value: function setPreviewImageSourceFromFile(file) { var _this2 = this; var previewReader = new FileReader(); previewReader.readAsDataURL(file); previewReader.onloadend = function () { _this2.setState({ imgSource: previewReader.result }); }; } }, { key: 'setPreviewImageSource', value: function setPreviewImageSource(file) { if (file.type !== 'video/mp4') { this.setPreviewImageSourceFromFile(file); } else { if (this.props.thumbnail) { this.setPreviewImageSourceFromFile(this.props.thumbnail); } this.setState({ imgSource: this.state.defaultThumbnail }); } } }, { key: 'render', value: function render() { return _react2.default.createElement('img', { id: 'dropzone-preview', src: this.state.imgSource, className: this.props.dimPreview ? 'dim' : '', alt: 'publish preview' }); } }]); return Preview; }(_react2.default.Component); ; Preview.propTypes = { dimPreview: _propTypes2.default.bool.isRequired, file: _propTypes2.default.object.isRequired, thumbnail: _propTypes2.default.object }; exports.default = Preview; /***/ }), /* 100 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(5); var _view = __webpack_require__(101); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel, publish = _ref.publish; return { file: publish.file }; }; var mapDispatchToProps = { clearFile: _publish.clearFile, startPublish: _publish.startPublish }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 101 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); var _Dropzone = __webpack_require__(40); var _Dropzone2 = _interopRequireDefault(_Dropzone); var _PublishTitleInput = __webpack_require__(102); var _PublishTitleInput2 = _interopRequireDefault(_PublishTitleInput); var _PublishUrlInput = __webpack_require__(104); var _PublishUrlInput2 = _interopRequireDefault(_PublishUrlInput); var _PublishThumbnailInput = __webpack_require__(107); var _PublishThumbnailInput2 = _interopRequireDefault(_PublishThumbnailInput); var _PublishMetadataInputs = __webpack_require__(109); var _PublishMetadataInputs2 = _interopRequireDefault(_PublishMetadataInputs); var _ChannelSelect = __webpack_require__(112); var _ChannelSelect2 = _interopRequireDefault(_ChannelSelect); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishDetails = function (_React$Component) { _inherits(PublishDetails, _React$Component); function PublishDetails(props) { _classCallCheck(this, PublishDetails); var _this = _possibleConstructorReturn(this, (PublishDetails.__proto__ || Object.getPrototypeOf(PublishDetails)).call(this, props)); _this.onPublishSubmit = _this.onPublishSubmit.bind(_this); return _this; } _createClass(PublishDetails, [{ key: 'onPublishSubmit', value: function onPublishSubmit() { this.props.startPublish(this.props.history); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', { className: 'row row--no-bottom' }, _react2.default.createElement( 'div', { className: 'column column--10' }, _react2.default.createElement(_PublishTitleInput2.default, null) ), _react2.default.createElement( 'div', { className: 'column column--5 column--sml-10' }, _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement(_Dropzone2.default, null) ) ), _react2.default.createElement( 'div', { className: 'column column--5 column--sml-10 align-content-top' }, _react2.default.createElement( 'div', { id: 'publish-active-area', className: 'row row--padded' }, _react2.default.createElement( 'div', { className: 'row row--padded row--no-top row--wide' }, _react2.default.createElement(_PublishUrlInput2.default, null) ), _react2.default.createElement( 'div', { className: 'row row--padded row--no-top row--wide' }, _react2.default.createElement(_ChannelSelect2.default, null) ), this.props.file.type === 'video/mp4' && _react2.default.createElement( 'div', { className: 'row row--padded row--no-top row--wide ' }, _react2.default.createElement(_PublishThumbnailInput2.default, null) ), _react2.default.createElement( 'div', { className: 'row row--padded row--no-top row--no-bottom row--wide' }, _react2.default.createElement(_PublishMetadataInputs2.default, null) ), _react2.default.createElement( 'div', { className: 'row row--wide align-content-center' }, _react2.default.createElement( 'button', { id: 'publish-submit', className: 'button--primary button--large', onClick: this.onPublishSubmit }, 'Publish' ) ), _react2.default.createElement( 'div', { className: 'row row--padded row--no-bottom align-content-center' }, _react2.default.createElement( 'button', { className: 'button--cancel', onClick: this.props.clearFile }, 'Cancel' ) ), _react2.default.createElement( 'div', { className: 'row row--short align-content-center' }, _react2.default.createElement( 'p', { className: 'fine-print' }, 'By clicking \'Publish\', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. ', _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://lbry.io/learn' }, 'Read more.' ) ) ) ) ) ); } }]); return PublishDetails; }(_react2.default.Component); ; exports.default = (0, _reactRouterDom.withRouter)(PublishDetails); /***/ }), /* 102 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(5); var _view = __webpack_require__(103); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var publish = _ref.publish; return { title: publish.metadata.title }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onMetadataChange: function onMetadataChange(name, value) { dispatch((0, _publish.updateMetadata)(name, value)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 103 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishTitleInput = function (_React$Component) { _inherits(PublishTitleInput, _React$Component); function PublishTitleInput(props) { _classCallCheck(this, PublishTitleInput); var _this = _possibleConstructorReturn(this, (PublishTitleInput.__proto__ || Object.getPrototypeOf(PublishTitleInput)).call(this, props)); _this.handleInput = _this.handleInput.bind(_this); return _this; } _createClass(PublishTitleInput, [{ key: 'handleInput', value: function handleInput(e) { var name = e.target.name; var value = e.target.value; this.props.onMetadataChange(name, value); } }, { key: 'render', value: function render() { return _react2.default.createElement('input', { type: 'text', id: 'publish-title', className: 'input-text text--large input-text--full-width', name: 'title', placeholder: 'Give your post a title...', onChange: this.handleInput, value: this.props.title }); } }]); return PublishTitleInput; }(_react2.default.Component); exports.default = PublishTitleInput; /***/ }), /* 104 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _publish = __webpack_require__(5); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(105); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel, publish = _ref.publish; return { loggedInChannelName: channel.loggedInChannel.name, loggedInChannelShortId: channel.loggedInChannel.shortId, fileName: publish.file.name, publishInChannel: publish.publishInChannel, selectedChannel: publish.selectedChannel, claim: publish.claim, urlError: publish.error.url }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onClaimChange: function onClaimChange(value) { dispatch((0, _publish.updateClaim)(value)); dispatch((0, _publish.updateError)('publishSubmit', null)); }, onUrlError: function onUrlError(value) { dispatch((0, _publish.updateError)('url', value)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 105 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _request = __webpack_require__(11); var _request2 = _interopRequireDefault(_request); var _PublishUrlMiddleDisplay = __webpack_require__(106); var _PublishUrlMiddleDisplay2 = _interopRequireDefault(_PublishUrlMiddleDisplay); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishUrlInput = function (_React$Component) { _inherits(PublishUrlInput, _React$Component); function PublishUrlInput(props) { _classCallCheck(this, PublishUrlInput); var _this = _possibleConstructorReturn(this, (PublishUrlInput.__proto__ || Object.getPrototypeOf(PublishUrlInput)).call(this, props)); _this.handleInput = _this.handleInput.bind(_this); return _this; } _createClass(PublishUrlInput, [{ key: 'componentDidMount', value: function componentDidMount() { var _props = this.props, claim = _props.claim, fileName = _props.fileName; if (!claim) { this.setClaimName(fileName); } } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(_ref) { var claim = _ref.claim, fileName = _ref.fileName; // if a new file was chosen, update the claim name if (fileName !== this.props.fileName) { return this.setClaimName(fileName); } // if the claim has updated, check its availability if (claim !== this.props.claim) { this.validateClaim(claim); } } }, { key: 'handleInput', value: function handleInput(event) { var value = event.target.value; value = this.cleanseInput(value); // update the state this.props.onClaimChange(value); } }, { key: 'cleanseInput', value: function cleanseInput(input) { input = input.replace(/\s+/g, '-'); // replace spaces with dashes input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-' return input; } }, { key: 'setClaimName', value: function setClaimName(fileName) { var fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.')); var cleanClaimName = this.cleanseInput(fileNameWithoutEnding); this.props.onClaimChange(cleanClaimName); } }, { key: 'validateClaim', value: function validateClaim(claim) { var _this2 = this; if (!claim) { return this.props.onUrlError('Enter a url above'); } (0, _request2.default)('/api/claim/availability/' + claim).then(function () { _this2.props.onUrlError(null); }).catch(function (error) { _this2.props.onUrlError(error.message); }); } }, { key: 'render', value: function render() { var _props2 = this.props, claim = _props2.claim, loggedInChannelName = _props2.loggedInChannelName, loggedInChannelShortId = _props2.loggedInChannelShortId, publishInChannel = _props2.publishInChannel, selectedChannel = _props2.selectedChannel, urlError = _props2.urlError; return _react2.default.createElement( 'div', { className: 'column column--10 column--sml-10' }, _react2.default.createElement( 'div', { className: 'input-text--primary span--relative' }, _react2.default.createElement( 'span', { className: 'url-text--secondary' }, 'spee.ch / ' ), _react2.default.createElement(_PublishUrlMiddleDisplay2.default, { publishInChannel: publishInChannel, selectedChannel: selectedChannel, loggedInChannelName: loggedInChannelName, loggedInChannelShortId: loggedInChannelShortId }), _react2.default.createElement('input', { type: 'text', id: 'claim-name-input', className: 'input-text', name: 'claim', placeholder: 'your-url-here', onChange: this.handleInput, value: claim }), claim && !urlError && _react2.default.createElement( 'span', { id: 'input-success-claim-name', className: 'info-message--success span--absolute' }, '\u2713' ), urlError && _react2.default.createElement( 'span', { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' }, '\u2716' ) ), _react2.default.createElement( 'div', null, urlError ? _react2.default.createElement( 'p', { id: 'input-error-claim-name', className: 'info-message--failure' }, urlError ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'Choose a custom url' ) ) ); } }]); return PublishUrlInput; }(_react2.default.Component); exports.default = PublishUrlInput; /***/ }), /* 106 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(10); var _propTypes2 = _interopRequireDefault(_propTypes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function UrlMiddle(_ref) { var publishInChannel = _ref.publishInChannel, selectedChannel = _ref.selectedChannel, loggedInChannelName = _ref.loggedInChannelName, loggedInChannelShortId = _ref.loggedInChannelShortId; if (publishInChannel) { if (selectedChannel === loggedInChannelName) { return _react2.default.createElement( 'span', { id: 'url-channel', className: 'url-text--secondary' }, loggedInChannelName, ':', loggedInChannelShortId, ' /' ); } return _react2.default.createElement( 'span', { id: 'url-channel-placeholder', className: 'url-text--secondary tooltip' }, '@channel', _react2.default.createElement( 'span', { className: 'tooltip-text' }, 'Select a channel below' ), ' /' ); } return _react2.default.createElement( 'span', { id: 'url-no-channel-placeholder', className: 'url-text--secondary tooltip' }, 'xyz', _react2.default.createElement( 'span', { className: 'tooltip-text' }, 'This will be a random id' ), ' /' ); } UrlMiddle.propTypes = { publishInChannel: _propTypes2.default.bool.isRequired, loggedInChannelName: _propTypes2.default.string, loggedInChannelShortId: _propTypes2.default.string }; exports.default = UrlMiddle; /***/ }), /* 107 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(5); var _view = __webpack_require__(108); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var file = _ref.publish.file; return { file: file }; }; var mapDispatchToProps = { onNewThumbnail: _publish.onNewThumbnail }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 108 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } function dataURItoBlob(dataURI) { // convert base64/URLEncoded data component to raw binary data held in a string var byteString = atob(dataURI.split(',')[1]); // separate out the mime component var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to a typed array var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], { type: mimeString }); } var PublishThumbnailInput = function (_React$Component) { _inherits(PublishThumbnailInput, _React$Component); function PublishThumbnailInput(props) { _classCallCheck(this, PublishThumbnailInput); var _this = _possibleConstructorReturn(this, (PublishThumbnailInput.__proto__ || Object.getPrototypeOf(PublishThumbnailInput)).call(this, props)); _this.state = { videoSource: null, error: null, sliderMinRange: 1, sliderMaxRange: null, sliderValue: null }; _this.handleVideoLoadedData = _this.handleVideoLoadedData.bind(_this); _this.handleSliderChange = _this.handleSliderChange.bind(_this); _this.createThumbnail = _this.createThumbnail.bind(_this); return _this; } _createClass(PublishThumbnailInput, [{ key: 'componentDidMount', value: function componentDidMount() { var file = this.props.file; this.setVideoSource(file); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { // if file changes if (nextProps.file && nextProps.file !== this.props.file) { var file = nextProps.file; this.setVideoSource(file); }; } }, { key: 'setVideoSource', value: function setVideoSource(file) { var _this2 = this; var previewReader = new FileReader(); previewReader.readAsDataURL(file); previewReader.onloadend = function () { var dataUri = previewReader.result; var blob = dataURItoBlob(dataUri); var videoSource = URL.createObjectURL(blob); _this2.setState({ videoSource: videoSource }); }; } }, { key: 'handleVideoLoadedData', value: function handleVideoLoadedData(event) { var duration = event.target.duration; var totalMinutes = Math.floor(duration / 60); var totalSeconds = Math.floor(duration % 60); // set the slider this.setState({ sliderMaxRange: duration * 100, sliderValue: duration * 100 / 2, totalMinutes: totalMinutes, totalSeconds: totalSeconds }); // update the current time of the video var video = document.getElementById('video-thumb-player'); video.currentTime = duration / 2; } }, { key: 'handleSliderChange', value: function handleSliderChange(event) { var value = parseInt(event.target.value); // update the slider value this.setState({ sliderValue: value }); // update the current time of the video var video = document.getElementById('video-thumb-player'); video.currentTime = value / 100; } }, { key: 'createThumbnail', value: function createThumbnail() { // take a snapshot var video = document.getElementById('video-thumb-player'); var canvas = document.createElement('canvas'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height); var dataUrl = canvas.toDataURL(); var blob = dataURItoBlob(dataUrl); var snapshot = new File([blob], 'thumbnail.png', { type: 'image/png' }); // set the thumbnail in redux store if (snapshot) { this.props.onNewThumbnail(snapshot); } } }, { key: 'render', value: function render() { var _state = this.state, error = _state.error, videoSource = _state.videoSource, sliderMinRange = _state.sliderMinRange, sliderMaxRange = _state.sliderMaxRange, sliderValue = _state.sliderValue, totalMinutes = _state.totalMinutes, totalSeconds = _state.totalSeconds; return _react2.default.createElement( 'div', null, _react2.default.createElement( 'label', { className: 'label' }, 'Thumbnail:' ), _react2.default.createElement('video', { id: 'video-thumb-player', preload: 'metadata', muted: true, style: { display: 'none' }, playsInline: true, onLoadedData: this.handleVideoLoadedData, src: videoSource, onSeeked: this.createThumbnail }), sliderValue ? _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: 'flex-container--row flex-container--space-between-center', style: { width: '100%' } }, _react2.default.createElement( 'span', { className: 'info-message' }, '0\'00"' ), _react2.default.createElement( 'span', { className: 'info-message' }, totalMinutes, '\'', totalSeconds, '"' ) ), _react2.default.createElement( 'div', null, _react2.default.createElement('input', { type: 'range', min: sliderMinRange, max: sliderMaxRange, value: sliderValue, className: 'slider', onChange: this.handleSliderChange }) ) ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'loading... ' ), error ? _react2.default.createElement( 'p', { className: 'info-message--failure' }, error ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'Use slider to set thumbnail' ) ); } }]); return PublishThumbnailInput; }(_react2.default.Component); exports.default = PublishThumbnailInput; /***/ }), /* 109 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(5); var _view = __webpack_require__(110); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var publish = _ref.publish; return { showMetadataInputs: publish.showMetadataInputs, description: publish.metadata.description, license: publish.metadata.license, nsfw: publish.metadata.nsfw }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onMetadataChange: function onMetadataChange(name, value) { dispatch((0, _publish.updateMetadata)(name, value)); }, onToggleMetadataInputs: function onToggleMetadataInputs(value) { dispatch((0, _publish.toggleMetadataInputs)(value)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 110 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ExpandingTextArea = __webpack_require__(111); var _ExpandingTextArea2 = _interopRequireDefault(_ExpandingTextArea); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishMetadataInputs = function (_React$Component) { _inherits(PublishMetadataInputs, _React$Component); function PublishMetadataInputs(props) { _classCallCheck(this, PublishMetadataInputs); var _this = _possibleConstructorReturn(this, (PublishMetadataInputs.__proto__ || Object.getPrototypeOf(PublishMetadataInputs)).call(this, props)); _this.toggleShowInputs = _this.toggleShowInputs.bind(_this); _this.handleInput = _this.handleInput.bind(_this); _this.handleSelect = _this.handleSelect.bind(_this); return _this; } _createClass(PublishMetadataInputs, [{ key: 'toggleShowInputs', value: function toggleShowInputs() { this.props.onToggleMetadataInputs(!this.props.showMetadataInputs); } }, { key: 'handleInput', value: function handleInput(event) { var target = event.target; var value = target.type === 'checkbox' ? target.checked : target.value; var name = target.name; this.props.onMetadataChange(name, value); } }, { key: 'handleSelect', value: function handleSelect(event) { var name = event.target.name; var selectedOption = event.target.selectedOptions[0].value; this.props.onMetadataChange(name, selectedOption); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', { id: 'publish-details', className: 'row row--padded row--no-top row--wide' }, this.props.showMetadataInputs && _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: 'row row--no-top' }, _react2.default.createElement( 'div', { className: 'column column--3 column--med-10 align-content-top' }, _react2.default.createElement( 'label', { htmlFor: 'publish-license', className: 'label' }, 'Description:' ) ), _react2.default.createElement( 'div', { className: 'column column--7 column--sml-10' }, _react2.default.createElement(_ExpandingTextArea2.default, { id: 'publish-description', className: 'textarea textarea--primary textarea--full-width', rows: 1, maxLength: 2000, style: { maxHeight: 200 }, name: 'description', placeholder: 'Optional description', value: this.props.description, onChange: this.handleInput }) ) ), _react2.default.createElement( 'div', { className: 'row row--no-top' }, _react2.default.createElement( 'div', { className: 'column column--3 column--med-10' }, _react2.default.createElement( 'label', { htmlFor: 'publish-license', className: 'label' }, 'License:' ) ), _react2.default.createElement( 'div', { className: 'column column--7 column--sml-10' }, _react2.default.createElement( 'select', { type: 'text', name: 'license', id: 'publish-license', className: 'select select--primary', onChange: this.handleSelect }, _react2.default.createElement( 'option', { value: ' ' }, 'Unspecified' ), _react2.default.createElement( 'option', { value: 'Public Domain' }, 'Public Domain' ), _react2.default.createElement( 'option', { value: 'Creative Commons' }, 'Creative Commons' ) ) ) ), _react2.default.createElement( 'div', { className: 'row row--no-top' }, _react2.default.createElement( 'div', { className: 'column column--3' }, _react2.default.createElement( 'label', { htmlFor: 'publish-nsfw', className: 'label' }, 'Mature:' ) ), _react2.default.createElement( 'div', { className: 'column column--7' }, _react2.default.createElement('input', { className: 'input-checkbox', type: 'checkbox', id: 'publish-nsfw', name: 'nsfw', value: this.props.nsfw, onChange: this.handleInput }) ) ) ), _react2.default.createElement( 'button', { className: 'button--secondary', onClick: this.toggleShowInputs }, this.props.showMetadataInputs ? 'less' : 'more' ) ); } }]); return PublishMetadataInputs; }(_react2.default.Component); exports.default = PublishMetadataInputs; /***/ }), /* 111 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(10); var _propTypes2 = _interopRequireDefault(_propTypes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ExpandingTextarea = function (_Component) { _inherits(ExpandingTextarea, _Component); function ExpandingTextarea(props) { _classCallCheck(this, ExpandingTextarea); var _this = _possibleConstructorReturn(this, (ExpandingTextarea.__proto__ || Object.getPrototypeOf(ExpandingTextarea)).call(this, props)); _this._handleChange = _this._handleChange.bind(_this); return _this; } _createClass(ExpandingTextarea, [{ key: 'componentDidMount', value: function componentDidMount() { this.adjustTextarea({}); } }, { key: '_handleChange', value: function _handleChange(event) { var onChange = this.props.onChange; if (onChange) onChange(event); this.adjustTextarea(event); } }, { key: 'adjustTextarea', value: function adjustTextarea(_ref) { var _ref$target = _ref.target, target = _ref$target === undefined ? this.el : _ref$target; target.style.height = 0; target.style.height = target.scrollHeight + 'px'; } }, { key: 'render', value: function render() { var _this2 = this; var rest = _objectWithoutProperties(this.props, []); return _react2.default.createElement('textarea', _extends({}, rest, { ref: function ref(x) { return _this2.el = x; }, onChange: this._handleChange })); } }]); return ExpandingTextarea; }(_react.Component); ExpandingTextarea.propTypes = { onChange: _propTypes2.default.func }; exports.default = ExpandingTextarea; /***/ }), /* 112 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(5); var _view = __webpack_require__(113); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel, publish = _ref.publish; return { loggedInChannelName: channel.loggedInChannel.name, publishInChannel: publish.publishInChannel, selectedChannel: publish.selectedChannel, channelError: publish.error.channel }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onPublishInChannelChange: function onPublishInChannelChange(value) { dispatch((0, _publish.updateError)('channel', null)); dispatch((0, _publish.setPublishInChannel)(value)); }, onChannelSelect: function onChannelSelect(value) { dispatch((0, _publish.updateError)('channel', null)); dispatch((0, _publish.updateSelectedChannel)(value)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 113 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ChannelLoginForm = __webpack_require__(41); var _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm); var _ChannelCreateForm = __webpack_require__(42); var _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm); var _publish_channel_select_states = __webpack_require__(35); var states = _interopRequireWildcard(_publish_channel_select_states); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ChannelSelect = function (_React$Component) { _inherits(ChannelSelect, _React$Component); function ChannelSelect(props) { _classCallCheck(this, ChannelSelect); var _this = _possibleConstructorReturn(this, (ChannelSelect.__proto__ || Object.getPrototypeOf(ChannelSelect)).call(this, props)); _this.toggleAnonymousPublish = _this.toggleAnonymousPublish.bind(_this); _this.handleSelection = _this.handleSelection.bind(_this); return _this; } _createClass(ChannelSelect, [{ key: 'toggleAnonymousPublish', value: function toggleAnonymousPublish(event) { var value = event.target.value; if (value === 'anonymous') { this.props.onPublishInChannelChange(false); } else { this.props.onPublishInChannelChange(true); } } }, { key: 'handleSelection', value: function handleSelection(event) { var selectedOption = event.target.selectedOptions[0].value; this.props.onChannelSelect(selectedOption); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', null, _react2.default.createElement( 'form', null, _react2.default.createElement( 'div', { className: 'column column--3 column--med-10' }, _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'anonymous-radio', className: 'input-radio', value: 'anonymous', checked: !this.props.publishInChannel, onChange: this.toggleAnonymousPublish }), _react2.default.createElement( 'label', { className: 'label label--pointer', htmlFor: 'anonymous-radio' }, 'Anonymous' ) ), _react2.default.createElement( 'div', { className: 'column column--7 column--med-10' }, _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'channel-radio', className: 'input-radio', value: 'in a channel', checked: this.props.publishInChannel, onChange: this.toggleAnonymousPublish }), _react2.default.createElement( 'label', { className: 'label label--pointer', htmlFor: 'channel-radio' }, 'In a channel' ) ), this.props.channelError ? _react2.default.createElement( 'p', { className: 'info-message--failure' }, this.props.channelError ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'Publish anonymously or in a channel' ) ), this.props.publishInChannel && _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: 'column column--3' }, _react2.default.createElement( 'label', { className: 'label', htmlFor: 'channel-name-select' }, 'Channel:' ) ), _react2.default.createElement( 'div', { className: 'column column--7' }, _react2.default.createElement( 'select', { type: 'text', id: 'channel-name-select', className: 'select select--arrow', value: this.props.selectedChannel, onChange: this.handleSelection }, this.props.loggedInChannelName && _react2.default.createElement( 'option', { value: this.props.loggedInChannelName, id: 'publish-channel-select-channel-option' }, this.props.loggedInChannelName ), _react2.default.createElement( 'option', { value: states.LOGIN }, 'Existing' ), _react2.default.createElement( 'option', { value: states.CREATE }, 'New' ) ) ), this.props.selectedChannel === states.LOGIN && _react2.default.createElement(_ChannelLoginForm2.default, null), this.props.selectedChannel === states.CREATE && _react2.default.createElement(_ChannelCreateForm2.default, null) ) ); } }]); return ChannelSelect; }(_react2.default.Component); exports.default = ChannelSelect; /***/ }), /* 114 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _request = __webpack_require__(11); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ChannelLoginForm = function (_React$Component) { _inherits(ChannelLoginForm, _React$Component); function ChannelLoginForm(props) { _classCallCheck(this, ChannelLoginForm); var _this = _possibleConstructorReturn(this, (ChannelLoginForm.__proto__ || Object.getPrototypeOf(ChannelLoginForm)).call(this, props)); _this.state = { error: null, name: '', password: '' }; _this.handleInput = _this.handleInput.bind(_this); _this.loginToChannel = _this.loginToChannel.bind(_this); return _this; } _createClass(ChannelLoginForm, [{ key: 'handleInput', value: function handleInput(event) { var name = event.target.name; var value = event.target.value; this.setState(_defineProperty({}, name, value)); } }, { key: 'loginToChannel', value: function loginToChannel(event) { var _this2 = this; event.preventDefault(); var params = { method: 'POST', body: JSON.stringify({ username: this.state.name, password: this.state.password }), headers: new Headers({ 'Content-Type': 'application/json' }), credentials: 'include' }; (0, _request2.default)('login', params).then(function (_ref) { var success = _ref.success, channelName = _ref.channelName, shortChannelId = _ref.shortChannelId, channelClaimId = _ref.channelClaimId, message = _ref.message; if (success) { _this2.props.onChannelLogin(channelName, shortChannelId, channelClaimId); } else { _this2.setState({ 'error': message }); }; }).catch(function (error) { if (error.message) { _this2.setState({ 'error': error.message }); } else { _this2.setState({ 'error': error }); } }); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'form', { id: 'channel-login-form' }, _react2.default.createElement( 'div', { className: 'row row--wide row--short' }, _react2.default.createElement( 'div', { className: 'column column--3 column--sml-10' }, _react2.default.createElement( 'label', { className: 'label', htmlFor: 'channel-login-name-input' }, 'Name:' ) ), _react2.default.createElement( 'div', { className: 'column column--6 column--sml-10' }, _react2.default.createElement( 'div', { className: 'input-text--primary flex-container--row flex-container--left-bottom' }, _react2.default.createElement( 'span', null, '@' ), _react2.default.createElement('input', { type: 'text', id: 'channel-login-name-input', className: 'input-text', name: 'name', placeholder: 'Your Channel Name', value: this.state.channelName, onChange: this.handleInput }) ) ) ), _react2.default.createElement( 'div', { className: 'row row--wide row--short' }, _react2.default.createElement( 'div', { className: 'column column--3 column--sml-10' }, _react2.default.createElement( 'label', { className: 'label', htmlFor: 'channel-login-password-input' }, 'Password:' ) ), _react2.default.createElement( 'div', { className: 'column column--6 column--sml-10' }, _react2.default.createElement( 'div', { className: 'input-text--primary' }, _react2.default.createElement('input', { type: 'password', id: 'channel-login-password-input', name: 'password', className: 'input-text', placeholder: '', value: this.state.channelPassword, onChange: this.handleInput }) ) ) ), this.state.error ? _react2.default.createElement( 'p', { className: 'info-message--failure' }, this.state.error ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'Enter the name and password for your channel' ), _react2.default.createElement( 'div', { className: 'row row--wide' }, _react2.default.createElement( 'button', { className: 'button--primary', onClick: this.loginToChannel }, 'Authenticate' ) ) ); } }]); return ChannelLoginForm; }(_react2.default.Component); exports.default = ChannelLoginForm; /***/ }), /* 115 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ProgressBar = __webpack_require__(20); var _ProgressBar2 = _interopRequireDefault(_ProgressBar); var _request = __webpack_require__(11); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ChannelCreateForm = function (_React$Component) { _inherits(ChannelCreateForm, _React$Component); function ChannelCreateForm(props) { _classCallCheck(this, ChannelCreateForm); var _this = _possibleConstructorReturn(this, (ChannelCreateForm.__proto__ || Object.getPrototypeOf(ChannelCreateForm)).call(this, props)); _this.state = { error: null, channel: '', password: '', status: null }; _this.handleChannelInput = _this.handleChannelInput.bind(_this); _this.handleInput = _this.handleInput.bind(_this); _this.createChannel = _this.createChannel.bind(_this); return _this; } _createClass(ChannelCreateForm, [{ key: 'cleanseChannelInput', value: function cleanseChannelInput(input) { input = input.replace(/\s+/g, '-'); // replace spaces with dashes input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-' return input; } }, { key: 'handleChannelInput', value: function handleChannelInput(event) { var value = event.target.value; value = this.cleanseChannelInput(value); this.setState({ channel: value }); if (value) { this.updateIsChannelAvailable(value); } else { this.setState({ error: 'Please enter a channel name' }); } } }, { key: 'handleInput', value: function handleInput(event) { var name = event.target.name; var value = event.target.value; this.setState(_defineProperty({}, name, value)); } }, { key: 'updateIsChannelAvailable', value: function updateIsChannelAvailable(channel) { var _this2 = this; var channelWithAtSymbol = '@' + channel; (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol).then(function () { _this2.setState({ 'error': null }); }).catch(function (error) { _this2.setState({ 'error': error.message }); }); } }, { key: 'checkIsChannelAvailable', value: function checkIsChannelAvailable(channel) { var channelWithAtSymbol = '@' + channel; return (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol); } }, { key: 'checkIsPasswordProvided', value: function checkIsPasswordProvided(password) { return new Promise(function (resolve, reject) { if (!password || password.length < 1) { return reject(new Error('Please provide a password')); } resolve(); }); } }, { key: 'makePublishChannelRequest', value: function makePublishChannelRequest(username, password) { var params = { method: 'POST', body: JSON.stringify({ username: username, password: password }), headers: new Headers({ 'Content-Type': 'application/json' }), credentials: 'include' }; return new Promise(function (resolve, reject) { (0, _request2.default)('/signup', params).then(function (result) { return resolve(result); }).catch(function (error) { reject(new Error('Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ' + error.message)); }); }); } }, { key: 'createChannel', value: function createChannel(event) { var _this3 = this; event.preventDefault(); this.checkIsPasswordProvided(this.state.password).then(function () { return _this3.checkIsChannelAvailable(_this3.state.channel); }).then(function () { _this3.setState({ status: 'We are publishing your new channel. Sit tight...' }); return _this3.makePublishChannelRequest(_this3.state.channel, _this3.state.password); }).then(function (result) { _this3.setState({ status: null }); _this3.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId); }).catch(function (error) { if (error.message) { _this3.setState({ 'error': error.message, status: null }); } else { _this3.setState({ 'error': error, status: null }); }; }); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', null, !this.state.status ? _react2.default.createElement( 'form', { id: 'publish-channel-form' }, _react2.default.createElement( 'div', { className: 'row row--wide row--short' }, _react2.default.createElement( 'div', { className: 'column column--3 column--sml-10' }, _react2.default.createElement( 'label', { className: 'label', htmlFor: 'new-channel-name' }, 'Name:' ) ), _react2.default.createElement( 'div', { className: 'column column--6 column--sml-10' }, _react2.default.createElement( 'div', { className: 'input-text--primary flex-container--row flex-container--left-bottom span--relative' }, _react2.default.createElement( 'span', null, '@' ), _react2.default.createElement('input', { type: 'text', name: 'channel', id: 'new-channel-name', className: 'input-text', placeholder: 'exampleChannelName', value: this.state.channel, onChange: this.handleChannelInput }), this.state.channel && !this.state.error && _react2.default.createElement( 'span', { id: 'input-success-channel-name', className: 'info-message--success span--absolute' }, '\u2713' ), this.state.error && _react2.default.createElement( 'span', { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' }, '\u2716' ) ) ) ), _react2.default.createElement( 'div', { className: 'row row--wide row--short' }, _react2.default.createElement( 'div', { className: 'column column--3 column--sml-10' }, _react2.default.createElement( 'label', { className: 'label', htmlFor: 'new-channel-password' }, 'Password:' ) ), _react2.default.createElement( 'div', { className: 'column column--6 column--sml-10' }, _react2.default.createElement( 'div', { className: 'input-text--primary' }, _react2.default.createElement('input', { type: 'password', name: 'password', id: 'new-channel-password', className: 'input-text', placeholder: '', value: this.state.password, onChange: this.handleInput }) ) ) ), this.state.error ? _react2.default.createElement( 'p', { className: 'info-message--failure' }, this.state.error ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'Choose a name and password for your channel' ), _react2.default.createElement( 'div', { className: 'row row--wide' }, _react2.default.createElement( 'button', { className: 'button--primary', onClick: this.createChannel }, 'Create Channel' ) ) ) : _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', { className: 'fine-print' }, this.state.status ), _react2.default.createElement(_ProgressBar2.default, { size: 12 }) ) ); } }]); return ChannelCreateForm; }(_react2.default.Component); exports.default = ChannelCreateForm; /***/ }), /* 116 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ActiveStatusBar = function ActiveStatusBar() { return _react2.default.createElement( 'span', { className: 'progress-bar progress-bar--active' }, '| ' ); }; exports.default = ActiveStatusBar; /***/ }), /* 117 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var InactiveStatusBar = function InactiveStatusBar() { return _react2.default.createElement( 'span', { className: 'progress-bar progress-bar--inactive' }, '| ' ); }; exports.default = InactiveStatusBar; /***/ }), /* 118 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(5); var _view = __webpack_require__(119); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var publish = _ref.publish; return { status: publish.status.status, message: publish.status.message }; }; var mapDispatchToProps = { clearFile: _publish.clearFile }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ProgressBar = __webpack_require__(20); var _ProgressBar2 = _interopRequireDefault(_ProgressBar); var _publish_claim_states = __webpack_require__(120); var publishStates = _interopRequireWildcard(_publish_claim_states); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishStatus = function (_React$Component) { _inherits(PublishStatus, _React$Component); function PublishStatus() { _classCallCheck(this, PublishStatus); return _possibleConstructorReturn(this, (PublishStatus.__proto__ || Object.getPrototypeOf(PublishStatus)).apply(this, arguments)); } _createClass(PublishStatus, [{ key: 'render', value: function render() { var _props = this.props, status = _props.status, message = _props.message, clearFile = _props.clearFile; return _react2.default.createElement( 'div', { className: 'row row--tall flex-container--column flex-container--center-center' }, status === publishStates.LOAD_START && _react2.default.createElement( 'div', { className: 'row align-content-center' }, _react2.default.createElement( 'p', null, 'File is loading to server' ), _react2.default.createElement( 'p', { className: 'blue' }, '0%' ) ), status === publishStates.LOADING && _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: 'row align-content-center' }, _react2.default.createElement( 'p', null, 'File is loading to server' ), _react2.default.createElement( 'p', { className: 'blue' }, message ) ) ), status === publishStates.PUBLISHING && _react2.default.createElement( 'div', { className: 'row align-content-center' }, _react2.default.createElement( 'p', null, 'Upload complete. Your file is now being published on the blockchain...' ), _react2.default.createElement(_ProgressBar2.default, { size: 12 }), _react2.default.createElement( 'p', null, 'Curious what magic is happening here? ', _react2.default.createElement( 'a', { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' }, 'Learn more.' ) ) ), status === publishStates.SUCCESS && _react2.default.createElement( 'div', { className: 'row align-content-center' }, _react2.default.createElement( 'p', null, 'Your publish is complete! You are being redirected to it now.' ), _react2.default.createElement( 'p', null, 'If you are not automatically redirected, ', _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: message }, 'click here.' ) ) ), status === publishStates.FAILED && _react2.default.createElement( 'div', { className: 'row align-content-center' }, _react2.default.createElement( 'p', null, 'Something went wrong...' ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'strong', null, message ) ), _react2.default.createElement( 'p', null, 'For help, post the above error text in the #speech channel on the ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' }, 'lbry discord' ) ), _react2.default.createElement( 'button', { className: 'button--secondary', onClick: clearFile }, 'Reset' ) ) ); } }]); return PublishStatus; }(_react2.default.Component); ; exports.default = PublishStatus; /***/ }), /* 120 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LOAD_START = exports.LOAD_START = 'LOAD_START'; var LOADING = exports.LOADING = 'LOADING'; var PUBLISHING = exports.PUBLISHING = 'PUBLISHING'; var SUCCESS = exports.SUCCESS = 'SUCCESS'; var FAILED = exports.FAILED = 'FAILED'; /***/ }), /* 121 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(122); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var publish = _ref.publish; return { message: publish.disabledMessage }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 122 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishDisabledMessage = function (_React$Component) { _inherits(PublishDisabledMessage, _React$Component); function PublishDisabledMessage() { _classCallCheck(this, PublishDisabledMessage); return _possibleConstructorReturn(this, (PublishDisabledMessage.__proto__ || Object.getPrototypeOf(PublishDisabledMessage)).apply(this, arguments)); } _createClass(PublishDisabledMessage, [{ key: 'render', value: function render() { var message = this.props.message; console.log('this.props.message:', message); return _react2.default.createElement( 'div', { className: 'row dropzone--disabled row--tall flex-container--column flex-container--center-center' }, _react2.default.createElement( 'p', { className: 'text--disabled' }, 'Publishing is currently disabled.' ), _react2.default.createElement( 'p', { className: 'text--disabled' }, message ) ); } }]); return PublishDisabledMessage; }(_react2.default.Component); exports.default = PublishDisabledMessage; /***/ }), /* 123 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _SEO = __webpack_require__(9); var _SEO2 = _interopRequireDefault(_SEO); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var AboutPage = function (_React$Component) { _inherits(AboutPage, _React$Component); function AboutPage() { _classCallCheck(this, AboutPage); return _possibleConstructorReturn(this, (AboutPage.__proto__ || Object.getPrototypeOf(AboutPage)).apply(this, arguments)); } _createClass(AboutPage, [{ key: 'render', value: function render() { return _react2.default.createElement( 'div', null, _react2.default.createElement(_SEO2.default, { pageTitle: 'About', pageUri: 'about' }), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'div', { className: 'column column--5 column--med-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'p', { className: 'pull-quote' }, 'Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.' ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://twitter.com/spee_ch' }, 'TWITTER' ) ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch' }, 'GITHUB' ) ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://discord.gg/YjYbwhS' }, 'DISCORD CHANNEL' ) ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch/blob/master/README.md' }, 'DOCUMENTATION' ) ) ) ), _react2.default.createElement( 'div', { className: 'column column--5 column--med-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'p', null, 'Spee.ch is a media-hosting site that reads from and publishes content to the ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://lbry.io' }, 'LBRY' ), ' blockchain.' ), _react2.default.createElement( 'p', null, 'Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://lbry.io/get' }, 'LBRY' ), ' network. This means that your images are stored in multiple locations without a single point of failure.' ), _react2.default.createElement( 'h3', null, 'Contribute' ), _react2.default.createElement( 'p', null, 'If you have an idea for your own spee.ch-like site on top of LBRY, fork our ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch' }, 'github repo' ), ' and go to town!' ), _react2.default.createElement( 'p', null, 'If you want to improve spee.ch, join our ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://discord.gg/YjYbwhS' }, 'discord channel' ), ' or solve one of our ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch/issues' }, 'github issues' ), '.' ) ) ) ) ); } }]); return AboutPage; }(_react2.default.Component); ; exports.default = AboutPage; /***/ }), /* 124 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(125); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel; return { loggedInChannelName: channel.loggedInChannel.name }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 125 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); var _SEO = __webpack_require__(9); var _SEO2 = _interopRequireDefault(_SEO); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _ChannelLoginForm = __webpack_require__(41); var _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm); var _ChannelCreateForm = __webpack_require__(42); var _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var LoginPage = function (_React$Component) { _inherits(LoginPage, _React$Component); function LoginPage() { _classCallCheck(this, LoginPage); return _possibleConstructorReturn(this, (LoginPage.__proto__ || Object.getPrototypeOf(LoginPage)).apply(this, arguments)); } _createClass(LoginPage, [{ key: 'componentWillReceiveProps', value: function componentWillReceiveProps(newProps) { // re-route the user to the homepage if the user is logged in if (newProps.loggedInChannelName !== this.props.loggedInChannelName) { this.props.history.push('/'); } } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', null, _react2.default.createElement(_SEO2.default, { pageTitle: 'Login', pageUri: 'login' }), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'div', { className: 'column column--5 column--med-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'p', null, 'Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends. You can create 1 channel, or 100, so whether you\'re ', _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: '/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8' }, 'documenting important events' ), ', or making a public repository for ', _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: '/@catGifs' }, 'cat gifs' ), ' (password: \'1234\'), try creating a channel for it!' ) ) ), _react2.default.createElement( 'div', { className: 'column column--5 column--med-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'h3', { className: 'h3--no-bottom' }, 'Log in to an existing channel:' ), _react2.default.createElement(_ChannelLoginForm2.default, null), _react2.default.createElement( 'h3', { className: 'h3--no-bottom' }, 'Create a brand new channel:' ), _react2.default.createElement(_ChannelCreateForm2.default, null) ) ) ) ); } }]); return LoginPage; }(_react2.default.Component); ; exports.default = (0, _reactRouterDom.withRouter)(LoginPage); /***/ }), /* 126 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _show = __webpack_require__(8); var _view = __webpack_require__(127); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; return { error: show.request.error, requestType: show.request.type }; }; var mapDispatchToProps = { onHandleShowPageUri: _show.onHandleShowPageUri }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 127 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ErrorPage = __webpack_require__(21); var _ErrorPage2 = _interopRequireDefault(_ErrorPage); var _ShowAssetLite = __webpack_require__(128); var _ShowAssetLite2 = _interopRequireDefault(_ShowAssetLite); var _ShowAssetDetails = __webpack_require__(131); var _ShowAssetDetails2 = _interopRequireDefault(_ShowAssetDetails); var _ShowChannel = __webpack_require__(137); var _ShowChannel2 = _interopRequireDefault(_ShowChannel); var _show_request_types = __webpack_require__(43); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ShowPage = function (_React$Component) { _inherits(ShowPage, _React$Component); function ShowPage() { _classCallCheck(this, ShowPage); return _possibleConstructorReturn(this, (ShowPage.__proto__ || Object.getPrototypeOf(ShowPage)).apply(this, arguments)); } _createClass(ShowPage, [{ key: 'componentDidMount', value: function componentDidMount() { this.props.onHandleShowPageUri(this.props.match.params); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { if (nextProps.match.params !== this.props.match.params) { this.props.onHandleShowPageUri(nextProps.match.params); } } }, { key: 'render', value: function render() { var _props = this.props, error = _props.error, requestType = _props.requestType; if (error) { return _react2.default.createElement(_ErrorPage2.default, { error: error }); } switch (requestType) { case _show_request_types.CHANNEL: return _react2.default.createElement(_ShowChannel2.default, null); case _show_request_types.ASSET_LITE: return _react2.default.createElement(_ShowAssetLite2.default, null); case _show_request_types.ASSET_DETAILS: return _react2.default.createElement(_ShowAssetDetails2.default, null); default: return _react2.default.createElement( 'p', null, 'loading...' ); } } }]); return ShowPage; }(_react2.default.Component); ; exports.default = ShowPage; /***/ }), /* 128 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(129); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select request info var requestId = show.request.id; // select asset info var asset = void 0; var request = show.requestList[requestId] || null; var assetList = show.assetList; if (request && assetList) { var assetKey = request.key; // note: just store this in the request asset = assetList[assetKey] || null; }; // return props return { asset: asset }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 129 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _SEO = __webpack_require__(9); var _SEO2 = _interopRequireDefault(_SEO); var _reactRouterDom = __webpack_require__(4); var _AssetDisplay = __webpack_require__(44); var _AssetDisplay2 = _interopRequireDefault(_AssetDisplay); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ShowLite = function (_React$Component) { _inherits(ShowLite, _React$Component); function ShowLite() { _classCallCheck(this, ShowLite); return _possibleConstructorReturn(this, (ShowLite.__proto__ || Object.getPrototypeOf(ShowLite)).apply(this, arguments)); } _createClass(ShowLite, [{ key: 'render', value: function render() { var asset = this.props.asset; if (asset) { var _asset$claimData = asset.claimData, name = _asset$claimData.name, claimId = _asset$claimData.claimId; return _react2.default.createElement( 'div', { className: 'row row--tall flex-container--column flex-container--center-center show-lite-container' }, _react2.default.createElement(_SEO2.default, { pageTitle: name, asset: asset }), _react2.default.createElement(_AssetDisplay2.default, null), _react2.default.createElement( _reactRouterDom.Link, { id: 'asset-boilerpate', className: 'link--primary fine-print', to: '/' + claimId + '/' + name }, 'hosted via Spee.ch' ) ); } return _react2.default.createElement( 'div', { className: 'row row--tall row--padded flex-container--column flex-container--center-center' }, _react2.default.createElement( 'p', null, 'loading asset data...' ) ); } }]); return ShowLite; }(_react2.default.Component); ; exports.default = ShowLite; /***/ }), /* 130 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ProgressBar = __webpack_require__(20); var _ProgressBar2 = _interopRequireDefault(_ProgressBar); var _asset_display_states = __webpack_require__(37); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var AssetDisplay = function (_React$Component) { _inherits(AssetDisplay, _React$Component); function AssetDisplay() { _classCallCheck(this, AssetDisplay); return _possibleConstructorReturn(this, (AssetDisplay.__proto__ || Object.getPrototypeOf(AssetDisplay)).apply(this, arguments)); } _createClass(AssetDisplay, [{ key: 'componentDidMount', value: function componentDidMount() { var _props$asset$claimDat = this.props.asset.claimData, name = _props$asset$claimDat.name, claimId = _props$asset$claimDat.claimId; this.props.onFileRequest(name, claimId); } }, { key: 'render', value: function render() { var _props = this.props, status = _props.status, error = _props.error, _props$asset$claimDat2 = _props.asset.claimData, name = _props$asset$claimDat2.name, claimId = _props$asset$claimDat2.claimId, contentType = _props$asset$claimDat2.contentType, fileExt = _props$asset$claimDat2.fileExt, thumbnail = _props$asset$claimDat2.thumbnail; return _react2.default.createElement( 'div', { id: 'asset-display-component' }, status === _asset_display_states.LOCAL_CHECK && _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', null, 'Checking to see if Spee.ch has your asset locally...' ) ), status === _asset_display_states.UNAVAILABLE && _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', null, 'Sit tight, we\'re searching the LBRY blockchain for your asset!' ), _react2.default.createElement(_ProgressBar2.default, { size: 12 }), _react2.default.createElement( 'p', null, 'Curious what magic is happening here? ', _react2.default.createElement( 'a', { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' }, 'Learn more.' ) ) ), status === _asset_display_states.ERROR && _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', null, 'Unfortunately, we couldn\'t download your asset from LBRY. You can help us out by sharing the below error message in the ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' }, 'LBRY discord' ), '.' ), _react2.default.createElement( 'i', null, _react2.default.createElement( 'p', { id: 'error-message' }, error ) ) ), status === _asset_display_states.AVAILABLE && function () { switch (contentType) { case 'image/jpeg': case 'image/jpg': case 'image/png': return _react2.default.createElement('img', { className: 'asset', src: '/' + claimId + '/' + name + '.' + fileExt, alt: name }); case 'image/gif': return _react2.default.createElement('img', { className: 'asset', src: '/' + claimId + '/' + name + '.' + fileExt, alt: name }); case 'video/mp4': return _react2.default.createElement( 'video', { className: 'asset video', controls: true, poster: thumbnail }, _react2.default.createElement('source', { src: '/' + claimId + '/' + name + '.' + fileExt }), _react2.default.createElement( 'p', null, 'Your browser does not support the ', _react2.default.createElement( 'code', null, 'video' ), ' element.' ) ); default: return _react2.default.createElement( 'p', null, 'Unsupported file type' ); } }() ); } }]); return AssetDisplay; }(_react2.default.Component); ; exports.default = AssetDisplay; /***/ }), /* 131 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(132); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select request info var requestId = show.request.id; // select asset info var asset = void 0; var request = show.requestList[requestId] || null; var assetList = show.assetList; if (request && assetList) { var assetKey = request.key; // note: just store this in the request asset = assetList[assetKey] || null; }; // return props return { asset: asset }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 132 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _SEO = __webpack_require__(9); var _SEO2 = _interopRequireDefault(_SEO); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _ErrorPage = __webpack_require__(21); var _ErrorPage2 = _interopRequireDefault(_ErrorPage); var _AssetTitle = __webpack_require__(133); var _AssetTitle2 = _interopRequireDefault(_AssetTitle); var _AssetDisplay = __webpack_require__(44); var _AssetDisplay2 = _interopRequireDefault(_AssetDisplay); var _AssetInfo = __webpack_require__(135); var _AssetInfo2 = _interopRequireDefault(_AssetInfo); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ShowAssetDetails = function (_React$Component) { _inherits(ShowAssetDetails, _React$Component); function ShowAssetDetails() { _classCallCheck(this, ShowAssetDetails); return _possibleConstructorReturn(this, (ShowAssetDetails.__proto__ || Object.getPrototypeOf(ShowAssetDetails)).apply(this, arguments)); } _createClass(ShowAssetDetails, [{ key: 'render', value: function render() { var asset = this.props.asset; if (asset) { var name = asset.claimData.name; return _react2.default.createElement( 'div', null, _react2.default.createElement(_SEO2.default, { pageTitle: name + ' - details', asset: asset }), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--tall row--padded' }, _react2.default.createElement( 'div', { className: 'column column--10' }, _react2.default.createElement(_AssetTitle2.default, null) ), _react2.default.createElement( 'div', { className: 'column column--5 column--sml-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'row row--padded show-details-container' }, _react2.default.createElement(_AssetDisplay2.default, null) ) ), _react2.default.createElement( 'div', { className: 'column column--5 column--sml-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement(_AssetInfo2.default, null) ) ) ) ); }; return _react2.default.createElement(_ErrorPage2.default, { error: 'loading asset data...' }); } }]); return ShowAssetDetails; }(_react2.default.Component); ; exports.default = ShowAssetDetails; /***/ }), /* 133 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(134); var _view2 = _interopRequireDefault(_view); var _show = __webpack_require__(13); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; var _selectAsset = (0, _show.selectAsset)(show), title = _selectAsset.claimData.title; return { title: title }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 134 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var AssetTitle = function AssetTitle(_ref) { var title = _ref.title; return _react2.default.createElement( 'div', null, _react2.default.createElement( 'span', { className: 'text--large' }, title ) ); }; exports.default = AssetTitle; /***/ }), /* 135 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(136); var _view2 = _interopRequireDefault(_view); var _show = __webpack_require__(13); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select asset var asset = (0, _show.selectAsset)(show); // return props return { asset: asset }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 136 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var AssetInfo = function (_React$Component) { _inherits(AssetInfo, _React$Component); function AssetInfo(props) { _classCallCheck(this, AssetInfo); var _this = _possibleConstructorReturn(this, (AssetInfo.__proto__ || Object.getPrototypeOf(AssetInfo)).call(this, props)); _this.copyToClipboard = _this.copyToClipboard.bind(_this); return _this; } _createClass(AssetInfo, [{ key: 'copyToClipboard', value: function copyToClipboard(event) { var elementToCopy = event.target.dataset.elementtocopy; var element = document.getElementById(elementToCopy); element.select(); try { document.execCommand('copy'); } catch (err) { this.setState({ error: 'Oops, unable to copy' }); } } }, { key: 'render', value: function render() { var _props$asset = this.props.asset, shortId = _props$asset.shortId, _props$asset$claimDat = _props$asset.claimData, channelName = _props$asset$claimDat.channelName, certificateId = _props$asset$claimDat.certificateId, description = _props$asset$claimDat.description, name = _props$asset$claimDat.name, claimId = _props$asset$claimDat.claimId, fileExt = _props$asset$claimDat.fileExt, contentType = _props$asset$claimDat.contentType, thumbnail = _props$asset$claimDat.thumbnail, host = _props$asset$claimDat.host; return _react2.default.createElement( 'div', null, channelName && _react2.default.createElement( 'div', { className: 'row row--padded row--wide row--no-top' }, _react2.default.createElement( 'div', { className: 'column column--2 column--med-10' }, _react2.default.createElement( 'span', { className: 'text' }, 'Channel:' ) ), _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'span', { className: 'text' }, _react2.default.createElement( _reactRouterDom.Link, { to: '/' + channelName + ':' + certificateId }, channelName ) ) ) ), description && _react2.default.createElement( 'div', { className: 'row row--padded row--wide row--no-top' }, _react2.default.createElement( 'span', { className: 'text' }, description ) ), _react2.default.createElement( 'div', { id: 'show-share-buttons' }, _react2.default.createElement( 'div', { className: 'row row--padded row--wide row--no-top' }, _react2.default.createElement( 'div', { className: 'column column--2 column--med-10' }, _react2.default.createElement( 'span', { className: 'text' }, 'Share:' ) ), _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'div', { className: 'row row--short row--wide flex-container--row flex-container--space-between-bottom flex-container--wrap' }, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://twitter.com/intent/tweet?text=' + host + '/' + shortId + '/' + name }, 'twitter' ), _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://www.facebook.com/sharer/sharer.php?u=' + host + '/' + shortId + '/' + name }, 'facebook' ), _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'http://tumblr.com/widgets/share/tool?canonicalUrl=' + host + '/' + shortId + '/' + name }, 'tumblr' ), _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://www.reddit.com/submit?url=' + host + '/' + shortId + '/' + name + '&title=' + name }, 'reddit' ) ) ) ) ), _react2.default.createElement( 'div', { className: 'row row--padded row--wide row--no-top' }, _react2.default.createElement( 'div', { id: 'show-short-link' }, _react2.default.createElement( 'div', { className: 'column column--2 column--med-10' }, _react2.default.createElement( 'span', { className: 'text' }, 'Link:' ) ), _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'div', { className: 'row row--short row--wide' }, _react2.default.createElement( 'div', { className: 'column column--7' }, _react2.default.createElement( 'div', { className: 'input-error', id: 'input-error-copy-short-link', hidden: 'true' }, 'error here' ), _react2.default.createElement('input', { type: 'text', id: 'short-link', className: 'input-disabled input-text--full-width', readOnly: true, spellCheck: 'false', value: host + '/' + shortId + '/' + name + '.' + fileExt, onClick: this.select }) ), _react2.default.createElement('div', { className: 'column column--1' }), _react2.default.createElement( 'div', { className: 'column column--2' }, _react2.default.createElement( 'button', { className: 'button--primary button--wide', 'data-elementtocopy': 'short-link', onClick: this.copyToClipboard }, 'copy' ) ) ) ) ), _react2.default.createElement( 'div', { id: 'show-embed-code' }, _react2.default.createElement( 'div', { className: 'column column--2 column--med-10' }, _react2.default.createElement( 'span', { className: 'text' }, 'Embed:' ) ), _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'div', { className: 'row row--short row--wide' }, _react2.default.createElement( 'div', { className: 'column column--7' }, _react2.default.createElement( 'div', { className: 'input-error', id: 'input-error-copy-embed-text', hidden: 'true' }, 'error here' ), contentType === 'video/mp4' ? _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true, onClick: this.select, spellCheck: 'false', value: '' }) : _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true, onClick: this.select, spellCheck: 'false', value: '' }) ), _react2.default.createElement('div', { className: 'column column--1' }), _react2.default.createElement( 'div', { className: 'column column--2' }, _react2.default.createElement( 'button', { className: 'button--primary button--wide', 'data-elementtocopy': 'embed-text', onClick: this.copyToClipboard }, 'copy' ) ) ) ) ) ), _react2.default.createElement( 'div', { className: 'flex-container--row flex-container--space-between-bottom' }, _react2.default.createElement( _reactRouterDom.Link, { className: 'link--primary', to: '/' + shortId + '/' + name + '.' + fileExt }, _react2.default.createElement( 'span', { className: 'text' }, 'Direct Link' ) ), _react2.default.createElement( 'a', { className: 'link--primary', href: host + '/' + claimId + '/' + name + '.' + fileExt, download: name }, 'Download' ), _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://lbry.io/dmca' }, 'Report' ) ) ); } }]); return AssetInfo; }(_react2.default.Component); ; exports.default = AssetInfo; /***/ }), /* 137 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(138); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select request info var requestId = show.request.id; // select request var previousRequest = show.requestList[requestId] || null; // select channel var channel = void 0; if (previousRequest) { var channelKey = previousRequest.key; channel = show.channelList[channelKey] || null; } return { channel: channel }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 138 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _SEO = __webpack_require__(9); var _SEO2 = _interopRequireDefault(_SEO); var _ErrorPage = __webpack_require__(21); var _ErrorPage2 = _interopRequireDefault(_ErrorPage); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _ChannelClaimsDisplay = __webpack_require__(139); var _ChannelClaimsDisplay2 = _interopRequireDefault(_ChannelClaimsDisplay); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ShowChannel = function (_React$Component) { _inherits(ShowChannel, _React$Component); function ShowChannel() { _classCallCheck(this, ShowChannel); return _possibleConstructorReturn(this, (ShowChannel.__proto__ || Object.getPrototypeOf(ShowChannel)).apply(this, arguments)); } _createClass(ShowChannel, [{ key: 'render', value: function render() { var channel = this.props.channel; if (channel) { var name = channel.name, longId = channel.longId, shortId = channel.shortId; return _react2.default.createElement( 'div', null, _react2.default.createElement(_SEO2.default, { pageTitle: name, channel: channel }), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--tall row--padded' }, _react2.default.createElement( 'div', { className: 'column column--10' }, _react2.default.createElement( 'h2', null, 'channel name: ', name ), _react2.default.createElement( 'p', { className: 'fine-print' }, 'full channel id: ', longId ), _react2.default.createElement( 'p', { className: 'fine-print' }, 'short channel id: ', shortId ) ), _react2.default.createElement( 'div', { className: 'column column--10' }, _react2.default.createElement(_ChannelClaimsDisplay2.default, null) ) ) ); }; return _react2.default.createElement(_ErrorPage2.default, { error: 'loading channel data...' }); } }]); return ShowChannel; }(_react2.default.Component); ; exports.default = ShowChannel; /***/ }), /* 139 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _show = __webpack_require__(8); var _view = __webpack_require__(140); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select channel key var request = show.requestList[show.request.id]; var channelKey = request.key; // select channel claims var channel = show.channelList[channelKey] || null; // return props return { channelKey: channelKey, channel: channel }; }; var mapDispatchToProps = { onUpdateChannelClaims: _show.onUpdateChannelClaims }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 140 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _AssetPreview = __webpack_require__(141); var _AssetPreview2 = _interopRequireDefault(_AssetPreview); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ChannelClaimsDisplay = function (_React$Component) { _inherits(ChannelClaimsDisplay, _React$Component); function ChannelClaimsDisplay(props) { _classCallCheck(this, ChannelClaimsDisplay); var _this = _possibleConstructorReturn(this, (ChannelClaimsDisplay.__proto__ || Object.getPrototypeOf(ChannelClaimsDisplay)).call(this, props)); _this.showNextResultsPage = _this.showNextResultsPage.bind(_this); _this.showPreviousResultsPage = _this.showPreviousResultsPage.bind(_this); return _this; } _createClass(ChannelClaimsDisplay, [{ key: 'showPreviousResultsPage', value: function showPreviousResultsPage() { var currentPage = this.props.channel.claimsData.currentPage; var previousPage = parseInt(currentPage) - 1; this.showNewPage(previousPage); } }, { key: 'showNextResultsPage', value: function showNextResultsPage() { var currentPage = this.props.channel.claimsData.currentPage; var nextPage = parseInt(currentPage) + 1; this.showNewPage(nextPage); } }, { key: 'showNewPage', value: function showNewPage(page) { var _props = this.props, channelKey = _props.channelKey, _props$channel = _props.channel, name = _props$channel.name, longId = _props$channel.longId; this.props.onUpdateChannelClaims(channelKey, name, longId, page); } }, { key: 'render', value: function render() { var _props$channel$claims = this.props.channel.claimsData, claims = _props$channel$claims.claims, currentPage = _props$channel$claims.currentPage, totalPages = _props$channel$claims.totalPages; return _react2.default.createElement( 'div', { className: 'row row--tall' }, claims.length > 0 ? _react2.default.createElement( 'div', null, claims.map(function (claim, index) { return _react2.default.createElement(_AssetPreview2.default, { claimData: claim, key: claim.name + '-' + index }); }), _react2.default.createElement( 'div', null, currentPage > 1 && _react2.default.createElement( 'button', { className: 'button--secondary', onClick: this.showPreviousResultsPage }, 'Previous Page' ), currentPage < totalPages && _react2.default.createElement( 'button', { className: 'button--secondary', onClick: this.showNextResultsPage }, 'Next Page' ) ) ) : _react2.default.createElement( 'p', null, 'There are no claims in this channel' ) ); } }]); return ChannelClaimsDisplay; }(_react2.default.Component); ; exports.default = ChannelClaimsDisplay; /***/ }), /* 141 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _require = __webpack_require__(3), defaultThumbnail = _require.assetDefaults.thumbnail; var AssetPreview = function AssetPreview(_ref) { var _ref$claimData = _ref.claimData, name = _ref$claimData.name, claimId = _ref$claimData.claimId, fileExt = _ref$claimData.fileExt, contentType = _ref$claimData.contentType, thumbnail = _ref$claimData.thumbnail; var directSourceLink = claimId + '/' + name + '.' + fileExt; var showUrlLink = '/' + claimId + '/' + name; return _react2.default.createElement( 'div', { className: 'asset-holder' }, _react2.default.createElement( _reactRouterDom.Link, { to: showUrlLink }, function () { switch (contentType) { case 'image/jpeg': case 'image/jpg': case 'image/png': case 'image/gif': return _react2.default.createElement('img', { className: 'asset-preview', src: directSourceLink, alt: name }); case 'video/mp4': return _react2.default.createElement('img', { className: 'asset-preview video', src: thumbnail || defaultThumbnail, alt: name }); default: return _react2.default.createElement( 'p', null, 'unsupported file type' ); } }() ) ); }; exports.default = AssetPreview; /***/ }), /* 142 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _reactHelmet = __webpack_require__(14); var _reactHelmet2 = _interopRequireDefault(_reactHelmet); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _require = __webpack_require__(3), _require$details = _require.details, title = _require$details.title, host = _require$details.host; var FourOhForPage = function (_React$Component) { _inherits(FourOhForPage, _React$Component); function FourOhForPage() { _classCallCheck(this, FourOhForPage); return _possibleConstructorReturn(this, (FourOhForPage.__proto__ || Object.getPrototypeOf(FourOhForPage)).apply(this, arguments)); } _createClass(FourOhForPage, [{ key: 'render', value: function render() { return _react2.default.createElement( 'div', null, _react2.default.createElement( _reactHelmet2.default, null, _react2.default.createElement( 'title', null, title, ' - 404' ), _react2.default.createElement('link', { rel: 'canonical', href: host + '/404' }) ), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'h2', null, '404' ), _react2.default.createElement( 'p', null, 'That page does not exist' ) ) ); } }]); return FourOhForPage; }(_react2.default.Component); ; exports.default = FourOhForPage; /***/ }), /* 143 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _require = __webpack_require__(17), sendGAServeEvent = _require.sendGAServeEvent; var _require2 = __webpack_require__(144), determineResponseType = _require2.determineResponseType, flipClaimNameAndIdForBackwardsCompatibility = _require2.flipClaimNameAndIdForBackwardsCompatibility, logRequestData = _require2.logRequestData, getClaimIdAndServeAsset = _require2.getClaimIdAndServeAsset; var lbryUri = __webpack_require__(145); var handleShowRender = __webpack_require__(146); var SERVE = 'SERVE'; module.exports = function (app) { // route to serve a specific asset using the channel or claim id app.get('/:identifier/:claim', function (req, res) { var headers = req.headers, ip = req.ip, originalUrl = req.originalUrl, params = req.params; // decide if this is a show request var hasFileExtension = void 0; try { var _lbryUri$parseModifie = lbryUri.parseModifier(params.claim); hasFileExtension = _lbryUri$parseModifie.hasFileExtension; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } var responseType = determineResponseType(hasFileExtension, headers); if (responseType !== SERVE) { return handleShowRender(req, res); } // handle serve request // send google analytics sendGAServeEvent(headers, ip, originalUrl); // parse the claim var claimName = void 0; try { var _lbryUri$parseClaim = lbryUri.parseClaim(params.claim); claimName = _lbryUri$parseClaim.claimName; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } // parse the identifier var isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0; try { var _lbryUri$parseIdentif = lbryUri.parseIdentifier(params.identifier); isChannel = _lbryUri$parseIdentif.isChannel; channelName = _lbryUri$parseIdentif.channelName; channelClaimId = _lbryUri$parseIdentif.channelClaimId; claimId = _lbryUri$parseIdentif.claimId; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } if (!isChannel) { var _flipClaimNameAndIdFo = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName); var _flipClaimNameAndIdFo2 = _slicedToArray(_flipClaimNameAndIdFo, 2); claimId = _flipClaimNameAndIdFo2[0]; claimName = _flipClaimNameAndIdFo2[1]; } // log the request data for debugging logRequestData(responseType, claimName, channelName, claimId); // get the claim Id and then serve the asset getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res); }); // route to serve the winning asset at a claim or a channel page app.get('/:claim', function (req, res) { var headers = req.headers, ip = req.ip, originalUrl = req.originalUrl, params = req.params; // decide if this is a show request var hasFileExtension = void 0; try { var _lbryUri$parseModifie2 = lbryUri.parseModifier(params.claim); hasFileExtension = _lbryUri$parseModifie2.hasFileExtension; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } var responseType = determineResponseType(hasFileExtension, headers); if (responseType !== SERVE) { return handleShowRender(req, res); } // handle serve request // send google analytics sendGAServeEvent(headers, ip, originalUrl); // parse the claim var claimName = void 0; try { var _lbryUri$parseClaim2 = lbryUri.parseClaim(params.claim); claimName = _lbryUri$parseClaim2.claimName; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } // log the request data for debugging logRequestData(responseType, claimName, null, null); // get the claim Id and then serve the asset getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res); }); }; /***/ }), /* 144 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var _require = __webpack_require__(30), getClaimId = _require.getClaimId, getLocalFileRecord = _require.getLocalFileRecord; var _require2 = __webpack_require__(29), handleErrorResponse = _require2.handleErrorResponse; var SERVE = 'SERVE'; var SHOW = 'SHOW'; var NO_FILE = 'NO_FILE'; var NO_CHANNEL = 'NO_CHANNEL'; var NO_CLAIM = 'NO_CLAIM'; function clientAcceptsHtml(_ref) { var accept = _ref.accept; return accept && accept.match(/text\/html/); }; function requestIsFromBrowser(headers) { return headers['user-agent'] && headers['user-agent'].match(/Mozilla/); }; function clientWantsAsset(_ref2) { var accept = _ref2.accept, range = _ref2.range; var imageIsWanted = accept && accept.match(/image\/.*/) && !accept.match(/text\/html/) && !accept.match(/text\/\*/); var videoIsWanted = accept && range; return imageIsWanted || videoIsWanted; }; function isValidClaimId(claimId) { return claimId.length === 40 && !/[^A-Za-z0-9]/g.test(claimId); }; function isValidShortId(claimId) { return claimId.length === 1; // it should really evaluate the short url itself }; function isValidShortIdOrClaimId(input) { return isValidClaimId(input) || isValidShortId(input); }; function serveAssetToClient(claimId, name, res) { return getLocalFileRecord(claimId, name).then(function (fileRecord) { // check that a local record was found if (fileRecord === NO_FILE) { return res.status(307).redirect('/api/claim/get/' + name + '/' + claimId); } // serve the file var filePath = fileRecord.filePath, fileType = fileRecord.fileType; logger.verbose('serving file: ' + filePath); var sendFileOptions = { headers: { 'X-Content-Type-Options': 'nosniff', 'Content-Type': fileType || 'image/jpeg' } }; res.status(200).sendFile(filePath, sendFileOptions); }).catch(function (error) { throw error; }); }; module.exports = { getClaimIdAndServeAsset: function getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) { // get the claim Id and then serve the asset getClaimId(channelName, channelClaimId, claimName, claimId).then(function (fullClaimId) { if (fullClaimId === NO_CLAIM) { return res.status(404).json({ success: false, message: 'no claim id could be found' }); } else if (fullClaimId === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'no channel id could be found' }); } serveAssetToClient(fullClaimId, claimName, res); // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success'); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail'); }); }, determineResponseType: function determineResponseType(hasFileExtension, headers) { var responseType = void 0; if (hasFileExtension) { responseType = SERVE; // assume a serve request if file extension is present if (clientAcceptsHtml(headers)) { // if the request comes from a browser, change it to a show request responseType = SHOW; } } else { responseType = SHOW; if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) { // this is in case someone embeds a show url logger.debug('Show request came from browser but wants an image/video. Changing response to serve...'); responseType = SERVE; } } return responseType; }, flipClaimNameAndIdForBackwardsCompatibility: function flipClaimNameAndIdForBackwardsCompatibility(identifier, name) { // this is a patch for backwards compatability with '/name/claim_id' url format if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) { var tempName = name; name = identifier; identifier = tempName; } return [identifier, name]; }, logRequestData: function logRequestData(responseType, claimName, channelName, claimId) { logger.debug('responseType ===', responseType); logger.debug('claim name === ', claimName); logger.debug('channel name ===', channelName); logger.debug('claim id ===', claimId); } }; /***/ }), /* 145 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var logger = __webpack_require__(2); module.exports = { REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g, REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g, REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/, CHANNEL_CHAR: '@', parseIdentifier: function parseIdentifier(identifier) { logger.debug('parsing identifier:', identifier); var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end) '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec = componentsRegex.exec(identifier).map(function (match) { return match || null; }), _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4), proto = _componentsRegex$exec2[0], value = _componentsRegex$exec2[1], modifierSeperator = _componentsRegex$exec2[2], modifier = _componentsRegex$exec2[3]; logger.debug(proto + ', ' + value + ', ' + modifierSeperator + ', ' + modifier); // Validate and process name if (!value) { throw new Error('Check your url. No channel name provided before "' + modifierSeperator + '"'); } var isChannel = value.startsWith(module.exports.CHANNEL_CHAR); var channelName = isChannel ? value : null; var claimId = void 0; if (isChannel) { if (!channelName) { throw new Error('No channel name after @.'); } var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL); if (nameBadChars) { throw new Error('Invalid characters in channel name: ' + nameBadChars.join(', ') + '.'); } } else { claimId = value; } // Validate and process modifier var channelClaimId = void 0; if (modifierSeperator) { if (!modifier) { throw new Error('No modifier provided after separator "' + modifierSeperator + '"'); } if (modifierSeperator === ':') { channelClaimId = modifier; } else { throw new Error('The "' + modifierSeperator + '" modifier is not currently supported'); } } return { isChannel: isChannel, channelName: channelName, channelClaimId: channelClaimId, claimId: claimId }; }, parseClaim: function parseClaim(claim) { logger.debug('parsing name:', claim); var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier) '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec3 = componentsRegex.exec(claim).map(function (match) { return match || null; }), _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4), proto = _componentsRegex$exec4[0], claimName = _componentsRegex$exec4[1], modifierSeperator = _componentsRegex$exec4[2], modifier = _componentsRegex$exec4[3]; logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier); // Validate and process name if (!claimName) { throw new Error('No claim name provided before .'); } var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM); if (nameBadChars) { throw new Error('Invalid characters in claim name: ' + nameBadChars.join(', ') + '.'); } // Validate and process modifier if (modifierSeperator) { if (!modifier) { throw new Error('No file extension provided after separator ' + modifierSeperator + '.'); } if (modifierSeperator !== '.') { throw new Error('The ' + modifierSeperator + ' modifier is not supported in the claim name'); } } // return results return { claimName: claimName }; }, parseModifier: function parseModifier(claim) { logger.debug('parsing modifier:', claim); var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier) '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec5 = componentsRegex.exec(claim).map(function (match) { return match || null; }), _componentsRegex$exec6 = _slicedToArray(_componentsRegex$exec5, 4), proto = _componentsRegex$exec6[0], claimName = _componentsRegex$exec6[1], modifierSeperator = _componentsRegex$exec6[2], modifier = _componentsRegex$exec6[3]; logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier); // Validate and process modifier var hasFileExtension = false; if (modifierSeperator) { hasFileExtension = true; } return { hasFileExtension: hasFileExtension }; } }; /***/ }), /* 146 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _server = __webpack_require__(32); var _redux = __webpack_require__(18); var _reducers = __webpack_require__(33); var _reducers2 = _interopRequireDefault(_reducers); var _reactRedux = __webpack_require__(1); var _reactRouterDom = __webpack_require__(4); var _GAListener = __webpack_require__(38); var _GAListener2 = _interopRequireDefault(_GAListener); var _app = __webpack_require__(39); var _app2 = _interopRequireDefault(_app); var _renderFullPage = __webpack_require__(45); var _renderFullPage2 = _interopRequireDefault(_renderFullPage); var _reduxSaga = __webpack_require__(147); var _reduxSaga2 = _interopRequireDefault(_reduxSaga); var _effects = __webpack_require__(15); var _show_uri = __webpack_require__(148); var _show = __webpack_require__(8); var _reactHelmet = __webpack_require__(14); var _reactHelmet2 = _interopRequireDefault(_reactHelmet); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var returnSagaWithParams = function returnSagaWithParams(saga, params) { return (/*#__PURE__*/regeneratorRuntime.mark(function _callee() { return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return (0, _effects.call)(saga, params); case 2: case 'end': return _context.stop(); } } }, _callee, this); }) ); }; module.exports = function (req, res) { var context = {}; // create and apply middleware var sagaMiddleware = (0, _reduxSaga2.default)(); var middleware = (0, _redux.applyMiddleware)(sagaMiddleware); // create a new Redux store instance var store = (0, _redux.createStore)(_reducers2.default, middleware); // create saga var action = (0, _show.onHandleShowPageUri)(req.params); var saga = returnSagaWithParams(_show_uri.handleShowPageUri, action); // run the saga middleware sagaMiddleware.run(saga).done.then(function () { // render component to a string var html = (0, _server.renderToString)(_react2.default.createElement( _reactRedux.Provider, { store: store }, _react2.default.createElement( _reactRouterDom.StaticRouter, { location: req.url, context: context }, _react2.default.createElement( _GAListener2.default, null, _react2.default.createElement(_app2.default, null) ) ) )); // get head tags from helmet var helmet = _reactHelmet2.default.renderStatic(); // check for a redirect if (context.url) { return res.redirect(301, context.url); } // get the initial state from our Redux store var preloadedState = store.getState(); // send the rendered page back to the client res.send((0, _renderFullPage2.default)(helmet, html, preloadedState)); }); }; /***/ }), /* 147 */ /***/ (function(module, exports) { module.exports = require("redux-saga"); /***/ }), /* 148 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.handleShowPageUri = handleShowPageUri; exports.watchHandleShowPageUri = watchHandleShowPageUri; var _effects = __webpack_require__(15); var _show_action_types = __webpack_require__(12); var actions = _interopRequireWildcard(_show_action_types); var _show = __webpack_require__(8); var _show_asset = __webpack_require__(149); var _show_channel = __webpack_require__(151); var _lbryUri = __webpack_require__(153); var _lbryUri2 = _interopRequireDefault(_lbryUri); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var _marked = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateIdentifierAndClaim), _marked2 = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateClaimOnly), _marked3 = /*#__PURE__*/regeneratorRuntime.mark(handleShowPageUri), _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchHandleShowPageUri); function parseAndUpdateIdentifierAndClaim(modifier, claim) { var isChannel, channelName, channelClaimId, claimId, claimName, extension, _lbryUri$parseIdentif, _lbryUri$parseClaim; return regeneratorRuntime.wrap(function parseAndUpdateIdentifierAndClaim$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: // this is a request for an asset // claim will be an asset claim // the identifier could be a channel or a claim id isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0, claimName = void 0, extension = void 0; _context.prev = 1; _lbryUri$parseIdentif = _lbryUri2.default.parseIdentifier(modifier); isChannel = _lbryUri$parseIdentif.isChannel; channelName = _lbryUri$parseIdentif.channelName; channelClaimId = _lbryUri$parseIdentif.channelClaimId; claimId = _lbryUri$parseIdentif.claimId; _lbryUri$parseClaim = _lbryUri2.default.parseClaim(claim); claimName = _lbryUri$parseClaim.claimName; extension = _lbryUri$parseClaim.extension; _context.next = 17; break; case 12: _context.prev = 12; _context.t0 = _context['catch'](1); _context.next = 16; return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); case 16: return _context.abrupt('return', _context.sent); case 17: if (!isChannel) { _context.next = 21; break; } _context.next = 20; return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, channelName, channelClaimId, extension)); case 20: return _context.abrupt('return', _context.sent); case 21: ; _context.next = 24; return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, claimId, null, null, extension)); case 24: case 'end': return _context.stop(); } } }, _marked, this, [[1, 12]]); } function parseAndUpdateClaimOnly(claim) { var isChannel, channelName, channelClaimId, _lbryUri$parseIdentif2, claimName, extension, _lbryUri$parseClaim2; return regeneratorRuntime.wrap(function parseAndUpdateClaimOnly$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: // this could be a request for an asset or a channel page // claim could be an asset claim or a channel claim isChannel = void 0, channelName = void 0, channelClaimId = void 0; _context2.prev = 1; _lbryUri$parseIdentif2 = _lbryUri2.default.parseIdentifier(claim); isChannel = _lbryUri$parseIdentif2.isChannel; channelName = _lbryUri$parseIdentif2.channelName; channelClaimId = _lbryUri$parseIdentif2.channelClaimId; _context2.next = 13; break; case 8: _context2.prev = 8; _context2.t0 = _context2['catch'](1); _context2.next = 12; return (0, _effects.put)((0, _show.onRequestError)(_context2.t0.message)); case 12: return _context2.abrupt('return', _context2.sent); case 13: if (!isChannel) { _context2.next = 17; break; } _context2.next = 16; return (0, _effects.call)(_show_channel.newChannelRequest, (0, _show.onNewChannelRequest)(channelName, channelClaimId)); case 16: return _context2.abrupt('return', _context2.sent); case 17: // if not for a channel, parse the claim request claimName = void 0, extension = void 0; _context2.prev = 18; _lbryUri$parseClaim2 = _lbryUri2.default.parseClaim(claim); claimName = _lbryUri$parseClaim2.claimName; extension = _lbryUri$parseClaim2.extension; _context2.next = 29; break; case 24: _context2.prev = 24; _context2.t1 = _context2['catch'](18); _context2.next = 28; return (0, _effects.put)((0, _show.onRequestError)(_context2.t1.message)); case 28: return _context2.abrupt('return', _context2.sent); case 29: _context2.next = 31; return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, null, null, extension)); case 31: case 'end': return _context2.stop(); } } }, _marked2, this, [[1, 8], [18, 24]]); } function handleShowPageUri(action) { var _action$data, identifier, claim; return regeneratorRuntime.wrap(function handleShowPageUri$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _action$data = action.data, identifier = _action$data.identifier, claim = _action$data.claim; if (!identifier) { _context3.next = 5; break; } _context3.next = 4; return (0, _effects.call)(parseAndUpdateIdentifierAndClaim, identifier, claim); case 4: return _context3.abrupt('return', _context3.sent); case 5: _context3.next = 7; return (0, _effects.call)(parseAndUpdateClaimOnly, claim); case 7: case 'end': return _context3.stop(); } } }, _marked3, this); }; function watchHandleShowPageUri() { return regeneratorRuntime.wrap(function watchHandleShowPageUri$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return (0, _effects.takeLatest)(actions.HANDLE_SHOW_URI, handleShowPageUri); case 2: case 'end': return _context4.stop(); } } }, _marked4, this); }; /***/ }), /* 149 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.newAssetRequest = newAssetRequest; exports.watchNewAssetRequest = watchNewAssetRequest; var _effects = __webpack_require__(15); var _show_action_types = __webpack_require__(12); var actions = _interopRequireWildcard(_show_action_types); var _show = __webpack_require__(8); var _assetApi = __webpack_require__(150); var _show2 = __webpack_require__(13); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var _marked = /*#__PURE__*/regeneratorRuntime.mark(newAssetRequest), _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewAssetRequest); function newAssetRequest(action) { var _action$data, requestType, requestId, name, modifier, state, longId, _ref, assetKey, shortId, _ref2, claimData, _ref3; return regeneratorRuntime.wrap(function newAssetRequest$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, name = _action$data.name, modifier = _action$data.modifier; // put an action to update the request in redux _context.next = 3; return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId)); case 3: _context.next = 5; return (0, _effects.select)(_show2.selectShowState); case 5: state = _context.sent; if (!state.requestList[requestId]) { _context.next = 8; break; } return _context.abrupt('return', null); case 8: // get long id && add request to request list longId = void 0; _context.prev = 9; _context.next = 12; return (0, _effects.call)(_assetApi.getLongClaimId, name, modifier); case 12: _ref = _context.sent; longId = _ref.data; _context.next = 21; break; case 16: _context.prev = 16; _context.t0 = _context['catch'](9); _context.next = 20; return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); case 20: return _context.abrupt('return', _context.sent); case 21: assetKey = 'a#' + name + '#' + longId; _context.next = 24; return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, assetKey)); case 24: if (!state.assetList[assetKey]) { _context.next = 26; break; } return _context.abrupt('return', null); case 26: // get short Id shortId = void 0; _context.prev = 27; _context.next = 30; return (0, _effects.call)(_assetApi.getShortId, name, longId); case 30: _ref2 = _context.sent; shortId = _ref2.data; _context.next = 39; break; case 34: _context.prev = 34; _context.t1 = _context['catch'](27); _context.next = 38; return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message)); case 38: return _context.abrupt('return', _context.sent); case 39: // get asset claim data claimData = void 0; _context.prev = 40; _context.next = 43; return (0, _effects.call)(_assetApi.getClaimData, name, longId); case 43: _ref3 = _context.sent; claimData = _ref3.data; _context.next = 52; break; case 47: _context.prev = 47; _context.t2 = _context['catch'](40); _context.next = 51; return (0, _effects.put)((0, _show.onRequestError)(_context.t2.message)); case 51: return _context.abrupt('return', _context.sent); case 52: _context.next = 54; return (0, _effects.put)((0, _show.addAssetToAssetList)(assetKey, null, name, longId, shortId, claimData)); case 54: _context.next = 56; return (0, _effects.put)((0, _show.onRequestError)(null)); case 56: case 'end': return _context.stop(); } } }, _marked, this, [[9, 16], [27, 34], [40, 47]]); }; function watchNewAssetRequest() { return regeneratorRuntime.wrap(function watchNewAssetRequest$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return (0, _effects.takeLatest)(actions.ASSET_REQUEST_NEW, newAssetRequest); case 2: case 'end': return _context2.stop(); } } }, _marked2, this); }; /***/ }), /* 150 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getLongClaimId = getLongClaimId; exports.getShortId = getShortId; exports.getClaimData = getClaimData; var _request = __webpack_require__(11); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _require = __webpack_require__(3), host = _require.details.host; function getLongClaimId(name, modifier) { var body = {}; // create request params if (modifier) { if (modifier.id) { body['claimId'] = modifier.id; } else { body['channelName'] = modifier.channel.name; body['channelClaimId'] = modifier.channel.id; } } body['claimName'] = name; var params = { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }; // create url var url = host + '/api/claim/long-id'; // return the request promise return (0, _request2.default)(url, params); }; function getShortId(name, claimId) { var url = host + '/api/claim/short-id/' + claimId + '/' + name; return (0, _request2.default)(url); }; function getClaimData(name, claimId) { var url = host + '/api/claim/data/' + name + '/' + claimId; return (0, _request2.default)(url); }; /***/ }), /* 151 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.newChannelRequest = newChannelRequest; exports.watchNewChannelRequest = watchNewChannelRequest; exports.watchUpdateChannelClaims = watchUpdateChannelClaims; var _effects = __webpack_require__(15); var _show_action_types = __webpack_require__(12); var actions = _interopRequireWildcard(_show_action_types); var _show = __webpack_require__(8); var _channelApi = __webpack_require__(152); var _show2 = __webpack_require__(13); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var _marked = /*#__PURE__*/regeneratorRuntime.mark(newChannelRequest), _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewChannelRequest), _marked3 = /*#__PURE__*/regeneratorRuntime.mark(getNewClaimsAndUpdateChannel), _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchUpdateChannelClaims); function newChannelRequest(action) { var _action$data, requestType, requestId, channelName, channelId, state, longId, shortId, _ref, _ref$data, channelKey, claimsData, _ref2; return regeneratorRuntime.wrap(function newChannelRequest$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, channelName = _action$data.channelName, channelId = _action$data.channelId; // put an action to update the request in redux _context.next = 3; return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId)); case 3: _context.next = 5; return (0, _effects.select)(_show2.selectShowState); case 5: state = _context.sent; if (!state.requestList[requestId]) { _context.next = 8; break; } return _context.abrupt('return', null); case 8: // get channel long id longId = void 0, shortId = void 0; _context.prev = 9; _context.next = 12; return (0, _effects.call)(_channelApi.getChannelData, channelName, channelId); case 12: _ref = _context.sent; _ref$data = _ref.data; longId = _ref$data.longChannelClaimId; shortId = _ref$data.shortChannelClaimId; _context.next = 23; break; case 18: _context.prev = 18; _context.t0 = _context['catch'](9); _context.next = 22; return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); case 22: return _context.abrupt('return', _context.sent); case 23: // store the request in the channel requests list channelKey = 'c#' + channelName + '#' + longId; _context.next = 26; return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, channelKey)); case 26: if (!state.channelList[channelKey]) { _context.next = 28; break; } return _context.abrupt('return', null); case 28: // get channel claims data claimsData = void 0; _context.prev = 29; _context.next = 32; return (0, _effects.call)(_channelApi.getChannelClaims, channelName, longId, 1); case 32: _ref2 = _context.sent; claimsData = _ref2.data; _context.next = 41; break; case 36: _context.prev = 36; _context.t1 = _context['catch'](29); _context.next = 40; return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message)); case 40: return _context.abrupt('return', _context.sent); case 41: _context.next = 43; return (0, _effects.put)((0, _show.addNewChannelToChannelList)(channelKey, channelName, shortId, longId, claimsData)); case 43: _context.next = 45; return (0, _effects.put)((0, _show.onRequestError)(null)); case 45: case 'end': return _context.stop(); } } }, _marked, this, [[9, 18], [29, 36]]); } function watchNewChannelRequest() { return regeneratorRuntime.wrap(function watchNewChannelRequest$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return (0, _effects.takeLatest)(actions.CHANNEL_REQUEST_NEW, newChannelRequest); case 2: case 'end': return _context2.stop(); } } }, _marked2, this); }; function getNewClaimsAndUpdateChannel(action) { var _action$data2, channelKey, name, longId, page, claimsData, _ref3; return regeneratorRuntime.wrap(function getNewClaimsAndUpdateChannel$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _action$data2 = action.data, channelKey = _action$data2.channelKey, name = _action$data2.name, longId = _action$data2.longId, page = _action$data2.page; claimsData = void 0; _context3.prev = 2; _context3.next = 5; return (0, _effects.call)(_channelApi.getChannelClaims, name, longId, page); case 5: _ref3 = _context3.sent; claimsData = _ref3.data; _context3.next = 14; break; case 9: _context3.prev = 9; _context3.t0 = _context3['catch'](2); _context3.next = 13; return (0, _effects.put)((0, _show.onRequestError)(_context3.t0.message)); case 13: return _context3.abrupt('return', _context3.sent); case 14: _context3.next = 16; return (0, _effects.put)((0, _show.updateChannelClaims)(channelKey, claimsData)); case 16: case 'end': return _context3.stop(); } } }, _marked3, this, [[2, 9]]); } function watchUpdateChannelClaims() { return regeneratorRuntime.wrap(function watchUpdateChannelClaims$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return (0, _effects.takeLatest)(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel); case 2: case 'end': return _context4.stop(); } } }, _marked4, this); } /***/ }), /* 152 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getChannelData = getChannelData; exports.getChannelClaims = getChannelClaims; var _request = __webpack_require__(11); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _require = __webpack_require__(3), host = _require.details.host; function getChannelData(name, id) { if (!id) id = 'none'; var url = host + '/api/channel/data/' + name + '/' + id; return (0, _request2.default)(url); }; function getChannelClaims(name, longId, page) { if (!page) page = 1; var url = host + '/api/channel/claims/' + name + '/' + longId + '/' + page; return (0, _request2.default)(url); }; /***/ }), /* 153 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); module.exports = { REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g, REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g, REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/, CHANNEL_CHAR: '@', parseIdentifier: function parseIdentifier(identifier) { var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end) '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec = componentsRegex // eslint-disable-line no-unused-vars .exec(identifier).map(function (match) { return match || null; }), _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4), proto = _componentsRegex$exec2[0], value = _componentsRegex$exec2[1], modifierSeperator = _componentsRegex$exec2[2], modifier = _componentsRegex$exec2[3]; // Validate and process name if (!value) { throw new Error('Check your URL. No channel name provided before "' + modifierSeperator + '"'); } var isChannel = value.startsWith(module.exports.CHANNEL_CHAR); var channelName = isChannel ? value : null; var claimId = void 0; if (isChannel) { if (!channelName) { throw new Error('Check your URL. No channel name after "@".'); } var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL); if (nameBadChars) { throw new Error('Check your URL. Invalid characters in channel name: "' + nameBadChars.join(', ') + '".'); } } else { claimId = value; } // Validate and process modifier var channelClaimId = void 0; if (modifierSeperator) { if (!modifier) { throw new Error('Check your URL. No modifier provided after separator "' + modifierSeperator + '"'); } if (modifierSeperator === ':') { channelClaimId = modifier; } else { throw new Error('Check your URL. The "' + modifierSeperator + '" modifier is not currently supported'); } } return { isChannel: isChannel, channelName: channelName, channelClaimId: channelClaimId || null, claimId: claimId || null }; }, parseClaim: function parseClaim(name) { var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first extension) '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end) ); var _componentsRegex$exec3 = componentsRegex // eslint-disable-line no-unused-vars .exec(name).map(function (match) { return match || null; }), _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4), proto = _componentsRegex$exec4[0], claimName = _componentsRegex$exec4[1], extensionSeperator = _componentsRegex$exec4[2], extension = _componentsRegex$exec4[3]; // Validate and process name if (!claimName) { throw new Error('Check your URL. No claim name provided before "."'); } var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM); if (nameBadChars) { throw new Error('Check your URL. Invalid characters in claim name: "' + nameBadChars.join(', ') + '".'); } // Validate and process extension if (extensionSeperator) { if (!extension) { throw new Error('Check your URL. No file extension provided after separator "' + extensionSeperator + '".'); } if (extensionSeperator !== '.') { throw new Error('Check your URL. The "' + extensionSeperator + '" separator is not supported in the claim name.'); } } return { claimName: claimName, extension: extension || null }; } }; /***/ }), /* 154 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var handlePageRender = __webpack_require__(31); module.exports = function (app) { // a catch-all route if someone visits a page that does not exist app.use('*', function (req, res) { // send response handlePageRender(req, res); }); }; /***/ }) /******/ ]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgYjllZWE2YzBjYzRiNTViNGUyMjkiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3RcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdC1yZWR1eFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIndpbnN0b25cIiIsIndlYnBhY2s6Ly8vLi9jb25maWcvc2l0ZUNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdC1yb3V0ZXItZG9tXCIiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvYWN0aW9ucy9wdWJsaXNoLmpzIiwid2VicGFjazovLy8uL21vZGVscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL05hdkJhci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9hY3Rpb25zL3Nob3cuanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29tcG9uZW50cy9TRU8vaW5kZXguanN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcInByb3AtdHlwZXNcIiIsIndlYnBhY2s6Ly8vLi9yZWFjdC91dGlscy9yZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL3JlYWN0L2NvbnN0YW50cy9zaG93X2FjdGlvbl90eXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9zZWxlY3RvcnMvc2hvdy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdC1oZWxtZXRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWR1eC1zYWdhL2VmZmVjdHNcIiIsIndlYnBhY2s6Ly8vLi9oZWxwZXJzL2xicnlBcGkuanMiLCJ3ZWJwYWNrOi8vLy4vaGVscGVycy9nb29nbGVBbmFseXRpY3MuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVkdXhcIiIsIndlYnBhY2s6Ly8vLi9yZWFjdC9hY3Rpb25zL2NoYW5uZWwuanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29tcG9uZW50cy9Qcm9ncmVzc0Jhci9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29tcG9uZW50cy9FcnJvclBhZ2UvaW5kZXguanN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcInBhc3Nwb3J0XCIiLCJ3ZWJwYWNrOi8vLy4vY29uZmlnL215c3FsQ29uZmlnLmpzIiwid2VicGFjazovLy8uL2NvbmZpZy9zbGFja0NvbmZpZy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJwYXNzcG9ydC1sb2NhbFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInNlcXVlbGl6ZVwiIiwid2VicGFjazovLy8uL2hlbHBlcnMvc2VxdWVsaXplSGVscGVycy5qcyIsIndlYnBhY2s6Ly8vLi9oZWxwZXJzL3B1Ymxpc2hIZWxwZXJzLmpzIiwid2VicGFjazovLy8uL2hlbHBlcnMvZXJyb3JIYW5kbGVycy5qcyIsIndlYnBhY2s6Ly8vLi9jb250cm9sbGVycy9zZXJ2ZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vaGVscGVycy9oYW5kbGVQYWdlUmVuZGVyLmpzeCIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdC1kb20vc2VydmVyXCIiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvcmVkdWNlcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29uc3RhbnRzL3B1Ymxpc2hfYWN0aW9uX3R5cGVzLmpzIiwid2VicGFjazovLy8uL3JlYWN0L2NvbnN0YW50cy9wdWJsaXNoX2NoYW5uZWxfc2VsZWN0X3N0YXRlcy5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb25zdGFudHMvY2hhbm5lbF9hY3Rpb25fdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29uc3RhbnRzL2Fzc2V0X2Rpc3BsYXlfc3RhdGVzLmpzIiwid2VicGFjazovLy8uL3JlYWN0L2NvbXBvbmVudHMvR0FMaXN0ZW5lci9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvYXBwLmpzIiwid2VicGFjazovLy8uL3JlYWN0L2NvbnRhaW5lcnMvRHJvcHpvbmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtL2luZGV4LmpzIiwid2VicGFjazovLy8uL3JlYWN0L2NvbnRhaW5lcnMvQ2hhbm5lbENyZWF0ZUZvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29uc3RhbnRzL3Nob3dfcmVxdWVzdF90eXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL0Fzc2V0RGlzcGxheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9oZWxwZXJzL3JlbmRlckZ1bGxQYWdlLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImJhYmVsLXBvbHlmaWxsXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwid2hhdHdnLWZldGNoXCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImV4cHJlc3NcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJib2R5LXBhcnNlclwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImV4cHJlc3MtaGFuZGxlYmFyc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcImhhbmRsZWJhcnNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJoZWxtZXRcIiIsIndlYnBhY2s6Ly8vLi9oZWxwZXJzL2F1dGhIZWxwZXJzLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImNvb2tpZS1zZXNzaW9uXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiaHR0cFwiIiwid2VicGFjazovLy8uL2hlbHBlcnMvY29uZmlndXJlTG9nZ2VyLmpzIiwid2VicGFjazovLy8uL2NvbmZpZy9sb2dnZXJDb25maWcuanMiLCJ3ZWJwYWNrOi8vLy4vaGVscGVycy9jb25maWd1cmVTbGFjay5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ3aW5zdG9uLXNsYWNrLXdlYmhvb2tcIiIsIndlYnBhY2s6Ly8vLi9wYXNzcG9ydC9sb2NhbC1zaWdudXAuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiYXhpb3NcIiIsIndlYnBhY2s6Ly8vLi9jb25maWcvbGJyeUNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ1bml2ZXJzYWwtYW5hbHl0aWNzXCIiLCJ3ZWJwYWNrOi8vLy4vbW9kZWxzL2NlcnRpZmljYXRlLmpzIiwid2VicGFjazovLy8uL21vZGVscy9jaGFubmVsLmpzIiwid2VicGFjazovLy8uL21vZGVscy9jbGFpbS5qcyIsIndlYnBhY2s6Ly8vLi9tb2RlbHMvZmlsZS5qcyIsIndlYnBhY2s6Ly8vLi9tb2RlbHMvcmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9tb2RlbHMvdXNlci5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJiY3J5cHRcIiIsIndlYnBhY2s6Ly8vLi9wYXNzcG9ydC9sb2NhbC1sb2dpbi5qcyIsIndlYnBhY2s6Ly8vLi9yb3V0ZXMvYXV0aC1yb3V0ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vcm91dGVzL2FwaS1yb3V0ZXMuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY29ubmVjdC1tdWx0aXBhcnR5XCIiLCJ3ZWJwYWNrOi8vLy4vY29udHJvbGxlcnMvcHVibGlzaENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiZnNcIiIsIndlYnBhY2s6Ly8vLi9hdXRoL2F1dGhlbnRpY2F0aW9uLmpzIiwid2VicGFjazovLy8uL2hlbHBlcnMvY2hhbm5lbFBhZ2luYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vcm91dGVzL3BhZ2Utcm91dGVzLmpzIiwid2VicGFjazovLy8uL3JlYWN0L3JlZHVjZXJzL3B1Ymxpc2guanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvcmVkdWNlcnMvY2hhbm5lbC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9yZWR1Y2Vycy9zaG93LmpzIiwid2VicGFjazovLy8uL3JlYWN0L3JlZHVjZXJzL3NpdGUuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtZ2FcIiIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb21wb25lbnRzL0hvbWVQYWdlL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC91dGlscy9wYWdlVGl0bGUuanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvdXRpbHMvbWV0YVRhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvdXRpbHMvY2Fub25pY2FsTGluay5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL05hdkJhci92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb21wb25lbnRzL0xvZ28vaW5kZXguanN4Iiwid2VicGFjazovLy8uL3JlYWN0L2NvbXBvbmVudHMvTmF2QmFyQ2hhbm5lbE9wdGlvbnNEcm9wZG93bi9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY3Jvc3MtZmV0Y2gvcG9seWZpbGxcIiIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hUb29sL2luZGV4LmpzIiwid2VicGFjazovLy8uL3JlYWN0L2NvbnRhaW5lcnMvUHVibGlzaFRvb2wvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9Ecm9wem9uZS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC91dGlscy9maWxlLmpzIiwid2VicGFjazovLy8uL3JlYWN0L2NvbXBvbmVudHMvUHJldmlldy9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9QdWJsaXNoRGV0YWlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hEZXRhaWxzL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL3JlYWN0L2NvbnRhaW5lcnMvUHVibGlzaFRpdGxlSW5wdXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9QdWJsaXNoVGl0bGVJbnB1dC92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hVcmxJbnB1dC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hVcmxJbnB1dC92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb21wb25lbnRzL1B1Ymxpc2hVcmxNaWRkbGVEaXNwbGF5L2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hUaHVtYm5haWxJbnB1dC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hUaHVtYm5haWxJbnB1dC92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hNZXRhZGF0YUlucHV0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hNZXRhZGF0YUlucHV0cy92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb21wb25lbnRzL0V4cGFuZGluZ1RleHRBcmVhL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL0NoYW5uZWxTZWxlY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9DaGFubmVsU2VsZWN0L3ZpZXcuanN4Iiwid2VicGFjazovLy8uL3JlYWN0L2NvbnRhaW5lcnMvQ2hhbm5lbExvZ2luRm9ybS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL0NoYW5uZWxDcmVhdGVGb3JtL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL3JlYWN0L2NvbXBvbmVudHMvQWN0aXZlU3RhdHVzQmFyL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb21wb25lbnRzL0luYWN0aXZlU3RhdHVzQmFyL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hTdGF0dXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9QdWJsaXNoU3RhdHVzL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL3JlYWN0L2NvbnN0YW50cy9wdWJsaXNoX2NsYWltX3N0YXRlcy5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hEaXNhYmxlZE1lc3NhZ2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9QdWJsaXNoRGlzYWJsZWRNZXNzYWdlL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL3JlYWN0L2NvbXBvbmVudHMvQWJvdXRQYWdlL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL0xvZ2luUGFnZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL0xvZ2luUGFnZS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1Nob3dQYWdlL2luZGV4LmpzIiwid2VicGFjazovLy8uL3JlYWN0L2NvbnRhaW5lcnMvU2hvd1BhZ2Uvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9TaG93QXNzZXRMaXRlL2luZGV4LmpzIiwid2VicGFjazovLy8uL3JlYWN0L2NvbnRhaW5lcnMvU2hvd0Fzc2V0TGl0ZS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL0Fzc2V0RGlzcGxheS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1Nob3dBc3NldERldGFpbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9TaG93QXNzZXREZXRhaWxzL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL3JlYWN0L2NvbnRhaW5lcnMvQXNzZXRUaXRsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL0Fzc2V0VGl0bGUvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9Bc3NldEluZm8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9Bc3NldEluZm8vdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9TaG93Q2hhbm5lbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb250YWluZXJzL1Nob3dDaGFubmVsL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL3JlYWN0L2NvbnRhaW5lcnMvQ2hhbm5lbENsYWltc0Rpc3BsYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9yZWFjdC9jb21wb25lbnRzL0Fzc2V0UHJldmlldy9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vcmVhY3QvY29tcG9uZW50cy9Gb3VyT2hGb3VyUGFnZS9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vcm91dGVzL3NlcnZlLXJvdXRlcy5qcyIsIndlYnBhY2s6Ly8vLi9oZWxwZXJzL3NlcnZlSGVscGVycy5qcyIsIndlYnBhY2s6Ly8vLi9oZWxwZXJzL2xicnlVcmkuanMiLCJ3ZWJwYWNrOi8vLy4vaGVscGVycy9oYW5kbGVTaG93UmVuZGVyLmpzeCIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWR1eC1zYWdhXCIiLCJ3ZWJwYWNrOi8vLy4vcmVhY3Qvc2FnYXMvc2hvd191cmkuanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3Qvc2FnYXMvc2hvd19hc3NldC5qcyIsIndlYnBhY2s6Ly8vLi9yZWFjdC9hcGkvYXNzZXRBcGkuanMiLCJ3ZWJwYWNrOi8vLy4vcmVhY3Qvc2FnYXMvc2hvd19jaGFubmVsLmpzIiwid2VicGFjazovLy8uL3JlYWN0L2FwaS9jaGFubmVsQXBpLmpzIiwid2VicGFjazovLy8uL3JlYWN0L3V0aWxzL2xicnlVcmkuanMiLCJ3ZWJwYWNrOi8vLy4vcm91dGVzL2ZhbGxiYWNrLXJvdXRlcy5qcyJdLCJuYW1lcyI6WyJTaXRlQ29uZmlnIiwiYW5hbHl0aWNzIiwiZ29vZ2xlSWQiLCJhc3NldERlZmF1bHRzIiwidGl0bGUiLCJ0aHVtYm5haWwiLCJkZXNjcmlwdGlvbiIsImF1dGgiLCJzZXNzaW9uS2V5IiwiZGV0YWlscyIsImhvc3QiLCJwdWJsaXNoaW5nIiwiYWRkaXRpb25hbENsYWltQWRkcmVzc2VzIiwiZGlzYWJsZWQiLCJkaXNhYmxlZE1lc3NhZ2UiLCJwcmltYXJ5Q2xhaW1BZGRyZXNzIiwidGh1bWJuYWlsQ2hhbm5lbCIsInRodW1ibmFpbENoYW5uZWxJZCIsInVwbG9hZERpcmVjdG9yeSIsImNvbmZpZ3VyZSIsImNvbmZpZyIsImNvbnNvbGUiLCJsb2ciLCJtb2R1bGUiLCJleHBvcnRzIiwic2VsZWN0RmlsZSIsImNsZWFyRmlsZSIsInVwZGF0ZU1ldGFkYXRhIiwidXBkYXRlQ2xhaW0iLCJzZXRQdWJsaXNoSW5DaGFubmVsIiwidXBkYXRlUHVibGlzaFN0YXR1cyIsInVwZGF0ZUVycm9yIiwidXBkYXRlU2VsZWN0ZWRDaGFubmVsIiwidG9nZ2xlTWV0YWRhdGFJbnB1dHMiLCJvbk5ld1RodW1ibmFpbCIsInN0YXJ0UHVibGlzaCIsImFjdGlvbnMiLCJmaWxlIiwidHlwZSIsIkZJTEVfU0VMRUNURUQiLCJkYXRhIiwiRklMRV9DTEVBUiIsIm5hbWUiLCJ2YWx1ZSIsIk1FVEFEQVRBX1VQREFURSIsIkNMQUlNX1VQREFURSIsImNoYW5uZWwiLCJTRVRfUFVCTElTSF9JTl9DSEFOTkVMIiwic3RhdHVzIiwibWVzc2FnZSIsIlBVQkxJU0hfU1RBVFVTX1VQREFURSIsIkVSUk9SX1VQREFURSIsImNoYW5uZWxOYW1lIiwiU0VMRUNURURfQ0hBTk5FTF9VUERBVEUiLCJzaG93TWV0YWRhdGFJbnB1dHMiLCJUT0dHTEVfTUVUQURBVEFfSU5QVVRTIiwiVEhVTUJOQUlMX05FVyIsImhpc3RvcnkiLCJQVUJMSVNIX1NUQVJUIiwiU2VxdWVsaXplIiwicmVxdWlyZSIsImxvZ2dlciIsImRhdGFiYXNlIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImRiIiwic2VxdWVsaXplIiwiZGlhbGVjdCIsImRpYWxlY3RPcHRpb25zIiwiZGVjaW1hbE51bWJlcnMiLCJsb2dnaW5nIiwicG9vbCIsIm1heCIsIm1pbiIsImlkbGUiLCJhY3F1aXJlIiwiYXV0aGVudGljYXRlIiwidGhlbiIsImluZm8iLCJjYXRjaCIsImVycm9yIiwiZXJyIiwiQ2VydGlmaWNhdGUiLCJDaGFubmVsIiwiQ2xhaW0iLCJGaWxlIiwiUmVxdWVzdCIsIlVzZXIiLCJpbXBvcnQiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsIm1vZGVsTmFtZSIsImFzc29jaWF0ZSIsInVwc2VydCIsIk1vZGVsIiwidmFsdWVzIiwiY29uZGl0aW9uIiwidGFibGVOYW1lIiwiZmluZE9uZSIsIndoZXJlIiwib2JqIiwiZGVidWciLCJ1cGRhdGUiLCJjcmVhdGUiLCJtYXBTdGF0ZVRvUHJvcHMiLCJsb2dnZWRJbkNoYW5uZWwiLCJjaGFubmVsU2hvcnRJZCIsInNob3J0SWQiLCJjaGFubmVsTG9uZ0lkIiwibG9uZ0lkIiwibWFwRGlzcGF0Y2hUb1Byb3BzIiwib25DaGFubmVsTG9naW4iLCJkaXNwYXRjaCIsIm9uQ2hhbm5lbExvZ291dCIsIm9uSGFuZGxlU2hvd1BhZ2VVcmkiLCJvblJlcXVlc3RFcnJvciIsIm9uTmV3Q2hhbm5lbFJlcXVlc3QiLCJvbk5ld0Fzc2V0UmVxdWVzdCIsIm9uUmVxdWVzdFVwZGF0ZSIsImFkZFJlcXVlc3RUb1JlcXVlc3RMaXN0IiwiYWRkQXNzZXRUb0Fzc2V0TGlzdCIsImFkZE5ld0NoYW5uZWxUb0NoYW5uZWxMaXN0Iiwib25VcGRhdGVDaGFubmVsQ2xhaW1zIiwidXBkYXRlQ2hhbm5lbENsYWltcyIsImZpbGVSZXF1ZXN0ZWQiLCJ1cGRhdGVGaWxlQXZhaWxhYmlsaXR5IiwidXBkYXRlRGlzcGxheUFzc2V0RXJyb3IiLCJwYXJhbXMiLCJIQU5ETEVfU0hPV19VUkkiLCJSRVFVRVNUX0VSUk9SIiwiY2hhbm5lbElkIiwicmVxdWVzdFR5cGUiLCJyZXF1ZXN0SWQiLCJDSEFOTkVMX1JFUVVFU1RfTkVXIiwiaWQiLCJleHRlbnNpb24iLCJBU1NFVF9SRVFVRVNUX05FVyIsIm1vZGlmaWVyIiwiUkVRVUVTVF9VUERBVEUiLCJrZXkiLCJSRVFVRVNUX0xJU1RfQUREIiwiY2xhaW1JZCIsImNsYWltRGF0YSIsIkFTU0VUX0FERCIsImNsYWltc0RhdGEiLCJDSEFOTkVMX0FERCIsImNoYW5uZWxLZXkiLCJwYWdlIiwiQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX0FTWU5DIiwiY2hhbm5lbExpc3RJZCIsIkNIQU5ORUxfQ0xBSU1TX1VQREFURV9TVUNDRVNTIiwiRklMRV9SRVFVRVNURUQiLCJGSUxFX0FWQUlMQUJJTElUWV9VUERBVEUiLCJESVNQTEFZX0FTU0VUX0VSUk9SIiwiU0VPIiwicHJvcHMiLCJwYWdlVGl0bGUiLCJhc3NldCIsInBhZ2VVcmkiLCJtZXRhVGFncyIsImNhbm9uaWNhbExpbmsiLCJyZWwiLCJocmVmIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwic3RyaW5nIiwib2JqZWN0IiwicmVxdWVzdCIsInBhcnNlSlNPTiIsInJlc3BvbnNlIiwianNvbiIsImNoZWNrU3RhdHVzIiwianNvblJlc3BvbnNlIiwiRXJyb3IiLCJ1cmwiLCJvcHRpb25zIiwiZmV0Y2giLCJQcm9taXNlIiwiYWxsIiwic2VsZWN0QXNzZXQiLCJzaG93IiwicmVxdWVzdExpc3QiLCJhc3NldEtleSIsImFzc2V0TGlzdCIsInNlbGVjdFNob3dTdGF0ZSIsInN0YXRlIiwiYXhpb3MiLCJhcGkiLCJhcGlIb3N0IiwiYXBpUG9ydCIsImxicnlBcGlVcmkiLCJjaG9vc2VHYUxicnluZXRQdWJsaXNoTGFiZWwiLCJzZW5kR0FUaW1pbmdFdmVudCIsImhhbmRsZUxicnluZXRSZXNwb25zZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXN1bHQiLCJKU09OIiwic3RyaW5naWZ5IiwicHVibGlzaENsYWltIiwicHVibGlzaFBhcmFtcyIsImdhU3RhcnRUaW1lIiwiRGF0ZSIsIm5vdyIsInBvc3QiLCJtZXRob2QiLCJnZXRDbGFpbSIsInVyaSIsInRpbWVvdXQiLCJnZXRDbGFpbUxpc3QiLCJjbGFpbU5hbWUiLCJyZXNvbHZlVXJpIiwiZ2V0RG93bmxvYWREaXJlY3RvcnkiLCJkb3dubG9hZF9kaXJlY3RvcnkiLCJjcmVhdGVDaGFubmVsIiwiY2hhbm5lbF9uYW1lIiwiYW1vdW50IiwidWEiLCJjcmVhdGVTZXJ2ZUV2ZW50UGFyYW1zIiwiaGVhZGVycyIsImlwIiwib3JpZ2luYWxVcmwiLCJldmVudENhdGVnb3J5IiwiZXZlbnRBY3Rpb24iLCJldmVudExhYmVsIiwiaXBPdmVycmlkZSIsInVzZXJBZ2VudE92ZXJyaWRlIiwiY3JlYXRlUHVibGlzaFRpbWluZ0V2ZW50UGFyYW1zIiwiY2F0ZWdvcnkiLCJ2YXJpYWJsZSIsImxhYmVsIiwic3RhcnRUaW1lIiwiZW5kVGltZSIsImR1cmF0aW9uIiwidXNlclRpbWluZ0NhdGVnb3J5IiwidXNlclRpbWluZ1ZhcmlhYmxlTmFtZSIsInVzZXJUaW1pbmdUaW1lIiwidXNlclRpbWluZ0xhYmVsIiwic2VuZEdvb2dsZUFuYWx5dGljc0V2ZW50IiwidmlzaXRvcklkIiwicmVwbGFjZSIsInZpc2l0b3IiLCJzdHJpY3RDaWRGb3JtYXQiLCJodHRwcyIsImV2ZW50Iiwic2VuZEdvb2dsZUFuYWx5dGljc1RpbWluZyIsInRpbWluZyIsInNlbmRHQVNlcnZlRXZlbnQiLCJjaGFubmVsX2lkIiwidXBkYXRlTG9nZ2VkSW5DaGFubmVsIiwiQ0hBTk5FTF9VUERBVEUiLCJQcm9ncmVzc0JhciIsImJhcnMiLCJpbmRleCIsImluY3JlbWVudGVyIiwiY3JlYXRlQmFycyIsImJpbmQiLCJzdGFydFByb2dyZXNzQmFyIiwidXBkYXRlUHJvZ3Jlc3NCYXIiLCJzdG9wUHJvZ3Jlc3NCYXIiLCJpIiwic2l6ZSIsInB1c2giLCJpc0FjdGl2ZSIsInNldFN0YXRlIiwidXBkYXRlSW50ZXJ2YWwiLCJzZXRJbnRlcnZhbCIsImNsZWFySW50ZXJ2YWwiLCJtYXAiLCJiYXIiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwiRXJyb3JQYWdlIiwiTXlzcWxDb25maWciLCJTbGFja0NvbmZpZyIsInNsYWNrV2ViSG9vayIsInNsYWNrRXJyb3JDaGFubmVsIiwic2xhY2tJbmZvQ2hhbm5lbCIsInJldHVyblNob3J0SWQiLCJjbGFpbXNBcnJheSIsImNsYWltSW5kZXgiLCJzdWJzdHJpbmciLCJzaG9ydElkTGVuZ3RoIiwiZmluZEluZGV4IiwiZWxlbWVudCIsInBvc3NpYmxlTWF0Y2hlcyIsInNsaWNlIiwibGVuZ3RoIiwiZmlsdGVyIiwiZnMiLCJwYXJzZVB1Ymxpc2hBcGlSZXF1ZXN0Qm9keSIsIm5zZnciLCJsaWNlbnNlIiwiaW52YWxpZE5hbWVDaGFyYWN0ZXJzIiwiZXhlYyIsInBhcnNlUHVibGlzaEFwaVJlcXVlc3RGaWxlcyIsInBhdGgiLCJ0ZXN0IiwidmFsaWRhdGVGaWxlVHlwZUFuZFNpemUiLCJmaWxlTmFtZSIsImZpbGVQYXRoIiwiZmlsZVR5cGUiLCJ0aHVtYm5haWxGaWxlTmFtZSIsInRodW1ibmFpbEZpbGVQYXRoIiwidGh1bWJuYWlsRmlsZVR5cGUiLCJjcmVhdGVCYXNpY1B1Ymxpc2hQYXJhbXMiLCJ0cmltIiwiZmlsZV9wYXRoIiwiYmlkIiwibWV0YWRhdGEiLCJhdXRob3IiLCJsYW5ndWFnZSIsImNsYWltX2FkZHJlc3MiLCJjcmVhdGVUaHVtYm5haWxQdWJsaXNoUGFyYW1zIiwiZGVsZXRlVGVtcG9yYXJ5RmlsZSIsInVubGluayIsImFkZEdldFJlc3VsdHNUb0ZpbGVEYXRhIiwiZmlsZUluZm8iLCJnZXRSZXN1bHQiLCJmaWxlX25hbWUiLCJkb3dubG9hZF9wYXRoIiwiY3JlYXRlRmlsZURhdGEiLCJvdXRwb2ludCIsImhlaWdodCIsImFkZHJlc3MiLCJjb250ZW50VHlwZSIsImhhbmRsZUVycm9yUmVzcG9uc2UiLCJyZXMiLCJ1c2VPYmplY3RQcm9wZXJ0aWVzSWZOb0tleXMiLCJyZXR1cm5FcnJvck1lc3NhZ2VBbmRTdGF0dXMiLCJjcmVhdGVFcnJvclJlc3BvbnNlUGF5bG9hZCIsImNvZGUiLCJuZXdFcnJvck9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJzdWNjZXNzIiwicmV0dXJuUGFnaW5hdGVkQ2hhbm5lbENsYWltcyIsIk5PX0NIQU5ORUwiLCJOT19DTEFJTSIsIk5PX0ZJTEUiLCJnZXRDbGFpbUlkIiwiY2hhbm5lbENsYWltSWQiLCJnZXRDbGFpbUlkQnlDaGFubmVsIiwiZ2V0Q2xhaW1JZEJ5Q2xhaW0iLCJnZXRMb25nQ2xhaW1JZCIsImxvbmdDbGFpbUlkIiwiZ2V0TG9uZ0NoYW5uZWxJZCIsImxvbmdDaGFubmVsSWQiLCJnZXRDbGFpbUlkQnlMb25nQ2hhbm5lbElkIiwiZ2V0Q2hhbm5lbERhdGEiLCJsb25nQ2hhbm5lbENsYWltSWQiLCJnZXRTaG9ydENoYW5uZWxJZEZyb21Mb25nQ2hhbm5lbElkIiwic2hvcnRDaGFubmVsQ2xhaW1JZCIsImdldENoYW5uZWxDbGFpbXMiLCJnZXRBbGxDaGFubmVsQ2xhaW1zIiwiY2hhbm5lbENsYWltc0FycmF5IiwicGFnaW5hdGVkQ2hhbm5lbFZpZXdEYXRhIiwiZ2V0TG9jYWxGaWxlUmVjb3JkIiwiZGF0YVZhbHVlcyIsInJlcSIsImNvbnRleHQiLCJzdG9yZSIsImh0bWwiLCJoZWxtZXQiLCJyZW5kZXJTdGF0aWMiLCJyZWRpcmVjdCIsInByZWxvYWRlZFN0YXRlIiwiZ2V0U3RhdGUiLCJzZW5kIiwicHVibGlzaCIsInNpdGUiLCJMT0dJTiIsIkNSRUFURSIsIkxPQ0FMX0NIRUNLIiwiVU5BVkFJTEFCTEUiLCJFUlJPUiIsIkFWQUlMQUJMRSIsImluaXRpYWxpemUiLCJHQUxpc3RlbmVyIiwic2VuZFBhZ2VWaWV3IiwibG9jYXRpb24iLCJsaXN0ZW4iLCJzZXQiLCJwYXRobmFtZSIsInBhZ2V2aWV3IiwiY2hpbGRyZW4iLCJBcHAiLCJmaWxlRXJyb3IiLCJzZXRGaWxlRXJyb3IiLCJDSEFOTkVMIiwiQVNTRVRfTElURSIsIkFTU0VUX0RFVEFJTFMiLCJkaXNwbGF5QXNzZXQiLCJvbkZpbGVSZXF1ZXN0IiwidG9TdHJpbmciLCJtZXRhIiwibGluayIsImV4cHJlc3MiLCJib2R5UGFyc2VyIiwiZXhwcmVzc0hhbmRsZWJhcnMiLCJIYW5kbGViYXJzIiwicGFzc3BvcnQiLCJwb3B1bGF0ZUxvY2Fsc0RvdFVzZXIiLCJzZXJpYWxpemVTcGVlY2hVc2VyIiwiZGVzZXJpYWxpemVTcGVlY2hVc2VyIiwiY29va2llU2Vzc2lvbiIsImh0dHAiLCJTcGVlY2hTZXJ2ZXIiLCJteXNxbENvbmZpZyIsInNpdGVDb25maWciLCJzbGFja0NvbmZpZyIsIlBPUlQiLCJzdGFydCIsImNvbmZpZ3VyZUNvbmZpZ0ZpbGVzIiwiY29uZmlndXJlTG9nZ2luZyIsImNvbmZpZ3VyZUFwcCIsImNvbmZpZ3VyZVNlcnZlciIsInN0YXJ0U2VydmVyIiwibXlzcWxBcHBDb25maWciLCJzaXRlQXBwQ29uZmlnIiwic2xhY2tBcHBDb25maWciLCJhcHAiLCJlbmFibGUiLCJ1c2UiLCJzdGF0aWMiLCJfX2Rpcm5hbWUiLCJ1cmxlbmNvZGVkIiwiZXh0ZW5kZWQiLCJuZXh0IiwidmVyYm9zZSIsInNlcmlhbGl6ZVVzZXIiLCJkZXNlcmlhbGl6ZVVzZXIiLCJsb2NhbFNpZ251cFN0cmF0ZWd5IiwibG9jYWxMb2dpblN0cmF0ZWd5IiwibWF4QWdlIiwic2Vzc2lvbiIsImhicyIsImRlZmF1bHRMYXlvdXQiLCJoYW5kbGViYXJzIiwiZW5naW5lIiwic2VydmVyIiwiU2VydmVyIiwic3luYyIsInVzZXIiLCJsb2NhbHMiLCJ1c2VyTmFtZSIsInNob3J0Q2hhbm5lbElkIiwiZG9uZSIsImxvZ0xldmVsIiwid2luc3RvbiIsInRyYW5zcG9ydHMiLCJDb25zb2xlIiwibGV2ZWwiLCJ0aW1lc3RhbXAiLCJjb2xvcml6ZSIsInByZXR0eVByaW50IiwiaGFuZGxlRXhjZXB0aW9ucyIsImh1bWFuUmVhZGFibGVVbmhhbmRsZWRFeGNlcHRpb24iLCJ3YXJuIiwic2lsbHkiLCJsb2dnZXJDb25maWciLCJ3aW5zdG9uU2xhY2tXZWJIb29rIiwiU2xhY2tXZWJIb29rIiwiYWRkIiwid2ViaG9va1VybCIsImljb25FbW9qaSIsIlBhc3Nwb3J0TG9jYWxTdHJhdGVneSIsIlN0cmF0ZWd5IiwibGJyeUFwaSIsInVzZXJuYW1lRmllbGQiLCJwYXNzd29yZEZpZWxkIiwidXNlckluZm8iLCJ1c2VyRGF0YSIsImNoYW5uZWxEYXRhIiwidHgiLCJjbGFpbV9pZCIsImNlcnRpZmljYXRlRGF0YSIsIm5ld1VzZXIiLCJuZXdDaGFubmVsIiwibmV3Q2VydGlmaWNhdGUiLCJzZXRDaGFubmVsIiwic2V0VXNlciIsImxicnlDb25maWciLCJTVFJJTkciLCJCT09MRUFOIiwiSU5URUdFUiIsIlRFWFQiLCJERUNJTUFMIiwiZGVmaW5lIiwiZGVmYXVsdCIsImNsYWltU2VxdWVuY2UiLCJkZWNvZGVkQ2xhaW0iLCJkZXB0aCIsImVmZmVjdGl2ZUFtb3VudCIsImhhc1NpZ25hdHVyZSIsImhleCIsIm5vdXQiLCJ0eGlkIiwidmFsaWRBdEhlaWdodCIsInZhbHVlVmVyc2lvbiIsImNsYWltVHlwZSIsImNlcnRpZmljYXRlVmVyc2lvbiIsImtleVR5cGUiLCJwdWJsaWNLZXkiLCJmcmVlemVUYWJsZU5hbWUiLCJiZWxvbmdzVG8iLCJmb3JlaWduS2V5IiwiYWxsb3dOdWxsIiwiZmluZEFsbCIsIm9yZGVyIiwiZ2V0TG9uZ0NoYW5uZWxJZEZyb21TaG9ydENoYW5uZWxJZCIsIiRsaWtlIiwiZ2V0TG9uZ0NoYW5uZWxJZEZyb21DaGFubmVsTmFtZSIsInZhbGlkYXRlTG9uZ0NoYW5uZWxJZCIsImhhc09uZSIsImRlZmF1bHRUaHVtYm5haWwiLCJkZXRlcm1pbmVGaWxlRXh0ZW5zaW9uRnJvbUNvbnRlbnRUeXBlIiwiZGV0ZXJtaW5lVGh1bWJuYWlsIiwic3RvcmVkVGh1bWJuYWlsIiwicHJlcGFyZUNsYWltRGF0YSIsImNsYWltIiwiY2VydGlmaWNhdGVJZCIsImxpY2Vuc2VVcmwiLCJwcmV2aWV3IiwibWV0YWRhdGFWZXJzaW9uIiwic291cmNlIiwic291cmNlVHlwZSIsInNvdXJjZVZlcnNpb24iLCJzdHJlYW1WZXJzaW9uIiwiZ2V0U2hvcnRDbGFpbUlkRnJvbUxvbmdDbGFpbUlkIiwicmF3IiwiZ2V0TG9uZ0NsYWltSWRGcm9tU2hvcnRDbGFpbUlkIiwiZ2V0VG9wRnJlZUNsYWltSWRCeUNsYWltTmFtZSIsInZhbGlkYXRlTG9uZ0NsYWltSWQiLCJyZXNvbHZlQ2xhaW0iLCJjbGFpbUFycmF5IiwiZGVmYXVsdFZhbHVlIiwidHJlbmRpbmdFbGlnaWJsZSIsImhhc01hbnkiLCJnZXRSZWNlbnRDbGFpbXMiLCJsaW1pdCIsImFjdGlvbiIsImlwQWRkcmVzcyIsImJjcnlwdCIsInByb3RvdHlwZSIsImNvbXBhcmVQYXNzd29yZCIsImNvbXBhcmUiLCJjaGFuZ2VQYXNzd29yZCIsIm5ld1Bhc3N3b3JkIiwiZ2VuU2FsdCIsInNhbHRFcnJvciIsInNhbHQiLCJoYXNoIiwiaGFzaEVycm9yIiwiaG9vayIsInJldHVyblVzZXJBbmRDaGFubmVsSW5mbyIsInVzZXJJbnN0YW5jZSIsImdldENoYW5uZWwiLCJpc01hdGNoIiwibG9nSW4iLCJnZXQiLCJsb2dvdXQiLCJtdWx0aXBhcnQiLCJtdWx0aXBhcnRNaWRkbGV3YXJlIiwidXBsb2FkRGlyIiwiY2xhaW1OYW1lSXNBdmFpbGFibGUiLCJjaGVja0NoYW5uZWxBdmFpbGFiaWxpdHkiLCJlcnJvckhhbmRsZXJzIiwiYXV0aGVudGljYXRlVXNlciIsImF2YWlsYWJsZU5hbWUiLCJib2R5IiwiY2xhaW1zTGlzdCIsInJlc29sdmVSZXN1bHQiLCJmaWxlRGF0YSIsImZpbGVSZWNvcmQiLCJjb21wbGV0ZWQiLCJyZXNvbHZlZFVyaSIsImZpbGVzIiwiY2hhbm5lbFBhc3N3b3JkIiwidmFsaWRhdGVkQ2xhaW1OYW1lIiwidGh1bWJuYWlsUHVibGlzaFBhcmFtcyIsImxicnlUeCIsImNsYWltSW5mbyIsInB1Ymxpc2hIZWxwZXJzIiwiT3AiLCJwdWJsaXNoUmVzdWx0cyIsImNsYWltUmVjb3JkIiwidXBzZXJ0Q3JpdGVyaWEiLCJzZXRDbGFpbSIsInNldEZpbGUiLCJjbGFpbUFkZHJlc3NlcyIsImF0dHJpYnV0ZXMiLCJvciIsImF1dGhlbnRpY2F0ZUNoYW5uZWxDcmVkZW50aWFscyIsInVzZXJQYXNzd29yZCIsImNoYW5uZWxGaW5kUGFyYW1zIiwiQ0xBSU1TX1BFUl9QQUdFIiwiY2xhaW1zIiwidG90YWxQYWdlcyIsImRldGVybWluZVRvdGFsUGFnZXMiLCJwYWdpbmF0aW9uUGFnZSIsImdldFBhZ2VGcm9tUXVlcnkiLCJ2aWV3RGF0YSIsImV4dHJhY3RQYWdlRnJvbUNsYWltcyIsInByZXZpb3VzUGFnZSIsImRldGVybWluZVByZXZpb3VzUGFnZSIsImN1cnJlbnRQYWdlIiwibmV4dFBhZ2UiLCJkZXRlcm1pbmVOZXh0UGFnZSIsInRvdGFsUmVzdWx0cyIsImRldGVybWluZVRvdGFsQ2xhaW1zIiwicGFyc2VJbnQiLCJwYWdlTnVtYmVyIiwiY2xhaW1TdGFydEluZGV4IiwiY2xhaW1FbmRJbmRleCIsInBhZ2VPZkNsYWltcyIsInRvdGFsQ2xhaW1zIiwiZnVsbFBhZ2VzIiwiTWF0aCIsImZsb29yIiwicmVtYWluZGVyIiwiaGFuZGxlUGFnZVJlbmRlciIsInJlbmRlciIsImxheW91dCIsImluaXRpYWxTdGF0ZSIsImFzc2lnbiIsInB1Ymxpc2hJbkNoYW5uZWwiLCJzZWxlY3RlZENoYW5uZWwiLCJwdWJsaXNoU3VibWl0IiwiY2hhbm5lbExpc3QiLCJIb21lUGFnZSIsImNyZWF0ZVBhZ2VUaXRsZSIsImRlZmF1bHREZXNjcmlwdGlvbiIsImRldGVybWluZU9nVGh1bWJuYWlsQ29udGVudFR5cGUiLCJmaWxlRXh0IiwibGFzdEluZGV4T2YiLCJjcmVhdGVCYXNpY01ldGFUYWdzIiwicHJvcGVydHkiLCJjb250ZW50IiwiY3JlYXRlQ2hhbm5lbE1ldGFUYWdzIiwiY3JlYXRlQXNzZXRNZXRhVGFncyIsImVtYmVkVXJsIiwic2hvd1VybCIsIm9nVGl0bGUiLCJvZ0Rlc2NyaXB0aW9uIiwib2dUaHVtYm5haWxDb250ZW50VHlwZSIsIm9nVGh1bWJuYWlsIiwiY3JlYXRlTWV0YVRhZ3MiLCJjcmVhdGVCYXNpY0Nhbm9uaWNhbExpbmsiLCJjcmVhdGVBc3NldENhbm9uaWNhbExpbmsiLCJjcmVhdGVDaGFubmVsQ2Fub25pY2FsTGluayIsImNyZWF0ZUNhbm9uaWNhbExpbmsiLCJWSUVXIiwiTE9HT1VUIiwiTmF2QmFyIiwiY2hlY2tGb3JMb2dnZWRJblVzZXIiLCJsb2dvdXRVc2VyIiwiaGFuZGxlU2VsZWN0aW9uIiwiY3JlZGVudGlhbHMiLCJ0YXJnZXQiLCJzZWxlY3RlZE9wdGlvbnMiLCJMb2dvIiwiTmF2QmFyQ2hhbm5lbERyb3Bkb3duIiwiZGVmYXVsdFNlbGVjdGlvbiIsIlB1Ymxpc2hUb29sIiwiRHJvcHpvbmUiLCJkcmFnT3ZlciIsIm1vdXNlT3ZlciIsImRpbVByZXZpZXciLCJoYW5kbGVEcm9wIiwiaGFuZGxlRHJhZ092ZXIiLCJoYW5kbGVEcmFnRW5kIiwiaGFuZGxlRHJhZ0VudGVyIiwiaGFuZGxlRHJhZ0xlYXZlIiwiaGFuZGxlTW91c2VFbnRlciIsImhhbmRsZU1vdXNlTGVhdmUiLCJoYW5kbGVDbGljayIsImhhbmRsZUZpbGVJbnB1dCIsImNob29zZUZpbGUiLCJwcmV2ZW50RGVmYXVsdCIsImR0IiwiZGF0YVRyYW5zZmVyIiwiaXRlbXMiLCJraW5kIiwiZHJvcHBlZEZpbGUiLCJnZXRBc0ZpbGUiLCJyZW1vdmUiLCJjbGVhckRhdGEiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiY2xpY2siLCJmaWxlTGlzdCIsInZhbGlkYXRlRmlsZSIsIlByZXZpZXciLCJpbWdTb3VyY2UiLCJzZXRQcmV2aWV3SW1hZ2VTb3VyY2UiLCJuZXdQcm9wcyIsInNldFByZXZpZXdJbWFnZVNvdXJjZUZyb21GaWxlIiwicHJldmlld1JlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwib25sb2FkZW5kIiwiYm9vbCIsIlB1Ymxpc2hEZXRhaWxzIiwib25QdWJsaXNoU3VibWl0Iiwib25NZXRhZGF0YUNoYW5nZSIsIlB1Ymxpc2hUaXRsZUlucHV0IiwiaGFuZGxlSW5wdXQiLCJlIiwibG9nZ2VkSW5DaGFubmVsTmFtZSIsImxvZ2dlZEluQ2hhbm5lbFNob3J0SWQiLCJ1cmxFcnJvciIsIm9uQ2xhaW1DaGFuZ2UiLCJvblVybEVycm9yIiwiUHVibGlzaFVybElucHV0Iiwic2V0Q2xhaW1OYW1lIiwidmFsaWRhdGVDbGFpbSIsImNsZWFuc2VJbnB1dCIsImlucHV0IiwiZmlsZU5hbWVXaXRob3V0RW5kaW5nIiwiY2xlYW5DbGFpbU5hbWUiLCJVcmxNaWRkbGUiLCJkYXRhVVJJdG9CbG9iIiwiZGF0YVVSSSIsImJ5dGVTdHJpbmciLCJhdG9iIiwic3BsaXQiLCJtaW1lU3RyaW5nIiwiaWEiLCJVaW50OEFycmF5IiwiY2hhckNvZGVBdCIsIkJsb2IiLCJQdWJsaXNoVGh1bWJuYWlsSW5wdXQiLCJ2aWRlb1NvdXJjZSIsInNsaWRlck1pblJhbmdlIiwic2xpZGVyTWF4UmFuZ2UiLCJzbGlkZXJWYWx1ZSIsImhhbmRsZVZpZGVvTG9hZGVkRGF0YSIsImhhbmRsZVNsaWRlckNoYW5nZSIsImNyZWF0ZVRodW1ibmFpbCIsInNldFZpZGVvU291cmNlIiwibmV4dFByb3BzIiwiZGF0YVVyaSIsImJsb2IiLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJ0b3RhbE1pbnV0ZXMiLCJ0b3RhbFNlY29uZHMiLCJ2aWRlbyIsImN1cnJlbnRUaW1lIiwiY2FudmFzIiwiY3JlYXRlRWxlbWVudCIsIndpZHRoIiwidmlkZW9XaWR0aCIsInZpZGVvSGVpZ2h0IiwiZ2V0Q29udGV4dCIsImRyYXdJbWFnZSIsImRhdGFVcmwiLCJ0b0RhdGFVUkwiLCJzbmFwc2hvdCIsImRpc3BsYXkiLCJvblRvZ2dsZU1ldGFkYXRhSW5wdXRzIiwiUHVibGlzaE1ldGFkYXRhSW5wdXRzIiwidG9nZ2xlU2hvd0lucHV0cyIsImhhbmRsZVNlbGVjdCIsImNoZWNrZWQiLCJzZWxlY3RlZE9wdGlvbiIsIm1heEhlaWdodCIsIkV4cGFuZGluZ1RleHRhcmVhIiwiX2hhbmRsZUNoYW5nZSIsImFkanVzdFRleHRhcmVhIiwib25DaGFuZ2UiLCJlbCIsInN0eWxlIiwic2Nyb2xsSGVpZ2h0IiwicmVzdCIsIngiLCJmdW5jIiwiY2hhbm5lbEVycm9yIiwib25QdWJsaXNoSW5DaGFubmVsQ2hhbmdlIiwib25DaGFubmVsU2VsZWN0Iiwic3RhdGVzIiwiQ2hhbm5lbFNlbGVjdCIsInRvZ2dsZUFub255bW91c1B1Ymxpc2giLCJDaGFubmVsTG9naW5Gb3JtIiwibG9naW5Ub0NoYW5uZWwiLCJIZWFkZXJzIiwiQ2hhbm5lbENyZWF0ZUZvcm0iLCJoYW5kbGVDaGFubmVsSW5wdXQiLCJjbGVhbnNlQ2hhbm5lbElucHV0IiwidXBkYXRlSXNDaGFubmVsQXZhaWxhYmxlIiwiY2hhbm5lbFdpdGhBdFN5bWJvbCIsImNoZWNrSXNQYXNzd29yZFByb3ZpZGVkIiwiY2hlY2tJc0NoYW5uZWxBdmFpbGFibGUiLCJtYWtlUHVibGlzaENoYW5uZWxSZXF1ZXN0IiwiQWN0aXZlU3RhdHVzQmFyIiwiSW5hY3RpdmVTdGF0dXNCYXIiLCJwdWJsaXNoU3RhdGVzIiwiUHVibGlzaFN0YXR1cyIsIkxPQURfU1RBUlQiLCJMT0FESU5HIiwiUFVCTElTSElORyIsIlNVQ0NFU1MiLCJGQUlMRUQiLCJQdWJsaXNoRGlzYWJsZWRNZXNzYWdlIiwiQWJvdXRQYWdlIiwiTG9naW5QYWdlIiwiU2hvd1BhZ2UiLCJtYXRjaCIsIlNob3dMaXRlIiwiQXNzZXREaXNwbGF5IiwiU2hvd0Fzc2V0RGV0YWlscyIsIkFzc2V0VGl0bGUiLCJBc3NldEluZm8iLCJjb3B5VG9DbGlwYm9hcmQiLCJlbGVtZW50VG9Db3B5IiwiZGF0YXNldCIsImVsZW1lbnR0b2NvcHkiLCJzZWxlY3QiLCJleGVjQ29tbWFuZCIsInByZXZpb3VzUmVxdWVzdCIsIlNob3dDaGFubmVsIiwiQ2hhbm5lbENsYWltc0Rpc3BsYXkiLCJzaG93TmV4dFJlc3VsdHNQYWdlIiwic2hvd1ByZXZpb3VzUmVzdWx0c1BhZ2UiLCJzaG93TmV3UGFnZSIsIkFzc2V0UHJldmlldyIsImRpcmVjdFNvdXJjZUxpbmsiLCJzaG93VXJsTGluayIsIkZvdXJPaEZvclBhZ2UiLCJkZXRlcm1pbmVSZXNwb25zZVR5cGUiLCJmbGlwQ2xhaW1OYW1lQW5kSWRGb3JCYWNrd2FyZHNDb21wYXRpYmlsaXR5IiwibG9nUmVxdWVzdERhdGEiLCJnZXRDbGFpbUlkQW5kU2VydmVBc3NldCIsImxicnlVcmkiLCJoYW5kbGVTaG93UmVuZGVyIiwiU0VSVkUiLCJoYXNGaWxlRXh0ZW5zaW9uIiwicGFyc2VNb2RpZmllciIsInJlc3BvbnNlVHlwZSIsInBhcnNlQ2xhaW0iLCJpc0NoYW5uZWwiLCJwYXJzZUlkZW50aWZpZXIiLCJpZGVudGlmaWVyIiwiU0hPVyIsImNsaWVudEFjY2VwdHNIdG1sIiwiYWNjZXB0IiwicmVxdWVzdElzRnJvbUJyb3dzZXIiLCJjbGllbnRXYW50c0Fzc2V0IiwicmFuZ2UiLCJpbWFnZUlzV2FudGVkIiwidmlkZW9Jc1dhbnRlZCIsImlzVmFsaWRDbGFpbUlkIiwiaXNWYWxpZFNob3J0SWQiLCJpc1ZhbGlkU2hvcnRJZE9yQ2xhaW1JZCIsInNlcnZlQXNzZXRUb0NsaWVudCIsInNlbmRGaWxlT3B0aW9ucyIsInNlbmRGaWxlIiwiZnVsbENsYWltSWQiLCJ0ZW1wTmFtZSIsIlJFR0VYUF9JTlZBTElEX0NMQUlNIiwiUkVHRVhQX0lOVkFMSURfQ0hBTk5FTCIsIlJFR0VYUF9BRERSRVNTIiwiQ0hBTk5FTF9DSEFSIiwiY29tcG9uZW50c1JlZ2V4IiwiUmVnRXhwIiwicHJvdG8iLCJtb2RpZmllclNlcGVyYXRvciIsInN0YXJ0c1dpdGgiLCJuYW1lQmFkQ2hhcnMiLCJqb2luIiwicmV0dXJuU2FnYVdpdGhQYXJhbXMiLCJzYWdhIiwic2FnYU1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlIiwicnVuIiwiaGFuZGxlU2hvd1BhZ2VVcmkiLCJ3YXRjaEhhbmRsZVNob3dQYWdlVXJpIiwicGFyc2VBbmRVcGRhdGVJZGVudGlmaWVyQW5kQ2xhaW0iLCJwYXJzZUFuZFVwZGF0ZUNsYWltT25seSIsIm5ld0Fzc2V0UmVxdWVzdCIsIndhdGNoTmV3QXNzZXRSZXF1ZXN0IiwiZ2V0U2hvcnRJZCIsImdldENsYWltRGF0YSIsIm5ld0NoYW5uZWxSZXF1ZXN0Iiwid2F0Y2hOZXdDaGFubmVsUmVxdWVzdCIsIndhdGNoVXBkYXRlQ2hhbm5lbENsYWltcyIsImdldE5ld0NsYWltc0FuZFVwZGF0ZUNoYW5uZWwiLCJleHRlbnNpb25TZXBlcmF0b3IiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUM3REEsa0M7Ozs7OztBQ0FBLHdDOzs7Ozs7QUNBQSxvQzs7Ozs7Ozs7O0FDQUEsU0FBU0EsVUFBVCxHQUF1QjtBQUFBOztBQUNyQixPQUFLQyxTQUFMLEdBQWlCO0FBQ2ZDLGNBQVU7QUFESyxHQUFqQjtBQUdBLE9BQUtDLGFBQUwsR0FBcUI7QUFDbkJDLFdBQWEsU0FETTtBQUVuQkMsZUFBYSxvREFGTTtBQUduQkMsaUJBQWE7QUFITSxHQUFyQjtBQUtBLE9BQUtDLElBQUwsR0FBWTtBQUNWQyxnQkFBWTtBQURGLEdBQVo7QUFHQSxPQUFLQyxPQUFMLEdBQWU7QUFDYkwsV0FBYSxhQURBO0FBRWJNLFVBQWEsc0JBRkE7QUFHYkosaUJBQWE7QUFIQSxHQUFmO0FBS0EsT0FBS0ssVUFBTCxHQUFrQjtBQUNoQkMsOEJBQTBCLEVBRFY7QUFFaEJDLGNBQTBCLEtBRlY7QUFHaEJDLHFCQUEwQix5QkFIVjtBQUloQkMseUJBQTBCLFNBSlY7QUFLaEJDLHNCQUEwQixTQUxWO0FBTWhCQyx3QkFBMEIs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biBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9cIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0Nik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYjllZWE2YzBjYzRiNTViNGUyMjkiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlYWN0XCJcbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtcmVkdXhcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWFjdC1yZWR1eFwiXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndpbnN0b25cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJ3aW5zdG9uXCJcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZnVuY3Rpb24gU2l0ZUNvbmZpZyAoKSB7XG4gIHRoaXMuYW5hbHl0aWNzID0ge1xuICAgIGdvb2dsZUlkOiAnZGVmYXVsdCcsXG4gIH07XG4gIHRoaXMuYXNzZXREZWZhdWx0cyA9IHtcbiAgICB0aXRsZSAgICAgIDogJ1NwZWUuY2gnLFxuICAgIHRodW1ibmFpbCAgOiAnaHR0cHM6Ly9zcGVlLmNoL2Fzc2V0cy9pbWcvdmlkZW9fdGh1bWJfZGVmYXVsdC5wbmcnLFxuICAgIGRlc2NyaXB0aW9uOiAnT3Blbi1zb3VyY2UsIGRlY2VudHJhbGl6ZWQgaW1hZ2UgYW5kIHZpZGVvIHNoYXJpbmcuJyxcbiAgfTtcbiAgdGhpcy5hdXRoID0ge1xuICAgIHNlc3Npb25LZXk6ICdkZWZhdWx0JyxcbiAgfTtcbiAgdGhpcy5kZXRhaWxzID0ge1xuICAgIHRpdGxlICAgICAgOiAnU3BlZS5oIERldjEnLFxuICAgIGhvc3QgICAgICAgOiAnaHR0cHM6Ly9kZXYxLnNwZWUuY2gnLFxuICAgIGRlc2NyaXB0aW9uOiAnT3Blbi1zb3VyY2UsIGRlY2VudHJhbGl6ZWQgaW1hZ2UgYW5kIHZpZGVvIHNoYXJpbmcuJyxcbiAgfTtcbiAgdGhpcy5wdWJsaXNoaW5nID0ge1xuICAgIGFkZGl0aW9uYWxDbGFpbUFkZHJlc3NlczogW10sXG4gICAgZGlzYWJsZWQgICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICBkaXNhYmxlZE1lc3NhZ2UgICAgICAgICA6ICdQbGVhc2UgY2hlY2sgYmFjayBzb29uLicsXG4gICAgcHJpbWFyeUNsYWltQWRkcmVzcyAgICAgOiAnZGVmYXVsdCcsXG4gICAgdGh1bWJuYWlsQ2hhbm5lbCAgICAgICAgOiAnZGVmYXVsdCcsXG4gICAgdGh1bWJuYWlsQ2hhbm5lbElkICAgICAgOiAnZGVmYXVsdCcsXG4gICAgdXBsb2FkRGlyZWN0b3J5ICAgICAgICAgOiAnL2hvbWUvbGJyeS9VcGxvYWRzJyxcbiAgfTtcbiAgdGhpcy5jb25maWd1cmUgPSAoY29uZmlnKSA9PiB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygnTm8gc2l0ZSBjb25maWcgcmVjZWl2ZWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IHthbmFseXRpY3MsIHB1Ymxpc2hpbmcsIGRldGFpbHMsIGFzc2V0RGVmYXVsdHMsIGF1dGh9ID0gY29uZmlnO1xuICAgIHRoaXMuYW5hbHl0aWNzID0gYW5hbHl0aWNzO1xuICAgIHRoaXMuYXNzZXREZWZhdWx0cyA9IGFzc2V0RGVmYXVsdHM7XG4gICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICAgIHRoaXMucHVibGlzaGluZyA9IHB1Ymxpc2hpbmc7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTaXRlQ29uZmlnKCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb25maWcvc2l0ZUNvbmZpZy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LXJvdXRlci1kb21cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWFjdC1yb3V0ZXItZG9tXCJcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvcHVibGlzaF9hY3Rpb25fdHlwZXMnO1xuXG4vLyBleHBvcnQgYWN0aW9uIGNyZWF0b3JzXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RmlsZSAoZmlsZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuRklMRV9TRUxFQ1RFRCxcbiAgICBkYXRhOiBmaWxlLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRmlsZSAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5GSUxFX0NMRUFSLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU1ldGFkYXRhIChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuTUVUQURBVEFfVVBEQVRFLFxuICAgIGRhdGE6IHtcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNsYWltICh2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuQ0xBSU1fVVBEQVRFLFxuICAgIGRhdGE6IHZhbHVlLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldFB1Ymxpc2hJbkNoYW5uZWwgKGNoYW5uZWwpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlNFVF9QVUJMSVNIX0lOX0NIQU5ORUwsXG4gICAgY2hhbm5lbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVQdWJsaXNoU3RhdHVzIChzdGF0dXMsIG1lc3NhZ2UpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlBVQkxJU0hfU1RBVFVTX1VQREFURSxcbiAgICBkYXRhOiB7XG4gICAgICBzdGF0dXMsXG4gICAgICBtZXNzYWdlLFxuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRXJyb3IgKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5FUlJPUl9VUERBVEUsXG4gICAgZGF0YToge1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU2VsZWN0ZWRDaGFubmVsIChjaGFubmVsTmFtZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuU0VMRUNURURfQ0hBTk5FTF9VUERBVEUsXG4gICAgZGF0YTogY2hhbm5lbE5hbWUsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlTWV0YWRhdGFJbnB1dHMgKHNob3dNZXRhZGF0YUlucHV0cykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuVE9HR0xFX01FVEFEQVRBX0lOUFVUUyxcbiAgICBkYXRhOiBzaG93TWV0YWRhdGFJbnB1dHMsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb25OZXdUaHVtYm5haWwgKGZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlRIVU1CTkFJTF9ORVcsXG4gICAgZGF0YTogZmlsZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydFB1Ymxpc2ggKGhpc3RvcnkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlBVQkxJU0hfU1RBUlQsXG4gICAgZGF0YTogeyBoaXN0b3J5IH0sXG4gIH07XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9hY3Rpb25zL3B1Ymxpc2guanMiLCJjb25zdCBTZXF1ZWxpemUgPSByZXF1aXJlKCdzZXF1ZWxpemUnKTtcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxuY29uc29sZS5sb2coJ2V4cG9ydGluZyBzZXF1ZWxpemUgbW9kZWxzJyk7XG5jb25zdCB7IGRhdGFiYXNlLCB1c2VybmFtZSwgcGFzc3dvcmQgfSA9IHJlcXVpcmUoJy4uL2NvbmZpZy9teXNxbENvbmZpZycpO1xuY29uc3QgZGIgPSB7fTtcbi8vIHNldCBzZXF1ZWxpemUgb3B0aW9uc1xuY29uc3Qgc2VxdWVsaXplID0gbmV3IFNlcXVlbGl6ZShkYXRhYmFzZSwgdXNlcm5hbWUsIHBhc3N3b3JkLCB7XG4gIGhvc3QgICAgICAgICAgOiAnbG9jYWxob3N0JyxcbiAgZGlhbGVjdCAgICAgICA6ICdteXNxbCcsXG4gIGRpYWxlY3RPcHRpb25zOiB7ZGVjaW1hbE51bWJlcnM6IHRydWV9LCAvLyBmaXggdG8gZW5zdXJlIERFQ0lNQUwgd2lsbCBub3QgYmUgc3RvcmVkIGFzIGEgc3RyaW5nXG4gIGxvZ2dpbmcgICAgICAgOiBmYWxzZSxcbiAgcG9vbCAgICAgICAgICA6IHtcbiAgICBtYXggICAgOiA1LFxuICAgIG1pbiAgICA6IDAsXG4gICAgaWRsZSAgIDogMTAwMDAsXG4gICAgYWNxdWlyZTogMTAwMDAsXG4gIH0sXG59KTtcblxuLy8gZXN0YWJsaXNoIG15c3FsIGNvbm5lY3Rpb25cbnNlcXVlbGl6ZVxuICAuYXV0aGVudGljYXRlKClcbiAgLnRoZW4oKCkgPT4ge1xuICAgIGxvZ2dlci5pbmZvKCdTZXF1ZWxpemUgaGFzIGVzdGFibGlzaGVkIG15c3FsIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bGx5LicpO1xuICB9KVxuICAuY2F0Y2goZXJyID0+IHtcbiAgICBsb2dnZXIuZXJyb3IoJ1NlcXVlbGl6ZSB3YXMgdW5hYmxlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlOicsIGVycik7XG4gIH0pO1xuXG4vLyBtYW51YWxseSBhZGQgZWFjaCBtb2RlbCB0byB0aGUgZGIgb2JqZWN0XG5jb25zdCBDZXJ0aWZpY2F0ZSA9IHJlcXVpcmUoJy4vY2VydGlmaWNhdGUuanMnKTtcbmNvbnN0IENoYW5uZWwgPSByZXF1aXJlKCcuL2NoYW5uZWwuanMnKTtcbmNvbnN0IENsYWltID0gcmVxdWlyZSgnLi9jbGFpbS5qcycpO1xuY29uc3QgRmlsZSA9IHJlcXVpcmUoJy4vZmlsZS5qcycpO1xuY29uc3QgUmVxdWVzdCA9IHJlcXVpcmUoJy4vcmVxdWVzdC5qcycpO1xuY29uc3QgVXNlciA9IHJlcXVpcmUoJy4vdXNlci5qcycpO1xuZGJbJ0NlcnRpZmljYXRlJ10gPSBzZXF1ZWxpemUuaW1wb3J0KCdDZXJ0aWZpY2F0ZScsIENlcnRpZmljYXRlKTtcbmRiWydDaGFubmVsJ10gPSBzZXF1ZWxpemUuaW1wb3J0KCdDaGFubmVsJywgQ2hhbm5lbCk7XG5kYlsnQ2xhaW0nXSA9IHNlcXVlbGl6ZS5pbXBvcnQoJ0NsYWltJywgQ2xhaW0pO1xuZGJbJ0ZpbGUnXSA9IHNlcXVlbGl6ZS5pbXBvcnQoJ0ZpbGUnLCBGaWxlKTtcbmRiWydSZXF1ZXN0J10gPSBzZXF1ZWxpemUuaW1wb3J0KCdSZXF1ZXN0JywgUmVxdWVzdCk7XG5kYlsnVXNlciddID0gc2VxdWVsaXplLmltcG9ydCgnVXNlcicsIFVzZXIpO1xuXG4vLyBydW4gbW9kZWwuYXNzb2NpYXRpb24gZm9yIGVhY2ggbW9kZWwgaW4gdGhlIGRiIG9iamVjdCB0aGF0IGhhcyBhbiBhc3NvY2lhdGlvblxuT2JqZWN0LmtleXMoZGIpLmZvckVhY2gobW9kZWxOYW1lID0+IHtcbiAgaWYgKGRiW21vZGVsTmFtZV0uYXNzb2NpYXRlKSB7XG4gICAgbG9nZ2VyLmluZm8oJ0Fzc29jaWF0aW5nIG1vZGVsOicsIG1vZGVsTmFtZSk7XG4gICAgZGJbbW9kZWxOYW1lXS5hc3NvY2lhdGUoZGIpO1xuICB9XG59KTtcblxuZGIuc2VxdWVsaXplID0gc2VxdWVsaXplO1xuZGIuU2VxdWVsaXplID0gU2VxdWVsaXplO1xuXG4vLyBhZGQgYW4gJ3Vwc2VydCcgbWV0aG9kIHRvIHRoZSBkYiBvYmplY3RcbmRiLnVwc2VydCA9IChNb2RlbCwgdmFsdWVzLCBjb25kaXRpb24sIHRhYmxlTmFtZSkgPT4ge1xuICByZXR1cm4gTW9kZWxcbiAgICAuZmluZE9uZSh7XG4gICAgICB3aGVyZTogY29uZGl0aW9uLFxuICAgIH0pXG4gICAgLnRoZW4ob2JqID0+IHtcbiAgICAgIGlmIChvYmopIHsgIC8vIHVwZGF0ZVxuICAgICAgICBsb2dnZXIuZGVidWcoYHVwZGF0aW5nIHJlY29yZCBpbiBkYi4ke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgcmV0dXJuIG9iai51cGRhdGUodmFsdWVzKTtcbiAgICAgIH0gZWxzZSB7ICAvLyBpbnNlcnRcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBjcmVhdGluZyByZWNvcmQgaW4gZGIuJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgIHJldHVybiBNb2RlbC5jcmVhdGUodmFsdWVzKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgJHt0YWJsZU5hbWV9LnVwc2VydCBlcnJvcmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBkYjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL21vZGVscy9pbmRleC5qcyIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyB1cGRhdGVMb2dnZWRJbkNoYW5uZWwgfSBmcm9tICdhY3Rpb25zL2NoYW5uZWwnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCB7dXBkYXRlU2VsZWN0ZWRDaGFubmVsfSBmcm9tICcuLi8uLi9hY3Rpb25zL3B1Ymxpc2gnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBjaGFubmVsIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsTmFtZSAgIDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubmFtZSxcbiAgICBjaGFubmVsU2hvcnRJZDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwuc2hvcnRJZCxcbiAgICBjaGFubmVsTG9uZ0lkIDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubG9uZ0lkLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uQ2hhbm5lbExvZ2luOiAobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVMb2dnZWRJbkNoYW5uZWwobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSk7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVTZWxlY3RlZENoYW5uZWwobmFtZSkpO1xuICAgIH0sXG4gICAgb25DaGFubmVsTG9nb3V0OiAoKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVMb2dnZWRJbkNoYW5uZWwobnVsbCwgbnVsbCwgbnVsbCkpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvTmF2QmFyL2luZGV4LmpzIiwiaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMnO1xuXG5pbXBvcnQgeyBDSEFOTkVMLCBBU1NFVF9MSVRFLCBBU1NFVF9ERVRBSUxTIH0gZnJvbSAnY29uc3RhbnRzL3Nob3dfcmVxdWVzdF90eXBlcyc7XG5cbi8vIGJhc2ljIHJlcXVlc3QgcGFyc2luZ1xuZXhwb3J0IGZ1bmN0aW9uIG9uSGFuZGxlU2hvd1BhZ2VVcmkgKHBhcmFtcykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuSEFORExFX1NIT1dfVVJJLFxuICAgIGRhdGE6IHBhcmFtcyxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvblJlcXVlc3RFcnJvciAoZXJyb3IpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlJFUVVFU1RfRVJST1IsXG4gICAgZGF0YTogZXJyb3IsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb25OZXdDaGFubmVsUmVxdWVzdCAoY2hhbm5lbE5hbWUsIGNoYW5uZWxJZCkge1xuICBjb25zdCByZXF1ZXN0VHlwZSA9IENIQU5ORUw7XG4gIGNvbnN0IHJlcXVlc3RJZCA9IGBjciMke2NoYW5uZWxOYW1lfSMke2NoYW5uZWxJZH1gO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuQ0hBTk5FTF9SRVFVRVNUX05FVyxcbiAgICBkYXRhOiB7IHJlcXVlc3RUeXBlLCByZXF1ZXN0SWQsIGNoYW5uZWxOYW1lLCBjaGFubmVsSWQgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvbk5ld0Fzc2V0UmVxdWVzdCAobmFtZSwgaWQsIGNoYW5uZWxOYW1lLCBjaGFubmVsSWQsIGV4dGVuc2lvbikge1xuICBjb25zdCByZXF1ZXN0VHlwZSA9IGV4dGVuc2lvbiA/IEFTU0VUX0xJVEUgOiBBU1NFVF9ERVRBSUxTO1xuICBjb25zdCByZXF1ZXN0SWQgPSBgYXIjJHtuYW1lfSMke2lkfSMke2NoYW5uZWxOYW1lfSMke2NoYW5uZWxJZH1gO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuQVNTRVRfUkVRVUVTVF9ORVcsXG4gICAgZGF0YToge1xuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICByZXF1ZXN0SWQsXG4gICAgICBuYW1lLFxuICAgICAgbW9kaWZpZXI6IHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNoYW5uZWw6IHtcbiAgICAgICAgICBuYW1lOiBjaGFubmVsTmFtZSxcbiAgICAgICAgICBpZCAgOiBjaGFubmVsSWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb25SZXF1ZXN0VXBkYXRlIChyZXF1ZXN0VHlwZSwgcmVxdWVzdElkKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5SRVFVRVNUX1VQREFURSxcbiAgICBkYXRhOiB7XG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHJlcXVlc3RJZCxcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFJlcXVlc3RUb1JlcXVlc3RMaXN0IChpZCwgZXJyb3IsIGtleSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuUkVRVUVTVF9MSVNUX0FERCxcbiAgICBkYXRhOiB7IGlkLCBlcnJvciwga2V5IH0sXG4gIH07XG59O1xuXG4vLyBhc3NldCBhY3Rpb25zXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRBc3NldFRvQXNzZXRMaXN0IChpZCwgZXJyb3IsIG5hbWUsIGNsYWltSWQsIHNob3J0SWQsIGNsYWltRGF0YSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuQVNTRVRfQURELFxuICAgIGRhdGE6IHsgaWQsIGVycm9yLCBuYW1lLCBjbGFpbUlkLCBzaG9ydElkLCBjbGFpbURhdGEgfSxcbiAgfTtcbn1cblxuLy8gY2hhbm5lbCBhY3Rpb25zXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGROZXdDaGFubmVsVG9DaGFubmVsTGlzdCAoaWQsIG5hbWUsIHNob3J0SWQsIGxvbmdJZCwgY2xhaW1zRGF0YSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuQ0hBTk5FTF9BREQsXG4gICAgZGF0YTogeyBpZCwgbmFtZSwgc2hvcnRJZCwgbG9uZ0lkLCBjbGFpbXNEYXRhIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb25VcGRhdGVDaGFubmVsQ2xhaW1zIChjaGFubmVsS2V5LCBuYW1lLCBsb25nSWQsIHBhZ2UpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkNIQU5ORUxfQ0xBSU1TX1VQREFURV9BU1lOQyxcbiAgICBkYXRhOiB7Y2hhbm5lbEtleSwgbmFtZSwgbG9uZ0lkLCBwYWdlfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDaGFubmVsQ2xhaW1zIChjaGFubmVsTGlzdElkLCBjbGFpbXNEYXRhKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5DSEFOTkVMX0NMQUlNU19VUERBVEVfU1VDQ0VTUyxcbiAgICBkYXRhOiB7Y2hhbm5lbExpc3RJZCwgY2xhaW1zRGF0YX0sXG4gIH07XG59O1xuXG4vLyBkaXNwbGF5IGEgZmlsZVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsZVJlcXVlc3RlZCAobmFtZSwgY2xhaW1JZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuRklMRV9SRVFVRVNURUQsXG4gICAgZGF0YTogeyBuYW1lLCBjbGFpbUlkIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRmlsZUF2YWlsYWJpbGl0eSAoc3RhdHVzKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5GSUxFX0FWQUlMQUJJTElUWV9VUERBVEUsXG4gICAgZGF0YTogc3RhdHVzLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlBc3NldEVycm9yIChlcnJvcikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuRElTUExBWV9BU1NFVF9FUlJPUixcbiAgICBkYXRhOiBlcnJvcixcbiAgfTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9hY3Rpb25zL3Nob3cuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEhlbG1ldCBmcm9tICdyZWFjdC1oZWxtZXQnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuaW1wb3J0IHsgY3JlYXRlUGFnZVRpdGxlIH0gZnJvbSAndXRpbHMvcGFnZVRpdGxlJztcbmltcG9ydCB7IGNyZWF0ZU1ldGFUYWdzIH0gZnJvbSAndXRpbHMvbWV0YVRhZ3MnO1xuaW1wb3J0IHsgY3JlYXRlQ2Fub25pY2FsTGluayB9IGZyb20gJ3V0aWxzL2Nhbm9uaWNhbExpbmsnO1xuXG5jbGFzcyBTRU8gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGxldCB7IHBhZ2VUaXRsZSwgYXNzZXQsIGNoYW5uZWwsIHBhZ2VVcmkgfSA9IHRoaXMucHJvcHM7XG4gICAgcGFnZVRpdGxlID0gY3JlYXRlUGFnZVRpdGxlKHBhZ2VUaXRsZSk7XG4gICAgY29uc3QgbWV0YVRhZ3MgPSBjcmVhdGVNZXRhVGFncyhhc3NldCwgY2hhbm5lbCk7XG4gICAgY29uc3QgY2Fub25pY2FsTGluayA9IGNyZWF0ZUNhbm9uaWNhbExpbmsoYXNzZXQsIGNoYW5uZWwsIHBhZ2VVcmkpO1xuICAgIHJldHVybiAoXG4gICAgICA8SGVsbWV0XG4gICAgICAgIHRpdGxlPXtwYWdlVGl0bGV9XG4gICAgICAgIG1ldGE9e21ldGFUYWdzfVxuICAgICAgICBsaW5rPXtbe3JlbDogJ2Nhbm9uaWNhbCcsIGhyZWY6IGNhbm9uaWNhbExpbmt9XX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufTtcblxuU0VPLnByb3BUeXBlcyA9IHtcbiAgcGFnZVRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBwYWdlVXJpICA6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNoYW5uZWwgIDogUHJvcFR5cGVzLm9iamVjdCxcbiAgYXNzZXQgICAgOiBQcm9wVHlwZXMub2JqZWN0LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgU0VPO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29tcG9uZW50cy9TRU8vaW5kZXguanN4IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJvcC10eXBlc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInByb3AtdHlwZXNcIlxuLy8gbW9kdWxlIGlkID0gMTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICdjcm9zcy1mZXRjaC9wb2x5ZmlsbCc7XG5cbi8qKlxuICogUGFyc2VzIHRoZSBKU09OIHJldHVybmVkIGJ5IGEgbmV0d29yayByZXF1ZXN0XG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSByZXNwb25zZSBBIHJlc3BvbnNlIGZyb20gYSBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJuIHtvYmplY3R9ICAgICAgICAgIFRoZSBwYXJzZWQgSlNPTiBmcm9tIHRoZSByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIHBhcnNlSlNPTiAocmVzcG9uc2UpIHtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0IHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA1KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIHN0YXR1cyByZXR1cm5lZCBieSBhIG5ldHdvcmsgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gcmVzcG9uc2UgICBBIHJlc3BvbnNlIGZyb20gYSBuZXR3b3JrIHJlcXVlc3RcbiAqIEBwYXJhbSAge29iamVjdH0gcmVzcG9uc2UgICBUaGUgcGFyc2VkIEpTT04gZnJvbSB0aGUgbmV0d29yayByZXF1ZXN0XG4gKlxuICogQHJldHVybiB7b2JqZWN0IHwgdW5kZWZpbmVkfSBSZXR1cm5zIG9iamVjdCB3aXRoIHN0YXR1cyBhbmQgc3RhdHVzVGV4dCwgb3IgdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU3RhdHVzIChyZXNwb25zZSwganNvblJlc3BvbnNlKSB7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgIHJldHVybiBqc29uUmVzcG9uc2U7XG4gIH1cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoanNvblJlc3BvbnNlLm1lc3NhZ2UpO1xuICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICB0aHJvdyBlcnJvcjtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyBhIFVSTCwgcmV0dXJuaW5nIGEgcHJvbWlzZVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gdXJsICAgICAgIFRoZSBVUkwgd2Ugd2FudCB0byByZXF1ZXN0XG4gKiBAcGFyYW0gIHtvYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyB3ZSB3YW50IHRvIHBhc3MgdG8gXCJmZXRjaFwiXG4gKlxuICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAgVGhlIHJlc3BvbnNlIGRhdGFcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1ZXN0ICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucylcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3Jlc3BvbnNlLCBwYXJzZUpTT04ocmVzcG9uc2UpXSk7XG4gICAgfSlcbiAgICAudGhlbigoW3Jlc3BvbnNlLCBqc29uUmVzcG9uc2VdKSA9PiB7XG4gICAgICByZXR1cm4gY2hlY2tTdGF0dXMocmVzcG9uc2UsIGpzb25SZXNwb25zZSk7XG4gICAgfSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC91dGlscy9yZXF1ZXN0LmpzIiwiLy8gcmVxdWVzdCBhY3Rpb25zXG5leHBvcnQgY29uc3QgSEFORExFX1NIT1dfVVJJID0gJ0hBTkRMRV9TSE9XX1VSSSc7XG5leHBvcnQgY29uc3QgUkVRVUVTVF9FUlJPUiA9ICdSRVFVRVNUX0VSUk9SJztcbmV4cG9ydCBjb25zdCBSRVFVRVNUX1VQREFURSA9ICdSRVFVRVNUX1VQREFURSc7XG5leHBvcnQgY29uc3QgQVNTRVRfUkVRVUVTVF9ORVcgPSAnQVNTRVRfUkVRVUVTVF9ORVcnO1xuZXhwb3J0IGNvbnN0IENIQU5ORUxfUkVRVUVTVF9ORVcgPSAnQ0hBTk5FTF9SRVFVRVNUX05FVyc7XG5leHBvcnQgY29uc3QgUkVRVUVTVF9MSVNUX0FERCA9ICdSRVFVRVNUX0xJU1RfQUREJztcblxuLy8gYXNzZXQgYWN0aW9uc1xuZXhwb3J0IGNvbnN0IEFTU0VUX0FERCA9IGBBU1NFVF9BRERgO1xuXG4vLyBjaGFubmVsIGFjdGlvbnNcbmV4cG9ydCBjb25zdCBDSEFOTkVMX0FERCA9ICdDSEFOTkVMX0FERCc7XG5cbmV4cG9ydCBjb25zdCBDSEFOTkVMX0NMQUlNU19VUERBVEVfQVNZTkMgPSAnQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX0FTWU5DJztcbmV4cG9ydCBjb25zdCBDSEFOTkVMX0NMQUlNU19VUERBVEVfU1VDQ0VTUyA9ICdDSEFOTkVMX0NMQUlNU19VUERBVEVfU1VDQ0VTUyc7XG5cbi8vIGFzc2V0L2ZpbGUgZGlzcGxheSBhY3Rpb25zXG5leHBvcnQgY29uc3QgRklMRV9SRVFVRVNURUQgPSAnRklMRV9SRVFVRVNURUQnO1xuZXhwb3J0IGNvbnN0IEZJTEVfQVZBSUxBQklMSVRZX1VQREFURSA9ICdGSUxFX0FWQUlMQUJJTElUWV9VUERBVEUnO1xuZXhwb3J0IGNvbnN0IERJU1BMQVlfQVNTRVRfRVJST1IgPSAnRElTUExBWV9BU1NFVF9FUlJPUic7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMuanMiLCJleHBvcnQgY29uc3Qgc2VsZWN0QXNzZXQgPSAoc2hvdykgPT4ge1xuICBjb25zdCByZXF1ZXN0ID0gc2hvdy5yZXF1ZXN0TGlzdFtzaG93LnJlcXVlc3QuaWRdO1xuICBjb25zdCBhc3NldEtleSA9IHJlcXVlc3Qua2V5O1xuICByZXR1cm4gc2hvdy5hc3NldExpc3RbYXNzZXRLZXldO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdFNob3dTdGF0ZSA9IChzdGF0ZSkgPT4ge1xuICByZXR1cm4gc3RhdGUuc2hvdztcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9zZWxlY3RvcnMvc2hvdy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWhlbG1ldFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlYWN0LWhlbG1ldFwiXG4vLyBtb2R1bGUgaWQgPSAxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWR1eC1zYWdhL2VmZmVjdHNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWR1eC1zYWdhL2VmZmVjdHNcIlxuLy8gbW9kdWxlIGlkID0gMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyBhcGk6IHsgYXBpSG9zdCwgYXBpUG9ydCB9IH0gPSByZXF1aXJlKCcuLi9jb25maWcvbGJyeUNvbmZpZy5qcycpO1xuY29uc3QgbGJyeUFwaVVyaSA9ICdodHRwOi8vJyArIGFwaUhvc3QgKyAnOicgKyBhcGlQb3J0O1xuY29uc3QgeyBjaG9vc2VHYUxicnluZXRQdWJsaXNoTGFiZWwsIHNlbmRHQVRpbWluZ0V2ZW50IH0gPSByZXF1aXJlKCcuL2dvb2dsZUFuYWx5dGljcy5qcycpO1xuXG5jb25zdCBoYW5kbGVMYnJ5bmV0UmVzcG9uc2UgPSAoeyBkYXRhIH0sIHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICBsb2dnZXIuZGVidWcoJ2xicnkgYXBpIGRhdGE6JywgZGF0YSk7XG4gIGlmIChkYXRhLnJlc3VsdCkge1xuICAgIC8vIGNoZWNrIGZvciBhbiBlcnJvclxuICAgIGlmIChkYXRhLnJlc3VsdC5lcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdMYnJ5bmV0IGFwaSBlcnJvcjonLCBkYXRhLnJlc3VsdC5lcnJvcik7XG4gICAgICByZWplY3QobmV3IEVycm9yKGRhdGEucmVzdWx0LmVycm9yKSk7XG4gICAgICByZXR1cm47XG4gICAgfTtcbiAgICByZXNvbHZlKGRhdGEucmVzdWx0KTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZmFsbGJhY2sgaW4gY2FzZSBpdCBqdXN0IHRpbWVkIG91dFxuICByZWplY3QoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHB1Ymxpc2hDbGFpbSAocHVibGlzaFBhcmFtcykge1xuICAgIGxvZ2dlci5kZWJ1ZyhgbGJyeUFwaSA+PiBQdWJsaXNoaW5nIGNsYWltIHRvIFwiJHtwdWJsaXNoUGFyYW1zLm5hbWV9XCJgKTtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KGxicnlBcGlVcmksIHtcbiAgICAgICAgICBtZXRob2Q6ICdwdWJsaXNoJyxcbiAgICAgICAgICBwYXJhbXM6IHB1Ymxpc2hQYXJhbXMsXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnbGJyeW5ldCcsICdwdWJsaXNoJywgY2hvb3NlR2FMYnJ5bmV0UHVibGlzaExhYmVsKHB1Ymxpc2hQYXJhbXMpLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgaGFuZGxlTGJyeW5ldFJlc3BvbnNlKHJlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXRDbGFpbSAodXJpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBsYnJ5QXBpID4+IEdldHRpbmcgQ2xhaW0gZm9yIFwiJHt1cml9XCJgKTtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KGxicnlBcGlVcmksIHtcbiAgICAgICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgICAgIHBhcmFtczogeyB1cmksIHRpbWVvdXQ6IDIwIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnbGJyeW5ldCcsICdnZXRDbGFpbScsICdHRVQnLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgaGFuZGxlTGJyeW5ldFJlc3BvbnNlKHJlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXRDbGFpbUxpc3QgKGNsYWltTmFtZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgbGJyeUFwaSA+PiBHZXR0aW5nIGNsYWltX2xpc3QgZm9yIFwiJHtjbGFpbU5hbWV9XCJgKTtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KGxicnlBcGlVcmksIHtcbiAgICAgICAgICBtZXRob2Q6ICdjbGFpbV9saXN0JyxcbiAgICAgICAgICBwYXJhbXM6IHsgbmFtZTogY2xhaW1OYW1lIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnbGJyeW5ldCcsICdnZXRDbGFpbUxpc3QnLCAnQ0xBSU1fTElTVCcsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICBoYW5kbGVMYnJ5bmV0UmVzcG9uc2UocmVzcG9uc2UsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIHJlc29sdmVVcmkgKHVyaSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgbGJyeUFwaSA+PiBSZXNvbHZpbmcgVVJJIGZvciBcIiR7dXJpfVwiYCk7XG4gICAgY29uc3QgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBheGlvc1xuICAgICAgICAucG9zdChsYnJ5QXBpVXJpLCB7XG4gICAgICAgICAgbWV0aG9kOiAncmVzb2x2ZScsXG4gICAgICAgICAgcGFyYW1zOiB7IHVyaSB9LFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnbGJyeW5ldCcsICdyZXNvbHZlVXJpJywgJ1JFU09MVkUnLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgaWYgKGRhdGEucmVzdWx0W3VyaV0uZXJyb3IpIHsgIC8vIGNoZWNrIGZvciBlcnJvcnNcbiAgICAgICAgICAgIHJlamVjdChkYXRhLnJlc3VsdFt1cmldLmVycm9yKTtcbiAgICAgICAgICB9IGVsc2UgeyAgLy8gaWYgbm8gZXJyb3JzLCByZXNvbHZlXG4gICAgICAgICAgICByZXNvbHZlKGRhdGEucmVzdWx0W3VyaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0RG93bmxvYWREaXJlY3RvcnkgKCkge1xuICAgIGxvZ2dlci5kZWJ1ZygnbGJyeUFwaSA+PiBSZXRyaWV2aW5nIHRoZSBkb3dubG9hZCBkaXJlY3RvcnkgcGF0aCBmcm9tIGxicnkgZGFlbW9uLi4uJyk7XG4gICAgY29uc3QgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBheGlvc1xuICAgICAgICAucG9zdChsYnJ5QXBpVXJpLCB7XG4gICAgICAgICAgbWV0aG9kOiAnc2V0dGluZ3NfZ2V0JyxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2xicnluZXQnLCAnZ2V0RG93bmxvYWREaXJlY3RvcnknLCAnU0VUVElOR1NfR0VUJywgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xuICAgICAgICAgIGlmIChkYXRhLnJlc3VsdCkge1xuICAgICAgICAgICAgcmVzb2x2ZShkYXRhLnJlc3VsdC5kb3dubG9hZF9kaXJlY3RvcnkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIGxicnkgZGFlbW9uLCBidXQgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBkb3dubG9hZCBkaXJlY3RvcnkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignTGJyeW5ldCBFcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgnL2hvbWUvbGJyeS9Eb3dubG9hZHMvJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBjcmVhdGVDaGFubmVsIChuYW1lKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBsYnJ5QXBpID4+IENyZWF0aW5nIGNoYW5uZWwgZm9yICR7bmFtZX0uLi5gKTtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KGxicnlBcGlVcmksIHtcbiAgICAgICAgICBtZXRob2Q6ICdjaGFubmVsX25ldycsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBjaGFubmVsX25hbWU6IG5hbWUsXG4gICAgICAgICAgICBhbW91bnQgICAgICA6IDAuMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2xicnluZXQnLCAnY3JlYXRlQ2hhbm5lbCcsICdDSEFOTkVMX05FVycsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICBoYW5kbGVMYnJ5bmV0UmVzcG9uc2UocmVzcG9uc2UsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vaGVscGVycy9sYnJ5QXBpLmpzIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgdWEgPSByZXF1aXJlKCd1bml2ZXJzYWwtYW5hbHl0aWNzJyk7XG5jb25zdCB7IGFuYWx5dGljcyA6IHsgZ29vZ2xlSWQgfSwgZGV0YWlsczogeyB0aXRsZSB9IH0gPSByZXF1aXJlKCcuLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuXG5mdW5jdGlvbiBjcmVhdGVTZXJ2ZUV2ZW50UGFyYW1zIChoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwpIHtcbiAgcmV0dXJuIHtcbiAgICBldmVudENhdGVnb3J5ICAgIDogJ2NsaWVudCByZXF1ZXN0cycsXG4gICAgZXZlbnRBY3Rpb24gICAgICA6ICdzZXJ2ZSByZXF1ZXN0JyxcbiAgICBldmVudExhYmVsICAgICAgIDogb3JpZ2luYWxVcmwsXG4gICAgaXBPdmVycmlkZSAgICAgICA6IGlwLFxuICAgIHVzZXJBZ2VudE92ZXJyaWRlOiBoZWFkZXJzWyd1c2VyLWFnZW50J10sXG4gIH07XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVQdWJsaXNoVGltaW5nRXZlbnRQYXJhbXMgKGNhdGVnb3J5LCB2YXJpYWJsZSwgbGFiZWwsIHN0YXJ0VGltZSwgZW5kVGltZSkge1xuICBjb25zdCBkdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gIHJldHVybiB7XG4gICAgdXNlclRpbWluZ0NhdGVnb3J5ICAgIDogY2F0ZWdvcnksXG4gICAgdXNlclRpbWluZ1ZhcmlhYmxlTmFtZTogdmFyaWFibGUsXG4gICAgdXNlclRpbWluZ1RpbWUgICAgICAgIDogZHVyYXRpb24sXG4gICAgdXNlclRpbWluZ0xhYmVsICAgICAgIDogbGFiZWwsXG4gIH07XG59O1xuXG5mdW5jdGlvbiBzZW5kR29vZ2xlQW5hbHl0aWNzRXZlbnQgKGlwLCBwYXJhbXMpIHtcbiAgY29uc3QgdmlzaXRvcklkID0gaXAucmVwbGFjZSgvXFwuL2csICctJyk7XG4gIGNvbnN0IHZpc2l0b3IgPSB1YShnb29nbGVJZCwgdmlzaXRvcklkLCB7IHN0cmljdENpZEZvcm1hdDogZmFsc2UsIGh0dHBzOiB0cnVlIH0pO1xuICB2aXNpdG9yLmV2ZW50KHBhcmFtcywgKGVycikgPT4ge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignR29vZ2xlIEFuYWx5dGljcyBFdmVudCBFcnJvciA+PicsIGVycik7XG4gICAgfVxuICB9KTtcbn07XG5cbmZ1bmN0aW9uIHNlbmRHb29nbGVBbmFseXRpY3NUaW1pbmcgKHZpc2l0b3JJZCwgcGFyYW1zKSB7XG4gIGNvbnN0IHZpc2l0b3IgPSB1YShnb29nbGVJZCwgdmlzaXRvcklkLCB7IHN0cmljdENpZEZvcm1hdDogZmFsc2UsIGh0dHBzOiB0cnVlIH0pO1xuICB2aXNpdG9yLnRpbWluZyhwYXJhbXMsIChlcnIpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0dvb2dsZSBBbmFseXRpY3MgRXZlbnQgRXJyb3IgPj4nLCBlcnIpO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoYFRpbWluZyBldmVudCBzdWNjZXNzZnVsbHkgc2VudCB0byBnb29nbGUgYW5hbHl0aWNzYCk7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNlbmRHQVNlcnZlRXZlbnQgKGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IGNyZWF0ZVNlcnZlRXZlbnRQYXJhbXMoaGVhZGVycywgaXAsIG9yaWdpbmFsVXJsKTtcbiAgICBzZW5kR29vZ2xlQW5hbHl0aWNzRXZlbnQoaXAsIHBhcmFtcyk7XG4gIH0sXG4gIHNlbmRHQVRpbWluZ0V2ZW50IChjYXRlZ29yeSwgdmFyaWFibGUsIGxhYmVsLCBzdGFydFRpbWUsIGVuZFRpbWUpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBjcmVhdGVQdWJsaXNoVGltaW5nRXZlbnRQYXJhbXMoY2F0ZWdvcnksIHZhcmlhYmxlLCBsYWJlbCwgc3RhcnRUaW1lLCBlbmRUaW1lKTtcbiAgICBzZW5kR29vZ2xlQW5hbHl0aWNzVGltaW5nKHRpdGxlLCBwYXJhbXMpO1xuICB9LFxuICBjaG9vc2VHYUxicnluZXRQdWJsaXNoTGFiZWwgKHsgY2hhbm5lbF9uYW1lOiBjaGFubmVsTmFtZSwgY2hhbm5lbF9pZDogY2hhbm5lbElkIH0pIHtcbiAgICByZXR1cm4gKGNoYW5uZWxOYW1lIHx8IGNoYW5uZWxJZCA/ICdQVUJMSVNIX0lOX0NIQU5ORUxfQ0xBSU0nIDogJ1BVQkxJU0hfQU5PTllNT1VTX0NMQUlNJyk7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vaGVscGVycy9nb29nbGVBbmFseXRpY3MuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWR1eFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlZHV4XCJcbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL2NoYW5uZWxfYWN0aW9uX3R5cGVzJztcblxuLy8gZXhwb3J0IGFjdGlvbiBjcmVhdG9yc1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTG9nZ2VkSW5DaGFubmVsIChuYW1lLCBzaG9ydElkLCBsb25nSWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkNIQU5ORUxfVVBEQVRFLFxuICAgIGRhdGE6IHtcbiAgICAgIG5hbWUsXG4gICAgICBzaG9ydElkLFxuICAgICAgbG9uZ0lkLFxuICAgIH0sXG4gIH07XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvYWN0aW9ucy9jaGFubmVsLmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQWN0aXZlU3RhdHVzQmFyIGZyb20gJ2NvbXBvbmVudHMvQWN0aXZlU3RhdHVzQmFyJztcbmltcG9ydCBJbmFjdGl2ZVN0YXR1c0JhciBmcm9tICdjb21wb25lbnRzL0luYWN0aXZlU3RhdHVzQmFyJztcblxuY2xhc3MgUHJvZ3Jlc3NCYXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGJhcnMgICAgICAgOiBbXSxcbiAgICAgIGluZGV4ICAgICAgOiAwLFxuICAgICAgaW5jcmVtZW50ZXI6IDEsXG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZUJhcnMgPSB0aGlzLmNyZWF0ZUJhcnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnN0YXJ0UHJvZ3Jlc3NCYXIgPSB0aGlzLnN0YXJ0UHJvZ3Jlc3NCYXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZVByb2dyZXNzQmFyID0gdGhpcy51cGRhdGVQcm9ncmVzc0Jhci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc3RvcFByb2dyZXNzQmFyID0gdGhpcy5zdG9wUHJvZ3Jlc3NCYXIuYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgdGhpcy5jcmVhdGVCYXJzKCk7XG4gICAgdGhpcy5zdGFydFByb2dyZXNzQmFyKCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQgKCkge1xuICAgIHRoaXMuc3RvcFByb2dyZXNzQmFyKCk7XG4gIH1cbiAgY3JlYXRlQmFycyAoKSB7XG4gICAgY29uc3QgYmFycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHRoaXMucHJvcHMuc2l6ZTsgaSsrKSB7XG4gICAgICBiYXJzLnB1c2goe2lzQWN0aXZlOiBmYWxzZX0pO1xuICAgIH1cbiAgICB0aGlzLnNldFN0YXRlKHsgYmFycyB9KTtcbiAgfVxuICBzdGFydFByb2dyZXNzQmFyICgpIHtcbiAgICB0aGlzLnVwZGF0ZUludGVydmFsID0gc2V0SW50ZXJ2YWwodGhpcy51cGRhdGVQcm9ncmVzc0Jhci5iaW5kKHRoaXMpLCAzMDApO1xuICB9O1xuICB1cGRhdGVQcm9ncmVzc0JhciAoKSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5zdGF0ZS5pbmRleDtcbiAgICBsZXQgaW5jcmVtZW50ZXIgPSB0aGlzLnN0YXRlLmluY3JlbWVudGVyO1xuICAgIGxldCBiYXJzID0gdGhpcy5zdGF0ZS5iYXJzO1xuICAgIC8vIGZsaXAgaW5jcmVtZW50ZXIgaWYgbmVjZXNzYXJ5LCB0byBzdGF5IGluIGJvdW5kc1xuICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPiB0aGlzLnByb3BzLnNpemUpKSB7XG4gICAgICBpbmNyZW1lbnRlciA9IGluY3JlbWVudGVyICogLTE7XG4gICAgICBpbmRleCArPSBpbmNyZW1lbnRlcjtcbiAgICB9XG4gICAgLy8gdXBkYXRlIHRoZSBpbmRleGVkIGJhclxuICAgIGlmIChpbmNyZW1lbnRlciA+IDApIHtcbiAgICAgIGJhcnNbaW5kZXhdLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFyc1tpbmRleF0uaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuICAgIC8vIGluY3JlbWVudCBpbmRleFxuICAgIGluZGV4ICs9IGluY3JlbWVudGVyO1xuICAgIC8vIHVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgYmFycyxcbiAgICAgIGluY3JlbWVudGVyLFxuICAgICAgaW5kZXgsXG4gICAgfSk7XG4gIH07XG4gIHN0b3BQcm9ncmVzc0JhciAoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZUludGVydmFsKTtcbiAgfTtcbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAge3RoaXMuc3RhdGUuYmFycy5tYXAoKGJhciwgaW5kZXgpID0+IGJhci5pc0FjdGl2ZSA/IDxBY3RpdmVTdGF0dXNCYXIga2V5PXtpbmRleH0gLz4gOiA8SW5hY3RpdmVTdGF0dXNCYXIga2V5PXtpbmRleH0vPil9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5Qcm9ncmVzc0Jhci5wcm9wVHlwZXMgPSB7XG4gIHNpemU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByb2dyZXNzQmFyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29tcG9uZW50cy9Qcm9ncmVzc0Jhci9pbmRleC5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBOYXZCYXIgZnJvbSAnY29udGFpbmVycy9OYXZCYXInO1xuXG5jbGFzcyBFcnJvclBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgZXJyb3IgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxOYXZCYXIgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgPHA+e2Vycm9yfTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5FcnJvclBhZ2UucHJvcFR5cGVzID0ge1xuICBlcnJvcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRXJyb3JQYWdlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29tcG9uZW50cy9FcnJvclBhZ2UvaW5kZXguanN4IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGFzc3BvcnRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJwYXNzcG9ydFwiXG4vLyBtb2R1bGUgaWQgPSAyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJmdW5jdGlvbiBNeXNxbENvbmZpZyAoKSB7XG4gIHRoaXMuZGF0YWJhc2UgPSAnZGVmYXVsdCc7XG4gIHRoaXMudXNlcm5hbWUgPSAnZGVmYXVsdCc7XG4gIHRoaXMucGFzc3dvcmQgPSAnZGVmYXVsdCc7XG4gIHRoaXMuY29uZmlndXJlID0gKGNvbmZpZykgPT4ge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ05vIE15U1FMIGNvbmZpZyByZWNlaXZlZC4nKTtcbiAgICB9XG4gICAgY29uc3Qge2RhdGFiYXNlLCB1c2VybmFtZSwgcGFzc3dvcmR9ID0gY29uZmlnO1xuICAgIHRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTtcbiAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7XG4gICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgTXlzcWxDb25maWcoKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvbmZpZy9teXNxbENvbmZpZy5qcyIsImZ1bmN0aW9uIFNsYWNrQ29uZmlnICgpIHtcbiAgdGhpcy5zbGFja1dlYkhvb2sgICAgICA9ICdkZWZhdWx0JztcbiAgdGhpcy5zbGFja0Vycm9yQ2hhbm5lbCA9ICdkZWZhdWx0JztcbiAgdGhpcy5zbGFja0luZm9DaGFubmVsICA9ICdkZWZhdWx0JztcbiAgdGhpcy5jb25maWd1cmUgPSAoY29uZmlnKSA9PiB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygnTm8gc2xhY2sgY29uZmlnIHJlY2VpdmVkLicpO1xuICAgIH1cbiAgICBjb25zdCB7c2xhY2tXZWJIb29rLCBzbGFja0Vycm9yQ2hhbm5lbCwgc2xhY2tJbmZvQ2hhbm5lbH0gPSBjb25maWc7XG4gICAgdGhpcy5zbGFja1dlYkhvb2sgPSBzbGFja1dlYkhvb2s7XG4gICAgdGhpcy5zbGFja0Vycm9yQ2hhbm5lbCA9IHNsYWNrRXJyb3JDaGFubmVsO1xuICAgIHRoaXMuc2xhY2tJbmZvQ2hhbm5lbCA9IHNsYWNrSW5mb0NoYW5uZWw7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTbGFja0NvbmZpZygpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY29uZmlnL3NsYWNrQ29uZmlnLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGFzc3BvcnQtbG9jYWxcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJwYXNzcG9ydC1sb2NhbFwiXG4vLyBtb2R1bGUgaWQgPSAyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzZXF1ZWxpemVcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJzZXF1ZWxpemVcIlxuLy8gbW9kdWxlIGlkID0gMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJldHVyblNob3J0SWQ6IGZ1bmN0aW9uIChjbGFpbXNBcnJheSwgbG9uZ0lkKSB7XG4gICAgbGV0IGNsYWltSW5kZXg7XG4gICAgbGV0IHNob3J0SWQgPSBsb25nSWQuc3Vic3RyaW5nKDAsIDEpOyAvLyBkZWZhdWx0IHNob3J0IGlkIGlzIHRoZSBmaXJzdCBsZXR0ZXJcbiAgICBsZXQgc2hvcnRJZExlbmd0aCA9IDA7XG4gICAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhpcyBjbGFpbSBpZFxuICAgIGNsYWltSW5kZXggPSBjbGFpbXNBcnJheS5maW5kSW5kZXgoZWxlbWVudCA9PiB7XG4gICAgICByZXR1cm4gZWxlbWVudC5jbGFpbUlkID09PSBsb25nSWQ7XG4gICAgfSk7XG4gICAgaWYgKGNsYWltSW5kZXggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsYWltIGlkIG5vdCBmb3VuZCBpbiBjbGFpbXMgbGlzdCcpO1xuICAgIH1cbiAgICAvLyBnZXQgYW4gYXJyYXkgb2YgYWxsIGNsYWltcyB3aXRoIGxvd2VyIGhlaWdodFxuICAgIGxldCBwb3NzaWJsZU1hdGNoZXMgPSBjbGFpbXNBcnJheS5zbGljZSgwLCBjbGFpbUluZGV4KTtcbiAgICAvLyByZW1vdmUgY2VydGlmaWNhdGVzIHdpdGggdGhlIHNhbWUgcHJlZml4ZXMgdW50aWwgbm9uZSBhcmUgbGVmdC5cbiAgICB3aGlsZSAocG9zc2libGVNYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNob3J0SWRMZW5ndGggKz0gMTtcbiAgICAgIHNob3J0SWQgPSBsb25nSWQuc3Vic3RyaW5nKDAsIHNob3J0SWRMZW5ndGgpO1xuICAgICAgcG9zc2libGVNYXRjaGVzID0gcG9zc2libGVNYXRjaGVzLmZpbHRlcihlbGVtZW50ID0+IHtcbiAgICAgICAgcmV0dXJuIChlbGVtZW50LmNsYWltSWQgJiYgKGVsZW1lbnQuY2xhaW1JZC5zdWJzdHJpbmcoMCwgc2hvcnRJZExlbmd0aCkgPT09IHNob3J0SWQpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2hvcnRJZDtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9oZWxwZXJzL3NlcXVlbGl6ZUhlbHBlcnMuanMiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmNvbnN0IHsgZGV0YWlscywgcHVibGlzaGluZyB9ID0gcmVxdWlyZSgnLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhcnNlUHVibGlzaEFwaVJlcXVlc3RCb2R5ICh7bmFtZSwgbnNmdywgbGljZW5zZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCB0aHVtYm5haWx9KSB7XG4gICAgLy8gdmFsaWRhdGUgbmFtZVxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBuYW1lIGZpZWxkIGZvdW5kIGluIHJlcXVlc3QnKTtcbiAgICB9XG4gICAgY29uc3QgaW52YWxpZE5hbWVDaGFyYWN0ZXJzID0gL1teQS1aYS16MC05LC1dLy5leGVjKG5hbWUpO1xuICAgIGlmIChpbnZhbGlkTmFtZUNoYXJhY3RlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNsYWltIG5hbWUgeW91IHByb3ZpZGVkIGlzIG5vdCBhbGxvd2VkLiAgT25seSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQ6IEEtWiwgYS16LCAwLTksIGFuZCBcIi1cIicpO1xuICAgIH1cbiAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzXG4gICAgbnNmdyA9IChuc2Z3ID09PSAndHJ1ZScpO1xuICAgIGxpY2Vuc2UgPSBsaWNlbnNlIHx8IG51bGw7XG4gICAgdGl0bGUgPSB0aXRsZSB8fCBudWxsO1xuICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgbnVsbDtcbiAgICB0aHVtYm5haWwgPSB0aHVtYm5haWwgfHwgbnVsbDtcbiAgICAvLyByZXR1cm4gcmVzdWx0c1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgbnNmdyxcbiAgICAgIGxpY2Vuc2UsXG4gICAgICB0aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgdGh1bWJuYWlsLFxuICAgIH07XG4gIH0sXG4gIHBhcnNlUHVibGlzaEFwaVJlcXVlc3RGaWxlcyAoe2ZpbGUsIHRodW1ibmFpbH0pIHtcbiAgICAvLyBtYWtlIHN1cmUgYSBmaWxlIHdhcyBwcm92aWRlZFxuICAgIGlmICghZmlsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmaWxlIHdpdGgga2V5IG9mIFtmaWxlXSBmb3VuZCBpbiByZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGlmICghZmlsZS5wYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGZpbGUgcGF0aCBmb3VuZCcpO1xuICAgIH1cbiAgICBpZiAoIWZpbGUudHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmaWxlIHR5cGUgZm91bmQnKTtcbiAgICB9XG4gICAgaWYgKCFmaWxlLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZmlsZSB0eXBlIGZvdW5kJyk7XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIHRoZSBmaWxlIG5hbWVcbiAgICBpZiAoLycvLnRlc3QoZmlsZS5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcG9zdHJvcGhlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIGZpbGUgbmFtZScpO1xuICAgIH1cbiAgICAvLyB2YWxpZGF0ZSB0aGUgZmlsZVxuICAgIG1vZHVsZS5leHBvcnRzLnZhbGlkYXRlRmlsZVR5cGVBbmRTaXplKGZpbGUpO1xuICAgIC8vIHJldHVybiByZXN1bHRzXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVOYW1lICAgICAgICAgOiBmaWxlLm5hbWUsXG4gICAgICBmaWxlUGF0aCAgICAgICAgIDogZmlsZS5wYXRoLFxuICAgICAgZmlsZVR5cGUgICAgICAgICA6IGZpbGUudHlwZSxcbiAgICAgIHRodW1ibmFpbEZpbGVOYW1lOiAodGh1bWJuYWlsID8gdGh1bWJuYWlsLm5hbWUgOiBudWxsKSxcbiAgICAgIHRodW1ibmFpbEZpbGVQYXRoOiAodGh1bWJuYWlsID8gdGh1bWJuYWlsLnBhdGggOiBudWxsKSxcbiAgICAgIHRodW1ibmFpbEZpbGVUeXBlOiAodGh1bWJuYWlsID8gdGh1bWJuYWlsLnR5cGUgOiBudWxsKSxcbiAgICB9O1xuICB9LFxuICB2YWxpZGF0ZUZpbGVUeXBlQW5kU2l6ZSAoZmlsZSkge1xuICAgIC8vIGNoZWNrIGZpbGUgdHlwZSBhbmQgc2l6ZVxuICAgIHN3aXRjaCAoZmlsZS50eXBlKSB7XG4gICAgICBjYXNlICdpbWFnZS9qcGVnJzpcbiAgICAgIGNhc2UgJ2ltYWdlL2pwZyc6XG4gICAgICBjYXNlICdpbWFnZS9wbmcnOlxuICAgICAgICBpZiAoZmlsZS5zaXplID4gMTAwMDAwMDApIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ3B1Ymxpc2ggPiBmaWxlIHZhbGlkYXRpb24gPiAuanBlZy8uanBnLy5wbmcgd2FzIHRvbyBiaWcnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvcnJ5LCBpbWFnZXMgYXJlIGxpbWl0ZWQgdG8gMTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW1hZ2UvZ2lmJzpcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IDUwMDAwMDAwKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdwdWJsaXNoID4gZmlsZSB2YWxpZGF0aW9uID4gLmdpZiB3YXMgdG9vIGJpZycpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29ycnksIC5naWZzIGFyZSBsaW1pdGVkIHRvIDUwIG1lZ2FieXRlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZpZGVvL21wNCc6XG4gICAgICAgIGlmIChmaWxlLnNpemUgPiA1MDAwMDAwMCkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygncHVibGlzaCA+IGZpbGUgdmFsaWRhdGlvbiA+IC5tcDQgd2FzIHRvbyBiaWcnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvcnJ5LCB2aWRlb3MgYXJlIGxpbWl0ZWQgdG8gNTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdwdWJsaXNoID4gZmlsZSB2YWxpZGF0aW9uID4gdW5yZWNvZ25pemVkIGZpbGUgdHlwZScpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSAnICsgZmlsZS50eXBlICsgJyBjb250ZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZC4gIE9ubHksIC5qcGVnLCAucG5nLCAuZ2lmLCBhbmQgLm1wNCBmaWxlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGU7XG4gIH0sXG4gIGNyZWF0ZUJhc2ljUHVibGlzaFBhcmFtcyAoZmlsZVBhdGgsIG5hbWUsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbGljZW5zZSwgbnNmdywgdGh1bWJuYWlsKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBQdWJsaXNoIFBhcmFtZXRlcnNgKTtcbiAgICAvLyBwcm92aWRlIGRlZmF1bHRzIGZvciB0aXRsZVxuICAgIGlmICh0aXRsZSA9PT0gbnVsbCB8fCB0aXRsZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aXRsZSA9IG5hbWU7XG4gICAgfVxuICAgIC8vIHByb3ZpZGUgZGVmYXVsdCBmb3IgZGVzY3JpcHRpb25cbiAgICBpZiAoZGVzY3JpcHRpb24gPT09IG51bGwgfHwgZGVzY3JpcHRpb24udHJpbSgpID09PSAnJykge1xuICAgICAgZGVzY3JpcHRpb24gPSAnJztcbiAgICB9XG4gICAgLy8gcHJvdmlkZSBkZWZhdWx0IGZvciBsaWNlbnNlXG4gICAgaWYgKGxpY2Vuc2UgPT09IG51bGwgfHwgbGljZW5zZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBsaWNlbnNlID0gJyAnOyAgLy8gZGVmYXVsdCB0byBlbXB0eSBzdHJpbmdcbiAgICB9XG4gICAgLy8gY3JlYXRlIHRoZSBwdWJsaXNoIHBhcmFtc1xuICAgIGNvbnN0IHB1Ymxpc2hQYXJhbXMgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZmlsZV9wYXRoOiBmaWxlUGF0aCxcbiAgICAgIGJpZCAgICAgIDogMC4wMSxcbiAgICAgIG1ldGFkYXRhIDoge1xuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGF1dGhvciAgOiBkZXRhaWxzLnRpdGxlLFxuICAgICAgICBsYW5ndWFnZTogJ2VuJyxcbiAgICAgICAgbGljZW5zZSxcbiAgICAgICAgbnNmdyxcbiAgICAgIH0sXG4gICAgICBjbGFpbV9hZGRyZXNzOiBwdWJsaXNoaW5nLnByaW1hcnlDbGFpbUFkZHJlc3MsXG4gICAgfTtcbiAgICAvLyBhZGQgdGh1bWJuYWlsIHRvIGNoYW5uZWwgaWYgdmlkZW9cbiAgICBpZiAodGh1bWJuYWlsKSB7XG4gICAgICBwdWJsaXNoUGFyYW1zWydtZXRhZGF0YSddWyd0aHVtYm5haWwnXSA9IHRodW1ibmFpbDtcbiAgICB9XG4gICAgcmV0dXJuIHB1Ymxpc2hQYXJhbXM7XG4gIH0sXG4gIGNyZWF0ZVRodW1ibmFpbFB1Ymxpc2hQYXJhbXMgKHRodW1ibmFpbEZpbGVQYXRoLCBjbGFpbU5hbWUsIGxpY2Vuc2UsIG5zZncpIHtcbiAgICBpZiAoIXRodW1ibmFpbEZpbGVQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgVGh1bWJuYWlsIFB1Ymxpc2ggUGFyYW1ldGVyc2ApO1xuICAgIC8vIGNyZWF0ZSB0aGUgcHVibGlzaCBwYXJhbXNcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSAgICAgOiBgJHtjbGFpbU5hbWV9LXRodW1iYCxcbiAgICAgIGZpbGVfcGF0aDogdGh1bWJuYWlsRmlsZVBhdGgsXG4gICAgICBiaWQgICAgICA6IDAuMDEsXG4gICAgICBtZXRhZGF0YSA6IHtcbiAgICAgICAgdGl0bGUgICAgICA6IGAke2NsYWltTmFtZX0gdGh1bWJuYWlsYCxcbiAgICAgICAgZGVzY3JpcHRpb246IGBhIHRodW1ibmFpbCBmb3IgJHtjbGFpbU5hbWV9YCxcbiAgICAgICAgYXV0aG9yICAgICA6IGRldGFpbHMudGl0bGUsXG4gICAgICAgIGxhbmd1YWdlICAgOiAnZW4nLFxuICAgICAgICBsaWNlbnNlLFxuICAgICAgICBuc2Z3LFxuICAgICAgfSxcbiAgICAgIGNsYWltX2FkZHJlc3M6IHB1Ymxpc2hpbmcucHJpbWFyeUNsYWltQWRkcmVzcyxcbiAgICAgIGNoYW5uZWxfbmFtZSA6IHB1Ymxpc2hpbmcudGh1bWJuYWlsQ2hhbm5lbCxcbiAgICAgIGNoYW5uZWxfaWQgICA6IHB1Ymxpc2hpbmcudGh1bWJuYWlsQ2hhbm5lbElkLFxuICAgIH07XG4gIH0sXG4gIGRlbGV0ZVRlbXBvcmFyeUZpbGUgKGZpbGVQYXRoKSB7XG4gICAgZnMudW5saW5rKGZpbGVQYXRoLCBlcnIgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYGVycm9yIGRlbGV0aW5nIHRlbXBvcmFyeSBmaWxlICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1Zyhgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgICB9KTtcbiAgfSxcbiAgYWRkR2V0UmVzdWx0c1RvRmlsZURhdGEgKGZpbGVJbmZvLCBnZXRSZXN1bHQpIHtcbiAgICBmaWxlSW5mby5maWxlTmFtZSA9IGdldFJlc3VsdC5maWxlX25hbWU7XG4gICAgZmlsZUluZm8uZmlsZVBhdGggPSBnZXRSZXN1bHQuZG93bmxvYWRfcGF0aDtcbiAgICByZXR1cm4gZmlsZUluZm87XG4gIH0sXG4gIGNyZWF0ZUZpbGVEYXRhICh7IG5hbWUsIGNsYWltSWQsIG91dHBvaW50LCBoZWlnaHQsIGFkZHJlc3MsIG5zZncsIGNvbnRlbnRUeXBlIH0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIGNsYWltSWQsXG4gICAgICBvdXRwb2ludCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGFkZHJlc3MsXG4gICAgICBmaWxlTmFtZTogJycsXG4gICAgICBmaWxlUGF0aDogJycsXG4gICAgICBmaWxlVHlwZTogY29udGVudFR5cGUsXG4gICAgICBuc2Z3LFxuICAgIH07XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vaGVscGVycy9wdWJsaXNoSGVscGVycy5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGhhbmRsZUVycm9yUmVzcG9uc2U6IGZ1bmN0aW9uIChvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpIHtcbiAgICBsb2dnZXIuZXJyb3IoYEVycm9yIG9uICR7b3JpZ2luYWxVcmx9YCwgbW9kdWxlLmV4cG9ydHMudXNlT2JqZWN0UHJvcGVydGllc0lmTm9LZXlzKGVycm9yKSk7XG4gICAgY29uc3QgW3N0YXR1cywgbWVzc2FnZV0gPSBtb2R1bGUuZXhwb3J0cy5yZXR1cm5FcnJvck1lc3NhZ2VBbmRTdGF0dXMoZXJyb3IpO1xuICAgIHJlc1xuICAgICAgLnN0YXR1cyhzdGF0dXMpXG4gICAgICAuanNvbihtb2R1bGUuZXhwb3J0cy5jcmVhdGVFcnJvclJlc3BvbnNlUGF5bG9hZChzdGF0dXMsIG1lc3NhZ2UpKTtcbiAgfSxcbiAgcmV0dXJuRXJyb3JNZXNzYWdlQW5kU3RhdHVzOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBsZXQgc3RhdHVzLCBtZXNzYWdlO1xuICAgIC8vIGNoZWNrIGZvciBkYWVtb24gYmVpbmcgdHVybmVkIG9mZlxuICAgIGlmIChlcnJvci5jb2RlID09PSAnRUNPTk5SRUZVU0VEJykge1xuICAgICAgc3RhdHVzID0gNTAzO1xuICAgICAgbWVzc2FnZSA9ICdDb25uZWN0aW9uIHJlZnVzZWQuICBUaGUgZGFlbW9uIG1heSBub3QgYmUgcnVubmluZy4nO1xuICAgICAgLy8gZmFsbGJhY2sgZm9yIGV2ZXJ5dGhpbmcgZWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXMgPSA0MDA7XG4gICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gW3N0YXR1cywgbWVzc2FnZV07XG4gIH0sXG4gIHVzZU9iamVjdFByb3BlcnRpZXNJZk5vS2V5czogZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChPYmplY3Qua2V5cyhlcnIpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbGV0IG5ld0Vycm9yT2JqZWN0ID0ge307XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnIpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBuZXdFcnJvck9iamVjdFtrZXldID0gZXJyW2tleV07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXdFcnJvck9iamVjdDtcbiAgICB9XG4gICAgcmV0dXJuIGVycjtcbiAgfSxcbiAgY3JlYXRlRXJyb3JSZXNwb25zZVBheWxvYWQgKHN0YXR1cywgbWVzc2FnZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXMsXG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgfTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9oZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMiLCJjb25zdCBkYiA9IHJlcXVpcmUoJy4uL21vZGVscycpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyByZXR1cm5QYWdpbmF0ZWRDaGFubmVsQ2xhaW1zIH0gPSByZXF1aXJlKCcuLi9oZWxwZXJzL2NoYW5uZWxQYWdpbmF0aW9uLmpzJyk7XG5cbmNvbnN0IE5PX0NIQU5ORUwgPSAnTk9fQ0hBTk5FTCc7XG5jb25zdCBOT19DTEFJTSA9ICdOT19DTEFJTSc7XG5jb25zdCBOT19GSUxFID0gJ05PX0ZJTEUnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q2xhaW1JZCAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBuYW1lLCBjbGFpbUlkKSB7XG4gICAgaWYgKGNoYW5uZWxOYW1lKSB7XG4gICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHMuZ2V0Q2xhaW1JZEJ5Q2hhbm5lbChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHMuZ2V0Q2xhaW1JZEJ5Q2xhaW0obmFtZSwgY2xhaW1JZCk7XG4gICAgfVxuICB9LFxuICBnZXRDbGFpbUlkQnlDbGFpbSAoY2xhaW1OYW1lLCBjbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRDbGFpbUlkQnlDbGFpbSgke2NsYWltTmFtZX0sICR7Y2xhaW1JZH0pYCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRiLkNsYWltLmdldExvbmdDbGFpbUlkKGNsYWltTmFtZSwgY2xhaW1JZClcbiAgICAgICAgLnRoZW4obG9uZ0NsYWltSWQgPT4ge1xuICAgICAgICAgIGlmICghbG9uZ0NsYWltSWQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoTk9fQ0xBSU0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGxvbmdDbGFpbUlkKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0Q2xhaW1JZEJ5Q2hhbm5lbCAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbU5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYGdldENsYWltSWRCeUNoYW5uZWwoJHtjaGFubmVsTmFtZX0sICR7Y2hhbm5lbENsYWltSWR9LCAke2NsYWltTmFtZX0pYCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRiLkNlcnRpZmljYXRlLmdldExvbmdDaGFubmVsSWQoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkKSAvLyAxLiBnZXQgdGhlIGxvbmcgY2hhbm5lbCBpZFxuICAgICAgICAudGhlbihsb25nQ2hhbm5lbElkID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbbG9uZ0NoYW5uZWxJZCwgZGIuQ2xhaW0uZ2V0Q2xhaW1JZEJ5TG9uZ0NoYW5uZWxJZChsb25nQ2hhbm5lbElkLCBjbGFpbU5hbWUpXSk7ICAvLyAyLiBnZXQgdGhlIGxvbmcgY2xhaW0gaWRcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKFtsb25nQ2hhbm5lbElkLCBsb25nQ2xhaW1JZF0pID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsSWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKE5PX0NIQU5ORUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWxvbmdDbGFpbUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShOT19DTEFJTSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUobG9uZ0NsYWltSWQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXRDaGFubmVsRGF0YSAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBwYWdlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIDEuIGdldCB0aGUgbG9uZyBjaGFubmVsIElkIChtYWtlIHN1cmUgY2hhbm5lbCBleGlzdHMpXG4gICAgICBkYi5DZXJ0aWZpY2F0ZS5nZXRMb25nQ2hhbm5lbElkKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZClcbiAgICAgICAgLnRoZW4obG9uZ0NoYW5uZWxDbGFpbUlkID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsQ2xhaW1JZCkge1xuICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsLCBudWxsXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gMi4gZ2V0IHRoZSBzaG9ydCBJRCBhbmQgYWxsIGNsYWltcyBmb3IgdGhhdCBjaGFubmVsXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtsb25nQ2hhbm5lbENsYWltSWQsIGRiLkNlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQobG9uZ0NoYW5uZWxDbGFpbUlkLCBjaGFubmVsTmFtZSldKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKFtsb25nQ2hhbm5lbENsYWltSWQsIHNob3J0Q2hhbm5lbENsYWltSWRdKSA9PiB7XG4gICAgICAgICAgaWYgKCFsb25nQ2hhbm5lbENsYWltSWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKE5PX0NIQU5ORUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyAzLiByZXR1cm4gYWxsIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uXG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBjaGFubmVsTmFtZSxcbiAgICAgICAgICAgIGxvbmdDaGFubmVsQ2xhaW1JZCxcbiAgICAgICAgICAgIHNob3J0Q2hhbm5lbENsYWltSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldENoYW5uZWxDbGFpbXMgKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgcGFnZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyAxLiBnZXQgdGhlIGxvbmcgY2hhbm5lbCBJZCAobWFrZSBzdXJlIGNoYW5uZWwgZXhpc3RzKVxuICAgICAgZGIuQ2VydGlmaWNhdGUuZ2V0TG9uZ0NoYW5uZWxJZChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpXG4gICAgICAgIC50aGVuKGxvbmdDaGFubmVsQ2xhaW1JZCA9PiB7XG4gICAgICAgICAgaWYgKCFsb25nQ2hhbm5lbENsYWltSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbCwgbnVsbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIDIuIGdldCB0aGUgc2hvcnQgSUQgYW5kIGFsbCBjbGFpbXMgZm9yIHRoYXQgY2hhbm5lbFxuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbbG9uZ0NoYW5uZWxDbGFpbUlkLCBkYi5DbGFpbS5nZXRBbGxDaGFubmVsQ2xhaW1zKGxvbmdDaGFubmVsQ2xhaW1JZCldKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKFtsb25nQ2hhbm5lbENsYWltSWQsIGNoYW5uZWxDbGFpbXNBcnJheV0pID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsQ2xhaW1JZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoTk9fQ0hBTk5FTCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIDMuIGZvcm1hdCB0aGUgZGF0YSBmb3IgdGhlIHZpZXcsIGluY2x1ZGluZyBwYWdpbmF0aW9uXG4gICAgICAgICAgbGV0IHBhZ2luYXRlZENoYW5uZWxWaWV3RGF0YSA9IHJldHVyblBhZ2luYXRlZENoYW5uZWxDbGFpbXMoY2hhbm5lbE5hbWUsIGxvbmdDaGFubmVsQ2xhaW1JZCwgY2hhbm5lbENsYWltc0FycmF5LCBwYWdlKTtcbiAgICAgICAgICAvLyA0LiByZXR1cm4gYWxsIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uIGFuZCBjb250ZW50c1xuICAgICAgICAgIHJlc29sdmUocGFnaW5hdGVkQ2hhbm5lbFZpZXdEYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0TG9jYWxGaWxlUmVjb3JkIChjbGFpbUlkLCBuYW1lKSB7XG4gICAgcmV0dXJuIGRiLkZpbGUuZmluZE9uZSh7d2hlcmU6IHtjbGFpbUlkLCBuYW1lfX0pXG4gICAgICAudGhlbihmaWxlID0+IHtcbiAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgcmV0dXJuIE5PX0ZJTEU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGUuZGF0YVZhbHVlcztcbiAgICAgIH0pO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvbnRyb2xsZXJzL3NlcnZlQ29udHJvbGxlci5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXJUb1N0cmluZyB9IGZyb20gJ3JlYWN0LWRvbS9zZXJ2ZXInO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgUmVkdWNlciBmcm9tICcuLi9yZWFjdC9yZWR1Y2Vycyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IFN0YXRpY1JvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IEdBTGlzdGVuZXIgZnJvbSAnLi4vcmVhY3QvY29tcG9uZW50cy9HQUxpc3RlbmVyJztcbmltcG9ydCBBcHAgZnJvbSAnLi4vcmVhY3QvYXBwJztcbmltcG9ydCByZW5kZXJGdWxsUGFnZSBmcm9tICcuL3JlbmRlckZ1bGxQYWdlLmpzJztcbmltcG9ydCBIZWxtZXQgZnJvbSAncmVhY3QtaGVsbWV0JztcblxubW9kdWxlLmV4cG9ydHMgPSAocmVxLCByZXMpID0+IHtcbiAgbGV0IGNvbnRleHQgPSB7fTtcblxuICAvLyBjcmVhdGUgYSBuZXcgUmVkdXggc3RvcmUgaW5zdGFuY2VcbiAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShSZWR1Y2VyKTtcblxuICAvLyByZW5kZXIgY29tcG9uZW50IHRvIGEgc3RyaW5nXG4gIGNvbnN0IGh0bWwgPSByZW5kZXJUb1N0cmluZyhcbiAgICA8UHJvdmlkZXIgc3RvcmU9e3N0b3JlfT5cbiAgICAgIDxTdGF0aWNSb3V0ZXIgbG9jYXRpb249e3JlcS51cmx9IGNvbnRleHQ9e2NvbnRleHR9PlxuICAgICAgICA8R0FMaXN0ZW5lcj5cbiAgICAgICAgICA8QXBwIC8+XG4gICAgICAgIDwvR0FMaXN0ZW5lcj5cbiAgICAgIDwvU3RhdGljUm91dGVyPlxuICAgIDwvUHJvdmlkZXI+XG4gICk7XG5cbiAgLy8gZ2V0IGhlYWQgdGFncyBmcm9tIGhlbG1ldFxuICBjb25zdCBoZWxtZXQgPSBIZWxtZXQucmVuZGVyU3RhdGljKCk7XG5cbiAgLy8gY2hlY2sgZm9yIGEgcmVkaXJlY3RcbiAgaWYgKGNvbnRleHQudXJsKSB7XG4gICAgLy8gU29tZXdoZXJlIGEgYDxSZWRpcmVjdD5gIHdhcyByZW5kZXJlZFxuICAgIHJldHVybiByZXMucmVkaXJlY3QoMzAxLCBjb250ZXh0LnVybCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gd2UncmUgZ29vZCwgc2VuZCB0aGUgcmVzcG9uc2VcbiAgfVxuXG4gIC8vIGdldCB0aGUgaW5pdGlhbCBzdGF0ZSBmcm9tIG91ciBSZWR1eCBzdG9yZVxuICBjb25zdCBwcmVsb2FkZWRTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG5cbiAgLy8gc2VuZCB0aGUgcmVuZGVyZWQgcGFnZSBiYWNrIHRvIHRoZSBjbGllbnRcbiAgcmVzLnNlbmQocmVuZGVyRnVsbFBhZ2UoaGVsbWV0LCBodG1sLCBwcmVsb2FkZWRTdGF0ZSkpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2hlbHBlcnMvaGFuZGxlUGFnZVJlbmRlci5qc3giLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1kb20vc2VydmVyXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicmVhY3QtZG9tL3NlcnZlclwiXG4vLyBtb2R1bGUgaWQgPSAzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgUHVibGlzaFJlZHVjZXIgZnJvbSAncmVkdWNlcnMvcHVibGlzaCc7XG5pbXBvcnQgQ2hhbm5lbFJlZHVjZXIgZnJvbSAncmVkdWNlcnMvY2hhbm5lbCc7XG5pbXBvcnQgU2hvd1JlZHVjZXIgZnJvbSAncmVkdWNlcnMvc2hvdyc7XG5pbXBvcnQgU2l0ZVJlZHVjZXIgZnJvbSAncmVkdWNlcnMvc2l0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbWJpbmVSZWR1Y2Vycyh7XG4gIGNoYW5uZWw6IENoYW5uZWxSZWR1Y2VyLFxuICBwdWJsaXNoOiBQdWJsaXNoUmVkdWNlcixcbiAgc2hvdyAgIDogU2hvd1JlZHVjZXIsXG4gIHNpdGUgICA6IFNpdGVSZWR1Y2VyLFxufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9yZWR1Y2Vycy9pbmRleC5qcyIsImV4cG9ydCBjb25zdCBGSUxFX1NFTEVDVEVEID0gJ0ZJTEVfU0VMRUNURUQnO1xuZXhwb3J0IGNvbnN0IEZJTEVfQ0xFQVIgPSAnRklMRV9DTEVBUic7XG5leHBvcnQgY29uc3QgTUVUQURBVEFfVVBEQVRFID0gJ01FVEFEQVRBX1VQREFURSc7XG5leHBvcnQgY29uc3QgQ0xBSU1fVVBEQVRFID0gJ0NMQUlNX1VQREFURSc7XG5leHBvcnQgY29uc3QgU0VUX1BVQkxJU0hfSU5fQ0hBTk5FTCA9ICdTRVRfUFVCTElTSF9JTl9DSEFOTkVMJztcbmV4cG9ydCBjb25zdCBQVUJMSVNIX1NUQVRVU19VUERBVEUgPSAnUFVCTElTSF9TVEFUVVNfVVBEQVRFJztcbmV4cG9ydCBjb25zdCBFUlJPUl9VUERBVEUgPSAnRVJST1JfVVBEQVRFJztcbmV4cG9ydCBjb25zdCBTRUxFQ1RFRF9DSEFOTkVMX1VQREFURSA9ICdTRUxFQ1RFRF9DSEFOTkVMX1VQREFURSc7XG5leHBvcnQgY29uc3QgVE9HR0xFX01FVEFEQVRBX0lOUFVUUyA9ICdUT0dHTEVfTUVUQURBVEFfSU5QVVRTJztcbmV4cG9ydCBjb25zdCBUSFVNQk5BSUxfTkVXID0gJ1RIVU1CTkFJTF9ORVcnO1xuZXhwb3J0IGNvbnN0IFBVQkxJU0hfU1RBUlQgPSAnUFVCTElTSF9TVEFSVCc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb25zdGFudHMvcHVibGlzaF9hY3Rpb25fdHlwZXMuanMiLCJleHBvcnQgY29uc3QgTE9HSU4gPSAnRXhpc3RpbmcnO1xuZXhwb3J0IGNvbnN0IENSRUFURSA9ICdOZXcnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29uc3RhbnRzL3B1Ymxpc2hfY2hhbm5lbF9zZWxlY3Rfc3RhdGVzLmpzIiwiZXhwb3J0IGNvbnN0IENIQU5ORUxfVVBEQVRFID0gJ0NIQU5ORUxfVVBEQVRFJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnN0YW50cy9jaGFubmVsX2FjdGlvbl90eXBlcy5qcyIsImV4cG9ydCBjb25zdCBMT0NBTF9DSEVDSyA9ICdMT0NBTF9DSEVDSyc7XG5leHBvcnQgY29uc3QgVU5BVkFJTEFCTEUgPSAnVU5BVkFJTEFCTEUnO1xuZXhwb3J0IGNvbnN0IEVSUk9SID0gJ0VSUk9SJztcbmV4cG9ydCBjb25zdCBBVkFJTEFCTEUgPSAnQVZBSUxBQkxFJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnN0YW50cy9hc3NldF9kaXNwbGF5X3N0YXRlcy5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgR29vZ2xlQW5hbHl0aWNzIGZyb20gJ3JlYWN0LWdhJztcbmltcG9ydCB7IHdpdGhSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmNvbnN0IHthbmFseXRpY3M6IGdvb2dsZUlkfSA9IHJlcXVpcmUoJy4uLy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5cbkdvb2dsZUFuYWx5dGljcy5pbml0aWFsaXplKGdvb2dsZUlkKTtcblxuY2xhc3MgR0FMaXN0ZW5lciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLnNlbmRQYWdlVmlldyh0aGlzLnByb3BzLmhpc3RvcnkubG9jYXRpb24pO1xuICAgIHRoaXMucHJvcHMuaGlzdG9yeS5saXN0ZW4odGhpcy5zZW5kUGFnZVZpZXcpO1xuICB9XG5cbiAgc2VuZFBhZ2VWaWV3IChsb2NhdGlvbikge1xuICAgIEdvb2dsZUFuYWx5dGljcy5zZXQoeyBwYWdlOiBsb2NhdGlvbi5wYXRobmFtZSB9KTtcbiAgICBHb29nbGVBbmFseXRpY3MucGFnZXZpZXcobG9jYXRpb24ucGF0aG5hbWUpO1xuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoUm91dGVyKEdBTGlzdGVuZXIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29tcG9uZW50cy9HQUxpc3RlbmVyL2luZGV4LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSb3V0ZSwgU3dpdGNoIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgSG9tZVBhZ2UgZnJvbSAnY29tcG9uZW50cy9Ib21lUGFnZSc7XG5pbXBvcnQgQWJvdXRQYWdlIGZyb20gJ2NvbXBvbmVudHMvQWJvdXRQYWdlJztcbmltcG9ydCBMb2dpblBhZ2UgZnJvbSAnY29udGFpbmVycy9Mb2dpblBhZ2UnO1xuaW1wb3J0IFNob3dQYWdlIGZyb20gJ2NvbnRhaW5lcnMvU2hvd1BhZ2UnO1xuaW1wb3J0IEZvdXJPaEZvdXJQYWdlIGZyb20gJ2NvbXBvbmVudHMvRm91ck9oRm91clBhZ2UnO1xuXG5jb25zdCBBcHAgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPFN3aXRjaD5cbiAgICAgIDxSb3V0ZSBleGFjdCBwYXRoPScvJyBjb21wb25lbnQ9e0hvbWVQYWdlfSAvPlxuICAgICAgPFJvdXRlIGV4YWN0IHBhdGg9Jy9hYm91dCcgY29tcG9uZW50PXtBYm91dFBhZ2V9IC8+XG4gICAgICA8Um91dGUgZXhhY3QgcGF0aD0nL2xvZ2luJyBjb21wb25lbnQ9e0xvZ2luUGFnZX0gLz5cbiAgICAgIDxSb3V0ZSBleGFjdCBwYXRoPScvOmlkZW50aWZpZXIvOmNsYWltJyBjb21wb25lbnQ9e1Nob3dQYWdlfSAvPlxuICAgICAgPFJvdXRlIGV4YWN0IHBhdGg9Jy86Y2xhaW0nIGNvbXBvbmVudD17U2hvd1BhZ2V9IC8+XG4gICAgICA8Um91dGUgY29tcG9uZW50PXtGb3VyT2hGb3VyUGFnZX0gLz5cbiAgICA8L1N3aXRjaD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2FwcC5qcyIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBzZWxlY3RGaWxlLCB1cGRhdGVFcnJvciwgY2xlYXJGaWxlIH0gZnJvbSAnYWN0aW9ucy9wdWJsaXNoJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHB1Ymxpc2ggfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGZpbGUgICAgIDogcHVibGlzaC5maWxlLFxuICAgIHRodW1ibmFpbDogcHVibGlzaC50aHVtYm5haWwsXG4gICAgZmlsZUVycm9yOiBwdWJsaXNoLmVycm9yLmZpbGUsXG4gIH07XG59O1xuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSBkaXNwYXRjaCA9PiB7XG4gIHJldHVybiB7XG4gICAgc2VsZWN0RmlsZTogKGZpbGUpID0+IHtcbiAgICAgIGRpc3BhdGNoKHNlbGVjdEZpbGUoZmlsZSkpO1xuICAgIH0sXG4gICAgc2V0RmlsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGRpc3BhdGNoKGNsZWFyRmlsZSgpKTtcbiAgICAgIGRpc3BhdGNoKHVwZGF0ZUVycm9yKCdmaWxlJywgdmFsdWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL0Ryb3B6b25lL2luZGV4LmpzIiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IHVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCB9IGZyb20gJ2FjdGlvbnMvY2hhbm5lbCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHt1cGRhdGVTZWxlY3RlZENoYW5uZWx9IGZyb20gJy4uLy4uL2FjdGlvbnMvcHVibGlzaCc7XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkNoYW5uZWxMb2dpbjogKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTG9nZ2VkSW5DaGFubmVsKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkpO1xuICAgICAgZGlzcGF0Y2godXBkYXRlU2VsZWN0ZWRDaGFubmVsKG5hbWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChudWxsLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtL2luZGV4LmpzIiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IHVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCB9IGZyb20gJ2FjdGlvbnMvY2hhbm5lbCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHt1cGRhdGVTZWxlY3RlZENoYW5uZWx9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkNoYW5uZWxMb2dpbjogKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTG9nZ2VkSW5DaGFubmVsKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkpO1xuICAgICAgZGlzcGF0Y2godXBkYXRlU2VsZWN0ZWRDaGFubmVsKG5hbWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChudWxsLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9DaGFubmVsQ3JlYXRlRm9ybS9pbmRleC5qcyIsImV4cG9ydCBjb25zdCBDSEFOTkVMID0gJ0NIQU5ORUwnO1xuZXhwb3J0IGNvbnN0IEFTU0VUX0xJVEUgPSAnQVNTRVRfTElURSc7XG5leHBvcnQgY29uc3QgQVNTRVRfREVUQUlMUyA9ICdBU1NFVF9ERVRBSUxTJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnN0YW50cy9zaG93X3JlcXVlc3RfdHlwZXMuanMiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCB7IGZpbGVSZXF1ZXN0ZWQgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IHsgc2VsZWN0QXNzZXQgfSBmcm9tICdzZWxlY3RvcnMvc2hvdyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICAvLyBzZWxlY3QgZXJyb3IgYW5kIHN0YXR1c1xuICBjb25zdCBlcnJvciAgPSBzaG93LmRpc3BsYXlBc3NldC5lcnJvcjtcbiAgY29uc3Qgc3RhdHVzID0gc2hvdy5kaXNwbGF5QXNzZXQuc3RhdHVzO1xuICAvLyBzZWxlY3QgYXNzZXRcbiAgY29uc3QgYXNzZXQgPSBzZWxlY3RBc3NldChzaG93KTtcbiAgLy8gIHJldHVybiBwcm9wc1xuICByZXR1cm4ge1xuICAgIGVycm9yLFxuICAgIHN0YXR1cyxcbiAgICBhc3NldCxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkZpbGVSZXF1ZXN0OiAobmFtZSwgY2xhaW1JZCkgPT4ge1xuICAgICAgZGlzcGF0Y2goZmlsZVJlcXVlc3RlZChuYW1lLCBjbGFpbUlkKSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9Bc3NldERpc3BsYXkvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IChoZWxtZXQsIGh0bWwsIHByZWxvYWRlZFN0YXRlKSA9PiB7XG4gIC8vIHRha2UgdGhlIGh0bWwgYW5kIHByZWxvYWRlZFN0YXRlIGFuZCByZXR1cm4gdGhlIGZ1bGwgcGFnZVxuICByZXR1cm4gYFxuICAgIDwhRE9DVFlQRSBodG1sPlxuICAgIDxodG1sIGxhbmc9XCJlblwiIHByZWZpeD1cIm9nOiBodHRwOi8vb2dwLm1lL25zIyBmYjogaHR0cDovL29ncC5tZS9ucy9mYiNcIj5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgICAgICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEsIHVzZXItc2NhbGFibGU9bm9cIj5cbiAgICAgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9XCJYLVVBLUNvbXBhdGlibGVcIiBjb250ZW50PVwiaWU9ZWRnZVwiPlxuICAgICAgICAgICAgPCEtLWhlbG1ldC0tPlxuICAgICAgICAgICAgJHtoZWxtZXQudGl0bGUudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICR7aGVsbWV0Lm1ldGEudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICR7aGVsbWV0LmxpbmsudG9TdHJpbmcoKX1cbiAgICAgICAgICAgIDwhLS1zdHlsZSBzaGVldHMtLT5cbiAgICAgICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiL2Fzc2V0cy9jc3MvcmVzZXQuY3NzXCIgdHlwZT1cInRleHQvY3NzXCI+XG4gICAgICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi9hc3NldHMvY3NzL2dlbmVyYWwuY3NzXCIgdHlwZT1cInRleHQvY3NzXCI+XG4gICAgICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi9hc3NldHMvY3NzL21lZGlhUXVlcmllcy5jc3NcIiB0eXBlPVwidGV4dC9jc3NcIj5cbiAgICAgICAgICAgIDwhLS1nb29nbGUgZm9udC0tPlxuICAgICAgICAgICAgPGxpbmsgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86MzAwXCIgcmVsPVwic3R5bGVzaGVldFwiPlxuICAgICAgICA8L2hlYWQ+XG4gICAgICAgIDxib2R5IGlkPVwibWFpbi1ib2R5XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInJlYWN0LWFwcFwiIGNsYXNzPVwicm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uXCI+JHtodG1sfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICAgICAgIHdpbmRvdy5fX1BSRUxPQURFRF9TVEFURV9fID0gJHtKU09OLnN0cmluZ2lmeShwcmVsb2FkZWRTdGF0ZSkucmVwbGFjZSgvPC9nLCAnXFxcXFxcdTAwM2MnKX1cbiAgICAgICAgICAgIDwvc2NyaXB0PlxuICAgICAgICAgICAgPHNjcmlwdCBzcmM9XCIvYnVuZGxlL2J1bmRsZS5qc1wiPjwvc2NyaXB0PlxuICAgICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICBgO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2hlbHBlcnMvcmVuZGVyRnVsbFBhZ2UuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJiYWJlbC1wb2x5ZmlsbFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImJhYmVsLXBvbHlmaWxsXCJcbi8vIG1vZHVsZSBpZCA9IDQ3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndoYXR3Zy1mZXRjaFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIndoYXR3Zy1mZXRjaFwiXG4vLyBtb2R1bGUgaWQgPSA0OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBhcHAgZGVwZW5kZW5jaWVzXG5jb25zdCBleHByZXNzID0gcmVxdWlyZSgnZXhwcmVzcycpO1xuY29uc3QgYm9keVBhcnNlciA9IHJlcXVpcmUoJ2JvZHktcGFyc2VyJyk7XG5jb25zdCBleHByZXNzSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2V4cHJlc3MtaGFuZGxlYmFycycpO1xuY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcbmNvbnN0IGhlbG1ldCA9IHJlcXVpcmUoJ2hlbG1ldCcpO1xuY29uc3QgcGFzc3BvcnQgPSByZXF1aXJlKCdwYXNzcG9ydCcpO1xuY29uc3QgeyBwb3B1bGF0ZUxvY2Fsc0RvdFVzZXIsIHNlcmlhbGl6ZVNwZWVjaFVzZXIsIGRlc2VyaWFsaXplU3BlZWNoVXNlciB9ID0gcmVxdWlyZSgnLi9oZWxwZXJzL2F1dGhIZWxwZXJzLmpzJyk7XG5jb25zdCBjb29raWVTZXNzaW9uID0gcmVxdWlyZSgnY29va2llLXNlc3Npb24nKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG4vLyBsb2dnaW5nIGRlcGVuZGVuY2llc1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuXG5mdW5jdGlvbiBTcGVlY2hTZXJ2ZXIgKHsgbXlzcWxDb25maWcsIHNpdGVDb25maWcsIHNsYWNrQ29uZmlnIH0pIHtcbiAgdGhpcy5QT1JUID0gMzAwMDtcbiAgdGhpcy5zdGFydCA9ICgpID0+IHtcbiAgICB0aGlzLmNvbmZpZ3VyZUNvbmZpZ0ZpbGVzKCk7XG4gICAgdGhpcy5jb25maWd1cmVMb2dnaW5nKCk7XG4gICAgdGhpcy5jb25maWd1cmVBcHAoKTtcbiAgICB0aGlzLmNvbmZpZ3VyZVNlcnZlcigpO1xuICAgIHRoaXMuc3RhcnRTZXJ2ZXIoKTtcbiAgfTtcbiAgdGhpcy5jb25maWd1cmVDb25maWdGaWxlcyA9ICgpID0+IHtcbiAgICBjb25zdCBteXNxbEFwcENvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnL215c3FsQ29uZmlnLmpzJyk7XG4gICAgbXlzcWxBcHBDb25maWcuY29uZmlndXJlKG15c3FsQ29uZmlnKTtcbiAgICBjb25zdCBzaXRlQXBwQ29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuICAgIHNpdGVBcHBDb25maWcuY29uZmlndXJlKHNpdGVDb25maWcpO1xuICAgIGNvbnN0IHNsYWNrQXBwQ29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcvc2xhY2tDb25maWcuanMnKTtcbiAgICBzbGFja0FwcENvbmZpZy5jb25maWd1cmUoc2xhY2tDb25maWcpO1xuICB9O1xuICB0aGlzLmNvbmZpZ3VyZUxvZ2dpbmcgPSAoKSA9PiB7XG4gICAgcmVxdWlyZSgnLi9oZWxwZXJzL2NvbmZpZ3VyZUxvZ2dlci5qcycpKGxvZ2dlcik7XG4gICAgcmVxdWlyZSgnLi9oZWxwZXJzL2NvbmZpZ3VyZVNsYWNrLmpzJykobG9nZ2VyKTtcbiAgfTtcbiAgdGhpcy5jb25maWd1cmVBcHAgPSAoKSA9PiB7XG4gICAgY29uc3QgYXBwID0gZXhwcmVzcygpOyAvLyBjcmVhdGUgYW4gRXhwcmVzcyBhcHBsaWNhdGlvblxuXG4gICAgLy8gdHJ1c3QgdGhlIHByb3h5IHRvIGdldCBpcCBhZGRyZXNzIGZvciB1c1xuICAgIGFwcC5lbmFibGUoJ3RydXN0IHByb3h5Jyk7XG5cbiAgICAvLyBhZGQgbWlkZGxld2FyZVxuICAgIGFwcC51c2UoaGVsbWV0KCkpOyAvLyBzZXQgSFRUUCBoZWFkZXJzIHRvIHByb3RlY3QgYWdhaW5zdCB3ZWxsLWtub3duIHdlYiB2dWxuZXJhYmlsdGllc1xuICAgIGFwcC51c2UoZXhwcmVzcy5zdGF0aWMoYCR7X19kaXJuYW1lfS9wdWJsaWNgKSk7IC8vICdleHByZXNzLnN0YXRpYycgdG8gc2VydmUgc3RhdGljIGZpbGVzIGZyb20gcHVibGljIGRpcmVjdG9yeVxuICAgIGFwcC51c2UoYm9keVBhcnNlci5qc29uKCkpOyAvLyAnYm9keSBwYXJzZXInIGZvciBwYXJzaW5nIGFwcGxpY2F0aW9uL2pzb25cbiAgICBhcHAudXNlKGJvZHlQYXJzZXIudXJsZW5jb2RlZCh7IGV4dGVuZGVkOiB0cnVlIH0pKTsgLy8gJ2JvZHkgcGFyc2VyJyBmb3IgcGFyc2luZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcbiAgICBhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4geyAgLy8gY3VzdG9tIGxvZ2dpbmcgbWlkZGxld2FyZSB0byBsb2cgYWxsIGluY29taW5nIGh0dHAgcmVxdWVzdHNcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXF1ZXN0IG9uICR7cmVxLm9yaWdpbmFsVXJsfSBmcm9tICR7cmVxLmlwfWApO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuXG4gICAgLy8gY29uZmlndXJlIHBhc3Nwb3J0XG4gICAgcGFzc3BvcnQuc2VyaWFsaXplVXNlcihzZXJpYWxpemVTcGVlY2hVc2VyKTtcbiAgICBwYXNzcG9ydC5kZXNlcmlhbGl6ZVVzZXIoZGVzZXJpYWxpemVTcGVlY2hVc2VyKTtcbiAgICBjb25zdCBsb2NhbFNpZ251cFN0cmF0ZWd5ID0gcmVxdWlyZSgnLi9wYXNzcG9ydC9sb2NhbC1zaWdudXAuanMnKTtcbiAgICBjb25zdCBsb2NhbExvZ2luU3RyYXRlZ3kgPSByZXF1aXJlKCcuL3Bhc3Nwb3J0L2xvY2FsLWxvZ2luLmpzJyk7XG4gICAgcGFzc3BvcnQudXNlKCdsb2NhbC1zaWdudXAnLCBsb2NhbFNpZ251cFN0cmF0ZWd5KTtcbiAgICBwYXNzcG9ydC51c2UoJ2xvY2FsLWxvZ2luJywgbG9jYWxMb2dpblN0cmF0ZWd5KTtcbiAgICAvLyBpbml0aWFsaXplIHBhc3Nwb3J0XG4gICAgYXBwLnVzZShjb29raWVTZXNzaW9uKHtcbiAgICAgIG5hbWUgIDogJ3Nlc3Npb24nLFxuICAgICAga2V5cyAgOiBbc2l0ZUNvbmZpZy5hdXRoLnNlc3Npb25LZXldLFxuICAgICAgbWF4QWdlOiAyNCAqIDYwICogNjAgKiAxMDAwLCAvLyBpLmUuIDI0IGhvdXJzXG4gICAgfSkpO1xuICAgIGFwcC51c2UocGFzc3BvcnQuaW5pdGlhbGl6ZSgpKTtcbiAgICBhcHAudXNlKHBhc3Nwb3J0LnNlc3Npb24oKSk7XG5cbiAgICAvLyBjb25maWd1cmUgaGFuZGxlYmFycyAmIHJlZ2lzdGVyIGl0IHdpdGggZXhwcmVzcyBhcHBcbiAgICBjb25zdCBoYnMgPSBleHByZXNzSGFuZGxlYmFycy5jcmVhdGUoe1xuICAgICAgZGVmYXVsdExheW91dDogJ2VtYmVkJyxcbiAgICAgIGhhbmRsZWJhcnMgICA6IEhhbmRsZWJhcnMsXG4gICAgfSk7XG4gICAgYXBwLmVuZ2luZSgnaGFuZGxlYmFycycsIGhicy5lbmdpbmUpO1xuICAgIGFwcC5zZXQoJ3ZpZXcgZW5naW5lJywgJ2hhbmRsZWJhcnMnKTtcblxuICAgIC8vIG1pZGRsZXdhcmUgdG8gcGFzcyB1c2VyIGluZm8gYmFjayB0byBjbGllbnQgKGZvciBoYW5kbGViYXJzIGFjY2VzcyksIGlmIHVzZXIgaXMgbG9nZ2VkIGluXG4gICAgYXBwLnVzZShwb3B1bGF0ZUxvY2Fsc0RvdFVzZXIpOyAgLy8gbm90ZTogSSBkb24ndCB0aGluayBJIG5lZWQgdGhpcyBhbnkgbW9yZT9cblxuICAgIC8vIHNldCB0aGUgcm91dGVzIG9uIHRoZSBhcHBcbiAgICByZXF1aXJlKCcuL3JvdXRlcy9hdXRoLXJvdXRlcy5qcycpKGFwcCk7XG4gICAgcmVxdWlyZSgnLi9yb3V0ZXMvYXBpLXJvdXRlcy5qcycpKGFwcCk7XG4gICAgcmVxdWlyZSgnLi9yb3V0ZXMvcGFnZS1yb3V0ZXMuanMnKShhcHApO1xuICAgIHJlcXVpcmUoJy4vcm91dGVzL3NlcnZlLXJvdXRlcy5qcycpKGFwcCk7XG4gICAgcmVxdWlyZSgnLi9yb3V0ZXMvZmFsbGJhY2stcm91dGVzLmpzJykoYXBwKTtcblxuICAgIHRoaXMuYXBwID0gYXBwO1xuICB9O1xuICB0aGlzLmNvbmZpZ3VyZVNlcnZlciA9ICgpID0+IHtcbiAgICB0aGlzLnNlcnZlciA9IGh0dHAuU2VydmVyKHRoaXMuYXBwKTtcbiAgfTtcbiAgdGhpcy5zdGFydFNlcnZlciA9ICgpID0+IHtcbiAgICBjb25zdCBkYiA9IHJlcXVpcmUoJy4vbW9kZWxzJyk7XG4gICAgLy8gc3luYyBzZXF1ZWxpemVcbiAgICBkYi5zZXF1ZWxpemUuc3luYygpXG4gICAgICAvLyBzdGFydCB0aGUgc2VydmVyXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VydmVyLmxpc3Rlbih0aGlzLlBPUlQsICgpID0+IHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgU2VydmVyIGlzIGxpc3RlbmluZyBvbiBQT1JUICR7dGhpcy5QT1JUfWApO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgU3RhcnR1cCBFcnJvcjpgLCBlcnJvcik7XG4gICAgICB9KTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU3BlZWNoU2VydmVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXhwcmVzc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImV4cHJlc3NcIlxuLy8gbW9kdWxlIGlkID0gNTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm9keS1wYXJzZXJcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJib2R5LXBhcnNlclwiXG4vLyBtb2R1bGUgaWQgPSA1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJleHByZXNzLWhhbmRsZWJhcnNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJleHByZXNzLWhhbmRsZWJhcnNcIlxuLy8gbW9kdWxlIGlkID0gNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaGFuZGxlYmFyc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImhhbmRsZWJhcnNcIlxuLy8gbW9kdWxlIGlkID0gNTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaGVsbWV0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiaGVsbWV0XCJcbi8vIG1vZHVsZSBpZCA9IDU0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBvcHVsYXRlTG9jYWxzRG90VXNlciAocmVxLCByZXMsIG5leHQpIHtcbiAgICBpZiAocmVxLnVzZXIpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygncG9wdWxhdGluZyByZXMubG9jYWxzLnVzZXInKTtcbiAgICAgIHJlcy5sb2NhbHMudXNlciA9IHtcbiAgICAgICAgaWQgICAgICAgICAgICA6IHJlcS51c2VyLmlkLFxuICAgICAgICB1c2VyTmFtZSAgICAgIDogcmVxLnVzZXIudXNlck5hbWUsXG4gICAgICAgIGNoYW5uZWxOYW1lICAgOiByZXEudXNlci5jaGFubmVsTmFtZSxcbiAgICAgICAgY2hhbm5lbENsYWltSWQ6IHJlcS51c2VyLmNoYW5uZWxDbGFpbUlkLFxuICAgICAgICBzaG9ydENoYW5uZWxJZDogcmVxLnVzZXIuc2hvcnRDaGFubmVsSWQsXG4gICAgICB9O1xuICAgIH1cbiAgICBuZXh0KCk7XG4gIH0sXG4gIHNlcmlhbGl6ZVNwZWVjaFVzZXIgKHVzZXIsIGRvbmUpIHsgIC8vIHJldHVybnMgdXNlciBkYXRhIHRvIGJlIHNlcmlhbGl6ZWQgaW50byBzZXNzaW9uXG4gICAgbG9nZ2VyLmRlYnVnKCdzZXJpYWxpemluZyB1c2VyJyk7XG4gICAgZG9uZShudWxsLCB1c2VyKTtcbiAgfSxcbiAgZGVzZXJpYWxpemVTcGVlY2hVc2VyICh1c2VyLCBkb25lKSB7ICAvLyBkZXNlcmlhbGl6ZXMgc2Vzc2lvbiBhbmQgcG9wdWxhdGVzIGFkZGl0aW9uYWwgaW5mbyB0byByZXEudXNlclxuICAgIGxvZ2dlci5kZWJ1ZygnZGVzZXJpYWxpemluZyB1c2VyJyk7XG4gICAgZG9uZShudWxsLCB1c2VyKTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9oZWxwZXJzL2F1dGhIZWxwZXJzLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29va2llLXNlc3Npb25cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJjb29raWUtc2Vzc2lvblwiXG4vLyBtb2R1bGUgaWQgPSA1NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJodHRwXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiaHR0cFwiXG4vLyBtb2R1bGUgaWQgPSA1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCB7IGxvZ0xldmVsIH0gPSByZXF1aXJlKCcuLi9jb25maWcvbG9nZ2VyQ29uZmlnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKHdpbnN0b24pID0+IHtcbiAgLy8gY29uZmlndXJlXG4gIHdpbnN0b24uY29uZmlndXJlKHtcbiAgICB0cmFuc3BvcnRzOiBbXG4gICAgICBuZXcgKHdpbnN0b24udHJhbnNwb3J0cy5Db25zb2xlKSh7XG4gICAgICAgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxvZ0xldmVsLFxuICAgICAgICB0aW1lc3RhbXAgICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgY29sb3JpemUgICAgICAgICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgcHJldHR5UHJpbnQgICAgICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgaGFuZGxlRXhjZXB0aW9ucyAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgaHVtYW5SZWFkYWJsZVVuaGFuZGxlZEV4Y2VwdGlvbjogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIF0sXG4gIH0pO1xuICAvLyB0ZXN0IGFsbCB0aGUgbG9nIGxldmVsc1xuICB3aW5zdG9uLmVycm9yKCdMZXZlbCAwJyk7XG4gIHdpbnN0b24ud2FybignTGV2ZWwgMScpO1xuICB3aW5zdG9uLmluZm8oJ0xldmVsIDInKTtcbiAgd2luc3Rvbi52ZXJib3NlKCdMZXZlbCAzJyk7XG4gIHdpbnN0b24uZGVidWcoJ0xldmVsIDQnKTtcbiAgd2luc3Rvbi5zaWxseSgnTGV2ZWwgNScpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2hlbHBlcnMvY29uZmlndXJlTG9nZ2VyLmpzIiwiY29uc3QgbG9nZ2VyQ29uZmlnID0ge1xuICBsb2dMZXZlbDogJ2RlYnVnJywgIC8vIG9wdGlvbnM6IHNpbGx5LCBkZWJ1ZywgdmVyYm9zZSwgaW5mb1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBsb2dnZXJDb25maWc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb25maWcvbG9nZ2VyQ29uZmlnLmpzIiwiY29uc3Qgd2luc3RvblNsYWNrV2ViSG9vayA9IHJlcXVpcmUoJ3dpbnN0b24tc2xhY2std2ViaG9vaycpLlNsYWNrV2ViSG9vaztcbmNvbnN0IHNsYWNrQ29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnL3NsYWNrQ29uZmlnLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKHdpbnN0b24pID0+IHtcbiAgY29uc3Qge3NsYWNrV2ViSG9vaywgc2xhY2tFcnJvckNoYW5uZWwsIHNsYWNrSW5mb0NoYW5uZWx9ID0gc2xhY2tDb25maWc7XG4gIGlmIChzbGFja1dlYkhvb2spIHtcbiAgICAvLyBhZGQgYSB0cmFuc3BvcnQgZm9yIGVycm9ycyB0byBzbGFja1xuICAgIGlmIChzbGFja0Vycm9yQ2hhbm5lbCkge1xuICAgICAgd2luc3Rvbi5hZGQod2luc3RvblNsYWNrV2ViSG9vaywge1xuICAgICAgICBuYW1lICAgICAgOiAnc2xhY2stZXJyb3JzLXRyYW5zcG9ydCcsXG4gICAgICAgIGxldmVsICAgICA6ICd3YXJuJyxcbiAgICAgICAgd2ViaG9va1VybDogc2xhY2tXZWJIb29rLFxuICAgICAgICBjaGFubmVsICAgOiBzbGFja0Vycm9yQ2hhbm5lbCxcbiAgICAgICAgdXNlcm5hbWUgIDogJ3NwZWUuY2gnLFxuICAgICAgICBpY29uRW1vamkgOiAnOmZhY2Vfd2l0aF9oZWFkX2JhbmRhZ2U6JyxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYgKHNsYWNrSW5mb0NoYW5uZWwpIHtcbiAgICAgIHdpbnN0b24uYWRkKHdpbnN0b25TbGFja1dlYkhvb2ssIHtcbiAgICAgICAgbmFtZSAgICAgIDogJ3NsYWNrLWluZm8tdHJhbnNwb3J0JyxcbiAgICAgICAgbGV2ZWwgICAgIDogJ2luZm8nLFxuICAgICAgICB3ZWJob29rVXJsOiBzbGFja1dlYkhvb2ssXG4gICAgICAgIGNoYW5uZWwgICA6IHNsYWNrSW5mb0NoYW5uZWwsXG4gICAgICAgIHVzZXJuYW1lICA6ICdzcGVlLmNoJyxcbiAgICAgICAgaWNvbkVtb2ppIDogJzpuZXJkX2ZhY2U6JyxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gc2VuZCB0ZXN0IG1lc3NhZ2VcbiAgICB3aW5zdG9uLmVycm9yKCdTbGFjayBcImVycm9yXCIgbG9nZ2luZyBpcyBvbmxpbmUuJyk7XG4gICAgd2luc3Rvbi5pbmZvKCdTbGFjayBcImluZm9cIiBsb2dnaW5nIGlzIG9ubGluZS4nKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5zdG9uLndhcm4oJ1NsYWNrIGxvZ2dpbmcgaXMgbm90IGVuYWJsZWQgYmVjYXVzZSBubyBzbGFja1dlYkhvb2sgY29uZmlnIHZhciBwcm92aWRlZC4nKTtcbiAgfVxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2hlbHBlcnMvY29uZmlndXJlU2xhY2suanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ3aW5zdG9uLXNsYWNrLXdlYmhvb2tcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJ3aW5zdG9uLXNsYWNrLXdlYmhvb2tcIlxuLy8gbW9kdWxlIGlkID0gNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgUGFzc3BvcnRMb2NhbFN0cmF0ZWd5ID0gcmVxdWlyZSgncGFzc3BvcnQtbG9jYWwnKS5TdHJhdGVneTtcbmNvbnN0IGxicnlBcGkgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2xicnlBcGkuanMnKTtcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IGRiID0gcmVxdWlyZSgnLi4vbW9kZWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFBhc3Nwb3J0TG9jYWxTdHJhdGVneShcbiAge1xuICAgIHVzZXJuYW1lRmllbGQ6ICd1c2VybmFtZScsXG4gICAgcGFzc3dvcmRGaWVsZDogJ3Bhc3N3b3JkJyxcbiAgfSxcbiAgKHVzZXJuYW1lLCBwYXNzd29yZCwgZG9uZSkgPT4ge1xuICAgIGxvZ2dlci52ZXJib3NlKGBuZXcgY2hhbm5lbCBzaWdudXAgcmVxdWVzdC4gdXNlcjogJHt1c2VybmFtZX0gcGFzczogJHtwYXNzd29yZH0gLmApO1xuICAgIGxldCB1c2VySW5mbyA9IHt9O1xuICAgIC8vIHNlcnZlci1zaWRlIHZhbGlkYXRvbiBvZiBpbnB1dHMgKHVzZXJuYW1lLCBwYXNzd29yZClcblxuICAgIC8vIGNyZWF0ZSB0aGUgY2hhbm5lbCBhbmQgcmV0cmlldmUgdGhlIG1ldGFkYXRhXG4gICAgcmV0dXJuIGxicnlBcGkuY3JlYXRlQ2hhbm5lbChgQCR7dXNlcm5hbWV9YClcbiAgICAgIC50aGVuKHR4ID0+IHtcbiAgICAgICAgLy8gY3JlYXRlIHVzZXIgcmVjb3JkXG4gICAgICAgIGNvbnN0IHVzZXJEYXRhID0ge1xuICAgICAgICAgIHVzZXJOYW1lOiB1c2VybmFtZSxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICAgIH07XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKCd1c2VyRGF0YSA+JywgdXNlckRhdGEpO1xuICAgICAgICAvLyBjcmVhdGUgdXNlciByZWNvcmRcbiAgICAgICAgY29uc3QgY2hhbm5lbERhdGEgPSB7XG4gICAgICAgICAgY2hhbm5lbE5hbWUgICA6IGBAJHt1c2VybmFtZX1gLFxuICAgICAgICAgIGNoYW5uZWxDbGFpbUlkOiB0eC5jbGFpbV9pZCxcbiAgICAgICAgfTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ2NoYW5uZWxEYXRhID4nLCBjaGFubmVsRGF0YSk7XG4gICAgICAgIC8vIGNyZWF0ZSBjZXJ0aWZpY2F0ZSByZWNvcmRcbiAgICAgICAgY29uc3QgY2VydGlmaWNhdGVEYXRhID0ge1xuICAgICAgICAgIGNsYWltSWQ6IHR4LmNsYWltX2lkLFxuICAgICAgICAgIG5hbWUgICA6IGBAJHt1c2VybmFtZX1gLFxuICAgICAgICAgIC8vIGFkZHJlc3MsXG4gICAgICAgIH07XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKCdjZXJ0aWZpY2F0ZURhdGEgPicsIGNlcnRpZmljYXRlRGF0YSk7XG4gICAgICAgIC8vIHNhdmUgdXNlciBhbmQgY2VydGlmaWNhdGUgdG8gZGJcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtkYi5Vc2VyLmNyZWF0ZSh1c2VyRGF0YSksIGRiLkNoYW5uZWwuY3JlYXRlKGNoYW5uZWxEYXRhKSwgZGIuQ2VydGlmaWNhdGUuY3JlYXRlKGNlcnRpZmljYXRlRGF0YSldKTtcbiAgICAgIH0pXG4gICAgICAudGhlbigoW25ld1VzZXIsIG5ld0NoYW5uZWwsIG5ld0NlcnRpZmljYXRlXSkgPT4ge1xuICAgICAgICBsb2dnZXIudmVyYm9zZSgndXNlciBhbmQgY2VydGlmaWNhdGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQnKTtcbiAgICAgICAgLy8gc3RvcmUgdGhlIHJlbGV2YW50IG5ld1VzZXIgaW5mbyB0byBiZSBwYXNzZWQgYmFjayBmb3IgcmVxLlVzZXJcbiAgICAgICAgdXNlckluZm9bJ2lkJ10gPSBuZXdVc2VyLmlkO1xuICAgICAgICB1c2VySW5mb1sndXNlck5hbWUnXSA9IG5ld1VzZXIudXNlck5hbWU7XG4gICAgICAgIHVzZXJJbmZvWydjaGFubmVsTmFtZSddID0gbmV3Q2hhbm5lbC5jaGFubmVsTmFtZTtcbiAgICAgICAgdXNlckluZm9bJ2NoYW5uZWxDbGFpbUlkJ10gPSBuZXdDaGFubmVsLmNoYW5uZWxDbGFpbUlkO1xuICAgICAgICAvLyBhc3NvY2lhdGUgdGhlIGluc3RhbmNlc1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW25ld0NlcnRpZmljYXRlLnNldENoYW5uZWwobmV3Q2hhbm5lbCksIG5ld0NoYW5uZWwuc2V0VXNlcihuZXdVc2VyKV0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ3VzZXIgYW5kIGNlcnRpZmljYXRlIHN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkJyk7XG4gICAgICAgIHJldHVybiBkYi5DZXJ0aWZpY2F0ZS5nZXRTaG9ydENoYW5uZWxJZEZyb21Mb25nQ2hhbm5lbElkKHVzZXJJbmZvLmNoYW5uZWxDbGFpbUlkLCB1c2VySW5mby5jaGFubmVsTmFtZSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oc2hvcnRDaGFubmVsSWQgPT4ge1xuICAgICAgICB1c2VySW5mb1snc2hvcnRDaGFubmVsSWQnXSA9IHNob3J0Q2hhbm5lbElkO1xuICAgICAgICByZXR1cm4gZG9uZShudWxsLCB1c2VySW5mbyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdzaWdudXAgZXJyb3InLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBkb25lKGVycm9yKTtcbiAgICAgIH0pO1xuICB9XG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFzc3BvcnQvbG9jYWwtc2lnbnVwLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYXhpb3NcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJheGlvc1wiXG4vLyBtb2R1bGUgaWQgPSA2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBsYnJ5Q29uZmlnID0ge1xuICBhcGk6IHtcbiAgICBhcGlIb3N0OiAnbG9jYWxob3N0JyxcbiAgICBhcGlQb3J0OiAnNTI3OScsXG4gIH0sXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxicnlDb25maWc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb25maWcvbGJyeUNvbmZpZy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInVuaXZlcnNhbC1hbmFseXRpY3NcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJ1bml2ZXJzYWwtYW5hbHl0aWNzXCJcbi8vIG1vZHVsZSBpZCA9IDY1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IHsgcmV0dXJuU2hvcnRJZCB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9zZXF1ZWxpemVIZWxwZXJzLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKHNlcXVlbGl6ZSwgeyBTVFJJTkcsIEJPT0xFQU4sIElOVEVHRVIsIFRFWFQsIERFQ0lNQUwgfSkgPT4ge1xuICBjb25zdCBDZXJ0aWZpY2F0ZSA9IHNlcXVlbGl6ZS5kZWZpbmUoXG4gICAgJ0NlcnRpZmljYXRlJyxcbiAgICB7XG4gICAgICBhZGRyZXNzOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBhbW91bnQ6IHtcbiAgICAgICAgdHlwZSAgIDogREVDSU1BTCgxOSwgOCksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2xhaW1JZDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2xhaW1TZXF1ZW5jZToge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGRlY29kZWRDbGFpbToge1xuICAgICAgICB0eXBlICAgOiBCT09MRUFOLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGRlcHRoOiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZWZmZWN0aXZlQW1vdW50OiB7XG4gICAgICAgIHR5cGUgICA6IERFQ0lNQUwoMTksIDgpLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhhc1NpZ25hdHVyZToge1xuICAgICAgICB0eXBlICAgOiBCT09MRUFOLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhleDoge1xuICAgICAgICB0eXBlICAgOiBURVhUKCdsb25nJyksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbmFtZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbm91dDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHR4aWQ6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHZhbGlkQXRIZWlnaHQ6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBvdXRwb2ludDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdmFsdWVWZXJzaW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjbGFpbVR5cGU6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNlcnRpZmljYXRlVmVyc2lvbjoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAga2V5VHlwZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgcHVibGljS2V5OiB7XG4gICAgICAgIHR5cGUgICA6IFRFWFQoJ2xvbmcnKSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIENlcnRpZmljYXRlLmFzc29jaWF0ZSA9IGRiID0+IHtcbiAgICBDZXJ0aWZpY2F0ZS5iZWxvbmdzVG8oZGIuQ2hhbm5lbCwge1xuICAgICAgZm9yZWlnbktleToge1xuICAgICAgICBhbGxvd051bGw6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIENlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQgPSBmdW5jdGlvbiAobG9uZ0NoYW5uZWxJZCwgY2hhbm5lbE5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYGdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQgJHtjaGFubmVsTmFtZX06JHtsb25nQ2hhbm5lbElkfWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZToge25hbWU6IGNoYW5uZWxOYW1lfSxcbiAgICAgICAgICBvcmRlcjogW1snaGVpZ2h0JywgJ0FTQyddXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjaGFubmVsKHMpIGZvdW5kIHdpdGggdGhhdCBjaGFubmVsIG5hbWUnKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJldHVyblNob3J0SWQocmVzdWx0LCBsb25nQ2hhbm5lbElkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENlcnRpZmljYXRlLmdldExvbmdDaGFubmVsSWRGcm9tU2hvcnRDaGFubmVsSWQgPSBmdW5jdGlvbiAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRMb25nQ2hhbm5lbElkRnJvbVNob3J0Q2hhbm5lbElkKCR7Y2hhbm5lbE5hbWV9LCAke2NoYW5uZWxDbGFpbUlkfSlgKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgIG5hbWUgICA6IGNoYW5uZWxOYW1lLFxuICAgICAgICAgICAgY2xhaW1JZDoge1xuICAgICAgICAgICAgICAkbGlrZTogYCR7Y2hhbm5lbENsYWltSWR9JWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JkZXI6IFtbJ2hlaWdodCcsICdBU0MnXV0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgZGVmYXVsdDogLy8gbm90ZSByZXN1bHRzIG11c3QgYmUgc29ydGVkXG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdFswXS5jbGFpbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2VydGlmaWNhdGUuZ2V0TG9uZ0NoYW5uZWxJZEZyb21DaGFubmVsTmFtZSA9IGZ1bmN0aW9uIChjaGFubmVsTmFtZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgZ2V0TG9uZ0NoYW5uZWxJZEZyb21DaGFubmVsTmFtZSgke2NoYW5uZWxOYW1lfSlgKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHsgbmFtZTogY2hhbm5lbE5hbWUgfSxcbiAgICAgICAgICBvcmRlcjogW1snZWZmZWN0aXZlQW1vdW50JywgJ0RFU0MnXSwgWydoZWlnaHQnLCAnQVNDJ11dLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdFswXS5jbGFpbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2VydGlmaWNhdGUudmFsaWRhdGVMb25nQ2hhbm5lbElkID0gZnVuY3Rpb24gKG5hbWUsIGNsYWltSWQpIHtcbiAgICBsb2dnZXIuZGVidWcoYHZhbGlkYXRlTG9uZ0NoYW5uZWxJZCgke25hbWV9LCAke2NsYWltSWR9KWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmZpbmRPbmUoe1xuICAgICAgICB3aGVyZToge25hbWUsIGNsYWltSWR9LFxuICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXNvbHZlKGNsYWltSWQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENlcnRpZmljYXRlLmdldExvbmdDaGFubmVsSWQgPSBmdW5jdGlvbiAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRMb25nQ2hhbm5lbElkKCR7Y2hhbm5lbE5hbWV9LCAke2NoYW5uZWxDbGFpbUlkfSlgKTtcbiAgICBpZiAoY2hhbm5lbENsYWltSWQgJiYgKGNoYW5uZWxDbGFpbUlkLmxlbmd0aCA9PT0gNDApKSB7ICAvLyBpZiBhIGZ1bGwgY2hhbm5lbCBpZCBpcyBwcm92aWRlZFxuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVMb25nQ2hhbm5lbElkKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsQ2xhaW1JZCAmJiBjaGFubmVsQ2xhaW1JZC5sZW5ndGggPCA0MCkgeyAgLy8gaWYgYSBzaG9ydCBjaGFubmVsIGlkIGlzIHByb3ZpZGVkXG4gICAgICByZXR1cm4gdGhpcy5nZXRMb25nQ2hhbm5lbElkRnJvbVNob3J0Q2hhbm5lbElkKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldExvbmdDaGFubmVsSWRGcm9tQ2hhbm5lbE5hbWUoY2hhbm5lbE5hbWUpOyAgLy8gaWYgbm8gY2hhbm5lbCBpZCBwcm92aWRlZFxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gQ2VydGlmaWNhdGU7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbW9kZWxzL2NlcnRpZmljYXRlLmpzIiwibW9kdWxlLmV4cG9ydHMgPSAoc2VxdWVsaXplLCB7IFNUUklORyB9KSA9PiB7XG4gIGNvbnN0IENoYW5uZWwgPSBzZXF1ZWxpemUuZGVmaW5lKFxuICAgICdDaGFubmVsJyxcbiAgICB7XG4gICAgICBjaGFubmVsTmFtZToge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBjaGFubmVsQ2xhaW1JZDoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIENoYW5uZWwuYXNzb2NpYXRlID0gZGIgPT4ge1xuICAgIENoYW5uZWwuYmVsb25nc1RvKGRiLlVzZXIpO1xuICAgIENoYW5uZWwuaGFzT25lKGRiLkNlcnRpZmljYXRlKTtcbiAgfTtcblxuICByZXR1cm4gQ2hhbm5lbDtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9tb2RlbHMvY2hhbm5lbC5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IHsgcmV0dXJuU2hvcnRJZCB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9zZXF1ZWxpemVIZWxwZXJzLmpzJyk7XG5jb25zdCB7IGFzc2V0RGVmYXVsdHM6IHsgdGh1bWJuYWlsOiBkZWZhdWx0VGh1bWJuYWlsIH0sIGRldGFpbHM6IHsgaG9zdCB9IH0gPSByZXF1aXJlKCcuLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVGaWxlRXh0ZW5zaW9uRnJvbUNvbnRlbnRUeXBlIChjb250ZW50VHlwZSkge1xuICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7XG4gICAgY2FzZSAnaW1hZ2UvanBlZyc6XG4gICAgY2FzZSAnaW1hZ2UvanBnJzpcbiAgICAgIHJldHVybiAnanBlZyc7XG4gICAgY2FzZSAnaW1hZ2UvcG5nJzpcbiAgICAgIHJldHVybiAncG5nJztcbiAgICBjYXNlICdpbWFnZS9naWYnOlxuICAgICAgcmV0dXJuICdnaWYnO1xuICAgIGNhc2UgJ3ZpZGVvL21wNCc6XG4gICAgICByZXR1cm4gJ21wNCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIGxvZ2dlci5kZWJ1Zygnc2V0dGluZyB1bmtub3duIGZpbGUgdHlwZSBhcyBmaWxlIGV4dGVuc2lvbiBqcGVnJyk7XG4gICAgICByZXR1cm4gJ2pwZWcnO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVUaHVtYm5haWwgKHN0b3JlZFRodW1ibmFpbCwgZGVmYXVsdFRodW1ibmFpbCkge1xuICBpZiAoc3RvcmVkVGh1bWJuYWlsID09PSAnJykge1xuICAgIHJldHVybiBkZWZhdWx0VGh1bWJuYWlsO1xuICB9XG4gIHJldHVybiBzdG9yZWRUaHVtYm5haWw7XG59O1xuXG5mdW5jdGlvbiBwcmVwYXJlQ2xhaW1EYXRhIChjbGFpbSkge1xuICAvLyBsb2dnZXIuZGVidWcoJ3ByZXBhcmluZyBjbGFpbSBkYXRhIGJhc2VkIG9uIHJlc29sdmVkIGRhdGE6JywgY2xhaW0pO1xuICBjbGFpbVsndGh1bWJuYWlsJ10gPSBkZXRlcm1pbmVUaHVtYm5haWwoY2xhaW0udGh1bWJuYWlsLCBkZWZhdWx0VGh1bWJuYWlsKTtcbiAgY2xhaW1bJ2ZpbGVFeHQnXSA9IGRldGVybWluZUZpbGVFeHRlbnNpb25Gcm9tQ29udGVudFR5cGUoY2xhaW0uY29udGVudFR5cGUpO1xuICBjbGFpbVsnaG9zdCddID0gaG9zdDtcbiAgcmV0dXJuIGNsYWltO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSAoc2VxdWVsaXplLCB7IFNUUklORywgQk9PTEVBTiwgSU5URUdFUiwgVEVYVCwgREVDSU1BTCB9KSA9PiB7XG4gIGNvbnN0IENsYWltID0gc2VxdWVsaXplLmRlZmluZShcbiAgICAnQ2xhaW0nLFxuICAgIHtcbiAgICAgIGFkZHJlc3M6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGFtb3VudDoge1xuICAgICAgICB0eXBlICAgOiBERUNJTUFMKDE5LCA4KSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjbGFpbUlkOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjbGFpbVNlcXVlbmNlOiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZGVjb2RlZENsYWltOiB7XG4gICAgICAgIHR5cGUgICA6IEJPT0xFQU4sXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZGVwdGg6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBlZmZlY3RpdmVBbW91bnQ6IHtcbiAgICAgICAgdHlwZSAgIDogREVDSU1BTCgxOSwgOCksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgaGFzU2lnbmF0dXJlOiB7XG4gICAgICAgIHR5cGUgICA6IEJPT0xFQU4sXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgaGV4OiB7XG4gICAgICAgIHR5cGUgICA6IFRFWFQoJ2xvbmcnKSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBuYW1lOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBub3V0OiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdHhpZDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdmFsaWRBdEhlaWdodDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIG91dHBvaW50OiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjbGFpbVR5cGU6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNlcnRpZmljYXRlSWQ6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGF1dGhvcjoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHtcbiAgICAgICAgdHlwZSAgIDogVEVYVCgnbG9uZycpLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGxhbmd1YWdlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBsaWNlbnNlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBsaWNlbnNlVXJsOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBuc2Z3OiB7XG4gICAgICAgIHR5cGUgICA6IEJPT0xFQU4sXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgcHJldmlldzoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGh1bWJuYWlsOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB0aXRsZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbWV0YWRhdGFWZXJzaW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjb250ZW50VHlwZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VUeXBlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VWZXJzaW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzdHJlYW1WZXJzaW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB2YWx1ZVZlcnNpb246IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNoYW5uZWxOYW1lOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IHRydWUsXG4gICAgICAgIGRlZmF1bHQgIDogbnVsbCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIENsYWltLmFzc29jaWF0ZSA9IGRiID0+IHtcbiAgICBDbGFpbS5iZWxvbmdzVG8oZGIuRmlsZSwge1xuICAgICAgZm9yZWlnbktleToge1xuICAgICAgICBhbGxvd051bGw6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIENsYWltLmdldFNob3J0Q2xhaW1JZEZyb21Mb25nQ2xhaW1JZCA9IGZ1bmN0aW9uIChjbGFpbUlkLCBjbGFpbU5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYENsYWltLmdldFNob3J0Q2xhaW1JZEZyb21Mb25nQ2xhaW1JZCBmb3IgJHtjbGFpbU5hbWV9IyR7Y2xhaW1JZH1gKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHsgbmFtZTogY2xhaW1OYW1lIH0sXG4gICAgICAgICAgb3JkZXI6IFtbJ2hlaWdodCcsICdBU0MnXV0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY2xhaW0ocykgZm91bmQgd2l0aCB0aGF0IGNsYWltIG5hbWUnKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuU2hvcnRJZChyZXN1bHQsIGNsYWltSWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2xhaW0uZ2V0QWxsQ2hhbm5lbENsYWltcyA9IGZ1bmN0aW9uIChjaGFubmVsQ2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ2xhaW0uZ2V0QWxsQ2hhbm5lbENsYWltcyBmb3IgJHtjaGFubmVsQ2xhaW1JZH1gKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHsgY2VydGlmaWNhdGVJZDogY2hhbm5lbENsYWltSWQgfSxcbiAgICAgICAgICBvcmRlcjogW1snaGVpZ2h0JywgJ0FTQyddXSxcbiAgICAgICAgICByYXcgIDogdHJ1ZSwgIC8vIHJldHVybnMgYW4gYXJyYXkgb2Ygb25seSBkYXRhLCBub3QgYW4gYXJyYXkgb2YgaW5zdGFuY2VzXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGNoYW5uZWxDbGFpbXNBcnJheSA9PiB7XG4gICAgICAgICAgLy8gbG9nZ2VyLmRlYnVnKCdjaGFubmVsY2xhaW1zYXJyYXkgbGVuZ3RoOicsIGNoYW5uZWxDbGFpbXNBcnJheS5sZW5ndGgpO1xuICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbENsYWltc0FycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGNoYW5uZWxDbGFpbXNBcnJheS5mb3JFYWNoKGNsYWltID0+IHtcbiAgICAgICAgICAgICAgICBjbGFpbVsnZmlsZUV4dCddID0gZGV0ZXJtaW5lRmlsZUV4dGVuc2lvbkZyb21Db250ZW50VHlwZShjbGFpbS5jb250ZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgY2xhaW1bJ3RodW1ibmFpbCddID0gZGV0ZXJtaW5lVGh1bWJuYWlsKGNsYWltLnRodW1ibmFpbCwgZGVmYXVsdFRodW1ibmFpbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYWltO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoY2hhbm5lbENsYWltc0FycmF5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2xhaW0uZ2V0Q2xhaW1JZEJ5TG9uZ0NoYW5uZWxJZCA9IGZ1bmN0aW9uIChjaGFubmVsQ2xhaW1JZCwgY2xhaW1OYW1lKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBmaW5kaW5nIGNsYWltIGlkIGZvciBjbGFpbSAke2NsYWltTmFtZX0gZnJvbSBjaGFubmVsICR7Y2hhbm5lbENsYWltSWR9YCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXNcbiAgICAgICAgLmZpbmRBbGwoe1xuICAgICAgICAgIHdoZXJlOiB7IG5hbWU6IGNsYWltTmFtZSwgY2VydGlmaWNhdGVJZDogY2hhbm5lbENsYWltSWQgfSxcbiAgICAgICAgICBvcmRlcjogW1snaWQnLCAnQVNDJ11dLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLmNsYWltSWQpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGAke3Jlc3VsdC5sZW5ndGh9IHJlY29yZHMgZm91bmQgZm9yIFwiJHtjbGFpbU5hbWV9XCIgaW4gY2hhbm5lbCBcIiR7Y2hhbm5lbENsYWltSWR9XCJgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLmNsYWltSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDbGFpbS5nZXRMb25nQ2xhaW1JZEZyb21TaG9ydENsYWltSWQgPSBmdW5jdGlvbiAobmFtZSwgc2hvcnRJZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZToge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGNsYWltSWQ6IHtcbiAgICAgICAgICAgICAgJGxpa2U6IGAke3Nob3J0SWR9JWAsXG4gICAgICAgICAgICB9fSxcbiAgICAgICAgICBvcmRlcjogW1snaGVpZ2h0JywgJ0FTQyddXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBkZWZhdWx0OiAvLyBub3RlIHJlc3VsdHMgbXVzdCBiZSBzb3J0ZWRcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLmNsYWltSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDbGFpbS5nZXRUb3BGcmVlQ2xhaW1JZEJ5Q2xhaW1OYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHsgbmFtZSB9LFxuICAgICAgICAgIG9yZGVyOiBbWydlZmZlY3RpdmVBbW91bnQnLCAnREVTQyddLCBbJ2hlaWdodCcsICdBU0MnXV0sICAvLyBub3RlOiBtYXliZSBoZWlnaHQgYW5kIGVmZmVjdGl2ZSBhbW91bnQgbmVlZCB0byBzd2l0Y2g/XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdsZW5ndGggb2YgcmVzdWx0JywgcmVzdWx0Lmxlbmd0aCk7XG4gICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLmRhdGFWYWx1ZXMuY2xhaW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENsYWltLnZhbGlkYXRlTG9uZ0NsYWltSWQgPSBmdW5jdGlvbiAobmFtZSwgY2xhaW1JZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmZpbmRPbmUoe1xuICAgICAgICB3aGVyZToge25hbWUsIGNsYWltSWR9LFxuICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXNvbHZlKGNsYWltSWQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENsYWltLmdldExvbmdDbGFpbUlkID0gZnVuY3Rpb24gKGNsYWltTmFtZSwgY2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgZ2V0TG9uZ0NsYWltSWQoJHtjbGFpbU5hbWV9LCAke2NsYWltSWR9KWApO1xuICAgIGlmIChjbGFpbUlkICYmIChjbGFpbUlkLmxlbmd0aCA9PT0gNDApKSB7ICAvLyBpZiBhIGZ1bGwgY2xhaW0gaWQgaXMgcHJvdmlkZWRcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlTG9uZ0NsYWltSWQoY2xhaW1OYW1lLCBjbGFpbUlkKTtcbiAgICB9IGVsc2UgaWYgKGNsYWltSWQgJiYgY2xhaW1JZC5sZW5ndGggPCA0MCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9uZ0NsYWltSWRGcm9tU2hvcnRDbGFpbUlkKGNsYWltTmFtZSwgY2xhaW1JZCk7ICAvLyBpZiBhIHNob3J0IGNsYWltIGlkIGlzIHByb3ZpZGVkXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRvcEZyZWVDbGFpbUlkQnlDbGFpbU5hbWUoY2xhaW1OYW1lKTsgIC8vIGlmIG5vIGNsYWltIGlkIGlzIHByb3ZpZGVkXG4gICAgfVxuICB9O1xuXG4gIENsYWltLnJlc29sdmVDbGFpbSA9IGZ1bmN0aW9uIChuYW1lLCBjbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDbGFpbS5yZXNvbHZlQ2xhaW06ICR7bmFtZX0gJHtjbGFpbUlkfWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZTogeyBuYW1lLCBjbGFpbUlkIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGNsYWltQXJyYXkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAoY2xhaW1BcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHByZXBhcmVDbGFpbURhdGEoY2xhaW1BcnJheVswXS5kYXRhVmFsdWVzKSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYG1vcmUgdGhhbiBvbmUgcmVjb3JkIG1hdGNoZXMgJHtuYW1lfSMke2NsYWltSWR9IGluIGRiLkNsYWltYCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHByZXBhcmVDbGFpbURhdGEoY2xhaW1BcnJheVswXS5kYXRhVmFsdWVzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBDbGFpbTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9tb2RlbHMvY2xhaW0uanMiLCJtb2R1bGUuZXhwb3J0cyA9IChzZXF1ZWxpemUsIHsgU1RSSU5HLCBCT09MRUFOLCBJTlRFR0VSIH0pID0+IHtcbiAgY29uc3QgRmlsZSA9IHNlcXVlbGl6ZS5kZWZpbmUoXG4gICAgJ0ZpbGUnLFxuICAgIHtcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgY2xhaW1JZDoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBhZGRyZXNzOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIG91dHBvaW50OiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICB0eXBlICAgICA6IElOVEVHRVIsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICAgIGRlZmF1bHQgIDogMCxcbiAgICAgIH0sXG4gICAgICBmaWxlTmFtZToge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBmaWxlUGF0aDoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBmaWxlVHlwZToge1xuICAgICAgICB0eXBlOiBTVFJJTkcsXG4gICAgICB9LFxuICAgICAgbnNmdzoge1xuICAgICAgICB0eXBlICAgICAgICA6IEJPT0xFQU4sXG4gICAgICAgIGFsbG93TnVsbCAgIDogZmFsc2UsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgdHJlbmRpbmdFbGlnaWJsZToge1xuICAgICAgICB0eXBlICAgICAgICA6IEJPT0xFQU4sXG4gICAgICAgIGFsbG93TnVsbCAgIDogZmFsc2UsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIEZpbGUuYXNzb2NpYXRlID0gZGIgPT4ge1xuICAgIEZpbGUuaGFzTWFueShkYi5SZXF1ZXN0KTtcbiAgICBGaWxlLmhhc09uZShkYi5DbGFpbSk7XG4gIH07XG5cbiAgRmlsZS5nZXRSZWNlbnRDbGFpbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZEFsbCh7XG4gICAgICB3aGVyZTogeyBuc2Z3OiBmYWxzZSwgdHJlbmRpbmdFbGlnaWJsZTogdHJ1ZSB9LFxuICAgICAgb3JkZXI6IFtbJ2NyZWF0ZWRBdCcsICdERVNDJ11dLFxuICAgICAgbGltaXQ6IDI1LFxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBGaWxlO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL21vZGVscy9maWxlLmpzIiwibW9kdWxlLmV4cG9ydHMgPSAoc2VxdWVsaXplLCB7IFNUUklORywgQk9PTEVBTiwgVEVYVCB9KSA9PiB7XG4gIGNvbnN0IFJlcXVlc3QgPSBzZXF1ZWxpemUuZGVmaW5lKFxuICAgICdSZXF1ZXN0JyxcbiAgICB7XG4gICAgICBhY3Rpb246IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgdXJsOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGlwQWRkcmVzczoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICB0eXBlICAgICA6IFRFWFQoJ2xvbmcnKSxcbiAgICAgICAgYWxsb3dOdWxsOiB0cnVlLFxuICAgICAgICBkZWZhdWx0ICA6IG51bGwsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgZnJlZXplVGFibGVOYW1lOiB0cnVlLFxuICAgIH1cbiAgKTtcblxuICBSZXF1ZXN0LmFzc29jaWF0ZSA9IGRiID0+IHtcbiAgICBSZXF1ZXN0LmJlbG9uZ3NUbyhkYi5GaWxlLCB7XG4gICAgICBmb3JlaWduS2V5OiB7XG4gICAgICAgIGFsbG93TnVsbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFJlcXVlc3Q7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbW9kZWxzL3JlcXVlc3QuanMiLCIndXNlIHN0cmljdCc7XG5jb25zdCBiY3J5cHQgPSByZXF1aXJlKCdiY3J5cHQnKTtcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoc2VxdWVsaXplLCB7IFNUUklORyB9KSA9PiB7XG4gIGNvbnN0IFVzZXIgPSBzZXF1ZWxpemUuZGVmaW5lKFxuICAgICdVc2VyJyxcbiAgICB7XG4gICAgICB1c2VyTmFtZToge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBwYXNzd29yZDoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIFVzZXIuYXNzb2NpYXRlID0gZGIgPT4ge1xuICAgIFVzZXIuaGFzT25lKGRiLkNoYW5uZWwpO1xuICB9O1xuXG4gIFVzZXIucHJvdG90eXBlLmNvbXBhcmVQYXNzd29yZCA9IGZ1bmN0aW9uIChwYXNzd29yZCkge1xuICAgIHJldHVybiBiY3J5cHQuY29tcGFyZShwYXNzd29yZCwgdGhpcy5wYXNzd29yZCk7XG4gIH07XG5cbiAgVXNlci5wcm90b3R5cGUuY2hhbmdlUGFzc3dvcmQgPSBmdW5jdGlvbiAobmV3UGFzc3dvcmQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gZ2VuZXJhdGUgYSBzYWx0IHN0cmluZyB0byB1c2UgZm9yIGhhc2hpbmdcbiAgICAgIGJjcnlwdC5nZW5TYWx0KChzYWx0RXJyb3IsIHNhbHQpID0+IHtcbiAgICAgICAgaWYgKHNhbHRFcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignc2FsdCBlcnJvcicsIHNhbHRFcnJvcik7XG4gICAgICAgICAgcmVqZWN0KHNhbHRFcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdlbmVyYXRlIGEgaGFzaGVkIHZlcnNpb24gb2YgdGhlIHVzZXIncyBwYXNzd29yZFxuICAgICAgICBiY3J5cHQuaGFzaChuZXdQYXNzd29yZCwgc2FsdCwgKGhhc2hFcnJvciwgaGFzaCkgPT4ge1xuICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggdGhlIGhhc2ggZ2VuZXJhdGlvbiByZXR1cm4gdGhlIGVycm9yXG4gICAgICAgICAgaWYgKGhhc2hFcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdoYXNoIGVycm9yJywgaGFzaEVycm9yKTtcbiAgICAgICAgICAgIHJlamVjdChoYXNoRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyByZXBsYWNlIHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpdGggdGhlIG5ldyBoYXNoXG4gICAgICAgICAgdGhpc1xuICAgICAgICAgICAgLnVwZGF0ZSh7cGFzc3dvcmQ6IGhhc2h9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIHByZS1zYXZlIGhvb2sgbWV0aG9kIHRvIGhhc2ggdGhlIHVzZXIncyBwYXNzd29yZCBiZWZvcmUgdGhlIHVzZXIncyBpbmZvIGlzIHNhdmVkIHRvIHRoZSBkYi5cbiAgVXNlci5ob29rKCdiZWZvcmVDcmVhdGUnLCAodXNlciwgb3B0aW9ucykgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZygnVXNlci5iZWZvcmVDcmVhdGUgaG9vay4uLicpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBnZW5lcmF0ZSBhIHNhbHQgc3RyaW5nIHRvIHVzZSBmb3IgaGFzaGluZ1xuICAgICAgYmNyeXB0LmdlblNhbHQoKHNhbHRFcnJvciwgc2FsdCkgPT4ge1xuICAgICAgICBpZiAoc2FsdEVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdzYWx0IGVycm9yJywgc2FsdEVycm9yKTtcbiAgICAgICAgICByZWplY3Qoc2FsdEVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBoYXNoZWQgdmVyc2lvbiBvZiB0aGUgdXNlcidzIHBhc3N3b3JkXG4gICAgICAgIGJjcnlwdC5oYXNoKHVzZXIucGFzc3dvcmQsIHNhbHQsIChoYXNoRXJyb3IsIGhhc2gpID0+IHtcbiAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHRoZSBoYXNoIGdlbmVyYXRpb24gcmV0dXJuIHRoZSBlcnJvclxuICAgICAgICAgIGlmIChoYXNoRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignaGFzaCBlcnJvcicsIGhhc2hFcnJvcik7XG4gICAgICAgICAgICByZWplY3QoaGFzaEVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcmVwbGFjZSB0aGUgcGFzc3dvcmQgc3RyaW5nIHdpdGggdGhlIGhhc2ggcGFzc3dvcmQgdmFsdWVcbiAgICAgICAgICB1c2VyLnBhc3N3b3JkID0gaGFzaDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBVc2VyO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL21vZGVscy91c2VyLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYmNyeXB0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiYmNyeXB0XCJcbi8vIG1vZHVsZSBpZCA9IDcyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IFBhc3Nwb3J0TG9jYWxTdHJhdGVneSA9IHJlcXVpcmUoJ3Bhc3Nwb3J0LWxvY2FsJykuU3RyYXRlZ3k7XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCBkYiA9IHJlcXVpcmUoJy4uL21vZGVscycpO1xuXG5jb25zdCByZXR1cm5Vc2VyQW5kQ2hhbm5lbEluZm8gPSAodXNlckluc3RhbmNlKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHVzZXJJbmZvID0ge307XG4gICAgdXNlckluZm9bJ2lkJ10gPSB1c2VySW5zdGFuY2UuaWQ7XG4gICAgdXNlckluZm9bJ3VzZXJOYW1lJ10gPSB1c2VySW5zdGFuY2UudXNlck5hbWU7XG4gICAgdXNlckluc3RhbmNlXG4gICAgICAuZ2V0Q2hhbm5lbCgpXG4gICAgICAudGhlbigoe2NoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZH0pID0+IHtcbiAgICAgICAgdXNlckluZm9bJ2NoYW5uZWxOYW1lJ10gPSBjaGFubmVsTmFtZTtcbiAgICAgICAgdXNlckluZm9bJ2NoYW5uZWxDbGFpbUlkJ10gPSBjaGFubmVsQ2xhaW1JZDtcbiAgICAgICAgcmV0dXJuIGRiLkNlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQoY2hhbm5lbENsYWltSWQsIGNoYW5uZWxOYW1lKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihzaG9ydENoYW5uZWxJZCA9PiB7XG4gICAgICAgIHVzZXJJbmZvWydzaG9ydENoYW5uZWxJZCddID0gc2hvcnRDaGFubmVsSWQ7XG4gICAgICAgIHJlc29sdmUodXNlckluZm8pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBQYXNzcG9ydExvY2FsU3RyYXRlZ3koXG4gIHtcbiAgICB1c2VybmFtZUZpZWxkOiAndXNlcm5hbWUnLFxuICAgIHBhc3N3b3JkRmllbGQ6ICdwYXNzd29yZCcsXG4gIH0sXG4gICh1c2VybmFtZSwgcGFzc3dvcmQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gZGIuVXNlclxuICAgICAgLmZpbmRPbmUoe1xuICAgICAgICB3aGVyZToge3VzZXJOYW1lOiB1c2VybmFtZX0sXG4gICAgICB9KVxuICAgICAgLnRoZW4odXNlciA9PiB7XG4gICAgICAgIGlmICghdXNlcikge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnbm8gdXNlciBmb3VuZCcpO1xuICAgICAgICAgIHJldHVybiBkb25lKG51bGwsIGZhbHNlLCB7bWVzc2FnZTogJ0luY29ycmVjdCB1c2VybmFtZSBvciBwYXNzd29yZCd9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXNlci5jb21wYXJlUGFzc3dvcmQocGFzc3dvcmQpXG4gICAgICAgICAgLnRoZW4oaXNNYXRjaCA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzTWF0Y2gpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdpbmNvcnJlY3QgcGFzc3dvcmQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRvbmUobnVsbCwgZmFsc2UsIHttZXNzYWdlOiAnSW5jb3JyZWN0IHVzZXJuYW1lIG9yIHBhc3N3b3JkJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdQYXNzd29yZCB3YXMgYSBtYXRjaCwgcmV0dXJuaW5nIFVzZXInKTtcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5Vc2VyQW5kQ2hhbm5lbEluZm8odXNlcilcbiAgICAgICAgICAgICAgLnRoZW4odXNlckluZm8gPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb25lKG51bGwsIHVzZXJJbmZvKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gZG9uZShlcnJvcik7XG4gICAgICB9KTtcbiAgfSxcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYXNzcG9ydC9sb2NhbC1sb2dpbi5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IHBhc3Nwb3J0ID0gcmVxdWlyZSgncGFzc3BvcnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoYXBwKSA9PiB7XG4gIC8vIHJvdXRlIGZvciBzaWduIHVwXG4gIGFwcC5wb3N0KCcvc2lnbnVwJywgcGFzc3BvcnQuYXV0aGVudGljYXRlKCdsb2NhbC1zaWdudXAnKSwgKHJlcSwgcmVzKSA9PiB7XG4gICAgbG9nZ2VyLnZlcmJvc2UoYHN1Y2Nlc3NmdWwgc2lnbnVwIGZvciAke3JlcS51c2VyLmNoYW5uZWxOYW1lfWApO1xuICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtcbiAgICAgIHN1Y2Nlc3MgICAgICAgOiB0cnVlLFxuICAgICAgY2hhbm5lbE5hbWUgICA6IHJlcS51c2VyLmNoYW5uZWxOYW1lLFxuICAgICAgY2hhbm5lbENsYWltSWQ6IHJlcS51c2VyLmNoYW5uZWxDbGFpbUlkLFxuICAgICAgc2hvcnRDaGFubmVsSWQ6IHJlcS51c2VyLnNob3J0Q2hhbm5lbElkLFxuICAgIH0pO1xuICB9KTtcbiAgLy8gcm91dGUgZm9yIGxvZyBpblxuICBhcHAucG9zdCgnL2xvZ2luJywgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgcGFzc3BvcnQuYXV0aGVudGljYXRlKCdsb2NhbC1sb2dpbicsIChlcnIsIHVzZXIsIGluZm8pID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnaW5mbzonLCBpbmZvKTtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoZXJyKTtcbiAgICAgIH1cbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGluZm8ubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoJ3N1Y2Nlc3NmdWwgbG9naW4nKTtcbiAgICAgIHJlcS5sb2dJbih1c2VyLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gbmV4dChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7XG4gICAgICAgICAgc3VjY2VzcyAgICAgICA6IHRydWUsXG4gICAgICAgICAgY2hhbm5lbE5hbWUgICA6IHJlcS51c2VyLmNoYW5uZWxOYW1lLFxuICAgICAgICAgIGNoYW5uZWxDbGFpbUlkOiByZXEudXNlci5jaGFubmVsQ2xhaW1JZCxcbiAgICAgICAgICBzaG9ydENoYW5uZWxJZDogcmVxLnVzZXIuc2hvcnRDaGFubmVsSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSkocmVxLCByZXMsIG5leHQpO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gbG9nIG91dFxuICBhcHAuZ2V0KCcvbG9nb3V0JywgKHJlcSwgcmVzKSA9PiB7XG4gICAgcmVxLmxvZ291dCgpO1xuICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBtZXNzYWdlOiAneW91IHN1Y2Nlc3NmdWxseSBsb2dnZWQgb3V0J30pO1xuICB9KTtcbiAgLy8gc2VlIGlmIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgYW5kIHJldHVybiBjcmVkZW50aWFscyBpZiBzb1xuICBhcHAuZ2V0KCcvdXNlcicsIChyZXEsIHJlcykgPT4ge1xuICAgIGlmIChyZXEudXNlcikge1xuICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGE6IHJlcS51c2VyfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAxKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ3VzZXIgaXMgbm90IGxvZ2dlZCBpbid9KTtcbiAgICB9XG4gIH0pO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JvdXRlcy9hdXRoLXJvdXRlcy5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IG11bHRpcGFydCA9IHJlcXVpcmUoJ2Nvbm5lY3QtbXVsdGlwYXJ0eScpO1xuY29uc3QgeyBwdWJsaXNoaW5nOiB7IHVwbG9hZERpcmVjdG9yeSB9LCBkZXRhaWxzOiB7IGhvc3QgfSB9ID0gcmVxdWlyZSgnLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcbmNvbnN0IG11bHRpcGFydE1pZGRsZXdhcmUgPSBtdWx0aXBhcnQoe3VwbG9hZERpcjogdXBsb2FkRGlyZWN0b3J5fSk7XG5jb25zdCBkYiA9IHJlcXVpcmUoJy4uL21vZGVscycpO1xuY29uc3QgeyBjbGFpbU5hbWVJc0F2YWlsYWJsZSwgY2hlY2tDaGFubmVsQXZhaWxhYmlsaXR5LCBwdWJsaXNoIH0gPSByZXF1aXJlKCcuLi9jb250cm9sbGVycy9wdWJsaXNoQ29udHJvbGxlci5qcycpO1xuY29uc3QgeyBnZXRDbGFpbUxpc3QsIHJlc29sdmVVcmksIGdldENsYWltIH0gPSByZXF1aXJlKCcuLi9oZWxwZXJzL2xicnlBcGkuanMnKTtcbmNvbnN0IHsgYWRkR2V0UmVzdWx0c1RvRmlsZURhdGEsIGNyZWF0ZUJhc2ljUHVibGlzaFBhcmFtcywgY3JlYXRlVGh1bWJuYWlsUHVibGlzaFBhcmFtcywgcGFyc2VQdWJsaXNoQXBpUmVxdWVzdEJvZHksIHBhcnNlUHVibGlzaEFwaVJlcXVlc3RGaWxlcywgY3JlYXRlRmlsZURhdGEgfSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvcHVibGlzaEhlbHBlcnMuanMnKTtcbmNvbnN0IGVycm9ySGFuZGxlcnMgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMnKTtcbmNvbnN0IHsgc2VuZEdBVGltaW5nRXZlbnQgfSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvZ29vZ2xlQW5hbHl0aWNzLmpzJyk7XG5jb25zdCB7IGF1dGhlbnRpY2F0ZVVzZXIgfSA9IHJlcXVpcmUoJy4uL2F1dGgvYXV0aGVudGljYXRpb24uanMnKTtcbmNvbnN0IHsgZ2V0Q2hhbm5lbERhdGEsIGdldENoYW5uZWxDbGFpbXMsIGdldENsYWltSWQgfSA9IHJlcXVpcmUoJy4uL2NvbnRyb2xsZXJzL3NlcnZlQ29udHJvbGxlci5qcycpO1xuXG5jb25zdCBOT19DSEFOTkVMID0gJ05PX0NIQU5ORUwnO1xuY29uc3QgTk9fQ0xBSU0gPSAnTk9fQ0xBSU0nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChhcHApID0+IHtcbiAgLy8gcm91dGUgdG8gY2hlY2sgd2hldGhlciBzaXRlIGhhcyBwdWJsaXNoZWQgdG8gYSBjaGFubmVsXG4gIGFwcC5nZXQoJy9hcGkvY2hhbm5lbC9hdmFpbGFiaWxpdHkvOm5hbWUnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtczogeyBuYW1lIH0gfSwgcmVzKSA9PiB7XG4gICAgY29uc3QgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNoZWNrQ2hhbm5lbEF2YWlsYWJpbGl0eShuYW1lKVxuICAgICAgLnRoZW4oYXZhaWxhYmxlTmFtZSA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKGF2YWlsYWJsZU5hbWUpO1xuICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnZW5kLXRvLWVuZCcsICdjbGFpbSBuYW1lIGF2YWlsYWJpbGl0eScsIG5hbWUsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gZ2V0IGEgc2hvcnQgY2hhbm5lbCBpZCBmcm9tIGxvbmcgY2hhbm5lbCBJZFxuICBhcHAuZ2V0KCcvYXBpL2NoYW5uZWwvc2hvcnQtaWQvOmxvbmdJZC86bmFtZScsICh7IGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zIH0sIHJlcykgPT4ge1xuICAgIGRiLkNlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQocGFyYW1zLmxvbmdJZCwgcGFyYW1zLm5hbWUpXG4gICAgICAudGhlbihzaG9ydElkID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oc2hvcnRJZCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG4gIGFwcC5nZXQoJy9hcGkvY2hhbm5lbC9kYXRhLzpjaGFubmVsTmFtZS86Y2hhbm5lbENsYWltSWQnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIGJvZHksIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBjb25zdCBjaGFubmVsTmFtZSA9IHBhcmFtcy5jaGFubmVsTmFtZTtcbiAgICBsZXQgY2hhbm5lbENsYWltSWQgPSBwYXJhbXMuY2hhbm5lbENsYWltSWQ7XG4gICAgaWYgKGNoYW5uZWxDbGFpbUlkID09PSAnbm9uZScpIGNoYW5uZWxDbGFpbUlkID0gbnVsbDtcbiAgICBnZXRDaGFubmVsRGF0YShjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIDApXG4gICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgaWYgKGRhdGEgPT09IE5PX0NIQU5ORUwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnTm8gbWF0Y2hpbmcgY2hhbm5lbCB3YXMgZm91bmQnfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGF9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgYXBwLmdldCgnL2FwaS9jaGFubmVsL2NsYWltcy86Y2hhbm5lbE5hbWUvOmNoYW5uZWxDbGFpbUlkLzpwYWdlJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBib2R5LCBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgY29uc3QgY2hhbm5lbE5hbWUgPSBwYXJhbXMuY2hhbm5lbE5hbWU7XG4gICAgbGV0IGNoYW5uZWxDbGFpbUlkID0gcGFyYW1zLmNoYW5uZWxDbGFpbUlkO1xuICAgIGlmIChjaGFubmVsQ2xhaW1JZCA9PT0gJ25vbmUnKSBjaGFubmVsQ2xhaW1JZCA9IG51bGw7XG4gICAgY29uc3QgcGFnZSA9IHBhcmFtcy5wYWdlO1xuICAgIGdldENoYW5uZWxDbGFpbXMoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBwYWdlKVxuICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIGlmIChkYXRhID09PSBOT19DSEFOTkVMKSB7XG4gICAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ05vIG1hdGNoaW5nIGNoYW5uZWwgd2FzIGZvdW5kJ30pO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIHJ1biBhIGNsYWltX2xpc3QgcmVxdWVzdCBvbiB0aGUgZGFlbW9uXG4gIGFwcC5nZXQoJy9hcGkvY2xhaW0vbGlzdC86bmFtZScsICh7IGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zIH0sIHJlcykgPT4ge1xuICAgIGdldENsYWltTGlzdChwYXJhbXMubmFtZSlcbiAgICAgIC50aGVuKGNsYWltc0xpc3QgPT4ge1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbihjbGFpbXNMaXN0KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gZ2V0IGFuIGFzc2V0XG4gIGFwcC5nZXQoJy9hcGkvY2xhaW0vZ2V0LzpuYW1lLzpjbGFpbUlkJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHBhcmFtcy5uYW1lO1xuICAgIGNvbnN0IGNsYWltSWQgPSBwYXJhbXMuY2xhaW1JZDtcbiAgICAvLyByZXNvbHZlIHRoZSBjbGFpbVxuICAgIGRiLkNsYWltLnJlc29sdmVDbGFpbShuYW1lLCBjbGFpbUlkKVxuICAgICAgLnRoZW4ocmVzb2x2ZVJlc3VsdCA9PiB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSBhIGNsYWltIGFjdHVhbGx5IGV4aXN0cyBhdCB0aGF0IHVyaVxuICAgICAgICBpZiAoIXJlc29sdmVSZXN1bHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG1hdGNoaW5nIHVyaSBmb3VuZCBpbiBDbGFpbSB0YWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlRGF0YSA9IGNyZWF0ZUZpbGVEYXRhKHJlc29sdmVSZXN1bHQpO1xuICAgICAgICAvLyBnZXQgdGhlIGNsYWltXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbZmlsZURhdGEsIGdldENsYWltKGAke25hbWV9IyR7Y2xhaW1JZH1gKV0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKChbIGZpbGVEYXRhLCBnZXRSZXN1bHQgXSkgPT4ge1xuICAgICAgICBmaWxlRGF0YSA9IGFkZEdldFJlc3VsdHNUb0ZpbGVEYXRhKGZpbGVEYXRhLCBnZXRSZXN1bHQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW2RiLnVwc2VydChkYi5GaWxlLCBmaWxlRGF0YSwge25hbWUsIGNsYWltSWR9LCAnRmlsZScpLCBnZXRSZXN1bHRdKTtcbiAgICAgIH0pXG4gICAgICAudGhlbigoWyBmaWxlUmVjb3JkLCB7bWVzc2FnZSwgY29tcGxldGVkfSBdKSA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3VjY2VzczogdHJ1ZSwgbWVzc2FnZSwgY29tcGxldGVkIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBjaGVjayB3aGV0aGVyIHRoaXMgc2l0ZSBwdWJsaXNoZWQgdG8gYSBjbGFpbVxuICBhcHAuZ2V0KCcvYXBpL2NsYWltL2F2YWlsYWJpbGl0eS86bmFtZScsICh7IGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zOiB7IG5hbWUgfSB9LCByZXMpID0+IHtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY2xhaW1OYW1lSXNBdmFpbGFibGUobmFtZSlcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHJlc3VsdCk7XG4gICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdlbmQtdG8tZW5kJywgJ2NsYWltIG5hbWUgYXZhaWxhYmlsaXR5JywgbmFtZSwgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBydW4gYSByZXNvbHZlIHJlcXVlc3Qgb24gdGhlIGRhZW1vblxuICBhcHAuZ2V0KCcvYXBpL2NsYWltL3Jlc29sdmUvOm5hbWUvOmNsYWltSWQnLCAoeyBoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICByZXNvbHZlVXJpKGAke3BhcmFtcy5uYW1lfSMke3BhcmFtcy5jbGFpbUlkfWApXG4gICAgICAudGhlbihyZXNvbHZlZFVyaSA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHJlc29sdmVkVXJpKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gcnVuIGEgcHVibGlzaCByZXF1ZXN0IG9uIHRoZSBkYWVtb25cbiAgYXBwLnBvc3QoJy9hcGkvY2xhaW0vcHVibGlzaCcsIG11bHRpcGFydE1pZGRsZXdhcmUsICh7IGJvZHksIGZpbGVzLCBoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwsIHVzZXIgfSwgcmVzKSA9PiB7XG4gICAgLy8gZGVmaW5lIHZhcmlhYmxlc1xuICAgIGxldCAgY2hhbm5lbE5hbWUsIGNoYW5uZWxJZCwgY2hhbm5lbFBhc3N3b3JkLCBkZXNjcmlwdGlvbiwgZmlsZU5hbWUsIGZpbGVQYXRoLCBmaWxlVHlwZSwgZ2FTdGFydFRpbWUsIGxpY2Vuc2UsIG5hbWUsIG5zZncsIHRodW1ibmFpbCwgdGh1bWJuYWlsRmlsZU5hbWUsIHRodW1ibmFpbEZpbGVQYXRoLCB0aHVtYm5haWxGaWxlVHlwZSwgdGl0bGU7XG4gICAgLy8gcmVjb3JkIHRoZSBzdGFydCB0aW1lIG9mIHRoZSByZXF1ZXN0XG4gICAgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIC8vIHZhbGlkYXRlIHRoZSBib2R5IGFuZCBmaWxlcyBvZiB0aGUgcmVxdWVzdFxuICAgIHRyeSB7XG4gICAgICAvLyB2YWxpZGF0ZUFwaVB1Ymxpc2hSZXF1ZXN0KGJvZHksIGZpbGVzKTtcbiAgICAgICh7bmFtZSwgbnNmdywgbGljZW5zZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCB0aHVtYm5haWx9ID0gcGFyc2VQdWJsaXNoQXBpUmVxdWVzdEJvZHkoYm9keSkpO1xuICAgICAgKHtmaWxlTmFtZSwgZmlsZVBhdGgsIGZpbGVUeXBlLCB0aHVtYm5haWxGaWxlTmFtZSwgdGh1bWJuYWlsRmlsZVBhdGgsIHRodW1ibmFpbEZpbGVUeXBlfSA9IHBhcnNlUHVibGlzaEFwaVJlcXVlc3RGaWxlcyhmaWxlcykpO1xuICAgICAgKHtjaGFubmVsTmFtZSwgY2hhbm5lbElkLCBjaGFubmVsUGFzc3dvcmR9ID0gYm9keSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICB9XG4gICAgLy8gY2hlY2sgY2hhbm5lbCBhdXRob3JpemF0aW9uXG4gICAgUHJvbWlzZS5hbGwoW1xuICAgICAgYXV0aGVudGljYXRlVXNlcihjaGFubmVsTmFtZSwgY2hhbm5lbElkLCBjaGFubmVsUGFzc3dvcmQsIHVzZXIpLFxuICAgICAgY2xhaW1OYW1lSXNBdmFpbGFibGUobmFtZSksXG4gICAgICBjcmVhdGVCYXNpY1B1Ymxpc2hQYXJhbXMoZmlsZVBhdGgsIG5hbWUsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbGljZW5zZSwgbnNmdywgdGh1bWJuYWlsKSxcbiAgICAgIGNyZWF0ZVRodW1ibmFpbFB1Ymxpc2hQYXJhbXModGh1bWJuYWlsRmlsZVBhdGgsIG5hbWUsIGxpY2Vuc2UsIG5zZncpLFxuICAgIF0pXG4gICAgICAudGhlbigoW3tjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWR9LCB2YWxpZGF0ZWRDbGFpbU5hbWUsIHB1Ymxpc2hQYXJhbXMsIHRodW1ibmFpbFB1Ymxpc2hQYXJhbXNdKSA9PiB7XG4gICAgICAgIC8vIGFkZCBjaGFubmVsIGRldGFpbHMgdG8gdGhlIHB1Ymxpc2ggcGFyYW1zXG4gICAgICAgIGlmIChjaGFubmVsTmFtZSAmJiBjaGFubmVsQ2xhaW1JZCkge1xuICAgICAgICAgIHB1Ymxpc2hQYXJhbXNbJ2NoYW5uZWxfbmFtZSddID0gY2hhbm5lbE5hbWU7XG4gICAgICAgICAgcHVibGlzaFBhcmFtc1snY2hhbm5lbF9pZCddID0gY2hhbm5lbENsYWltSWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHVibGlzaCB0aGUgdGh1bWJuYWlsXG4gICAgICAgIGlmICh0aHVtYm5haWxQdWJsaXNoUGFyYW1zKSB7XG4gICAgICAgICAgcHVibGlzaCh0aHVtYm5haWxQdWJsaXNoUGFyYW1zLCB0aHVtYm5haWxGaWxlTmFtZSwgdGh1bWJuYWlsRmlsZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHB1Ymxpc2ggdGhlIGFzc2V0XG4gICAgICAgIHJldHVybiBwdWJsaXNoKHB1Ymxpc2hQYXJhbXMsIGZpbGVOYW1lLCBmaWxlVHlwZSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogJ3B1Ymxpc2ggY29tcGxldGVkIHN1Y2Nlc3NmdWxseScsXG4gICAgICAgICAgZGF0YSAgIDoge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGNsYWltSWQ6IHJlc3VsdC5jbGFpbV9pZCxcbiAgICAgICAgICAgIHVybCAgICA6IGAke2hvc3R9LyR7cmVzdWx0LmNsYWltX2lkfS8ke25hbWV9YCxcbiAgICAgICAgICAgIGxicnlUeCA6IHJlc3VsdCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmVjb3JkIHRoZSBwdWJsaXNoIGVuZCB0aW1lIGFuZCBzZW5kIHRvIGdvb2dsZSBhbmFseXRpY3NcbiAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2VuZC10by1lbmQnLCAncHVibGlzaCcsIGZpbGVUeXBlLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIGdldCBhIHNob3J0IGNsYWltIGlkIGZyb20gbG9uZyBjbGFpbSBJZFxuICBhcHAuZ2V0KCcvYXBpL2NsYWltL3Nob3J0LWlkLzpsb25nSWQvOm5hbWUnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIGJvZHksIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBkYi5DbGFpbS5nZXRTaG9ydENsYWltSWRGcm9tTG9uZ0NsYWltSWQocGFyYW1zLmxvbmdJZCwgcGFyYW1zLm5hbWUpXG4gICAgICAudGhlbihzaG9ydElkID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGE6IHNob3J0SWR9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgYXBwLnBvc3QoJy9hcGkvY2xhaW0vbG9uZy1pZCcsICh7IGlwLCBvcmlnaW5hbFVybCwgYm9keSwgcGFyYW1zIH0sIHJlcykgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZygnYm9keTonLCBib2R5KTtcbiAgICBjb25zdCBjaGFubmVsTmFtZSA9IGJvZHkuY2hhbm5lbE5hbWU7XG4gICAgY29uc3QgY2hhbm5lbENsYWltSWQgPSBib2R5LmNoYW5uZWxDbGFpbUlkO1xuICAgIGNvbnN0IGNsYWltTmFtZSA9IGJvZHkuY2xhaW1OYW1lO1xuICAgIGNvbnN0IGNsYWltSWQgPSBib2R5LmNsYWltSWQ7XG4gICAgZ2V0Q2xhaW1JZChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltTmFtZSwgY2xhaW1JZClcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IE5PX0NIQU5ORUwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnTm8gbWF0Y2hpbmcgY2hhbm5lbCBjb3VsZCBiZSBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ID09PSBOT19DTEFJTSkge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdObyBtYXRjaGluZyBjbGFpbSBpZCBjb3VsZCBiZSBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YTogcmVzdWx0fSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG4gIGFwcC5nZXQoJy9hcGkvY2xhaW0vZGF0YS86Y2xhaW1OYW1lLzpjbGFpbUlkJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBib2R5LCBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgY29uc3QgY2xhaW1OYW1lID0gcGFyYW1zLmNsYWltTmFtZTtcbiAgICBsZXQgY2xhaW1JZCA9IHBhcmFtcy5jbGFpbUlkO1xuICAgIGlmIChjbGFpbUlkID09PSAnbm9uZScpIGNsYWltSWQgPSBudWxsO1xuICAgIGRiLkNsYWltLnJlc29sdmVDbGFpbShjbGFpbU5hbWUsIGNsYWltSWQpXG4gICAgICAudGhlbihjbGFpbUluZm8gPT4ge1xuICAgICAgICBpZiAoIWNsYWltSW5mbykge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdObyBjbGFpbSBjb3VsZCBiZSBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YTogY2xhaW1JbmZvfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIHNlZSBpZiBhc3NldCBpcyBhdmFpbGFibGUgbG9jYWxseVxuICBhcHAuZ2V0KCcvYXBpL2ZpbGUvYXZhaWxhYmlsaXR5LzpuYW1lLzpjbGFpbUlkJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHBhcmFtcy5uYW1lO1xuICAgIGNvbnN0IGNsYWltSWQgPSBwYXJhbXMuY2xhaW1JZDtcbiAgICBkYi5GaWxlLmZpbmRPbmUoe3doZXJlOiB7bmFtZSwgY2xhaW1JZH19KVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YTogdHJ1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiBmYWxzZX0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JvdXRlcy9hcGktcm91dGVzLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29ubmVjdC1tdWx0aXBhcnR5XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiY29ubmVjdC1tdWx0aXBhcnR5XCJcbi8vIG1vZHVsZSBpZCA9IDc2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IGRiID0gcmVxdWlyZSgnLi4vbW9kZWxzJyk7XG5jb25zdCBsYnJ5QXBpID0gcmVxdWlyZSgnLi4vaGVscGVycy9sYnJ5QXBpLmpzJyk7XG5jb25zdCBwdWJsaXNoSGVscGVycyA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvcHVibGlzaEhlbHBlcnMuanMnKTtcbmNvbnN0IHsgcHVibGlzaGluZzogeyBwcmltYXJ5Q2xhaW1BZGRyZXNzLCBhZGRpdGlvbmFsQ2xhaW1BZGRyZXNzZXMgfSB9ID0gcmVxdWlyZSgnLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcbmNvbnN0IFNlcXVlbGl6ZSA9IHJlcXVpcmUoJ3NlcXVlbGl6ZScpO1xuY29uc3QgT3AgPSBTZXF1ZWxpemUuT3A7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwdWJsaXNoIChwdWJsaXNoUGFyYW1zLCBmaWxlTmFtZSwgZmlsZVR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHB1Ymxpc2hSZXN1bHRzLCBjZXJ0aWZpY2F0ZUlkLCBjaGFubmVsTmFtZTtcbiAgICAgIC8vIHB1Ymxpc2ggdGhlIGZpbGVcbiAgICAgIHJldHVybiBsYnJ5QXBpLnB1Ymxpc2hDbGFpbShwdWJsaXNoUGFyYW1zKVxuICAgICAgICAudGhlbih0eCA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFN1Y2Nlc3NmdWxseSBwdWJsaXNoZWQgJHtwdWJsaXNoUGFyYW1zLm5hbWV9ICR7ZmlsZU5hbWV9YCwgdHgpO1xuICAgICAgICAgIHB1Ymxpc2hSZXN1bHRzID0gdHg7XG4gICAgICAgICAgLy8gZ2V0IHRoZSBjaGFubmVsIGluZm9ybWF0aW9uXG4gICAgICAgICAgaWYgKHB1Ymxpc2hQYXJhbXMuY2hhbm5lbF9uYW1lKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYHRoaXMgY2xhaW0gd2FzIHB1Ymxpc2hlZCBpbiBjaGFubmVsOiAke3B1Ymxpc2hQYXJhbXMuY2hhbm5lbF9uYW1lfWApO1xuICAgICAgICAgICAgcmV0dXJuIGRiLkNoYW5uZWwuZmluZE9uZSh7d2hlcmU6IHtjaGFubmVsTmFtZTogcHVibGlzaFBhcmFtcy5jaGFubmVsX25hbWV9fSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygndGhpcyBjbGFpbSB3YXMgbm90IHB1Ymxpc2hlZCBpbiBhIGNoYW5uZWwnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oY2hhbm5lbCA9PiB7XG4gICAgICAgIC8vIHNldCBjaGFubmVsIGluZm9ybWF0aW9uXG4gICAgICAgICAgY2VydGlmaWNhdGVJZCA9IG51bGw7XG4gICAgICAgICAgY2hhbm5lbE5hbWUgPSBudWxsO1xuICAgICAgICAgIGlmIChjaGFubmVsKSB7XG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZUlkID0gY2hhbm5lbC5jaGFubmVsQ2xhaW1JZDtcbiAgICAgICAgICAgIGNoYW5uZWxOYW1lID0gY2hhbm5lbC5jaGFubmVsTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBjZXJ0aWZpY2F0ZUlkOiAke2NlcnRpZmljYXRlSWR9YCk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gY3JlYXRlIHRoZSBGaWxlIHJlY29yZFxuICAgICAgICAgIGNvbnN0IGZpbGVSZWNvcmQgPSB7XG4gICAgICAgICAgICBuYW1lICAgICAgIDogcHVibGlzaFBhcmFtcy5uYW1lLFxuICAgICAgICAgICAgY2xhaW1JZCAgICA6IHB1Ymxpc2hSZXN1bHRzLmNsYWltX2lkLFxuICAgICAgICAgICAgdGl0bGUgICAgICA6IHB1Ymxpc2hQYXJhbXMubWV0YWRhdGEudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcHVibGlzaFBhcmFtcy5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGFkZHJlc3MgICAgOiBwdWJsaXNoUGFyYW1zLmNsYWltX2FkZHJlc3MsXG4gICAgICAgICAgICBvdXRwb2ludCAgIDogYCR7cHVibGlzaFJlc3VsdHMudHhpZH06JHtwdWJsaXNoUmVzdWx0cy5ub3V0fWAsXG4gICAgICAgICAgICBoZWlnaHQgICAgIDogMCxcbiAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgZmlsZVBhdGggICA6IHB1Ymxpc2hQYXJhbXMuZmlsZV9wYXRoLFxuICAgICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgICAgICBuc2Z3ICAgICAgIDogcHVibGlzaFBhcmFtcy5tZXRhZGF0YS5uc2Z3LFxuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gY3JlYXRlIHRoZSBDbGFpbSByZWNvcmRcbiAgICAgICAgICBjb25zdCBjbGFpbVJlY29yZCA9IHtcbiAgICAgICAgICAgIG5hbWUgICAgICAgOiBwdWJsaXNoUGFyYW1zLm5hbWUsXG4gICAgICAgICAgICBjbGFpbUlkICAgIDogcHVibGlzaFJlc3VsdHMuY2xhaW1faWQsXG4gICAgICAgICAgICB0aXRsZSAgICAgIDogcHVibGlzaFBhcmFtcy5tZXRhZGF0YS50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBwdWJsaXNoUGFyYW1zLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYWRkcmVzcyAgICA6IHB1Ymxpc2hQYXJhbXMuY2xhaW1fYWRkcmVzcyxcbiAgICAgICAgICAgIHRodW1ibmFpbCAgOiBwdWJsaXNoUGFyYW1zLm1ldGFkYXRhLnRodW1ibmFpbCxcbiAgICAgICAgICAgIG91dHBvaW50ICAgOiBgJHtwdWJsaXNoUmVzdWx0cy50eGlkfToke3B1Ymxpc2hSZXN1bHRzLm5vdXR9YCxcbiAgICAgICAgICAgIGhlaWdodCAgICAgOiAwLFxuICAgICAgICAgICAgY29udGVudFR5cGU6IGZpbGVUeXBlLFxuICAgICAgICAgICAgbnNmdyAgICAgICA6IHB1Ymxpc2hQYXJhbXMubWV0YWRhdGEubnNmdyxcbiAgICAgICAgICAgIGFtb3VudCAgICAgOiBwdWJsaXNoUGFyYW1zLmJpZCxcbiAgICAgICAgICAgIGNlcnRpZmljYXRlSWQsXG4gICAgICAgICAgICBjaGFubmVsTmFtZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIHVwc2VydCBjcml0ZXJpYVxuICAgICAgICAgIGNvbnN0IHVwc2VydENyaXRlcmlhID0ge1xuICAgICAgICAgICAgbmFtZSAgIDogcHVibGlzaFBhcmFtcy5uYW1lLFxuICAgICAgICAgICAgY2xhaW1JZDogcHVibGlzaFJlc3VsdHMuY2xhaW1faWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyB1cHNlcnQgdGhlIHJlY29yZHNcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW2RiLnVwc2VydChkYi5GaWxlLCBmaWxlUmVjb3JkLCB1cHNlcnRDcml0ZXJpYSwgJ0ZpbGUnKSwgZGIudXBzZXJ0KGRiLkNsYWltLCBjbGFpbVJlY29yZCwgdXBzZXJ0Q3JpdGVyaWEsICdDbGFpbScpXSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChbZmlsZSwgY2xhaW1dKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGaWxlIGFuZCBDbGFpbSByZWNvcmRzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkJyk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtmaWxlLnNldENsYWltKGNsYWltKSwgY2xhaW0uc2V0RmlsZShmaWxlKV0pO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGaWxlIGFuZCBDbGFpbSByZWNvcmRzIHN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkJyk7XG4gICAgICAgICAgcmVzb2x2ZShwdWJsaXNoUmVzdWx0cyk7IC8vIHJlc29sdmUgdGhlIHByb21pc2Ugd2l0aCB0aGUgcmVzdWx0IGZyb20gbGJyeUFwaS5wdWJsaXNoQ2xhaW07XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdQVUJMSVNIIEVSUk9SJywgZXJyb3IpO1xuICAgICAgICAgIHB1Ymxpc2hIZWxwZXJzLmRlbGV0ZVRlbXBvcmFyeUZpbGUocHVibGlzaFBhcmFtcy5maWxlX3BhdGgpOyAvLyBkZWxldGUgdGhlIGxvY2FsIGZpbGVcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgY2xhaW1OYW1lSXNBdmFpbGFibGUgKG5hbWUpIHtcbiAgICBjb25zdCBjbGFpbUFkZHJlc3NlcyA9IGFkZGl0aW9uYWxDbGFpbUFkZHJlc3NlcyB8fCBbXTtcbiAgICBjbGFpbUFkZHJlc3Nlcy5wdXNoKHByaW1hcnlDbGFpbUFkZHJlc3MpO1xuICAgIC8vIGZpbmQgYW55IHJlY29yZHMgd2hlcmUgdGhlIG5hbWUgaXMgdXNlZFxuICAgIHJldHVybiBkYi5DbGFpbVxuICAgICAgLmZpbmRBbGwoe1xuICAgICAgICBhdHRyaWJ1dGVzOiBbJ2FkZHJlc3MnXSxcbiAgICAgICAgd2hlcmUgICAgIDoge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgYWRkcmVzczoge1xuICAgICAgICAgICAgW09wLm9yXTogY2xhaW1BZGRyZXNzZXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGF0IGNsYWltIGlzIGFscmVhZHkgaW4gdXNlJyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gIH0sXG4gIGNoZWNrQ2hhbm5lbEF2YWlsYWJpbGl0eSAobmFtZSkge1xuICAgIHJldHVybiBkYi5DaGFubmVsXG4gICAgICAuZmluZEFsbCh7XG4gICAgICAgIHdoZXJlOiB7IGNoYW5uZWxOYW1lOiBuYW1lIH0sXG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhhdCBjaGFubmVsIGhhcyBhbHJlYWR5IGJlZW4gY2xhaW1lZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY29udHJvbGxlcnMvcHVibGlzaENvbnRyb2xsZXIuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImZzXCJcbi8vIG1vZHVsZSBpZCA9IDc4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IGRiID0gcmVxdWlyZSgnLi4vbW9kZWxzJyk7XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhdXRoZW50aWNhdGVVc2VyIChjaGFubmVsTmFtZSwgY2hhbm5lbElkLCBjaGFubmVsUGFzc3dvcmQsIHVzZXIpIHtcbiAgICAvLyBjYXNlOiBubyBjaGFubmVsTmFtZSBvciBjaGFubmVsIElkIGFyZSBwcm92aWRlZCAoYW5vbnltb3VzKSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHVzZXIgdG9rZW4gaXMgcHJvdmlkZWRcbiAgICBpZiAoIWNoYW5uZWxOYW1lICYmICFjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5uZWxOYW1lICAgOiBudWxsLFxuICAgICAgICBjaGFubmVsQ2xhaW1JZDogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIGNhc2U6IGNoYW5uZWxOYW1lIG9yIGNoYW5uZWwgSWQgYXJlIHByb3ZpZGVkIHdpdGggdXNlciB0b2tlblxuICAgIGlmICh1c2VyKSB7XG4gICAgICBpZiAoY2hhbm5lbE5hbWUgJiYgY2hhbm5lbE5hbWUgIT09IHVzZXIuY2hhbm5lbE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgcHJvdmlkZWQgY2hhbm5lbCBuYW1lIGRvZXMgbm90IG1hdGNoIHVzZXIgY3JlZGVudGlhbHMnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFubmVsSWQgJiYgY2hhbm5lbElkICE9PSB1c2VyLmNoYW5uZWxDbGFpbUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHByb3ZpZGVkIGNoYW5uZWwgaWQgZG9lcyBub3QgbWF0Y2ggdXNlciBjcmVkZW50aWFscycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbm5lbE5hbWUgICA6IHVzZXIuY2hhbm5lbE5hbWUsXG4gICAgICAgIGNoYW5uZWxDbGFpbUlkOiB1c2VyLmNoYW5uZWxDbGFpbUlkLFxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gY2FzZTogY2hhbm5lbE5hbWUgb3IgY2hhbm5lbCBJZCBhcmUgcHJvdmlkZWQgd2l0aCBwYXNzd29yZCBpbnN0ZWFkIG9mIHVzZXIgdG9rZW5cbiAgICBpZiAoIWNoYW5uZWxQYXNzd29yZCkgdGhyb3cgbmV3IEVycm9yKCdubyBjaGFubmVsIHBhc3N3b3JkIHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmF1dGhlbnRpY2F0ZUNoYW5uZWxDcmVkZW50aWFscyhjaGFubmVsTmFtZSwgY2hhbm5lbElkLCBjaGFubmVsUGFzc3dvcmQpO1xuICB9LFxuICBhdXRoZW50aWNhdGVDaGFubmVsQ3JlZGVudGlhbHMgKGNoYW5uZWxOYW1lLCBjaGFubmVsSWQsIHVzZXJQYXNzd29yZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBob2lzdGVkIHZhcmlhYmxlc1xuICAgICAgbGV0IGNoYW5uZWxEYXRhO1xuICAgICAgLy8gYnVpbGQgdGhlIHBhcmFtcyBmb3IgZmluZGluZyB0aGUgY2hhbm5lbFxuICAgICAgbGV0IGNoYW5uZWxGaW5kUGFyYW1zID0ge307XG4gICAgICBpZiAoY2hhbm5lbE5hbWUpIGNoYW5uZWxGaW5kUGFyYW1zWydjaGFubmVsTmFtZSddID0gY2hhbm5lbE5hbWU7XG4gICAgICBpZiAoY2hhbm5lbElkKSBjaGFubmVsRmluZFBhcmFtc1snY2hhbm5lbENsYWltSWQnXSA9IGNoYW5uZWxJZDtcbiAgICAgIC8vIGZpbmQgdGhlIGNoYW5uZWxcbiAgICAgIGRiLkNoYW5uZWxcbiAgICAgICAgLmZpbmRPbmUoe1xuICAgICAgICAgIHdoZXJlOiBjaGFubmVsRmluZFBhcmFtcyxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oY2hhbm5lbCA9PiB7XG4gICAgICAgICAgaWYgKCFjaGFubmVsKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ25vIGNoYW5uZWwgZm91bmQnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkLCB5b3UgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoYXQgY2hhbm5lbCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGFubmVsRGF0YSA9IGNoYW5uZWwuZ2V0KCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdjaGFubmVsIGRhdGE6JywgY2hhbm5lbERhdGEpO1xuICAgICAgICAgIHJldHVybiBkYi5Vc2VyLmZpbmRPbmUoe1xuICAgICAgICAgICAgd2hlcmU6IHsgdXNlck5hbWU6IGNoYW5uZWxEYXRhLmNoYW5uZWxOYW1lLnN1YnN0cmluZygxKSB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbih1c2VyID0+IHtcbiAgICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnbm8gdXNlciBmb3VuZCcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiBmYWlsZWQsIHlvdSBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhhdCBjaGFubmVsJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1c2VyLmNvbXBhcmVQYXNzd29yZCh1c2VyUGFzc3dvcmQpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihpc01hdGNoID0+IHtcbiAgICAgICAgICBpZiAoIWlzTWF0Y2gpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnaW5jb3JyZWN0IHBhc3N3b3JkJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCwgeW91IGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGF0IGNoYW5uZWwnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCcuLi5wYXNzd29yZCB3YXMgYSBtYXRjaC4uLicpO1xuICAgICAgICAgIHJlc29sdmUoY2hhbm5lbERhdGEpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2F1dGgvYXV0aGVudGljYXRpb24uanMiLCJjb25zdCBDTEFJTVNfUEVSX1BBR0UgPSAxMjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJldHVyblBhZ2luYXRlZENoYW5uZWxDbGFpbXMgKGNoYW5uZWxOYW1lLCBsb25nQ2hhbm5lbENsYWltSWQsIGNsYWltcywgcGFnZSkge1xuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBtb2R1bGUuZXhwb3J0cy5kZXRlcm1pbmVUb3RhbFBhZ2VzKGNsYWltcyk7XG4gICAgY29uc3QgcGFnaW5hdGlvblBhZ2UgPSBtb2R1bGUuZXhwb3J0cy5nZXRQYWdlRnJvbVF1ZXJ5KHBhZ2UpO1xuICAgIGNvbnN0IHZpZXdEYXRhID0ge1xuICAgICAgY2hhbm5lbE5hbWUgICAgICAgOiBjaGFubmVsTmFtZSxcbiAgICAgIGxvbmdDaGFubmVsQ2xhaW1JZDogbG9uZ0NoYW5uZWxDbGFpbUlkLFxuICAgICAgY2xhaW1zICAgICAgICAgICAgOiBtb2R1bGUuZXhwb3J0cy5leHRyYWN0UGFnZUZyb21DbGFpbXMoY2xhaW1zLCBwYWdpbmF0aW9uUGFnZSksXG4gICAgICBwcmV2aW91c1BhZ2UgICAgICA6IG1vZHVsZS5leHBvcnRzLmRldGVybWluZVByZXZpb3VzUGFnZShwYWdpbmF0aW9uUGFnZSksXG4gICAgICBjdXJyZW50UGFnZSAgICAgICA6IHBhZ2luYXRpb25QYWdlLFxuICAgICAgbmV4dFBhZ2UgICAgICAgICAgOiBtb2R1bGUuZXhwb3J0cy5kZXRlcm1pbmVOZXh0UGFnZSh0b3RhbFBhZ2VzLCBwYWdpbmF0aW9uUGFnZSksXG4gICAgICB0b3RhbFBhZ2VzICAgICAgICA6IHRvdGFsUGFnZXMsXG4gICAgICB0b3RhbFJlc3VsdHMgICAgICA6IG1vZHVsZS5leHBvcnRzLmRldGVybWluZVRvdGFsQ2xhaW1zKGNsYWltcyksXG4gICAgfTtcbiAgICByZXR1cm4gdmlld0RhdGE7XG4gIH0sXG4gIGdldFBhZ2VGcm9tUXVlcnkgKHBhZ2UpIHtcbiAgICBpZiAocGFnZSkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHBhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZXh0cmFjdFBhZ2VGcm9tQ2xhaW1zIChjbGFpbXMsIHBhZ2VOdW1iZXIpIHtcbiAgICBpZiAoIWNsYWltcykge1xuICAgICAgcmV0dXJuIFtdOyAgLy8gaWYgbm8gY2xhaW1zLCByZXR1cm4gdGhpcyBkZWZhdWx0XG4gICAgfVxuICAgIC8vIGxvZ2dlci5kZWJ1ZygnY2xhaW1zIGlzIGFycmF5PycsIEFycmF5LmlzQXJyYXkoY2xhaW1zKSk7XG4gICAgLy8gbG9nZ2VyLmRlYnVnKGBwYWdlTnVtYmVyICR7cGFnZU51bWJlcn0gaXMgbnVtYmVyP2AsIE51bWJlci5pc0ludGVnZXIocGFnZU51bWJlcikpO1xuICAgIGNvbnN0IGNsYWltU3RhcnRJbmRleCA9IChwYWdlTnVtYmVyIC0gMSkgKiBDTEFJTVNfUEVSX1BBR0U7XG4gICAgY29uc3QgY2xhaW1FbmRJbmRleCA9IGNsYWltU3RhcnRJbmRleCArIENMQUlNU19QRVJfUEFHRTtcbiAgICBjb25zdCBwYWdlT2ZDbGFpbXMgPSBjbGFpbXMuc2xpY2UoY2xhaW1TdGFydEluZGV4LCBjbGFpbUVuZEluZGV4KTtcbiAgICByZXR1cm4gcGFnZU9mQ2xhaW1zO1xuICB9LFxuICBkZXRlcm1pbmVUb3RhbFBhZ2VzIChjbGFpbXMpIHtcbiAgICBpZiAoIWNsYWltcykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRvdGFsQ2xhaW1zID0gY2xhaW1zLmxlbmd0aDtcbiAgICAgIGlmICh0b3RhbENsYWltcyA8IENMQUlNU19QRVJfUEFHRSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZ1bGxQYWdlcyA9IE1hdGguZmxvb3IodG90YWxDbGFpbXMgLyBDTEFJTVNfUEVSX1BBR0UpO1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gdG90YWxDbGFpbXMgJSBDTEFJTVNfUEVSX1BBR0U7XG4gICAgICBpZiAocmVtYWluZGVyID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmdWxsUGFnZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVsbFBhZ2VzICsgMTtcbiAgICB9XG4gIH0sXG4gIGRldGVybWluZVByZXZpb3VzUGFnZSAoY3VycmVudFBhZ2UpIHtcbiAgICBpZiAoY3VycmVudFBhZ2UgPT09IDEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFBhZ2UgLSAxO1xuICB9LFxuICBkZXRlcm1pbmVOZXh0UGFnZSAodG90YWxQYWdlcywgY3VycmVudFBhZ2UpIHtcbiAgICBpZiAoY3VycmVudFBhZ2UgPT09IHRvdGFsUGFnZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFBhZ2UgKyAxO1xuICB9LFxuICBkZXRlcm1pbmVUb3RhbENsYWltcyAoY2xhaW1zKSB7XG4gICAgaWYgKCFjbGFpbXMpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gY2xhaW1zLmxlbmd0aDtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9oZWxwZXJzL2NoYW5uZWxQYWdpbmF0aW9uLmpzIiwiY29uc3QgeyBkZXRhaWxzOiBob3N0IH0gPSByZXF1aXJlKCcuLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuY29uc3QgaGFuZGxlUGFnZVJlbmRlciA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvaGFuZGxlUGFnZVJlbmRlci5qc3gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoYXBwKSA9PiB7XG4gIC8vIHJvdXRlIGZvciB0aGUgaG9tZSBwYWdlXG4gIGFwcC5nZXQoJy8nLCAocmVxLCByZXMpID0+IHtcbiAgICBoYW5kbGVQYWdlUmVuZGVyKHJlcSwgcmVzKTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIGRpc3BsYXkgbG9naW4gcGFnZVxuICBhcHAuZ2V0KCcvbG9naW4nLCAocmVxLCByZXMpID0+IHtcbiAgICBoYW5kbGVQYWdlUmVuZGVyKHJlcSwgcmVzKTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIHNob3cgJ2Fib3V0JyBwYWdlXG4gIGFwcC5nZXQoJy9hYm91dCcsIChyZXEsIHJlcykgPT4ge1xuICAgIGhhbmRsZVBhZ2VSZW5kZXIocmVxLCByZXMpO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gZGlzcGxheSBhIGxpc3Qgb2YgdGhlIHRyZW5kaW5nIGltYWdlc1xuICBhcHAuZ2V0KCcvdHJlbmRpbmcnLCAocmVxLCByZXMpID0+IHtcbiAgICByZXMuc3RhdHVzKDMwMSkucmVkaXJlY3QoJy9wb3B1bGFyJyk7XG4gIH0pO1xuICBhcHAuZ2V0KCcvcG9wdWxhcicsIChyZXEsIHJlcykgPT4ge1xuICAgIGhhbmRsZVBhZ2VSZW5kZXIocmVxLCByZXMpO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gZGlzcGxheSBhIGxpc3Qgb2YgdGhlIHRyZW5kaW5nIGltYWdlc1xuICBhcHAuZ2V0KCcvbmV3JywgKHJlcSwgcmVzKSA9PiB7XG4gICAgaGFuZGxlUGFnZVJlbmRlcihyZXEsIHJlcyk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBzZW5kIGVtYmVkYWJsZSB2aWRlbyBwbGF5ZXIgKGZvciB0d2l0dGVyKVxuICBhcHAuZ2V0KCcvZW1iZWQvOmNsYWltSWQvOm5hbWUnLCAoeyBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgY29uc3QgY2xhaW1JZCA9IHBhcmFtcy5jbGFpbUlkO1xuICAgIGNvbnN0IG5hbWUgPSBwYXJhbXMubmFtZTtcbiAgICAvLyBnZXQgYW5kIHJlbmRlciB0aGUgY29udGVudFxuICAgIHJlcy5zdGF0dXMoMjAwKS5yZW5kZXIoJ2VtYmVkJywgeyBsYXlvdXQ6ICdlbWJlZCcsIGhvc3QsIGNsYWltSWQsIG5hbWUgfSk7XG4gIH0pO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JvdXRlcy9wYWdlLXJvdXRlcy5qcyIsImltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL3B1Ymxpc2hfYWN0aW9uX3R5cGVzJztcbmltcG9ydCB7IExPR0lOIH0gZnJvbSAnY29uc3RhbnRzL3B1Ymxpc2hfY2hhbm5lbF9zZWxlY3Rfc3RhdGVzJztcbmNvbnN0IHsgcHVibGlzaGluZyB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBkaXNhYmxlZCAgICAgICAgICA6IHB1Ymxpc2hpbmcuZGlzYWJsZWQsXG4gIGRpc2FibGVkTWVzc2FnZSAgIDogcHVibGlzaGluZy5kaXNhYmxlZE1lc3NhZ2UsXG4gIHB1Ymxpc2hJbkNoYW5uZWwgIDogZmFsc2UsXG4gIHNlbGVjdGVkQ2hhbm5lbCAgIDogTE9HSU4sXG4gIHNob3dNZXRhZGF0YUlucHV0czogZmFsc2UsXG4gIHN0YXR1cyAgICAgICAgICAgIDoge1xuICAgIHN0YXR1cyA6IG51bGwsXG4gICAgbWVzc2FnZTogbnVsbCxcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICBmaWxlICAgICAgICAgOiBudWxsLFxuICAgIHVybCAgICAgICAgICA6IG51bGwsXG4gICAgY2hhbm5lbCAgICAgIDogbnVsbCxcbiAgICBwdWJsaXNoU3VibWl0OiBudWxsLFxuICB9LFxuICBmaWxlICAgIDogbnVsbCxcbiAgY2xhaW0gICA6ICcnLFxuICBtZXRhZGF0YToge1xuICAgIHRpdGxlICAgICAgOiAnJyxcbiAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgbGljZW5zZSAgICA6ICcnLFxuICAgIG5zZncgICAgICAgOiBmYWxzZSxcbiAgfSxcbiAgdGh1bWJuYWlsOiBudWxsLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgYWN0aW9ucy5GSUxFX1NFTEVDVEVEOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGluaXRpYWxTdGF0ZSwgeyAgLy8gbm90ZTogY2xlYXJzIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgICAgZmlsZTogYWN0aW9uLmRhdGEsXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuRklMRV9DTEVBUjpcbiAgICAgIHJldHVybiBpbml0aWFsU3RhdGU7XG4gICAgY2FzZSBhY3Rpb25zLk1FVEFEQVRBX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBtZXRhZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUubWV0YWRhdGEsIHtcbiAgICAgICAgICBbYWN0aW9uLmRhdGEubmFtZV06IGFjdGlvbi5kYXRhLnZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5DTEFJTV9VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgY2xhaW06IGFjdGlvbi5kYXRhLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLlNFVF9QVUJMSVNIX0lOX0NIQU5ORUw6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgcHVibGlzaEluQ2hhbm5lbDogYWN0aW9uLmNoYW5uZWwsXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuUFVCTElTSF9TVEFUVVNfVVBEQVRFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHN0YXR1czogYWN0aW9uLmRhdGEsXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuRVJST1JfVVBEQVRFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGVycm9yOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5lcnJvciwge1xuICAgICAgICAgIFthY3Rpb24uZGF0YS5uYW1lXTogYWN0aW9uLmRhdGEudmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLlNFTEVDVEVEX0NIQU5ORUxfVVBEQVRFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHNlbGVjdGVkQ2hhbm5lbDogYWN0aW9uLmRhdGEsXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuVE9HR0xFX01FVEFEQVRBX0lOUFVUUzpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBzaG93TWV0YWRhdGFJbnB1dHM6IGFjdGlvbi5kYXRhLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLlRIVU1CTkFJTF9ORVc6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgdGh1bWJuYWlsOiBhY3Rpb24uZGF0YSxcbiAgICAgIH0pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L3JlZHVjZXJzL3B1Ymxpc2guanMiLCJpbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJ2NvbnN0YW50cy9jaGFubmVsX2FjdGlvbl90eXBlcyc7XG5cbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgbG9nZ2VkSW5DaGFubmVsOiB7XG4gICAgbmFtZSAgIDogbnVsbCxcbiAgICBzaG9ydElkOiBudWxsLFxuICAgIGxvbmdJZCA6IG51bGwsXG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3RhdGUgPSBpbml0aWFsU3RhdGUsIGFjdGlvbikge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBhY3Rpb25zLkNIQU5ORUxfVVBEQVRFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGxvZ2dlZEluQ2hhbm5lbDogYWN0aW9uLmRhdGEsXG4gICAgICB9KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9yZWR1Y2Vycy9jaGFubmVsLmpzIiwiaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMnO1xuaW1wb3J0IHsgTE9DQUxfQ0hFQ0ssIEVSUk9SIH0gZnJvbSAnY29uc3RhbnRzL2Fzc2V0X2Rpc3BsYXlfc3RhdGVzJztcblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICByZXF1ZXN0OiB7XG4gICAgZXJyb3I6IG51bGwsXG4gICAgdHlwZSA6IG51bGwsXG4gICAgaWQgICA6IG51bGwsXG4gIH0sXG4gIHJlcXVlc3RMaXN0IDoge30sXG4gIGNoYW5uZWxMaXN0IDoge30sXG4gIGFzc2V0TGlzdCAgIDoge30sXG4gIGRpc3BsYXlBc3NldDoge1xuICAgIGVycm9yIDogbnVsbCxcbiAgICBzdGF0dXM6IExPQ0FMX0NIRUNLLFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIC8vIGhhbmRsZSByZXF1ZXN0XG4gICAgY2FzZSBhY3Rpb25zLlJFUVVFU1RfRVJST1I6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgcmVxdWVzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVxdWVzdCwge1xuICAgICAgICAgIGVycm9yOiBhY3Rpb24uZGF0YSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuUkVRVUVTVF9VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgcmVxdWVzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVxdWVzdCwge1xuICAgICAgICAgIHR5cGU6IGFjdGlvbi5kYXRhLnJlcXVlc3RUeXBlLFxuICAgICAgICAgIGlkICA6IGFjdGlvbi5kYXRhLnJlcXVlc3RJZCxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAvLyBzdG9yZSByZXF1ZXN0c1xuICAgIGNhc2UgYWN0aW9ucy5SRVFVRVNUX0xJU1RfQUREOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHJlcXVlc3RMaXN0OiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZXF1ZXN0TGlzdCwge1xuICAgICAgICAgIFthY3Rpb24uZGF0YS5pZF06IHtcbiAgICAgICAgICAgIGVycm9yOiBhY3Rpb24uZGF0YS5lcnJvcixcbiAgICAgICAgICAgIGtleSAgOiBhY3Rpb24uZGF0YS5rZXksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAvLyBhc3NldCBkYXRhXG4gICAgY2FzZSBhY3Rpb25zLkFTU0VUX0FERDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBhc3NldExpc3Q6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmFzc2V0TGlzdCwge1xuICAgICAgICAgIFthY3Rpb24uZGF0YS5pZF06IHtcbiAgICAgICAgICAgIGVycm9yICAgIDogYWN0aW9uLmRhdGEuZXJyb3IsXG4gICAgICAgICAgICBuYW1lICAgICA6IGFjdGlvbi5kYXRhLm5hbWUsXG4gICAgICAgICAgICBjbGFpbUlkICA6IGFjdGlvbi5kYXRhLmNsYWltSWQsXG4gICAgICAgICAgICBzaG9ydElkICA6IGFjdGlvbi5kYXRhLnNob3J0SWQsXG4gICAgICAgICAgICBjbGFpbURhdGE6IGFjdGlvbi5kYXRhLmNsYWltRGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIC8vIGNoYW5uZWwgZGF0YVxuICAgIGNhc2UgYWN0aW9ucy5DSEFOTkVMX0FERDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBjaGFubmVsTGlzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuY2hhbm5lbExpc3QsIHtcbiAgICAgICAgICBbYWN0aW9uLmRhdGEuaWRdOiB7XG4gICAgICAgICAgICBuYW1lICAgICAgOiBhY3Rpb24uZGF0YS5uYW1lLFxuICAgICAgICAgICAgbG9uZ0lkICAgIDogYWN0aW9uLmRhdGEubG9uZ0lkLFxuICAgICAgICAgICAgc2hvcnRJZCAgIDogYWN0aW9uLmRhdGEuc2hvcnRJZCxcbiAgICAgICAgICAgIGNsYWltc0RhdGE6IGFjdGlvbi5kYXRhLmNsYWltc0RhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX1NVQ0NFU1M6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgY2hhbm5lbExpc3Q6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmNoYW5uZWxMaXN0LCB7XG4gICAgICAgICAgW2FjdGlvbi5kYXRhLmNoYW5uZWxMaXN0SWRdOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5jaGFubmVsTGlzdFthY3Rpb24uZGF0YS5jaGFubmVsTGlzdElkXSwge1xuICAgICAgICAgICAgY2xhaW1zRGF0YTogYWN0aW9uLmRhdGEuY2xhaW1zRGF0YSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAvLyBkaXNwbGF5IGFuIGFzc2V0XG4gICAgY2FzZSBhY3Rpb25zLkZJTEVfQVZBSUxBQklMSVRZX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBkaXNwbGF5QXNzZXQ6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmRpc3BsYXlBc3NldCwge1xuICAgICAgICAgIHN0YXR1czogYWN0aW9uLmRhdGEsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLkRJU1BMQVlfQVNTRVRfRVJST1I6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgZGlzcGxheUFzc2V0OiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5kaXNwbGF5QXNzZXQsIHtcbiAgICAgICAgICBlcnJvciA6IGFjdGlvbi5kYXRhLFxuICAgICAgICAgIHN0YXR1czogRVJST1IsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvcmVkdWNlcnMvc2hvdy5qcyIsImNvbnN0IHsgZGV0YWlsczogeyBob3N0IH0gfSA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5cbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgaG9zdDogaG9zdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9yZWR1Y2Vycy9zaXRlLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtZ2FcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWFjdC1nYVwiXG4vLyBtb2R1bGUgaWQgPSA4NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNFTyBmcm9tICdjb21wb25lbnRzL1NFTyc7XG5pbXBvcnQgTmF2QmFyIGZyb20gJ2NvbnRhaW5lcnMvTmF2QmFyJztcbmltcG9ydCBQdWJsaXNoVG9vbCBmcm9tICdjb250YWluZXJzL1B1Ymxpc2hUb29sJztcblxuY2xhc3MgSG9tZVBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17J3JvdyByb3ctLXRhbGwgZmxleC1jb250YWluZXItLWNvbHVtbid9PlxuICAgICAgICA8U0VPIC8+XG4gICAgICAgIDxOYXZCYXIgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9eydyb3cgcm93LS10YWxsIHJvdy0tcGFkZGVkIGZsZXgtY29udGFpbmVyLS1jb2x1bW4nfT5cbiAgICAgICAgICA8UHVibGlzaFRvb2wgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBIb21lUGFnZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbXBvbmVudHMvSG9tZVBhZ2UvaW5kZXguanN4IiwiY29uc3QgeyBkZXRhaWxzOiB7IHRpdGxlIH0gfSA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYWdlVGl0bGUgPSAocGFnZVRpdGxlKSA9PiB7XG4gIGlmICghcGFnZVRpdGxlKSB7XG4gICAgcmV0dXJuIGAke3RpdGxlfWA7XG4gIH1cbiAgcmV0dXJuIGAke3RpdGxlfSAtICR7cGFnZVRpdGxlfWA7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvdXRpbHMvcGFnZVRpdGxlLmpzIiwiY29uc3QgeyBkZXRhaWxzOiB7IHRpdGxlLCBob3N0LCBkZXNjcmlwdGlvbiB9LCBhc3NldERlZmF1bHRzOiB7IHRodW1ibmFpbDogZGVmYXVsdFRodW1ibmFpbCwgZGVzY3JpcHRpb246IGRlZmF1bHREZXNjcmlwdGlvbiB9IH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuXG5jb25zdCBkZXRlcm1pbmVPZ1RodW1ibmFpbENvbnRlbnRUeXBlID0gKHRodW1ibmFpbCkgPT4ge1xuICBpZiAodGh1bWJuYWlsKSB7XG4gICAgY29uc3QgZmlsZUV4dCA9IHRodW1ibmFpbC5zdWJzdHJpbmcodGh1bWJuYWlsLmxhc3RJbmRleE9mKCcuJykpO1xuICAgIHN3aXRjaCAoZmlsZUV4dCkge1xuICAgICAgY2FzZSAnanBlZyc6XG4gICAgICBjYXNlICdqcGcnOlxuICAgICAgICByZXR1cm4gJ2ltYWdlL2pwZWcnO1xuICAgICAgY2FzZSAncG5nJzpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9wbmcnO1xuICAgICAgY2FzZSAnZ2lmJzpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9naWYnO1xuICAgICAgY2FzZSAnbXA0JzpcbiAgICAgICAgcmV0dXJuICd2aWRlby9tcDQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9qcGVnJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufTtcblxuY29uc3QgY3JlYXRlQmFzaWNNZXRhVGFncyA9ICgpID0+IHtcbiAgcmV0dXJuIFtcbiAgICB7cHJvcGVydHk6ICdvZzp0aXRsZScsIGNvbnRlbnQ6IHRpdGxlfSxcbiAgICB7cHJvcGVydHk6ICdvZzp1cmwnLCBjb250ZW50OiBob3N0fSxcbiAgICB7cHJvcGVydHk6ICdvZzpzaXRlX25hbWUnLCBjb250ZW50OiB0aXRsZX0sXG4gICAge3Byb3BlcnR5OiAnb2c6ZGVzY3JpcHRpb24nLCBjb250ZW50OiBkZXNjcmlwdGlvbn0sXG4gICAge3Byb3BlcnR5OiAndHdpdHRlcjpzaXRlJywgY29udGVudDogJ0BzcGVlX2NoJ30sXG4gICAge3Byb3BlcnR5OiAndHdpdHRlcjpjYXJkJywgY29udGVudDogJ3N1bW1hcnknfSxcbiAgXTtcbn07XG5cbmNvbnN0IGNyZWF0ZUNoYW5uZWxNZXRhVGFncyA9IChjaGFubmVsKSA9PiB7XG4gIGNvbnN0IHsgbmFtZSwgbG9uZ0lkIH0gPSBjaGFubmVsO1xuICByZXR1cm4gW1xuICAgIHtwcm9wZXJ0eTogJ29nOnRpdGxlJywgY29udGVudDogYCR7bmFtZX0gb24gJHt0aXRsZX1gfSxcbiAgICB7cHJvcGVydHk6ICdvZzp1cmwnLCBjb250ZW50OiBgJHtob3N0fS8ke25hbWV9OiR7bG9uZ0lkfWB9LFxuICAgIHtwcm9wZXJ0eTogJ29nOnNpdGVfbmFtZScsIGNvbnRlbnQ6IHRpdGxlfSxcbiAgICB7cHJvcGVydHk6ICdvZzpkZXNjcmlwdGlvbicsIGNvbnRlbnQ6IGAke25hbWV9LCBhIGNoYW5uZWwgb24gJHt0aXRsZX1gfSxcbiAgICB7cHJvcGVydHk6ICd0d2l0dGVyOnNpdGUnLCBjb250ZW50OiAnQHNwZWVfY2gnfSxcbiAgICB7cHJvcGVydHk6ICd0d2l0dGVyOmNhcmQnLCBjb250ZW50OiAnc3VtbWFyeSd9LFxuICBdO1xufTtcblxuY29uc3QgY3JlYXRlQXNzZXRNZXRhVGFncyA9IChhc3NldCkgPT4ge1xuICBjb25zdCB7IGNsYWltRGF0YSB9ID0gYXNzZXQ7XG4gIGNvbnN0IHsgY29udGVudFR5cGUgfSA9IGNsYWltRGF0YTtcbiAgY29uc3QgZW1iZWRVcmwgPSBgJHtob3N0fS8ke2NsYWltRGF0YS5jbGFpbUlkfS8ke2NsYWltRGF0YS5uYW1lfWA7XG4gIGNvbnN0IHNob3dVcmwgPSBgJHtob3N0fS8ke2NsYWltRGF0YS5jbGFpbUlkfS8ke2NsYWltRGF0YS5uYW1lfWA7XG4gIGNvbnN0IHNvdXJjZSA9IGAke2hvc3R9LyR7Y2xhaW1EYXRhLmNsYWltSWR9LyR7Y2xhaW1EYXRhLm5hbWV9LiR7Y2xhaW1EYXRhLmZpbGVFeHR9YDtcbiAgY29uc3Qgb2dUaXRsZSA9IGNsYWltRGF0YS50aXRsZSB8fCBjbGFpbURhdGEubmFtZTtcbiAgY29uc3Qgb2dEZXNjcmlwdGlvbiA9IGNsYWltRGF0YS5kZXNjcmlwdGlvbiB8fCBkZWZhdWx0RGVzY3JpcHRpb247XG4gIGNvbnN0IG9nVGh1bWJuYWlsQ29udGVudFR5cGUgPSBkZXRlcm1pbmVPZ1RodW1ibmFpbENvbnRlbnRUeXBlKGNsYWltRGF0YS50aHVtYm5haWwpO1xuICBjb25zdCBvZ1RodW1ibmFpbCA9IGNsYWltRGF0YS50aHVtYm5haWwgfHwgZGVmYXVsdFRodW1ibmFpbDtcbiAgY29uc3QgbWV0YVRhZ3MgPSBbXG4gICAge3Byb3BlcnR5OiAnb2c6dGl0bGUnLCBjb250ZW50OiBvZ1RpdGxlfSxcbiAgICB7cHJvcGVydHk6ICdvZzp1cmwnLCBjb250ZW50OiBzaG93VXJsfSxcbiAgICB7cHJvcGVydHk6ICdvZzpzaXRlX25hbWUnLCBjb250ZW50OiB0aXRsZX0sXG4gICAge3Byb3BlcnR5OiAnb2c6ZGVzY3JpcHRpb24nLCBjb250ZW50OiBvZ0Rlc2NyaXB0aW9ufSxcbiAgICB7cHJvcGVydHk6ICdvZzppbWFnZTp3aWR0aCcsIGNvbnRlbnQ6IDYwMH0sXG4gICAge3Byb3BlcnR5OiAnb2c6aW1hZ2U6aGVpZ2h0JywgY29udGVudDogMzE1fSxcbiAgICB7cHJvcGVydHk6ICd0d2l0dGVyOnNpdGUnLCBjb250ZW50OiAnQHNwZWVfY2gnfSxcbiAgXTtcbiAgaWYgKGNvbnRlbnRUeXBlID09PSAndmlkZW8vbXA0JyB8fCBjb250ZW50VHlwZSA9PT0gJ3ZpZGVvL3dlYm0nKSB7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzp2aWRlbycsIGNvbnRlbnQ6IHNvdXJjZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6dmlkZW86c2VjdXJlX3VybCcsIGNvbnRlbnQ6IHNvdXJjZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6dmlkZW86dHlwZScsIGNvbnRlbnQ6IGNvbnRlbnRUeXBlfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzppbWFnZScsIGNvbnRlbnQ6IG9nVGh1bWJuYWlsfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzppbWFnZTp0eXBlJywgY29udGVudDogb2dUaHVtYm5haWxDb250ZW50VHlwZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6dHlwZScsIGNvbnRlbnQ6ICd2aWRlbyd9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ3R3aXR0ZXI6Y2FyZCcsIGNvbnRlbnQ6ICdwbGF5ZXInfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOnBsYXllcicsIGNvbnRlbnQ6IGVtYmVkVXJsfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOnBsYXllcjp3aWR0aCcsIGNvbnRlbnQ6IDYwMH0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAndHdpdHRlcjp0ZXh0OnBsYXllcl93aWR0aCcsIGNvbnRlbnQ6IDYwMH0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAndHdpdHRlcjpwbGF5ZXI6aGVpZ2h0JywgY29udGVudDogMzM3fSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOnBsYXllcjpzdHJlYW0nLCBjb250ZW50OiBzb3VyY2V9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ3R3aXR0ZXI6cGxheWVyOnN0cmVhbTpjb250ZW50X3R5cGUnLCBjb250ZW50OiBjb250ZW50VHlwZX0pO1xuICB9IGVsc2Uge1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6aW1hZ2UnLCBjb250ZW50OiBzb3VyY2V9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ29nOmltYWdlOnR5cGUnLCBjb250ZW50OiBjb250ZW50VHlwZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6dHlwZScsIGNvbnRlbnQ6ICdhcnRpY2xlJ30pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAndHdpdHRlcjpjYXJkJywgY29udGVudDogJ3N1bW1hcnlfbGFyZ2VfaW1hZ2UnfSk7XG4gIH1cbiAgcmV0dXJuIG1ldGFUYWdzO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU1ldGFUYWdzID0gKGFzc2V0LCBjaGFubmVsKSA9PiB7XG4gIGlmIChhc3NldCkge1xuICAgIHJldHVybiBjcmVhdGVBc3NldE1ldGFUYWdzKGFzc2V0KTtcbiAgfTtcbiAgaWYgKGNoYW5uZWwpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhbm5lbE1ldGFUYWdzKGNoYW5uZWwpO1xuICB9O1xuICByZXR1cm4gY3JlYXRlQmFzaWNNZXRhVGFncygpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L3V0aWxzL21ldGFUYWdzLmpzIiwiY29uc3QgeyBkZXRhaWxzOiB7IGhvc3QgfSB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxuY29uc3QgY3JlYXRlQmFzaWNDYW5vbmljYWxMaW5rID0gKHBhZ2UpID0+IHtcbiAgaWYgKCFwYWdlKSB7XG4gICAgcmV0dXJuIGAke2hvc3R9YDtcbiAgfTtcbiAgcmV0dXJuIGAke2hvc3R9LyR7cGFnZX1gO1xufTtcblxuY29uc3QgY3JlYXRlQXNzZXRDYW5vbmljYWxMaW5rID0gKGFzc2V0KSA9PiB7XG4gIGxldCBjaGFubmVsTmFtZSwgY2VydGlmaWNhdGVJZCwgbmFtZSwgY2xhaW1JZDtcbiAgaWYgKGFzc2V0LmNsYWltRGF0YSkge1xuICAgICh7IGNoYW5uZWxOYW1lLCBjZXJ0aWZpY2F0ZUlkLCBuYW1lLCBjbGFpbUlkIH0gPSBhc3NldC5jbGFpbURhdGEpO1xuICB9O1xuICBpZiAoY2hhbm5lbE5hbWUpIHtcbiAgICByZXR1cm4gYCR7aG9zdH0vJHtjaGFubmVsTmFtZX06JHtjZXJ0aWZpY2F0ZUlkfS8ke25hbWV9YDtcbiAgfTtcbiAgcmV0dXJuIGAke2hvc3R9LyR7Y2xhaW1JZH0vJHtuYW1lfWA7XG59O1xuXG5jb25zdCBjcmVhdGVDaGFubmVsQ2Fub25pY2FsTGluayA9IChjaGFubmVsKSA9PiB7XG4gIGNvbnN0IHsgbmFtZSwgbG9uZ0lkIH0gPSBjaGFubmVsO1xuICByZXR1cm4gYCR7aG9zdH0vJHtuYW1lfToke2xvbmdJZH1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUNhbm9uaWNhbExpbmsgPSAoYXNzZXQsIGNoYW5uZWwsIHBhZ2UpID0+IHtcbiAgaWYgKGFzc2V0KSB7XG4gICAgcmV0dXJuIGNyZWF0ZUFzc2V0Q2Fub25pY2FsTGluayhhc3NldCk7XG4gIH1cbiAgaWYgKGNoYW5uZWwpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhbm5lbENhbm9uaWNhbExpbmsoY2hhbm5lbCk7XG4gIH1cbiAgaWYgKHBhZ2UpIHtcbiAgICByZXR1cm4gY3JlYXRlQmFzaWNDYW5vbmljYWxMaW5rKHBhZ2UpO1xuICB9XG4gIHJldHVybiBjcmVhdGVCYXNpY0Nhbm9uaWNhbExpbmsoKTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC91dGlscy9jYW5vbmljYWxMaW5rLmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE5hdkxpbmssIHdpdGhSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBMb2dvIGZyb20gJ2NvbXBvbmVudHMvTG9nbyc7XG5pbXBvcnQgTmF2QmFyQ2hhbm5lbERyb3Bkb3duIGZyb20gJ2NvbXBvbmVudHMvTmF2QmFyQ2hhbm5lbE9wdGlvbnNEcm9wZG93bic7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICd1dGlscy9yZXF1ZXN0JztcblxuY29uc3QgVklFVyA9ICdWSUVXJztcbmNvbnN0IExPR09VVCA9ICdMT0dPVVQnO1xuXG5jbGFzcyBOYXZCYXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5jaGVja0ZvckxvZ2dlZEluVXNlciA9IHRoaXMuY2hlY2tGb3JMb2dnZWRJblVzZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmxvZ291dFVzZXIgPSB0aGlzLmxvZ291dFVzZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbiA9IHRoaXMuaGFuZGxlU2VsZWN0aW9uLmJpbmQodGhpcyk7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgdXNlciBpcyBhbHJlYWR5IGxvZ2dlZCBpblxuICAgIHRoaXMuY2hlY2tGb3JMb2dnZWRJblVzZXIoKTtcbiAgfVxuICBjaGVja0ZvckxvZ2dlZEluVXNlciAoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge2NyZWRlbnRpYWxzOiAnaW5jbHVkZSd9O1xuICAgIHJlcXVlc3QoJy91c2VyJywgcGFyYW1zKVxuICAgICAgLnRoZW4oKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFubmVsTG9naW4oZGF0YS5jaGFubmVsTmFtZSwgZGF0YS5zaG9ydENoYW5uZWxJZCwgZGF0YS5jaGFubmVsQ2xhaW1JZCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJy91c2VyIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cbiAgbG9nb3V0VXNlciAoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge2NyZWRlbnRpYWxzOiAnaW5jbHVkZSd9O1xuICAgIHJlcXVlc3QoJy9sb2dvdXQnLCBwYXJhbXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFubmVsTG9nb3V0KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJy9sb2dvdXQgZXJyb3InLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgIH0pO1xuICB9XG4gIGhhbmRsZVNlbGVjdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC5zZWxlY3RlZE9wdGlvbnNbMF0udmFsdWU7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSBMT0dPVVQ6XG4gICAgICAgIHRoaXMubG9nb3V0VXNlcigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVklFVzpcbiAgICAgICAgLy8gcmVkaXJlY3QgdG8gY2hhbm5lbCBwYWdlXG4gICAgICAgIHRoaXMucHJvcHMuaGlzdG9yeS5wdXNoKGAvJHt0aGlzLnByb3BzLmNoYW5uZWxOYW1lfToke3RoaXMucHJvcHMuY2hhbm5lbExvbmdJZH1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgbmF2LWJhcic+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS1zaG9ydCBmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1zcGFjZS1iZXR3ZWVuLWNlbnRlcic+XG4gICAgICAgICAgPExvZ28gLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbmF2LWJhci0tY2VudGVyJz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nbmF2LWJhci10YWdsaW5lJz5PcGVuLXNvdXJjZSwgZGVjZW50cmFsaXplZCBpbWFnZSBhbmQgdmlkZW8gc2hhcmluZy48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J25hdi1iYXItLXJpZ2h0Jz5cbiAgICAgICAgICAgIDxOYXZMaW5rIGNsYXNzTmFtZT0nbmF2LWJhci1saW5rIGxpbmstLW5hdicgYWN0aXZlQ2xhc3NOYW1lPSdsaW5rLS1uYXYtYWN0aXZlJyB0bz0nLycgZXhhY3Q+UHVibGlzaDwvTmF2TGluaz5cbiAgICAgICAgICAgIDxOYXZMaW5rIGNsYXNzTmFtZT0nbmF2LWJhci1saW5rIGxpbmstLW5hdicgIGFjdGl2ZUNsYXNzTmFtZT0nbGluay0tbmF2LWFjdGl2ZScgdG89Jy9hYm91dCc+QWJvdXQ8L05hdkxpbms+XG4gICAgICAgICAgICB7IHRoaXMucHJvcHMuY2hhbm5lbE5hbWUgPyAoXG4gICAgICAgICAgICAgIDxOYXZCYXJDaGFubmVsRHJvcGRvd25cbiAgICAgICAgICAgICAgICBjaGFubmVsTmFtZT17dGhpcy5wcm9wcy5jaGFubmVsTmFtZX1cbiAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3Rpb249e3RoaXMuaGFuZGxlU2VsZWN0aW9ufVxuICAgICAgICAgICAgICAgIGRlZmF1bHRTZWxlY3Rpb249e3RoaXMucHJvcHMuY2hhbm5lbE5hbWV9XG4gICAgICAgICAgICAgICAgVklFVz17VklFV31cbiAgICAgICAgICAgICAgICBMT0dPVVQ9e0xPR09VVH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxOYXZMaW5rIGlkPSduYXYtYmFyLWxvZ2luLWxpbmsnIGNsYXNzTmFtZT0nbmF2LWJhci1saW5rIGxpbmstLW5hdicgYWN0aXZlQ2xhc3NOYW1lPSdsaW5rLS1uYXYtYWN0aXZlJyB0bz0nL2xvZ2luJz5DaGFubmVsPC9OYXZMaW5rPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhSb3V0ZXIoTmF2QmFyKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvTmF2QmFyL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcblxuZnVuY3Rpb24gTG9nbyAoKSB7XG4gIHJldHVybiAoXG4gICAgPHN2ZyB2ZXJzaW9uPScxLjEnIGlkPSdMYXllcl8xJyB4PScwcHgnIHk9JzBweCcgaGVpZ2h0PScyNHB4JyB2aWV3Qm94PScwIDAgODAgMzEnIGVuYWJsZUJhY2tncm91bmQ9J25ldyAwIDAgODAgMzEnIGNsYXNzTmFtZT0nbmF2LWJhci1sb2dvJz5cbiAgICAgIDxMaW5rIHRvPScvJz5cbiAgICAgICAgPHRpdGxlPkxvZ288L3RpdGxlPlxuICAgICAgICA8ZGVzYz5TcGVlLmNoIGxvZ288L2Rlc2M+XG4gICAgICAgIDxnIGlkPSdBYm91dCc+XG4gICAgICAgICAgPGcgaWQ9J1B1Ymxpc2gtRm9ybS1WMi1feDI4X2ZpbGxlZF94MjlfJyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtNDIuMDAwMDAwLCAtMjMuMDAwMDAwKSc+XG4gICAgICAgICAgICA8ZyBpZD0nR3JvdXAtMTcnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKDQyLjAwMDAwMCwgMjIuMDAwMDAwKSc+XG4gICAgICAgICAgICAgIDx0ZXh0IHRyYW5zZm9ybT0nbWF0cml4KDEgMCAwIDEgMCAyMCknIGZvbnRTaXplPScyNScgZm9udEZhbWlseT0nUm9ib3RvJz5TcGVlJmx0O2g8L3RleHQ+XG4gICAgICAgICAgICAgIDxnIGlkPSdHcm91cC0xNicgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMC4wMDAwMDAsIDMwLjAwMDAwMCknPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPSdMaW5lLTgnIGZpbGw9J25vbmUnIHN0cm9rZT0nIzA5RjkxMScgc3Ryb2tlV2lkdGg9JzEnIHN0cm9rZUxpbmVjYXA9J3NxdWFyZScgZD0nTTAuNSwxLjVoMTUnIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggaWQ9J0xpbmUtOC1Db3B5JyBmaWxsPSdub25lJyBzdHJva2U9JyMwMjlENzQnIHN0cm9rZVdpZHRoPScxJyBzdHJva2VMaW5lY2FwPSdzcXVhcmUnIGQ9J00xNi41LDEuNWgxNScgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBpZD0nTGluZS04LUNvcHktMicgZmlsbD0nbm9uZScgc3Ryb2tlPScjRTM1QkQ4JyBzdHJva2VXaWR0aD0nMScgc3Ryb2tlTGluZWNhcD0nc3F1YXJlJyBkPSdNMzIuNSwxLjVoMTUnIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggaWQ9J0xpbmUtOC1Db3B5LTMnIGZpbGw9J25vbmUnIHN0cm9rZT0nIzQxNTZDNScgc3Ryb2tlV2lkdGg9JzEnIHN0cm9rZUxpbmVjYXA9J3NxdWFyZScgZD0nTTQ4LjUsMS41aDE1JyAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPSdMaW5lLTgtQ29weS00JyBmaWxsPSdub25lJyBzdHJva2U9JyM2MzU2ODgnIHN0cm9rZVdpZHRoPScxJyBzdHJva2VMaW5lY2FwPSdzcXVhcmUnIGQ9J002NC41LDEuNWgxNScgLz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgPC9nPlxuICAgICAgPC9MaW5rPlxuICAgIDwvc3ZnPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTG9nbztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbXBvbmVudHMvTG9nby9pbmRleC5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiBOYXZCYXJDaGFubmVsRHJvcGRvd24gKHsgY2hhbm5lbE5hbWUsIGhhbmRsZVNlbGVjdGlvbiwgZGVmYXVsdFNlbGVjdGlvbiwgVklFVywgTE9HT1VUIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8c2VsZWN0IHR5cGU9J3RleHQnIGlkPSduYXYtYmFyLWNoYW5uZWwtc2VsZWN0JyBjbGFzc05hbWU9J3NlbGVjdCBzZWxlY3QtLWFycm93IGxpbmstLW5hdicgb25DaGFuZ2U9e2hhbmRsZVNlbGVjdGlvbn0gdmFsdWU9e2RlZmF1bHRTZWxlY3Rpb259PlxuICAgICAgPG9wdGlvbiBpZD0nbmF2LWJhci1jaGFubmVsLXNlbGVjdC1jaGFubmVsLW9wdGlvbic+e2NoYW5uZWxOYW1lfTwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT17VklFV30+Vmlldzwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT17TE9HT1VUfT5Mb2dvdXQ8L29wdGlvbj5cbiAgICA8L3NlbGVjdD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE5hdkJhckNoYW5uZWxEcm9wZG93bjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbXBvbmVudHMvTmF2QmFyQ2hhbm5lbE9wdGlvbnNEcm9wZG93bi9pbmRleC5qc3giLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcm9zcy1mZXRjaC9wb2x5ZmlsbFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImNyb3NzLWZldGNoL3BvbHlmaWxsXCJcbi8vIG1vZHVsZSBpZCA9IDk0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgcHVibGlzaCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgZGlzYWJsZWQ6IHB1Ymxpc2guZGlzYWJsZWQsXG4gICAgZmlsZSAgICA6IHB1Ymxpc2guZmlsZSxcbiAgICBzdGF0dXMgIDogcHVibGlzaC5zdGF0dXMuc3RhdHVzLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9QdWJsaXNoVG9vbC9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRHJvcHpvbmUgZnJvbSAnY29udGFpbmVycy9Ecm9wem9uZSc7XG5pbXBvcnQgUHVibGlzaERldGFpbHMgZnJvbSAnY29udGFpbmVycy9QdWJsaXNoRGV0YWlscyc7XG5pbXBvcnQgUHVibGlzaFN0YXR1cyBmcm9tICdjb250YWluZXJzL1B1Ymxpc2hTdGF0dXMnO1xuaW1wb3J0IFB1Ymxpc2hEaXNhYmxlZE1lc3NhZ2UgZnJvbSAnY29udGFpbmVycy9QdWJsaXNoRGlzYWJsZWRNZXNzYWdlJztcblxuY2xhc3MgUHVibGlzaFRvb2wgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICBjb25zb2xlLmxvZygncHVibGlzaCBpcyBkaXNhYmxlZCcpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFB1Ymxpc2hEaXNhYmxlZE1lc3NhZ2UgLz5cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdwdWJsaXNoIGlzIG5vdCBkaXNhYmxlZCcpO1xuICAgICAgaWYgKHRoaXMucHJvcHMuZmlsZSkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5zdGF0dXMpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFB1Ymxpc2hTdGF0dXMgLz5cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiA8UHVibGlzaERldGFpbHMgLz47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiA8RHJvcHpvbmUgLz47XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQdWJsaXNoVG9vbDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvUHVibGlzaFRvb2wvdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWxlIH0gZnJvbSAndXRpbHMvZmlsZSc7XG5pbXBvcnQgUHJldmlldyBmcm9tICdjb21wb25lbnRzL1ByZXZpZXcnO1xuXG5jbGFzcyBEcm9wem9uZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZHJhZ092ZXIgIDogZmFsc2UsXG4gICAgICBtb3VzZU92ZXIgOiBmYWxzZSxcbiAgICAgIGRpbVByZXZpZXc6IGZhbHNlLFxuICAgIH07XG4gICAgdGhpcy5oYW5kbGVEcm9wID0gdGhpcy5oYW5kbGVEcm9wLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVEcmFnT3ZlciA9IHRoaXMuaGFuZGxlRHJhZ092ZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZURyYWdFbmQgPSB0aGlzLmhhbmRsZURyYWdFbmQuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZURyYWdFbnRlciA9IHRoaXMuaGFuZGxlRHJhZ0VudGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVEcmFnTGVhdmUgPSB0aGlzLmhhbmRsZURyYWdMZWF2ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlTW91c2VFbnRlciA9IHRoaXMuaGFuZGxlTW91c2VFbnRlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSA9IHRoaXMuaGFuZGxlTW91c2VMZWF2ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlQ2xpY2sgPSB0aGlzLmhhbmRsZUNsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVGaWxlSW5wdXQgPSB0aGlzLmhhbmRsZUZpbGVJbnB1dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY2hvb3NlRmlsZSA9IHRoaXMuY2hvb3NlRmlsZS5iaW5kKHRoaXMpO1xuICB9XG4gIGhhbmRsZURyb3AgKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNldFN0YXRlKHtkcmFnT3ZlcjogZmFsc2V9KTtcbiAgICAvLyBpZiBkcm9wcGVkIGl0ZW1zIGFyZW4ndCBmaWxlcywgcmVqZWN0IHRoZW1cbiAgICBjb25zdCBkdCA9IGV2ZW50LmRhdGFUcmFuc2ZlcjtcbiAgICBpZiAoZHQuaXRlbXMpIHtcbiAgICAgIGlmIChkdC5pdGVtc1swXS5raW5kID09PSAnZmlsZScpIHtcbiAgICAgICAgY29uc3QgZHJvcHBlZEZpbGUgPSBkdC5pdGVtc1swXS5nZXRBc0ZpbGUoKTtcbiAgICAgICAgdGhpcy5jaG9vc2VGaWxlKGRyb3BwZWRGaWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaGFuZGxlRHJhZ092ZXIgKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBoYW5kbGVEcmFnRW5kIChldmVudCkge1xuICAgIHZhciBkdCA9IGV2ZW50LmRhdGFUcmFuc2ZlcjtcbiAgICBpZiAoZHQuaXRlbXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHQuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZHQuaXRlbXMucmVtb3ZlKGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuY2xlYXJEYXRhKCk7XG4gICAgfVxuICB9XG4gIGhhbmRsZURyYWdFbnRlciAoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7ZHJhZ092ZXI6IHRydWUsIGRpbVByZXZpZXc6IHRydWV9KTtcbiAgfVxuICBoYW5kbGVEcmFnTGVhdmUgKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe2RyYWdPdmVyOiBmYWxzZSwgZGltUHJldmlldzogZmFsc2V9KTtcbiAgfVxuICBoYW5kbGVNb3VzZUVudGVyICgpIHtcbiAgICB0aGlzLnNldFN0YXRlKHttb3VzZU92ZXI6IHRydWUsIGRpbVByZXZpZXc6IHRydWV9KTtcbiAgfVxuICBoYW5kbGVNb3VzZUxlYXZlICgpIHtcbiAgICB0aGlzLnNldFN0YXRlKHttb3VzZU92ZXI6IGZhbHNlLCBkaW1QcmV2aWV3OiBmYWxzZX0pO1xuICB9XG4gIGhhbmRsZUNsaWNrIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVfaW5wdXQnKS5jbGljaygpO1xuICB9XG4gIGhhbmRsZUZpbGVJbnB1dCAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGZpbGVMaXN0ID0gZXZlbnQudGFyZ2V0LmZpbGVzO1xuICAgIHRoaXMuY2hvb3NlRmlsZShmaWxlTGlzdFswXSk7XG4gIH1cbiAgY2hvb3NlRmlsZSAoZmlsZSkge1xuICAgIGlmIChmaWxlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YWxpZGF0ZUZpbGUoZmlsZSk7IC8vIHZhbGlkYXRlIHRoZSBmaWxlJ3MgbmFtZSwgdHlwZSwgYW5kIHNpemVcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnNldEZpbGVFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIC8vIHN0YWdlIGl0IHNvIGl0IHdpbGwgYmUgcmVhZHkgd2hlbiB0aGUgcHVibGlzaCBidXR0b24gaXMgY2xpY2tlZFxuICAgICAgdGhpcy5wcm9wcy5zZWxlY3RGaWxlKGZpbGUpO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uJz5cbiAgICAgICAgPGZvcm0+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT0naW5wdXQtZmlsZScgdHlwZT0nZmlsZScgaWQ9J2ZpbGVfaW5wdXQnIG5hbWU9J2ZpbGVfaW5wdXQnIGFjY2VwdD0ndmlkZW8vKixpbWFnZS8qJyBvbkNoYW5nZT17dGhpcy5oYW5kbGVGaWxlSW5wdXR9IGVuY1R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnIC8+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgICAgPGRpdiBpZD0ncHJldmlldy1kcm9wem9uZScgY2xhc3NOYW1lPXsncm93IHJvdy0tcGFkZGVkIHJvdy0tdGFsbCBkcm9wem9uZScgKyAodGhpcy5zdGF0ZS5kcmFnT3ZlciA/ICcgZHJvcHpvbmUtLWRyYWctb3ZlcicgOiAnJyl9IG9uRHJvcD17dGhpcy5oYW5kbGVEcm9wfSBvbkRyYWdPdmVyPXt0aGlzLmhhbmRsZURyYWdPdmVyfSBvbkRyYWdFbmQ9e3RoaXMuaGFuZGxlRHJhZ0VuZH0gb25EcmFnRW50ZXI9e3RoaXMuaGFuZGxlRHJhZ0VudGVyfSBvbkRyYWdMZWF2ZT17dGhpcy5oYW5kbGVEcmFnTGVhdmV9IG9uTW91c2VFbnRlcj17dGhpcy5oYW5kbGVNb3VzZUVudGVyfSBvbk1vdXNlTGVhdmU9e3RoaXMuaGFuZGxlTW91c2VMZWF2ZX0gb25DbGljaz17dGhpcy5oYW5kbGVDbGlja30+XG4gICAgICAgICAge3RoaXMucHJvcHMuZmlsZSA/IChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxQcmV2aWV3XG4gICAgICAgICAgICAgICAgZGltUHJldmlldz17dGhpcy5zdGF0ZS5kaW1QcmV2aWV3fVxuICAgICAgICAgICAgICAgIGZpbGU9e3RoaXMucHJvcHMuZmlsZX1cbiAgICAgICAgICAgICAgICB0aHVtYm5haWw9e3RoaXMucHJvcHMudGh1bWJuYWlsfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGlkPSdkcm9wem9uZS10ZXh0LWhvbGRlcicgY2xhc3NOYW1lPXsnZmxleC1jb250YWluZXItLWNvbHVtbiBmbGV4LWNvbnRhaW5lci0tY2VudGVyLWNlbnRlcid9PlxuICAgICAgICAgICAgICAgIHsgdGhpcy5zdGF0ZS5kcmFnT3ZlciA/IChcbiAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9J2Ryb3B6b25lLWRyYWdvdmVyJz5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdibHVlJz5Ecm9wIGl0LjwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7IHRoaXMuc3RhdGUubW91c2VPdmVyID8gKFxuICAgICAgICAgICAgICAgICAgPGRpdiBpZD0nZHJvcHpvbmUtaW5zdHJ1Y3Rpb25zJz5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtcGxhY2Vob2xkZXIgaW5mby1tZXNzYWdlLS1mYWlsdXJlJyBpZD0naW5wdXQtZXJyb3ItZmlsZS1zZWxlY3Rpb24nPnt0aGlzLnByb3BzLmZpbGVFcnJvcn08L3A+XG4gICAgICAgICAgICAgICAgICAgIDxwPkRyYWcgJiBkcm9wIGltYWdlIG9yIHZpZGVvIGhlcmUgdG8gcHVibGlzaDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdmaW5lLXByaW50Jz5PUjwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdibHVlLS11bmRlcmxpbmVkJz5DSE9PU0UgRklMRTwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdiBpZD0nZHJvcHpvbmUtdGV4dC1ob2xkZXInIGNsYXNzTmFtZT17J2ZsZXgtY29udGFpbmVyLS1jb2x1bW4gZmxleC1jb250YWluZXItLWNlbnRlci1jZW50ZXInfT5cbiAgICAgICAgICAgICAgeyB0aGlzLnN0YXRlLmRyYWdPdmVyID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9J2Ryb3B6b25lLWRyYWdvdmVyJz5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nYmx1ZSc+RHJvcCBpdC48L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBpZD0nZHJvcHpvbmUtaW5zdHJ1Y3Rpb25zJz5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLXBsYWNlaG9sZGVyIGluZm8tbWVzc2FnZS0tZmFpbHVyZScgaWQ9J2lucHV0LWVycm9yLWZpbGUtc2VsZWN0aW9uJz57dGhpcy5wcm9wcy5maWxlRXJyb3J9PC9wPlxuICAgICAgICAgICAgICAgICAgPHA+RHJhZyAmIGRyb3AgaW1hZ2Ugb3IgdmlkZW8gaGVyZSB0byBwdWJsaXNoPC9wPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdmaW5lLXByaW50Jz5PUjwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nYmx1ZS0tdW5kZXJsaW5lZCc+Q0hPT1NFIEZJTEU8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IERyb3B6b25lO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9Ecm9wem9uZS92aWV3LmpzeCIsIm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUZpbGUgKGZpbGUpIHtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZmlsZSBwcm92aWRlZCcpO1xuICAgIH1cbiAgICBpZiAoLycvLnRlc3QoZmlsZS5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcG9zdHJvcGhlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIGZpbGUgbmFtZScpO1xuICAgIH1cbiAgICAvLyB2YWxpZGF0ZSBzaXplIGFuZCB0eXBlXG4gICAgc3dpdGNoIChmaWxlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2ltYWdlL2pwZWcnOlxuICAgICAgY2FzZSAnaW1hZ2UvanBnJzpcbiAgICAgIGNhc2UgJ2ltYWdlL3BuZyc6XG4gICAgICAgIGlmIChmaWxlLnNpemUgPiAxMDAwMDAwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29ycnksIGltYWdlcyBhcmUgbGltaXRlZCB0byAxMCBtZWdhYnl0ZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbWFnZS9naWYnOlxuICAgICAgICBpZiAoZmlsZS5zaXplID4gNTAwMDAwMDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvcnJ5LCBHSUZzIGFyZSBsaW1pdGVkIHRvIDUwIG1lZ2FieXRlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZpZGVvL21wNCc6XG4gICAgICAgIGlmIChmaWxlLnNpemUgPiA1MDAwMDAwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29ycnksIHZpZGVvcyBhcmUgbGltaXRlZCB0byA1MCBtZWdhYnl0ZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZmlsZS50eXBlICsgJyBpcyBub3QgYSBzdXBwb3J0ZWQgZmlsZSB0eXBlLiBPbmx5LCAuanBlZywgLnBuZywgLmdpZiwgYW5kIC5tcDQgZmlsZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L3V0aWxzL2ZpbGUuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuY2xhc3MgUHJldmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaW1nU291cmNlICAgICAgIDogJycsXG4gICAgICBkZWZhdWx0VGh1bWJuYWlsOiAnL2Fzc2V0cy9pbWcvdmlkZW9fdGh1bWJfZGVmYXVsdC5wbmcnLFxuICAgIH07XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIHRoaXMuc2V0UHJldmlld0ltYWdlU291cmNlKHRoaXMucHJvcHMuZmlsZSk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAobmV3UHJvcHMpIHtcbiAgICBpZiAobmV3UHJvcHMuZmlsZSAhPT0gdGhpcy5wcm9wcy5maWxlKSB7XG4gICAgICB0aGlzLnNldFByZXZpZXdJbWFnZVNvdXJjZShuZXdQcm9wcy5maWxlKTtcbiAgICB9XG4gICAgaWYgKG5ld1Byb3BzLnRodW1ibmFpbCAhPT0gdGhpcy5wcm9wcy50aHVtYm5haWwpIHtcbiAgICAgIGlmIChuZXdQcm9wcy50aHVtYm5haWwpIHtcbiAgICAgICAgdGhpcy5zZXRQcmV2aWV3SW1hZ2VTb3VyY2VGcm9tRmlsZShuZXdQcm9wcy50aHVtYm5haWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW1nU291cmNlOiB0aGlzLnN0YXRlLmRlZmF1bHRUaHVtYm5haWx9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2V0UHJldmlld0ltYWdlU291cmNlRnJvbUZpbGUgKGZpbGUpIHtcbiAgICBjb25zdCBwcmV2aWV3UmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBwcmV2aWV3UmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgcHJldmlld1JlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtpbWdTb3VyY2U6IHByZXZpZXdSZWFkZXIucmVzdWx0fSk7XG4gICAgfTtcbiAgfVxuICBzZXRQcmV2aWV3SW1hZ2VTb3VyY2UgKGZpbGUpIHtcbiAgICBpZiAoZmlsZS50eXBlICE9PSAndmlkZW8vbXA0Jykge1xuICAgICAgdGhpcy5zZXRQcmV2aWV3SW1hZ2VTb3VyY2VGcm9tRmlsZShmaWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMucHJvcHMudGh1bWJuYWlsKSB7XG4gICAgICAgIHRoaXMuc2V0UHJldmlld0ltYWdlU291cmNlRnJvbUZpbGUodGhpcy5wcm9wcy50aHVtYm5haWwpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRTdGF0ZSh7aW1nU291cmNlOiB0aGlzLnN0YXRlLmRlZmF1bHRUaHVtYm5haWx9KTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGltZ1xuICAgICAgICBpZD0nZHJvcHpvbmUtcHJldmlldydcbiAgICAgICAgc3JjPXt0aGlzLnN0YXRlLmltZ1NvdXJjZX1cbiAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmRpbVByZXZpZXcgPyAnZGltJyA6ICcnfVxuICAgICAgICBhbHQ9J3B1Ymxpc2ggcHJldmlldydcbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufTtcblxuUHJldmlldy5wcm9wVHlwZXMgPSB7XG4gIGRpbVByZXZpZXc6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGZpbGUgICAgICA6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgdGh1bWJuYWlsIDogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByZXZpZXc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb21wb25lbnRzL1ByZXZpZXcvaW5kZXguanN4IiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge2NsZWFyRmlsZSwgc3RhcnRQdWJsaXNofSBmcm9tICdhY3Rpb25zL3B1Ymxpc2gnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgY2hhbm5lbCwgcHVibGlzaCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgZmlsZTogcHVibGlzaC5maWxlLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0ge1xuICBjbGVhckZpbGUsXG4gIHN0YXJ0UHVibGlzaCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9QdWJsaXNoRGV0YWlscy9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB3aXRoUm91dGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgRHJvcHpvbmUgZnJvbSAnY29udGFpbmVycy9Ecm9wem9uZSc7XG5pbXBvcnQgUHVibGlzaFRpdGxlSW5wdXQgZnJvbSAnY29udGFpbmVycy9QdWJsaXNoVGl0bGVJbnB1dCc7XG5pbXBvcnQgUHVibGlzaFVybElucHV0IGZyb20gJ2NvbnRhaW5lcnMvUHVibGlzaFVybElucHV0JztcbmltcG9ydCBQdWJsaXNoVGh1bWJuYWlsSW5wdXQgZnJvbSAnY29udGFpbmVycy9QdWJsaXNoVGh1bWJuYWlsSW5wdXQnO1xuaW1wb3J0IFB1Ymxpc2hNZXRhZGF0YUlucHV0cyBmcm9tICdjb250YWluZXJzL1B1Ymxpc2hNZXRhZGF0YUlucHV0cyc7XG5pbXBvcnQgQ2hhbm5lbFNlbGVjdCBmcm9tICdjb250YWluZXJzL0NoYW5uZWxTZWxlY3QnO1xuXG5jbGFzcyBQdWJsaXNoRGV0YWlscyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIHRoaXMub25QdWJsaXNoU3VibWl0ID0gdGhpcy5vblB1Ymxpc2hTdWJtaXQuYmluZCh0aGlzKTtcbiAgfVxuICBvblB1Ymxpc2hTdWJtaXQgKCkge1xuICAgIHRoaXMucHJvcHMuc3RhcnRQdWJsaXNoKHRoaXMucHJvcHMuaGlzdG9yeSk7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLW5vLWJvdHRvbSc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0xMCc+XG4gICAgICAgICAgPFB1Ymxpc2hUaXRsZUlucHV0IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7LyogbGVmdCBjb2x1bW4gKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tc21sLTEwJyA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgICA8RHJvcHpvbmUgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHsvKiByaWdodCBjb2x1bW4gKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tc21sLTEwIGFsaWduLWNvbnRlbnQtdG9wJz5cbiAgICAgICAgICA8ZGl2IGlkPSdwdWJsaXNoLWFjdGl2ZS1hcmVhJyBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0tbm8tdG9wIHJvdy0td2lkZSc+XG4gICAgICAgICAgICAgIDxQdWJsaXNoVXJsSW5wdXQgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLW5vLXRvcCByb3ctLXdpZGUnPlxuICAgICAgICAgICAgICA8Q2hhbm5lbFNlbGVjdCAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7ICh0aGlzLnByb3BzLmZpbGUudHlwZSA9PT0gJ3ZpZGVvL21wNCcpICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLW5vLXRvcCByb3ctLXdpZGUgJz5cbiAgICAgICAgICAgICAgICA8UHVibGlzaFRodW1ibmFpbElucHV0IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS1uby10b3Agcm93LS1uby1ib3R0b20gcm93LS13aWRlJz5cbiAgICAgICAgICAgICAgPFB1Ymxpc2hNZXRhZGF0YUlucHV0cyAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0td2lkZSBhbGlnbi1jb250ZW50LWNlbnRlcic+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9J3B1Ymxpc2gtc3VibWl0JyBjbGFzc05hbWU9J2J1dHRvbi0tcHJpbWFyeSBidXR0b24tLWxhcmdlJyBvbkNsaWNrPXt0aGlzLm9uUHVibGlzaFN1Ym1pdH0+UHVibGlzaDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0tbm8tYm90dG9tIGFsaWduLWNvbnRlbnQtY2VudGVyJz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9J2J1dHRvbi0tY2FuY2VsJyBvbkNsaWNrPXt0aGlzLnByb3BzLmNsZWFyRmlsZX0+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1zaG9ydCBhbGlnbi1jb250ZW50LWNlbnRlcic+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nZmluZS1wcmludCc+QnkgY2xpY2tpbmcgJ1B1Ymxpc2gnLCB5b3UgYWZmaXJtIHRoYXQgeW91IGhhdmUgdGhlIHJpZ2h0cyB0byBwdWJsaXNoIHRoaXMgY29udGVudCB0byB0aGUgTEJSWSBuZXR3b3JrLCBhbmQgdGhhdCB5b3UgdW5kZXJzdGFuZCB0aGUgcHJvcGVydGllcyBvZiBwdWJsaXNoaW5nIGl0IHRvIGEgZGVjZW50cmFsaXplZCwgdXNlci1jb250cm9sbGVkIG5ldHdvcmsuIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vbGJyeS5pby9sZWFybic+UmVhZCBtb3JlLjwvYT48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoUm91dGVyKFB1Ymxpc2hEZXRhaWxzKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvUHVibGlzaERldGFpbHMvdmlldy5qc3giLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7dXBkYXRlTWV0YWRhdGF9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBwdWJsaXNoIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogcHVibGlzaC5tZXRhZGF0YS50aXRsZSxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbk1ldGFkYXRhQ2hhbmdlOiAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgIGRpc3BhdGNoKHVwZGF0ZU1ldGFkYXRhKG5hbWUsIHZhbHVlKSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9QdWJsaXNoVGl0bGVJbnB1dC9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmNsYXNzIFB1Ymxpc2hUaXRsZUlucHV0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlSW5wdXQgPSB0aGlzLmhhbmRsZUlucHV0LmJpbmQodGhpcyk7XG4gIH1cbiAgaGFuZGxlSW5wdXQgKGUpIHtcbiAgICBjb25zdCBuYW1lID0gZS50YXJnZXQubmFtZTtcbiAgICBjb25zdCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMucHJvcHMub25NZXRhZGF0YUNoYW5nZShuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGlucHV0IHR5cGU9J3RleHQnIGlkPSdwdWJsaXNoLXRpdGxlJyBjbGFzc05hbWU9J2lucHV0LXRleHQgdGV4dC0tbGFyZ2UgaW5wdXQtdGV4dC0tZnVsbC13aWR0aCcgbmFtZT0ndGl0bGUnIHBsYWNlaG9sZGVyPSdHaXZlIHlvdXIgcG9zdCBhIHRpdGxlLi4uJyBvbkNoYW5nZT17dGhpcy5oYW5kbGVJbnB1dH0gdmFsdWU9e3RoaXMucHJvcHMudGl0bGV9IC8+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdWJsaXNoVGl0bGVJbnB1dDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvUHVibGlzaFRpdGxlSW5wdXQvdmlldy5qc3giLCJpbXBvcnQge3VwZGF0ZUNsYWltLCB1cGRhdGVFcnJvcn0gZnJvbSAnYWN0aW9ucy9wdWJsaXNoJztcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgY2hhbm5lbCwgcHVibGlzaCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgbG9nZ2VkSW5DaGFubmVsTmFtZSAgIDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubmFtZSxcbiAgICBsb2dnZWRJbkNoYW5uZWxTaG9ydElkOiBjaGFubmVsLmxvZ2dlZEluQ2hhbm5lbC5zaG9ydElkLFxuICAgIGZpbGVOYW1lICAgICAgICAgICAgICA6IHB1Ymxpc2guZmlsZS5uYW1lLFxuICAgIHB1Ymxpc2hJbkNoYW5uZWwgICAgICA6IHB1Ymxpc2gucHVibGlzaEluQ2hhbm5lbCxcbiAgICBzZWxlY3RlZENoYW5uZWwgICAgICAgOiBwdWJsaXNoLnNlbGVjdGVkQ2hhbm5lbCxcbiAgICBjbGFpbSAgICAgICAgICAgICAgICAgOiBwdWJsaXNoLmNsYWltLFxuICAgIHVybEVycm9yICAgICAgICAgICAgICA6IHB1Ymxpc2guZXJyb3IudXJsLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uQ2xhaW1DaGFuZ2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlQ2xhaW0odmFsdWUpKTtcbiAgICAgIGRpc3BhdGNoKHVwZGF0ZUVycm9yKCdwdWJsaXNoU3VibWl0JywgbnVsbCkpO1xuICAgIH0sXG4gICAgb25VcmxFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVFcnJvcigndXJsJywgdmFsdWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hVcmxJbnB1dC9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICd1dGlscy9yZXF1ZXN0JztcbmltcG9ydCBVcmxNaWRkbGUgZnJvbSAnY29tcG9uZW50cy9QdWJsaXNoVXJsTWlkZGxlRGlzcGxheSc7XG5cbmNsYXNzIFB1Ymxpc2hVcmxJbnB1dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZUlucHV0ID0gdGhpcy5oYW5kbGVJbnB1dC5iaW5kKHRoaXMpO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICBjb25zdCB7IGNsYWltLCBmaWxlTmFtZSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoIWNsYWltKSB7XG4gICAgICB0aGlzLnNldENsYWltTmFtZShmaWxlTmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgKHsgY2xhaW0sIGZpbGVOYW1lIH0pIHtcbiAgICAvLyBpZiBhIG5ldyBmaWxlIHdhcyBjaG9zZW4sIHVwZGF0ZSB0aGUgY2xhaW0gbmFtZVxuICAgIGlmIChmaWxlTmFtZSAhPT0gdGhpcy5wcm9wcy5maWxlTmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0Q2xhaW1OYW1lKGZpbGVOYW1lKTtcbiAgICB9XG4gICAgLy8gaWYgdGhlIGNsYWltIGhhcyB1cGRhdGVkLCBjaGVjayBpdHMgYXZhaWxhYmlsaXR5XG4gICAgaWYgKGNsYWltICE9PSB0aGlzLnByb3BzLmNsYWltKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ2xhaW0oY2xhaW0pO1xuICAgIH1cbiAgfVxuICBoYW5kbGVJbnB1dCAoZXZlbnQpIHtcbiAgICBsZXQgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdmFsdWUgPSB0aGlzLmNsZWFuc2VJbnB1dCh2YWx1ZSk7XG4gICAgLy8gdXBkYXRlIHRoZSBzdGF0ZVxuICAgIHRoaXMucHJvcHMub25DbGFpbUNoYW5nZSh2YWx1ZSk7XG4gIH1cbiAgY2xlYW5zZUlucHV0IChpbnB1dCkge1xuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvXFxzKy9nLCAnLScpOyAvLyByZXBsYWNlIHNwYWNlcyB3aXRoIGRhc2hlc1xuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvW15BLVphLXowLTktXS9nLCAnJyk7ICAvLyByZW1vdmUgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IEEtWiwgYS16LCAwLTksIG9yICctJ1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuICBzZXRDbGFpbU5hbWUgKGZpbGVOYW1lKSB7XG4gICAgY29uc3QgZmlsZU5hbWVXaXRob3V0RW5kaW5nID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykpO1xuICAgIGNvbnN0IGNsZWFuQ2xhaW1OYW1lID0gdGhpcy5jbGVhbnNlSW5wdXQoZmlsZU5hbWVXaXRob3V0RW5kaW5nKTtcbiAgICB0aGlzLnByb3BzLm9uQ2xhaW1DaGFuZ2UoY2xlYW5DbGFpbU5hbWUpO1xuICB9XG4gIHZhbGlkYXRlQ2xhaW0gKGNsYWltKSB7XG4gICAgaWYgKCFjbGFpbSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25VcmxFcnJvcignRW50ZXIgYSB1cmwgYWJvdmUnKTtcbiAgICB9XG4gICAgcmVxdWVzdChgL2FwaS9jbGFpbS9hdmFpbGFiaWxpdHkvJHtjbGFpbX1gKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uVXJsRXJyb3IobnVsbCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uVXJsRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICB9KTtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgY2xhaW0sIGxvZ2dlZEluQ2hhbm5lbE5hbWUsIGxvZ2dlZEluQ2hhbm5lbFNob3J0SWQsIHB1Ymxpc2hJbkNoYW5uZWwsIHNlbGVjdGVkQ2hhbm5lbCwgdXJsRXJyb3IgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0xMCBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbnB1dC10ZXh0LS1wcmltYXJ5IHNwYW4tLXJlbGF0aXZlJz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3VybC10ZXh0LS1zZWNvbmRhcnknPnNwZWUuY2ggLyA8L3NwYW4+XG4gICAgICAgICAgPFVybE1pZGRsZVxuICAgICAgICAgICAgcHVibGlzaEluQ2hhbm5lbD17cHVibGlzaEluQ2hhbm5lbH1cbiAgICAgICAgICAgIHNlbGVjdGVkQ2hhbm5lbD17c2VsZWN0ZWRDaGFubmVsfVxuICAgICAgICAgICAgbG9nZ2VkSW5DaGFubmVsTmFtZT17bG9nZ2VkSW5DaGFubmVsTmFtZX1cbiAgICAgICAgICAgIGxvZ2dlZEluQ2hhbm5lbFNob3J0SWQ9e2xvZ2dlZEluQ2hhbm5lbFNob3J0SWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2NsYWltLW5hbWUtaW5wdXQnIGNsYXNzTmFtZT0naW5wdXQtdGV4dCcgbmFtZT0nY2xhaW0nIHBsYWNlaG9sZGVyPSd5b3VyLXVybC1oZXJlJyBvbkNoYW5nZT17dGhpcy5oYW5kbGVJbnB1dH0gdmFsdWU9e2NsYWltfSAvPlxuICAgICAgICAgIHsgKGNsYWltICYmICF1cmxFcnJvcikgJiYgPHNwYW4gaWQ9J2lucHV0LXN1Y2Nlc3MtY2xhaW0tbmFtZScgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtLXN1Y2Nlc3Mgc3Bhbi0tYWJzb2x1dGUnPnsnXFx1MjcxMyd9PC9zcGFuPiB9XG4gICAgICAgICAgeyB1cmxFcnJvciAmJiA8c3BhbiBpZD0naW5wdXQtc3VjY2Vzcy1jaGFubmVsLW5hbWUnIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLS1mYWlsdXJlIHNwYW4tLWFic29sdXRlJz57J1xcdTI3MTYnfTwvc3Bhbj4gfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICB7IHVybEVycm9yID8gKFxuICAgICAgICAgICAgPHAgaWQ9J2lucHV0LWVycm9yLWNsYWltLW5hbWUnIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLS1mYWlsdXJlJz57dXJsRXJyb3J9PC9wPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZSc+Q2hvb3NlIGEgY3VzdG9tIHVybDwvcD5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHVibGlzaFVybElucHV0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9QdWJsaXNoVXJsSW5wdXQvdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuZnVuY3Rpb24gVXJsTWlkZGxlICh7cHVibGlzaEluQ2hhbm5lbCwgc2VsZWN0ZWRDaGFubmVsLCBsb2dnZWRJbkNoYW5uZWxOYW1lLCBsb2dnZWRJbkNoYW5uZWxTaG9ydElkfSkge1xuICBpZiAocHVibGlzaEluQ2hhbm5lbCkge1xuICAgIGlmIChzZWxlY3RlZENoYW5uZWwgPT09IGxvZ2dlZEluQ2hhbm5lbE5hbWUpIHtcbiAgICAgIHJldHVybiA8c3BhbiBpZD0ndXJsLWNoYW5uZWwnIGNsYXNzTmFtZT0ndXJsLXRleHQtLXNlY29uZGFyeSc+e2xvZ2dlZEluQ2hhbm5lbE5hbWV9Ontsb2dnZWRJbkNoYW5uZWxTaG9ydElkfSAvPC9zcGFuPjtcbiAgICB9XG4gICAgcmV0dXJuIDxzcGFuIGlkPSd1cmwtY2hhbm5lbC1wbGFjZWhvbGRlcicgY2xhc3NOYW1lPSd1cmwtdGV4dC0tc2Vjb25kYXJ5IHRvb2x0aXAnPkBjaGFubmVsPHNwYW5cbiAgICAgIGNsYXNzTmFtZT0ndG9vbHRpcC10ZXh0Jz5TZWxlY3QgYSBjaGFubmVsIGJlbG93PC9zcGFuPiAvPC9zcGFuPjtcbiAgfVxuICByZXR1cm4gKFxuICAgIDxzcGFuIGlkPSd1cmwtbm8tY2hhbm5lbC1wbGFjZWhvbGRlcicgY2xhc3NOYW1lPSd1cmwtdGV4dC0tc2Vjb25kYXJ5IHRvb2x0aXAnPnh5ejxzcGFuIGNsYXNzTmFtZT0ndG9vbHRpcC10ZXh0Jz5UaGlzIHdpbGwgYmUgYSByYW5kb20gaWQ8L3NwYW4+IC88L3NwYW4+XG4gICk7XG59XG5cblVybE1pZGRsZS5wcm9wVHlwZXMgPSB7XG4gIHB1Ymxpc2hJbkNoYW5uZWwgICAgICA6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGxvZ2dlZEluQ2hhbm5lbE5hbWUgICA6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGxvZ2dlZEluQ2hhbm5lbFNob3J0SWQ6IFByb3BUeXBlcy5zdHJpbmcsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBVcmxNaWRkbGU7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb21wb25lbnRzL1B1Ymxpc2hVcmxNaWRkbGVEaXNwbGF5L2luZGV4LmpzeCIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBvbk5ld1RodW1ibmFpbCB9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBwdWJsaXNoOiB7IGZpbGUgfSB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgZmlsZSxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IHtcbiAgb25OZXdUaHVtYm5haWwsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvUHVibGlzaFRodW1ibmFpbElucHV0L2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gZGF0YVVSSXRvQmxvYihkYXRhVVJJKSB7XG4gIC8vIGNvbnZlcnQgYmFzZTY0L1VSTEVuY29kZWQgZGF0YSBjb21wb25lbnQgdG8gcmF3IGJpbmFyeSBkYXRhIGhlbGQgaW4gYSBzdHJpbmdcbiAgbGV0IGJ5dGVTdHJpbmcgPSBhdG9iKGRhdGFVUkkuc3BsaXQoJywnKVsxXSk7XG4gIC8vIHNlcGFyYXRlIG91dCB0aGUgbWltZSBjb21wb25lbnRcbiAgbGV0IG1pbWVTdHJpbmcgPSBkYXRhVVJJLnNwbGl0KCcsJylbMF0uc3BsaXQoJzonKVsxXS5zcGxpdCgnOycpWzBdO1xuICAvLyB3cml0ZSB0aGUgYnl0ZXMgb2YgdGhlIHN0cmluZyB0byBhIHR5cGVkIGFycmF5XG4gIGxldCBpYSA9IG5ldyBVaW50OEFycmF5KGJ5dGVTdHJpbmcubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlU3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgaWFbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBCbG9iKFtpYV0sIHt0eXBlOiBtaW1lU3RyaW5nfSk7XG59XG5cbmNsYXNzIFB1Ymxpc2hUaHVtYm5haWxJbnB1dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgdmlkZW9Tb3VyY2UgICA6IG51bGwsXG4gICAgICBlcnJvciAgICAgICAgIDogbnVsbCxcbiAgICAgIHNsaWRlck1pblJhbmdlOiAxLFxuICAgICAgc2xpZGVyTWF4UmFuZ2U6IG51bGwsXG4gICAgICBzbGlkZXJWYWx1ZSAgIDogbnVsbCxcbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlVmlkZW9Mb2FkZWREYXRhID0gdGhpcy5oYW5kbGVWaWRlb0xvYWRlZERhdGEuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZVNsaWRlckNoYW5nZSA9IHRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jcmVhdGVUaHVtYm5haWwgPSB0aGlzLmNyZWF0ZVRodW1ibmFpbC5iaW5kKHRoaXMpO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICBjb25zdCB7IGZpbGUgfSA9IHRoaXMucHJvcHM7XG4gICAgdGhpcy5zZXRWaWRlb1NvdXJjZShmaWxlKTtcbiAgfVxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXh0UHJvcHMpIHtcbiAgICAvLyBpZiBmaWxlIGNoYW5nZXNcbiAgICBpZiAobmV4dFByb3BzLmZpbGUgJiYgbmV4dFByb3BzLmZpbGUgIT09IHRoaXMucHJvcHMuZmlsZSkge1xuICAgICAgY29uc3QgeyBmaWxlIH0gPSBuZXh0UHJvcHM7XG4gICAgICB0aGlzLnNldFZpZGVvU291cmNlKGZpbGUpO1xuICAgIH07XG4gIH1cbiAgc2V0VmlkZW9Tb3VyY2UgKGZpbGUpIHtcbiAgICBjb25zdCBwcmV2aWV3UmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBwcmV2aWV3UmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgcHJldmlld1JlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhVXJpID0gcHJldmlld1JlYWRlci5yZXN1bHQ7XG4gICAgICBjb25zdCBibG9iID0gZGF0YVVSSXRvQmxvYihkYXRhVXJpKTtcbiAgICAgIGNvbnN0IHZpZGVvU291cmNlID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aWRlb1NvdXJjZSB9KTtcbiAgICB9O1xuICB9XG4gIGhhbmRsZVZpZGVvTG9hZGVkRGF0YSAoZXZlbnQpIHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IGV2ZW50LnRhcmdldC5kdXJhdGlvbjtcbiAgICBjb25zdCB0b3RhbE1pbnV0ZXMgPSBNYXRoLmZsb29yKGR1cmF0aW9uIC8gNjApO1xuICAgIGNvbnN0IHRvdGFsU2Vjb25kcyA9IE1hdGguZmxvb3IoZHVyYXRpb24gJSA2MCk7XG4gICAgLy8gc2V0IHRoZSBzbGlkZXJcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNsaWRlck1heFJhbmdlOiBkdXJhdGlvbiAqIDEwMCxcbiAgICAgIHNsaWRlclZhbHVlICAgOiBkdXJhdGlvbiAqIDEwMCAvIDIsXG4gICAgICB0b3RhbE1pbnV0ZXMsXG4gICAgICB0b3RhbFNlY29uZHMsXG4gICAgfSk7XG4gICAgLy8gdXBkYXRlIHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIHZpZGVvXG4gICAgbGV0IHZpZGVvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZGVvLXRodW1iLXBsYXllcicpO1xuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gZHVyYXRpb24gLyAyO1xuICB9XG4gIGhhbmRsZVNsaWRlckNoYW5nZSAoZXZlbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgLy8gdXBkYXRlIHRoZSBzbGlkZXIgdmFsdWVcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNsaWRlclZhbHVlOiB2YWx1ZSxcbiAgICB9KTtcbiAgICAvLyB1cGRhdGUgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgdmlkZW9cbiAgICBsZXQgdmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlkZW8tdGh1bWItcGxheWVyJyk7XG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB2YWx1ZSAvIDEwMDtcbiAgfVxuICBjcmVhdGVUaHVtYm5haWwgKCkge1xuICAgIC8vIHRha2UgYSBzbmFwc2hvdFxuICAgIGxldCB2aWRlbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWRlby10aHVtYi1wbGF5ZXInKTtcbiAgICBsZXQgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XG4gICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHZpZGVvLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgIGNvbnN0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgY29uc3QgYmxvYiA9IGRhdGFVUkl0b0Jsb2IoZGF0YVVybCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBuZXcgRmlsZShbYmxvYl0sIGB0aHVtYm5haWwucG5nYCwge1xuICAgICAgdHlwZTogJ2ltYWdlL3BuZycsXG4gICAgfSk7XG4gICAgLy8gc2V0IHRoZSB0aHVtYm5haWwgaW4gcmVkdXggc3RvcmVcbiAgICBpZiAoc25hcHNob3QpIHtcbiAgICAgIHRoaXMucHJvcHMub25OZXdUaHVtYm5haWwoc25hcHNob3QpO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgZXJyb3IsIHZpZGVvU291cmNlLCBzbGlkZXJNaW5SYW5nZSwgc2xpZGVyTWF4UmFuZ2UsIHNsaWRlclZhbHVlLCB0b3RhbE1pbnV0ZXMsIHRvdGFsU2Vjb25kcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nbGFiZWwnPlRodW1ibmFpbDo8L2xhYmVsPlxuICAgICAgICA8dmlkZW9cbiAgICAgICAgICBpZD0ndmlkZW8tdGh1bWItcGxheWVyJ1xuICAgICAgICAgIHByZWxvYWQ9J21ldGFkYXRhJ1xuICAgICAgICAgIG11dGVkXG4gICAgICAgICAgc3R5bGU9e3tkaXNwbGF5OiAnbm9uZSd9fVxuICAgICAgICAgIHBsYXlzSW5saW5lXG4gICAgICAgICAgb25Mb2FkZWREYXRhPXt0aGlzLmhhbmRsZVZpZGVvTG9hZGVkRGF0YX1cbiAgICAgICAgICBzcmM9e3ZpZGVvU291cmNlfVxuICAgICAgICAgIG9uU2Vla2VkPXt0aGlzLmNyZWF0ZVRodW1ibmFpbH1cbiAgICAgICAgLz5cbiAgICAgICAge1xuICAgICAgICAgIHNsaWRlclZhbHVlID8gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2ZsZXgtY29udGFpbmVyLS1yb3cgZmxleC1jb250YWluZXItLXNwYWNlLWJldHdlZW4tY2VudGVyJyBzdHlsZT17e3dpZHRoOiAnMTAwJSd9fT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2luZm8tbWVzc2FnZSc+MCcwMFwiPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJz57dG90YWxNaW51dGVzfSd7dG90YWxTZWNvbmRzfVwiPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9J3JhbmdlJ1xuICAgICAgICAgICAgICAgICAgbWluPXtzbGlkZXJNaW5SYW5nZX1cbiAgICAgICAgICAgICAgICAgIG1heD17c2xpZGVyTWF4UmFuZ2V9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17c2xpZGVyVmFsdWV9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3NsaWRlcidcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZVNsaWRlckNoYW5nZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZScgPmxvYWRpbmcuLi4gPC9wPlxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICB7IGVycm9yID8gKFxuICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLS1mYWlsdXJlJz57ZXJyb3J9PC9wPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJz5Vc2Ugc2xpZGVyIHRvIHNldCB0aHVtYm5haWw8L3A+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1Ymxpc2hUaHVtYm5haWxJbnB1dDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvUHVibGlzaFRodW1ibmFpbElucHV0L3ZpZXcuanN4IiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge3VwZGF0ZU1ldGFkYXRhLCB0b2dnbGVNZXRhZGF0YUlucHV0c30gZnJvbSAnYWN0aW9ucy9wdWJsaXNoJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHB1Ymxpc2ggfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIHNob3dNZXRhZGF0YUlucHV0czogcHVibGlzaC5zaG93TWV0YWRhdGFJbnB1dHMsXG4gICAgZGVzY3JpcHRpb24gICAgICAgOiBwdWJsaXNoLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgIGxpY2Vuc2UgICAgICAgICAgIDogcHVibGlzaC5tZXRhZGF0YS5saWNlbnNlLFxuICAgIG5zZncgICAgICAgICAgICAgIDogcHVibGlzaC5tZXRhZGF0YS5uc2Z3LFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uTWV0YWRhdGFDaGFuZ2U6IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTWV0YWRhdGEobmFtZSwgdmFsdWUpKTtcbiAgICB9LFxuICAgIG9uVG9nZ2xlTWV0YWRhdGFJbnB1dHM6ICh2YWx1ZSkgPT4ge1xuICAgICAgZGlzcGF0Y2godG9nZ2xlTWV0YWRhdGFJbnB1dHModmFsdWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hNZXRhZGF0YUlucHV0cy9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXhwYW5kaW5nVGV4dEFyZWEgZnJvbSAnY29tcG9uZW50cy9FeHBhbmRpbmdUZXh0QXJlYSc7XG5cbmNsYXNzIFB1Ymxpc2hNZXRhZGF0YUlucHV0cyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnRvZ2dsZVNob3dJbnB1dHMgPSB0aGlzLnRvZ2dsZVNob3dJbnB1dHMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZUlucHV0ID0gdGhpcy5oYW5kbGVJbnB1dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlU2VsZWN0ID0gdGhpcy5oYW5kbGVTZWxlY3QuYmluZCh0aGlzKTtcbiAgfVxuICB0b2dnbGVTaG93SW5wdXRzICgpIHtcbiAgICB0aGlzLnByb3BzLm9uVG9nZ2xlTWV0YWRhdGFJbnB1dHMoIXRoaXMucHJvcHMuc2hvd01ldGFkYXRhSW5wdXRzKTtcbiAgfVxuICBoYW5kbGVJbnB1dCAoZXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQudHlwZSA9PT0gJ2NoZWNrYm94JyA/IHRhcmdldC5jaGVja2VkIDogdGFyZ2V0LnZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSB0YXJnZXQubmFtZTtcbiAgICB0aGlzLnByb3BzLm9uTWV0YWRhdGFDaGFuZ2UobmFtZSwgdmFsdWUpO1xuICB9XG4gIGhhbmRsZVNlbGVjdCAoZXZlbnQpIHtcbiAgICBjb25zdCBuYW1lID0gZXZlbnQudGFyZ2V0Lm5hbWU7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSBldmVudC50YXJnZXQuc2VsZWN0ZWRPcHRpb25zWzBdLnZhbHVlO1xuICAgIHRoaXMucHJvcHMub25NZXRhZGF0YUNoYW5nZShuYW1lLCBzZWxlY3RlZE9wdGlvbik7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBpZD0ncHVibGlzaC1kZXRhaWxzJyBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLW5vLXRvcCByb3ctLXdpZGUnPlxuICAgICAgICB7dGhpcy5wcm9wcy5zaG93TWV0YWRhdGFJbnB1dHMgJiYgKFxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMgY29sdW1uLS1tZWQtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPSdwdWJsaXNoLWxpY2Vuc2UnIGNsYXNzTmFtZT0nbGFiZWwnPkRlc2NyaXB0aW9uOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS03IGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgICAgICA8RXhwYW5kaW5nVGV4dEFyZWFcbiAgICAgICAgICAgICAgICAgIGlkPSdwdWJsaXNoLWRlc2NyaXB0aW9uJ1xuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSd0ZXh0YXJlYSB0ZXh0YXJlYS0tcHJpbWFyeSB0ZXh0YXJlYS0tZnVsbC13aWR0aCdcbiAgICAgICAgICAgICAgICAgIHJvd3M9ezF9XG4gICAgICAgICAgICAgICAgICBtYXhMZW5ndGg9ezIwMDB9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17eyBtYXhIZWlnaHQ6IDIwMCB9fVxuICAgICAgICAgICAgICAgICAgbmFtZT0nZGVzY3JpcHRpb24nXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0nT3B0aW9uYWwgZGVzY3JpcHRpb24nXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5wcm9wcy5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUlucHV0fSAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMgY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPSdwdWJsaXNoLWxpY2Vuc2UnIGNsYXNzTmFtZT0nbGFiZWwnPkxpY2Vuc2U6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTcgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgdHlwZT0ndGV4dCcgbmFtZT0nbGljZW5zZScgaWQ9J3B1Ymxpc2gtbGljZW5zZScgY2xhc3NOYW1lPSdzZWxlY3Qgc2VsZWN0LS1wcmltYXJ5JyBvbkNoYW5nZT17dGhpcy5oYW5kbGVTZWxlY3R9PlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0nICc+VW5zcGVjaWZpZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9J1B1YmxpYyBEb21haW4nPlB1YmxpYyBEb21haW48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9J0NyZWF0aXZlIENvbW1vbnMnPkNyZWF0aXZlIENvbW1vbnM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLW5vLXRvcCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zJz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj0ncHVibGlzaC1uc2Z3JyBjbGFzc05hbWU9J2xhYmVsJz5NYXR1cmU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTcnPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9J2lucHV0LWNoZWNrYm94JyB0eXBlPSdjaGVja2JveCcgaWQ9J3B1Ymxpc2gtbnNmdycgbmFtZT0nbnNmdycgdmFsdWU9e3RoaXMucHJvcHMubnNmd30gb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLXNlY29uZGFyeScgb25DbGljaz17dGhpcy50b2dnbGVTaG93SW5wdXRzfT57dGhpcy5wcm9wcy5zaG93TWV0YWRhdGFJbnB1dHMgPyAnbGVzcycgOiAnbW9yZSd9PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1Ymxpc2hNZXRhZGF0YUlucHV0cztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvUHVibGlzaE1ldGFkYXRhSW5wdXRzL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmNsYXNzIEV4cGFuZGluZ1RleHRhcmVhIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuX2hhbmRsZUNoYW5nZSA9IHRoaXMuX2hhbmRsZUNoYW5nZS5iaW5kKHRoaXMpO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLmFkanVzdFRleHRhcmVhKHt9KTtcbiAgfVxuICBfaGFuZGxlQ2hhbmdlIChldmVudCkge1xuICAgIGNvbnN0IHsgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKG9uQ2hhbmdlKSBvbkNoYW5nZShldmVudCk7XG4gICAgdGhpcy5hZGp1c3RUZXh0YXJlYShldmVudCk7XG4gIH1cbiAgYWRqdXN0VGV4dGFyZWEgKHsgdGFyZ2V0ID0gdGhpcy5lbCB9KSB7XG4gICAgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IDA7XG4gICAgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IGAke3RhcmdldC5zY3JvbGxIZWlnaHR9cHhgO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyAuLi5yZXN0IH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8dGV4dGFyZWFcbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAgIHJlZj17eCA9PiB0aGlzLmVsID0geH1cbiAgICAgICAgb25DaGFuZ2U9e3RoaXMuX2hhbmRsZUNoYW5nZX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5FeHBhbmRpbmdUZXh0YXJlYS5wcm9wVHlwZXMgPSB7XG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEV4cGFuZGluZ1RleHRhcmVhO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29tcG9uZW50cy9FeHBhbmRpbmdUZXh0QXJlYS9pbmRleC5qc3giLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7c2V0UHVibGlzaEluQ2hhbm5lbCwgdXBkYXRlU2VsZWN0ZWRDaGFubmVsLCB1cGRhdGVFcnJvcn0gZnJvbSAnYWN0aW9ucy9wdWJsaXNoJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IGNoYW5uZWwsIHB1Ymxpc2ggfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGxvZ2dlZEluQ2hhbm5lbE5hbWU6IGNoYW5uZWwubG9nZ2VkSW5DaGFubmVsLm5hbWUsXG4gICAgcHVibGlzaEluQ2hhbm5lbCAgIDogcHVibGlzaC5wdWJsaXNoSW5DaGFubmVsLFxuICAgIHNlbGVjdGVkQ2hhbm5lbCAgICA6IHB1Ymxpc2guc2VsZWN0ZWRDaGFubmVsLFxuICAgIGNoYW5uZWxFcnJvciAgICAgICA6IHB1Ymxpc2guZXJyb3IuY2hhbm5lbCxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvblB1Ymxpc2hJbkNoYW5uZWxDaGFuZ2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlRXJyb3IoJ2NoYW5uZWwnLCBudWxsKSk7XG4gICAgICBkaXNwYXRjaChzZXRQdWJsaXNoSW5DaGFubmVsKHZhbHVlKSk7XG4gICAgfSxcbiAgICBvbkNoYW5uZWxTZWxlY3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlRXJyb3IoJ2NoYW5uZWwnLCBudWxsKSk7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVTZWxlY3RlZENoYW5uZWwodmFsdWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL0NoYW5uZWxTZWxlY3QvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENoYW5uZWxMb2dpbkZvcm0gZnJvbSAnY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtJztcbmltcG9ydCBDaGFubmVsQ3JlYXRlRm9ybSBmcm9tICdjb250YWluZXJzL0NoYW5uZWxDcmVhdGVGb3JtJztcbmltcG9ydCAqIGFzIHN0YXRlcyBmcm9tICdjb25zdGFudHMvcHVibGlzaF9jaGFubmVsX3NlbGVjdF9zdGF0ZXMnO1xuXG5jbGFzcyBDaGFubmVsU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMudG9nZ2xlQW5vbnltb3VzUHVibGlzaCA9IHRoaXMudG9nZ2xlQW5vbnltb3VzUHVibGlzaC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uID0gdGhpcy5oYW5kbGVTZWxlY3Rpb24uYmluZCh0aGlzKTtcbiAgfVxuICB0b2dnbGVBbm9ueW1vdXNQdWJsaXNoIChldmVudCkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gJ2Fub255bW91cycpIHtcbiAgICAgIHRoaXMucHJvcHMub25QdWJsaXNoSW5DaGFubmVsQ2hhbmdlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5vblB1Ymxpc2hJbkNoYW5uZWxDaGFuZ2UodHJ1ZSk7XG4gICAgfVxuICB9XG4gIGhhbmRsZVNlbGVjdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IGV2ZW50LnRhcmdldC5zZWxlY3RlZE9wdGlvbnNbMF0udmFsdWU7XG4gICAgdGhpcy5wcm9wcy5vbkNoYW5uZWxTZWxlY3Qoc2VsZWN0ZWRPcHRpb24pO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxmb3JtPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zIGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0nYW5vbnltb3VzLW9yLWNoYW5uZWwnIGlkPSdhbm9ueW1vdXMtcmFkaW8nIGNsYXNzTmFtZT0naW5wdXQtcmFkaW8nIHZhbHVlPSdhbm9ueW1vdXMnIGNoZWNrZWQ9eyF0aGlzLnByb3BzLnB1Ymxpc2hJbkNoYW5uZWx9IG9uQ2hhbmdlPXt0aGlzLnRvZ2dsZUFub255bW91c1B1Ymxpc2h9IC8+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCBsYWJlbC0tcG9pbnRlcicgaHRtbEZvcj0nYW5vbnltb3VzLXJhZGlvJz5Bbm9ueW1vdXM8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS03IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0nYW5vbnltb3VzLW9yLWNoYW5uZWwnIGlkPSdjaGFubmVsLXJhZGlvJyBjbGFzc05hbWU9J2lucHV0LXJhZGlvJyB2YWx1ZT0naW4gYSBjaGFubmVsJyBjaGVja2VkPXt0aGlzLnByb3BzLnB1Ymxpc2hJbkNoYW5uZWx9IG9uQ2hhbmdlPXt0aGlzLnRvZ2dsZUFub255bW91c1B1Ymxpc2h9IC8+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCBsYWJlbC0tcG9pbnRlcicgaHRtbEZvcj0nY2hhbm5lbC1yYWRpbyc+SW4gYSBjaGFubmVsPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7IHRoaXMucHJvcHMuY2hhbm5lbEVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtLWZhaWx1cmUnPnt0aGlzLnByb3BzLmNoYW5uZWxFcnJvcn08L3A+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJz5QdWJsaXNoIGFub255bW91c2x5IG9yIGluIGEgY2hhbm5lbDwvcD5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Zvcm0+XG4gICAgICAgIHsgdGhpcy5wcm9wcy5wdWJsaXNoSW5DaGFubmVsICYmIChcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMnPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCcgaHRtbEZvcj0nY2hhbm5lbC1uYW1lLXNlbGVjdCc+Q2hhbm5lbDo8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTcnPlxuICAgICAgICAgICAgICA8c2VsZWN0IHR5cGU9J3RleHQnIGlkPSdjaGFubmVsLW5hbWUtc2VsZWN0JyBjbGFzc05hbWU9J3NlbGVjdCBzZWxlY3QtLWFycm93JyB2YWx1ZT17dGhpcy5wcm9wcy5zZWxlY3RlZENoYW5uZWx9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZVNlbGVjdGlvbn0+XG4gICAgICAgICAgICAgICAgeyB0aGlzLnByb3BzLmxvZ2dlZEluQ2hhbm5lbE5hbWUgJiYgPG9wdGlvbiB2YWx1ZT17dGhpcy5wcm9wcy5sb2dnZWRJbkNoYW5uZWxOYW1lfSBpZD0ncHVibGlzaC1jaGFubmVsLXNlbGVjdC1jaGFubmVsLW9wdGlvbic+e3RoaXMucHJvcHMubG9nZ2VkSW5DaGFubmVsTmFtZX08L29wdGlvbj4gfVxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9e3N0YXRlcy5MT0dJTn0+RXhpc3Rpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtzdGF0ZXMuQ1JFQVRFfT5OZXc8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHsgKHRoaXMucHJvcHMuc2VsZWN0ZWRDaGFubmVsID09PSBzdGF0ZXMuTE9HSU4pICYmIDxDaGFubmVsTG9naW5Gb3JtIC8+IH1cbiAgICAgICAgICAgIHsgKHRoaXMucHJvcHMuc2VsZWN0ZWRDaGFubmVsID09PSBzdGF0ZXMuQ1JFQVRFKSAmJiA8Q2hhbm5lbENyZWF0ZUZvcm0gLz4gfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGFubmVsU2VsZWN0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9DaGFubmVsU2VsZWN0L3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuXG5jbGFzcyBDaGFubmVsTG9naW5Gb3JtIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBlcnJvciAgIDogbnVsbCxcbiAgICAgIG5hbWUgICAgOiAnJyxcbiAgICAgIHBhc3N3b3JkOiAnJyxcbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlSW5wdXQgPSB0aGlzLmhhbmRsZUlucHV0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5sb2dpblRvQ2hhbm5lbCA9IHRoaXMubG9naW5Ub0NoYW5uZWwuYmluZCh0aGlzKTtcbiAgfVxuICBoYW5kbGVJbnB1dCAoZXZlbnQpIHtcbiAgICBjb25zdCBuYW1lID0gZXZlbnQudGFyZ2V0Lm5hbWU7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZXRTdGF0ZSh7W25hbWVdOiB2YWx1ZX0pO1xuICB9XG4gIGxvZ2luVG9DaGFubmVsIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbWV0aG9kIDogJ1BPU1QnLFxuICAgICAgYm9keSAgIDogSlNPTi5zdHJpbmdpZnkoe3VzZXJuYW1lOiB0aGlzLnN0YXRlLm5hbWUsIHBhc3N3b3JkOiB0aGlzLnN0YXRlLnBhc3N3b3JkfSksXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgfTtcbiAgICByZXF1ZXN0KCdsb2dpbicsIHBhcmFtcylcbiAgICAgIC50aGVuKCh7c3VjY2VzcywgY2hhbm5lbE5hbWUsIHNob3J0Q2hhbm5lbElkLCBjaGFubmVsQ2xhaW1JZCwgbWVzc2FnZX0pID0+IHtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbm5lbExvZ2luKGNoYW5uZWxOYW1lLCBzaG9ydENoYW5uZWxJZCwgY2hhbm5lbENsYWltSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IG1lc3NhZ2V9KTtcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsnZXJyb3InOiBlcnJvcn0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Zm9ybSBpZD0nY2hhbm5lbC1sb2dpbi1mb3JtJz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgcm93LS1zaG9ydCc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nbGFiZWwnIGh0bWxGb3I9J2NoYW5uZWwtbG9naW4tbmFtZS1pbnB1dCc+TmFtZTo8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS02IGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbnB1dC10ZXh0LS1wcmltYXJ5IGZsZXgtY29udGFpbmVyLS1yb3cgZmxleC1jb250YWluZXItLWxlZnQtYm90dG9tJz5cbiAgICAgICAgICAgICAgPHNwYW4+QDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9J3RleHQnIGlkPSdjaGFubmVsLWxvZ2luLW5hbWUtaW5wdXQnIGNsYXNzTmFtZT0naW5wdXQtdGV4dCcgbmFtZT0nbmFtZScgcGxhY2Vob2xkZXI9J1lvdXIgQ2hhbm5lbCBOYW1lJyB2YWx1ZT17dGhpcy5zdGF0ZS5jaGFubmVsTmFtZX0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS13aWRlIHJvdy0tc2hvcnQnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zIGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9J2xhYmVsJyBodG1sRm9yPSdjaGFubmVsLWxvZ2luLXBhc3N3b3JkLWlucHV0JyA+UGFzc3dvcmQ6PC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNiBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtdGV4dC0tcHJpbWFyeSc+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdwYXNzd29yZCcgaWQ9J2NoYW5uZWwtbG9naW4tcGFzc3dvcmQtaW5wdXQnIG5hbWU9J3Bhc3N3b3JkJyBjbGFzc05hbWU9J2lucHV0LXRleHQnIHBsYWNlaG9sZGVyPScnIHZhbHVlPXt0aGlzLnN0YXRlLmNoYW5uZWxQYXNzd29yZH0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHsgdGhpcy5zdGF0ZS5lcnJvciA/IChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tZmFpbHVyZSc+e3RoaXMuc3RhdGUuZXJyb3J9PC9wPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJz5FbnRlciB0aGUgbmFtZSBhbmQgcGFzc3dvcmQgZm9yIHlvdXIgY2hhbm5lbDwvcD5cbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUnPlxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLXByaW1hcnknIG9uQ2xpY2s9e3RoaXMubG9naW5Ub0NoYW5uZWx9PkF1dGhlbnRpY2F0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENoYW5uZWxMb2dpbkZvcm07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL0NoYW5uZWxMb2dpbkZvcm0vdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ2NvbXBvbmVudHMvUHJvZ3Jlc3NCYXInO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAndXRpbHMvcmVxdWVzdCc7XG5cbmNsYXNzIENoYW5uZWxDcmVhdGVGb3JtIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBlcnJvciAgIDogbnVsbCxcbiAgICAgIGNoYW5uZWwgOiAnJyxcbiAgICAgIHBhc3N3b3JkOiAnJyxcbiAgICAgIHN0YXR1cyAgOiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5oYW5kbGVDaGFubmVsSW5wdXQgPSB0aGlzLmhhbmRsZUNoYW5uZWxJbnB1dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlSW5wdXQgPSB0aGlzLmhhbmRsZUlucHV0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5jcmVhdGVDaGFubmVsID0gdGhpcy5jcmVhdGVDaGFubmVsLmJpbmQodGhpcyk7XG4gIH1cbiAgY2xlYW5zZUNoYW5uZWxJbnB1dCAoaW5wdXQpIHtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1xccysvZywgJy0nKTsgLy8gcmVwbGFjZSBzcGFjZXMgd2l0aCBkYXNoZXNcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05LV0vZywgJycpOyAgLy8gcmVtb3ZlIGFsbCBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBBLVosIGEteiwgMC05LCBvciAnLSdcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgaGFuZGxlQ2hhbm5lbElucHV0IChldmVudCkge1xuICAgIGxldCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB2YWx1ZSA9IHRoaXMuY2xlYW5zZUNoYW5uZWxJbnB1dCh2YWx1ZSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7Y2hhbm5lbDogdmFsdWV9KTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlSXNDaGFubmVsQXZhaWxhYmxlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7ZXJyb3I6ICdQbGVhc2UgZW50ZXIgYSBjaGFubmVsIG5hbWUnfSk7XG4gICAgfVxuICB9XG4gIGhhbmRsZUlucHV0IChldmVudCkge1xuICAgIGNvbnN0IG5hbWUgPSBldmVudC50YXJnZXQubmFtZTtcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB0aGlzLnNldFN0YXRlKHtbbmFtZV06IHZhbHVlfSk7XG4gIH1cbiAgdXBkYXRlSXNDaGFubmVsQXZhaWxhYmxlIChjaGFubmVsKSB7XG4gICAgY29uc3QgY2hhbm5lbFdpdGhBdFN5bWJvbCA9IGBAJHtjaGFubmVsfWA7XG4gICAgcmVxdWVzdChgL2FwaS9jaGFubmVsL2F2YWlsYWJpbGl0eS8ke2NoYW5uZWxXaXRoQXRTeW1ib2x9YClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7J2Vycm9yJzogbnVsbH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7J2Vycm9yJzogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgfSk7XG4gIH1cbiAgY2hlY2tJc0NoYW5uZWxBdmFpbGFibGUgKGNoYW5uZWwpIHtcbiAgICBjb25zdCBjaGFubmVsV2l0aEF0U3ltYm9sID0gYEAke2NoYW5uZWx9YDtcbiAgICByZXR1cm4gcmVxdWVzdChgL2FwaS9jaGFubmVsL2F2YWlsYWJpbGl0eS8ke2NoYW5uZWxXaXRoQXRTeW1ib2x9YCk7XG4gIH1cbiAgY2hlY2tJc1Bhc3N3b3JkUHJvdmlkZWQgKHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghcGFzc3dvcmQgfHwgcGFzc3dvcmQubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSBwYXNzd29yZCcpKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuICBtYWtlUHVibGlzaENoYW5uZWxSZXF1ZXN0ICh1c2VybmFtZSwgcGFzc3dvcmQpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBtZXRob2QgOiAnUE9TVCcsXG4gICAgICBib2R5ICAgOiBKU09OLnN0cmluZ2lmeSh7dXNlcm5hbWUsIHBhc3N3b3JkfSksXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdCgnL3NpZ251cCcsIHBhcmFtcylcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuZm9ydHVuYXRlbHksIHdlIGVuY291bnRlcmVkIGFuIGVycm9yIHdoaWxlIGNyZWF0aW5nIHlvdXIgY2hhbm5lbC4gUGxlYXNlIGxldCB1cyBrbm93IGluIERpc2NvcmQhICR7ZXJyb3IubWVzc2FnZX1gKSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGNyZWF0ZUNoYW5uZWwgKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmNoZWNrSXNQYXNzd29yZFByb3ZpZGVkKHRoaXMuc3RhdGUucGFzc3dvcmQpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrSXNDaGFubmVsQXZhaWxhYmxlKHRoaXMuc3RhdGUuY2hhbm5lbCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtzdGF0dXM6ICdXZSBhcmUgcHVibGlzaGluZyB5b3VyIG5ldyBjaGFubmVsLiAgU2l0IHRpZ2h0Li4uJ30pO1xuICAgICAgICByZXR1cm4gdGhpcy5tYWtlUHVibGlzaENoYW5uZWxSZXF1ZXN0KHRoaXMuc3RhdGUuY2hhbm5lbCwgdGhpcy5zdGF0ZS5wYXNzd29yZCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c3RhdHVzOiBudWxsfSk7XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFubmVsTG9naW4ocmVzdWx0LmNoYW5uZWxOYW1lLCByZXN1bHQuc2hvcnRDaGFubmVsSWQsIHJlc3VsdC5jaGFubmVsQ2xhaW1JZCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IGVycm9yLm1lc3NhZ2UsIHN0YXR1czogbnVsbH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IGVycm9yLCBzdGF0dXM6IG51bGx9KTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIHsgIXRoaXMuc3RhdGUuc3RhdHVzID8gKFxuICAgICAgICAgIDxmb3JtIGlkPSdwdWJsaXNoLWNoYW5uZWwtZm9ybSc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0td2lkZSByb3ctLXNob3J0Jz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9J2xhYmVsJyBodG1sRm9yPSduZXctY2hhbm5lbC1uYW1lJz5OYW1lOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS02IGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtdGV4dC0tcHJpbWFyeSBmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1sZWZ0LWJvdHRvbSBzcGFuLS1yZWxhdGl2ZSc+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5APC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2NoYW5uZWwnIGlkPSduZXctY2hhbm5lbC1uYW1lJyBjbGFzc05hbWU9J2lucHV0LXRleHQnIHBsYWNlaG9sZGVyPSdleGFtcGxlQ2hhbm5lbE5hbWUnIHZhbHVlPXt0aGlzLnN0YXRlLmNoYW5uZWx9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUNoYW5uZWxJbnB1dH0gLz5cbiAgICAgICAgICAgICAgICAgIHsgKHRoaXMuc3RhdGUuY2hhbm5lbCAmJiAhdGhpcy5zdGF0ZS5lcnJvcikgJiYgPHNwYW4gaWQ9J2lucHV0LXN1Y2Nlc3MtY2hhbm5lbC1uYW1lJyBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tc3VjY2VzcyBzcGFuLS1hYnNvbHV0ZSc+eydcXHUyNzEzJ308L3NwYW4+IH1cbiAgICAgICAgICAgICAgICAgIHsgdGhpcy5zdGF0ZS5lcnJvciAmJiA8c3BhbiBpZD0naW5wdXQtc3VjY2Vzcy1jaGFubmVsLW5hbWUnIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLS1mYWlsdXJlIHNwYW4tLWFic29sdXRlJz57J1xcdTI3MTYnfTwvc3Bhbj4gfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgcm93LS1zaG9ydCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zIGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCcgaHRtbEZvcj0nbmV3LWNoYW5uZWwtcGFzc3dvcmQnPlBhc3N3b3JkOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS02IGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtdGV4dC0tcHJpbWFyeSc+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3N3b3JkJyBpZD0nbmV3LWNoYW5uZWwtcGFzc3dvcmQnIGNsYXNzTmFtZT0naW5wdXQtdGV4dCcgIHBsYWNlaG9sZGVyPScnIHZhbHVlPXt0aGlzLnN0YXRlLnBhc3N3b3JkfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVJbnB1dH0gLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLmVycm9yID8gKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tZmFpbHVyZSc+e3RoaXMuc3RhdGUuZXJyb3J9PC9wPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UnPkNob29zZSBhIG5hbWUgYW5kIHBhc3N3b3JkIGZvciB5b3VyIGNoYW5uZWw8L3A+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUnPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT0nYnV0dG9uLS1wcmltYXJ5JyBvbkNsaWNrPXt0aGlzLmNyZWF0ZUNoYW5uZWx9PkNyZWF0ZSBDaGFubmVsPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nZmluZS1wcmludCc+e3RoaXMuc3RhdGUuc3RhdHVzfTwvcD5cbiAgICAgICAgICAgIDxQcm9ncmVzc0JhciBzaXplPXsxMn0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2hhbm5lbENyZWF0ZUZvcm07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL0NoYW5uZWxDcmVhdGVGb3JtL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY29uc3QgQWN0aXZlU3RhdHVzQmFyID0gKCkgPT4ge1xuICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPSdwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLS1hY3RpdmUnPnwgPC9zcGFuPjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFjdGl2ZVN0YXR1c0JhcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbXBvbmVudHMvQWN0aXZlU3RhdHVzQmFyL2luZGV4LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmNvbnN0IEluYWN0aXZlU3RhdHVzQmFyID0gKCkgPT4ge1xuICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPSdwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLS1pbmFjdGl2ZSc+fCA8L3NwYW4+O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSW5hY3RpdmVTdGF0dXNCYXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb21wb25lbnRzL0luYWN0aXZlU3RhdHVzQmFyL2luZGV4LmpzeCIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtjbGVhckZpbGV9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBwdWJsaXNoIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXMgOiBwdWJsaXNoLnN0YXR1cy5zdGF0dXMsXG4gICAgbWVzc2FnZTogcHVibGlzaC5zdGF0dXMubWVzc2FnZSxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IHtcbiAgY2xlYXJGaWxlLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hTdGF0dXMvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ2NvbXBvbmVudHMvUHJvZ3Jlc3NCYXInO1xuaW1wb3J0ICogYXMgcHVibGlzaFN0YXRlcyBmcm9tICdjb25zdGFudHMvcHVibGlzaF9jbGFpbV9zdGF0ZXMnO1xuXG5jbGFzcyBQdWJsaXNoU3RhdHVzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IHN0YXR1cywgbWVzc2FnZSwgY2xlYXJGaWxlIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uIGZsZXgtY29udGFpbmVyLS1jZW50ZXItY2VudGVyJz5cbiAgICAgICAge3N0YXR1cyA9PT0gcHVibGlzaFN0YXRlcy5MT0FEX1NUQVJUICYmXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgYWxpZ24tY29udGVudC1jZW50ZXInPlxuICAgICAgICAgIDxwPkZpbGUgaXMgbG9hZGluZyB0byBzZXJ2ZXI8L3A+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPSdibHVlJz4wJTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAge3N0YXR1cyA9PT0gcHVibGlzaFN0YXRlcy5MT0FESU5HICYmXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyBhbGlnbi1jb250ZW50LWNlbnRlcic+XG4gICAgICAgICAgICA8cD5GaWxlIGlzIGxvYWRpbmcgdG8gc2VydmVyPC9wPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdibHVlJz57bWVzc2FnZX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHtzdGF0dXMgPT09IHB1Ymxpc2hTdGF0ZXMuUFVCTElTSElORyAmJlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IGFsaWduLWNvbnRlbnQtY2VudGVyJz5cbiAgICAgICAgICA8cD5VcGxvYWQgY29tcGxldGUuICBZb3VyIGZpbGUgaXMgbm93IGJlaW5nIHB1Ymxpc2hlZCBvbiB0aGUgYmxvY2tjaGFpbi4uLjwvcD5cbiAgICAgICAgICA8UHJvZ3Jlc3NCYXIgc2l6ZT17MTJ9IC8+XG4gICAgICAgICAgPHA+Q3VyaW91cyB3aGF0IG1hZ2ljIGlzIGhhcHBlbmluZyBoZXJlPyA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nYmxhbmsnIGhyZWY9J2h0dHBzOi8vbGJyeS5pby9mYXEvd2hhdC1pcy1sYnJ5Jz5MZWFybiBtb3JlLjwvYT48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHtzdGF0dXMgPT09IHB1Ymxpc2hTdGF0ZXMuU1VDQ0VTUyAmJlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IGFsaWduLWNvbnRlbnQtY2VudGVyJz5cbiAgICAgICAgICA8cD5Zb3VyIHB1Ymxpc2ggaXMgY29tcGxldGUhIFlvdSBhcmUgYmVpbmcgcmVkaXJlY3RlZCB0byBpdCBub3cuPC9wPlxuICAgICAgICAgIDxwPklmIHlvdSBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVkaXJlY3RlZCwgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj17bWVzc2FnZX0+Y2xpY2sgaGVyZS48L2E+PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7c3RhdHVzID09PSBwdWJsaXNoU3RhdGVzLkZBSUxFRCAmJlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IGFsaWduLWNvbnRlbnQtY2VudGVyJz5cbiAgICAgICAgICA8cD5Tb21ldGhpbmcgd2VudCB3cm9uZy4uLjwvcD5cbiAgICAgICAgICA8cD48c3Ryb25nPnttZXNzYWdlfTwvc3Ryb25nPjwvcD5cbiAgICAgICAgICA8cD5Gb3IgaGVscCwgcG9zdCB0aGUgYWJvdmUgZXJyb3IgdGV4dCBpbiB0aGUgI3NwZWVjaCBjaGFubmVsIG9uIHRoZSA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIGhyZWY9J2h0dHBzOi8vZGlzY29yZC5nZy9Zallid2hTJyB0YXJnZXQ9J19ibGFuayc+bGJyeSBkaXNjb3JkPC9hPjwvcD5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT0nYnV0dG9uLS1zZWNvbmRhcnknIG9uQ2xpY2s9e2NsZWFyRmlsZX0+UmVzZXQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFB1Ymxpc2hTdGF0dXM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL1B1Ymxpc2hTdGF0dXMvdmlldy5qc3giLCJleHBvcnQgY29uc3QgTE9BRF9TVEFSVCA9ICdMT0FEX1NUQVJUJztcbmV4cG9ydCBjb25zdCBMT0FESU5HID0gJ0xPQURJTkcnO1xuZXhwb3J0IGNvbnN0IFBVQkxJU0hJTkcgPSAnUFVCTElTSElORyc7XG5leHBvcnQgY29uc3QgU1VDQ0VTUyA9ICdTVUNDRVNTJztcbmV4cG9ydCBjb25zdCBGQUlMRUQgPSAnRkFJTEVEJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnN0YW50cy9wdWJsaXNoX2NsYWltX3N0YXRlcy5qcyIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xyXG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xyXG5cclxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgcHVibGlzaCB9KSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIG1lc3NhZ2U6IHB1Ymxpc2guZGlzYWJsZWRNZXNzYWdlLFxyXG4gIH07XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvUHVibGlzaERpc2FibGVkTWVzc2FnZS9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcblxyXG5jbGFzcyBQdWJsaXNoRGlzYWJsZWRNZXNzYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICByZW5kZXIgKCkge1xyXG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMucHJvcHMubWVzc2FnZTtcclxuICAgIGNvbnNvbGUubG9nKCd0aGlzLnByb3BzLm1lc3NhZ2U6JywgbWVzc2FnZSk7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IGRyb3B6b25lLS1kaXNhYmxlZCByb3ctLXRhbGwgZmxleC1jb250YWluZXItLWNvbHVtbiBmbGV4LWNvbnRhaW5lci0tY2VudGVyLWNlbnRlcic+XHJcbiAgICAgICAgPHAgY2xhc3NOYW1lPSd0ZXh0LS1kaXNhYmxlZCc+UHVibGlzaGluZyBpcyBjdXJyZW50bHkgZGlzYWJsZWQuPC9wPlxyXG4gICAgICAgIDxwIGNsYXNzTmFtZT0ndGV4dC0tZGlzYWJsZWQnPnttZXNzYWdlfTwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHVibGlzaERpc2FibGVkTWVzc2FnZTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9QdWJsaXNoRGlzYWJsZWRNZXNzYWdlL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBOYXZCYXIgZnJvbSAnY29udGFpbmVycy9OYXZCYXInO1xuaW1wb3J0IFNFTyBmcm9tICdjb21wb25lbnRzL1NFTyc7XG5cbmNsYXNzIEFib3V0UGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxTRU8gcGFnZVRpdGxlPXsnQWJvdXQnfSBwYWdlVXJpPXsnYWJvdXQnfSAvPlxuICAgICAgICA8TmF2QmFyIC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tbWVkLTEwIGFsaWduLWNvbnRlbnQtdG9wJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS04IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdwdWxsLXF1b3RlJz5TcGVlLmNoIGlzIGFuIG9wZW4tc291cmNlIHByb2plY3QuICBQbGVhc2UgY29udHJpYnV0ZSB0byB0aGUgZXhpc3Rpbmcgc2l0ZSwgb3IgZm9yayBpdCBhbmQgbWFrZSB5b3VyIG93bi48L3A+XG4gICAgICAgICAgICAgIDxwPjxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vdHdpdHRlci5jb20vc3BlZV9jaCc+VFdJVFRFUjwvYT48L3A+XG4gICAgICAgICAgICAgIDxwPjxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9sYnJ5aW8vc3BlZS5jaCc+R0lUSFVCPC9hPjwvcD5cbiAgICAgICAgICAgICAgPHA+PGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly9kaXNjb3JkLmdnL1lqWWJ3aFMnPkRJU0NPUkQgQ0hBTk5FTDwvYT48L3A+XG4gICAgICAgICAgICAgIDxwPjxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9sYnJ5aW8vc3BlZS5jaC9ibG9iL21hc3Rlci9SRUFETUUubWQnPkRPQ1VNRU5UQVRJT048L2E+PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1tZWQtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8cD5TcGVlLmNoIGlzIGEgbWVkaWEtaG9zdGluZyBzaXRlIHRoYXQgcmVhZHMgZnJvbSBhbmQgcHVibGlzaGVzIGNvbnRlbnQgdG8gdGhlIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9sYnJ5LmlvJz5MQlJZPC9hPiBibG9ja2NoYWluLjwvcD5cbiAgICAgICAgICAgICAgPHA+U3BlZS5jaCBpcyBhIGhvc3Rpbmcgc2VydmljZSwgYnV0IHdpdGggdGhlIGFkZGVkIGJlbmVmaXQgdGhhdCBpdCBzdG9yZXMgeW91ciBjb250ZW50IG9uIGEgZGVjZW50cmFsaXplZCBuZXR3b3JrIG9mIGNvbXB1dGVycyAtLSB0aGUgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyBocmVmPSdodHRwczovL2xicnkuaW8vZ2V0Jz5MQlJZPC9hPiBuZXR3b3JrLiAgVGhpcyBtZWFucyB0aGF0IHlvdXIgaW1hZ2VzIGFyZSBzdG9yZWQgaW4gbXVsdGlwbGUgbG9jYXRpb25zIHdpdGhvdXQgYSBzaW5nbGUgcG9pbnQgb2YgZmFpbHVyZS48L3A+XG4gICAgICAgICAgICAgIDxoMz5Db250cmlidXRlPC9oMz5cbiAgICAgICAgICAgICAgPHA+SWYgeW91IGhhdmUgYW4gaWRlYSBmb3IgeW91ciBvd24gc3BlZS5jaC1saWtlIHNpdGUgb24gdG9wIG9mIExCUlksIGZvcmsgb3VyIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL2xicnlpby9zcGVlLmNoJz5naXRodWIgcmVwbzwvYT4gYW5kIGdvIHRvIHRvd24hPC9wPlxuICAgICAgICAgICAgICA8cD5JZiB5b3Ugd2FudCB0byBpbXByb3ZlIHNwZWUuY2gsIGpvaW4gb3VyIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9kaXNjb3JkLmdnL1lqWWJ3aFMnPmRpc2NvcmQgY2hhbm5lbDwvYT4gb3Igc29sdmUgb25lIG9mIG91ciA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9sYnJ5aW8vc3BlZS5jaC9pc3N1ZXMnPmdpdGh1YiBpc3N1ZXM8L2E+LjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFib3V0UGFnZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbXBvbmVudHMvQWJvdXRQYWdlL2luZGV4LmpzeCIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgY2hhbm5lbCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgbG9nZ2VkSW5DaGFubmVsTmFtZTogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubmFtZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvTG9naW5QYWdlL2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHdpdGhSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBTRU8gZnJvbSAnY29tcG9uZW50cy9TRU8nO1xuaW1wb3J0IE5hdkJhciBmcm9tICdjb250YWluZXJzL05hdkJhcic7XG5pbXBvcnQgQ2hhbm5lbExvZ2luRm9ybSBmcm9tICdjb250YWluZXJzL0NoYW5uZWxMb2dpbkZvcm0nO1xuaW1wb3J0IENoYW5uZWxDcmVhdGVGb3JtIGZyb20gJ2NvbnRhaW5lcnMvQ2hhbm5lbENyZWF0ZUZvcm0nO1xuXG5jbGFzcyBMb2dpblBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXdQcm9wcykge1xuICAgIC8vIHJlLXJvdXRlIHRoZSB1c2VyIHRvIHRoZSBob21lcGFnZSBpZiB0aGUgdXNlciBpcyBsb2dnZWQgaW5cbiAgICBpZiAobmV3UHJvcHMubG9nZ2VkSW5DaGFubmVsTmFtZSAhPT0gdGhpcy5wcm9wcy5sb2dnZWRJbkNoYW5uZWxOYW1lKSB7XG4gICAgICB0aGlzLnByb3BzLmhpc3RvcnkucHVzaChgL2ApO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8U0VPIHBhZ2VUaXRsZT17J0xvZ2luJ30gcGFnZVVyaT17J2xvZ2luJ30gLz5cbiAgICAgICAgPE5hdkJhciAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNSBjb2x1bW4tLW1lZC0xMCBhbGlnbi1jb250ZW50LXRvcCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tOCBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxwPkNoYW5uZWxzIGFsbG93IHlvdSB0byBwdWJsaXNoIGFuZCBncm91cCBjb250ZW50IHVuZGVyIGFuIGlkZW50aXR5LiBZb3UgY2FuIGNyZWF0ZSBhIGNoYW5uZWwgZm9yIHlvdXJzZWxmLCBvciBzaGFyZSBvbmUgd2l0aCBsaWtlLW1pbmRlZCBmcmllbmRzLiAgWW91IGNhbiBjcmVhdGUgMSBjaGFubmVsLCBvciAxMDAsIHNvIHdoZXRoZXIgeW91J3JlIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9Jy9AY2F0YWxvbmlhMjAxNzo0M2RjZjQ3MTYzY2FhMjFkODQwNGQ5ZmU5YjMwZjc4ZWYzZTE0NmE4Jz5kb2N1bWVudGluZyBpbXBvcnRhbnQgZXZlbnRzPC9hPiwgb3IgbWFraW5nIGEgcHVibGljIHJlcG9zaXRvcnkgZm9yIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9Jy9AY2F0R2lmcyc+Y2F0IGdpZnM8L2E+IChwYXNzd29yZDogJzEyMzQnKSwgdHJ5IGNyZWF0aW5nIGEgY2hhbm5lbCBmb3IgaXQhPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1tZWQtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPSdoMy0tbm8tYm90dG9tJz5Mb2cgaW4gdG8gYW4gZXhpc3RpbmcgY2hhbm5lbDo8L2gzPlxuICAgICAgICAgICAgICA8Q2hhbm5lbExvZ2luRm9ybSAvPlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPSdoMy0tbm8tYm90dG9tJz5DcmVhdGUgYSBicmFuZCBuZXcgY2hhbm5lbDo8L2gzPlxuICAgICAgICAgICAgICA8Q2hhbm5lbENyZWF0ZUZvcm0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhSb3V0ZXIoTG9naW5QYWdlKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvTG9naW5QYWdlL3ZpZXcuanN4IiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IG9uSGFuZGxlU2hvd1BhZ2VVcmkgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgZXJyb3IgICAgICA6IHNob3cucmVxdWVzdC5lcnJvcixcbiAgICByZXF1ZXN0VHlwZTogc2hvdy5yZXF1ZXN0LnR5cGUsXG4gIH07XG59O1xuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSB7XG4gIG9uSGFuZGxlU2hvd1BhZ2VVcmksXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvU2hvd1BhZ2UvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEVycm9yUGFnZSBmcm9tICdjb21wb25lbnRzL0Vycm9yUGFnZSc7XG5pbXBvcnQgU2hvd0Fzc2V0TGl0ZSBmcm9tICdjb250YWluZXJzL1Nob3dBc3NldExpdGUnO1xuaW1wb3J0IFNob3dBc3NldERldGFpbHMgZnJvbSAnY29udGFpbmVycy9TaG93QXNzZXREZXRhaWxzJztcbmltcG9ydCBTaG93Q2hhbm5lbCBmcm9tICdjb250YWluZXJzL1Nob3dDaGFubmVsJztcblxuaW1wb3J0IHsgQ0hBTk5FTCwgQVNTRVRfTElURSwgQVNTRVRfREVUQUlMUyB9IGZyb20gJ2NvbnN0YW50cy9zaG93X3JlcXVlc3RfdHlwZXMnO1xuXG5jbGFzcyBTaG93UGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLnByb3BzLm9uSGFuZGxlU2hvd1BhZ2VVcmkodGhpcy5wcm9wcy5tYXRjaC5wYXJhbXMpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgKG5leHRQcm9wcykge1xuICAgIGlmIChuZXh0UHJvcHMubWF0Y2gucGFyYW1zICE9PSB0aGlzLnByb3BzLm1hdGNoLnBhcmFtcykge1xuICAgICAgdGhpcy5wcm9wcy5vbkhhbmRsZVNob3dQYWdlVXJpKG5leHRQcm9wcy5tYXRjaC5wYXJhbXMpO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgZXJyb3IsIHJlcXVlc3RUeXBlIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEVycm9yUGFnZSBlcnJvcj17ZXJyb3J9IC8+XG4gICAgICApO1xuICAgIH1cbiAgICBzd2l0Y2ggKHJlcXVlc3RUeXBlKSB7XG4gICAgICBjYXNlIENIQU5ORUw6XG4gICAgICAgIHJldHVybiA8U2hvd0NoYW5uZWwgLz47XG4gICAgICBjYXNlIEFTU0VUX0xJVEU6XG4gICAgICAgIHJldHVybiA8U2hvd0Fzc2V0TGl0ZSAvPjtcbiAgICAgIGNhc2UgQVNTRVRfREVUQUlMUzpcbiAgICAgICAgcmV0dXJuIDxTaG93QXNzZXREZXRhaWxzIC8+O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDxwPmxvYWRpbmcuLi48L3A+O1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2hvd1BhZ2U7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL1Nob3dQYWdlL3ZpZXcuanN4IiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICAvLyBzZWxlY3QgcmVxdWVzdCBpbmZvXG4gIGNvbnN0IHJlcXVlc3RJZCA9IHNob3cucmVxdWVzdC5pZDtcbiAgLy8gc2VsZWN0IGFzc2V0IGluZm9cbiAgbGV0IGFzc2V0O1xuICBjb25zdCByZXF1ZXN0ID0gc2hvdy5yZXF1ZXN0TGlzdFtyZXF1ZXN0SWRdIHx8IG51bGw7XG4gIGNvbnN0IGFzc2V0TGlzdCA9IHNob3cuYXNzZXRMaXN0O1xuICBpZiAocmVxdWVzdCAmJiBhc3NldExpc3QpIHtcbiAgICBjb25zdCBhc3NldEtleSA9IHJlcXVlc3Qua2V5OyAgLy8gbm90ZToganVzdCBzdG9yZSB0aGlzIGluIHRoZSByZXF1ZXN0XG4gICAgYXNzZXQgPSBhc3NldExpc3RbYXNzZXRLZXldIHx8IG51bGw7XG4gIH07XG4gIC8vIHJldHVybiBwcm9wc1xuICByZXR1cm4ge1xuICAgIGFzc2V0LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9TaG93QXNzZXRMaXRlL2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTRU8gZnJvbSAnY29tcG9uZW50cy9TRU8nO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IEFzc2V0RGlzcGxheSBmcm9tICdjb250YWluZXJzL0Fzc2V0RGlzcGxheSc7XG5cbmNsYXNzIFNob3dMaXRlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGFzc2V0IH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChhc3NldCkge1xuICAgICAgY29uc3QgeyBuYW1lLCBjbGFpbUlkIH0gPSBhc3NldC5jbGFpbURhdGE7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uIGZsZXgtY29udGFpbmVyLS1jZW50ZXItY2VudGVyIHNob3ctbGl0ZS1jb250YWluZXInPlxuICAgICAgICAgIDxTRU8gcGFnZVRpdGxlPXtuYW1lfSBhc3NldD17YXNzZXR9IC8+XG4gICAgICAgICAgPEFzc2V0RGlzcGxheSAvPlxuICAgICAgICAgIDxMaW5rIGlkPSdhc3NldC1ib2lsZXJwYXRlJyBjbGFzc05hbWU9J2xpbmstLXByaW1hcnkgZmluZS1wcmludCcgdG89e2AvJHtjbGFpbUlkfS8ke25hbWV9YH0+aG9zdGVkXG4gICAgICAgICAgICB2aWEgU3BlZS5jaDwvTGluaz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwgcm93LS1wYWRkZWQgZmxleC1jb250YWluZXItLWNvbHVtbiBmbGV4LWNvbnRhaW5lci0tY2VudGVyLWNlbnRlcic+XG4gICAgICAgIDxwPmxvYWRpbmcgYXNzZXQgZGF0YS4uLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNob3dMaXRlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9TaG93QXNzZXRMaXRlL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9ncmVzc0JhciBmcm9tICdjb21wb25lbnRzL1Byb2dyZXNzQmFyJztcbmltcG9ydCB7IExPQ0FMX0NIRUNLLCBVTkFWQUlMQUJMRSwgRVJST1IsIEFWQUlMQUJMRSB9IGZyb20gJ2NvbnN0YW50cy9hc3NldF9kaXNwbGF5X3N0YXRlcyc7XG5cbmNsYXNzIEFzc2V0RGlzcGxheSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICBjb25zdCB7IGFzc2V0OiB7IGNsYWltRGF0YTogeyBuYW1lLCBjbGFpbUlkIH0gfSB9ID0gdGhpcy5wcm9wcztcbiAgICB0aGlzLnByb3BzLm9uRmlsZVJlcXVlc3QobmFtZSwgY2xhaW1JZCk7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IHN0YXR1cywgZXJyb3IsIGFzc2V0OiB7IGNsYWltRGF0YTogeyBuYW1lLCBjbGFpbUlkLCBjb250ZW50VHlwZSwgZmlsZUV4dCwgdGh1bWJuYWlsIH0gfSB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBpZD0nYXNzZXQtZGlzcGxheS1jb21wb25lbnQnPlxuICAgICAgICB7KHN0YXR1cyA9PT0gTE9DQUxfQ0hFQ0spICYmXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHA+Q2hlY2tpbmcgdG8gc2VlIGlmIFNwZWUuY2ggaGFzIHlvdXIgYXNzZXQgbG9jYWxseS4uLjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgeyhzdGF0dXMgPT09IFVOQVZBSUxBQkxFKSAmJlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxwPlNpdCB0aWdodCwgd2UncmUgc2VhcmNoaW5nIHRoZSBMQlJZIGJsb2NrY2hhaW4gZm9yIHlvdXIgYXNzZXQhPC9wPlxuICAgICAgICAgIDxQcm9ncmVzc0JhciBzaXplPXsxMn0gLz5cbiAgICAgICAgICA8cD5DdXJpb3VzIHdoYXQgbWFnaWMgaXMgaGFwcGVuaW5nIGhlcmU/IDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdibGFuaycgaHJlZj0naHR0cHM6Ly9sYnJ5LmlvL2ZhcS93aGF0LWlzLWxicnknPkxlYXJuIG1vcmUuPC9hPjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgeyhzdGF0dXMgPT09IEVSUk9SKSAmJlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxwPlVuZm9ydHVuYXRlbHksIHdlIGNvdWxkbid0IGRvd25sb2FkIHlvdXIgYXNzZXQgZnJvbSBMQlJZLiAgWW91IGNhbiBoZWxwIHVzIG91dCBieSBzaGFyaW5nIHRoZSBiZWxvdyBlcnJvciBtZXNzYWdlIGluIHRoZSA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIGhyZWY9J2h0dHBzOi8vZGlzY29yZC5nZy9Zallid2hTJyB0YXJnZXQ9J19ibGFuayc+TEJSWSBkaXNjb3JkPC9hPi48L3A+XG4gICAgICAgICAgPGk+PHAgaWQ9J2Vycm9yLW1lc3NhZ2UnPntlcnJvcn08L3A+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7KHN0YXR1cyA9PT0gQVZBSUxBQkxFKSAmJlxuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL2pwZWcnOlxuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvanBnJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL3BuZyc6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdhc3NldCdcbiAgICAgICAgICAgICAgICAgIHNyYz17YC8ke2NsYWltSWR9LyR7bmFtZX0uJHtmaWxlRXh0fWB9XG4gICAgICAgICAgICAgICAgICBhbHQ9e25hbWV9IC8+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9naWYnOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nYXNzZXQnXG4gICAgICAgICAgICAgICAgICBzcmM9e2AvJHtjbGFpbUlkfS8ke25hbWV9LiR7ZmlsZUV4dH1gfVxuICAgICAgICAgICAgICAgICAgYWx0PXtuYW1lfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlICd2aWRlby9tcDQnOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDx2aWRlbyBjbGFzc05hbWU9J2Fzc2V0IHZpZGVvJyBjb250cm9scyBwb3N0ZXI9e3RodW1ibmFpbH0+XG4gICAgICAgICAgICAgICAgICA8c291cmNlXG4gICAgICAgICAgICAgICAgICAgIHNyYz17YC8ke2NsYWltSWR9LyR7bmFtZX0uJHtmaWxlRXh0fWB9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHA+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIDxjb2RlPnZpZGVvPC9jb2RlPiBlbGVtZW50LjwvcD5cbiAgICAgICAgICAgICAgICA8L3ZpZGVvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8cD5VbnN1cHBvcnRlZCBmaWxlIHR5cGU8L3A+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFzc2V0RGlzcGxheTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5L3ZpZXcuanN4IiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICAvLyBzZWxlY3QgcmVxdWVzdCBpbmZvXG4gIGNvbnN0IHJlcXVlc3RJZCA9IHNob3cucmVxdWVzdC5pZDtcbiAgLy8gc2VsZWN0IGFzc2V0IGluZm9cbiAgbGV0IGFzc2V0O1xuICBjb25zdCByZXF1ZXN0ID0gc2hvdy5yZXF1ZXN0TGlzdFtyZXF1ZXN0SWRdIHx8IG51bGw7XG4gIGNvbnN0IGFzc2V0TGlzdCA9IHNob3cuYXNzZXRMaXN0O1xuICBpZiAocmVxdWVzdCAmJiBhc3NldExpc3QpIHtcbiAgICBjb25zdCBhc3NldEtleSA9IHJlcXVlc3Qua2V5OyAgLy8gbm90ZToganVzdCBzdG9yZSB0aGlzIGluIHRoZSByZXF1ZXN0XG4gICAgYXNzZXQgPSBhc3NldExpc3RbYXNzZXRLZXldIHx8IG51bGw7XG4gIH07XG4gIC8vIHJldHVybiBwcm9wc1xuICByZXR1cm4ge1xuICAgIGFzc2V0LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9TaG93QXNzZXREZXRhaWxzL2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTRU8gZnJvbSAnY29tcG9uZW50cy9TRU8nO1xuaW1wb3J0IE5hdkJhciBmcm9tICdjb250YWluZXJzL05hdkJhcic7XG5pbXBvcnQgRXJyb3JQYWdlIGZyb20gJ2NvbXBvbmVudHMvRXJyb3JQYWdlJztcbmltcG9ydCBBc3NldFRpdGxlIGZyb20gJ2NvbnRhaW5lcnMvQXNzZXRUaXRsZSc7XG5pbXBvcnQgQXNzZXREaXNwbGF5IGZyb20gJ2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5JztcbmltcG9ydCBBc3NldEluZm8gZnJvbSAnY29udGFpbmVycy9Bc3NldEluZm8nO1xuXG5jbGFzcyBTaG93QXNzZXREZXRhaWxzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGFzc2V0IH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChhc3NldCkge1xuICAgICAgY29uc3QgeyBjbGFpbURhdGE6IHsgbmFtZSB9IH0gPSBhc3NldDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPFNFTyBwYWdlVGl0bGU9e2Ake25hbWV9IC0gZGV0YWlsc2B9IGFzc2V0PXthc3NldH0gLz5cbiAgICAgICAgICA8TmF2QmFyIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwgcm93LS1wYWRkZWQnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTEwJz5cbiAgICAgICAgICAgICAgPEFzc2V0VGl0bGUgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1zbWwtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHNob3ctZGV0YWlscy1jb250YWluZXInPlxuICAgICAgICAgICAgICAgIDxBc3NldERpc3BsYXkgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNSBjb2x1bW4tLXNtbC0xMCBhbGlnbi1jb250ZW50LXRvcCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQnPlxuICAgICAgICAgICAgICAgIDxBc3NldEluZm8gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxFcnJvclBhZ2UgZXJyb3I9eydsb2FkaW5nIGFzc2V0IGRhdGEuLi4nfSAvPlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNob3dBc3NldERldGFpbHM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL1Nob3dBc3NldERldGFpbHMvdmlldy5qc3giLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCB7IHNlbGVjdEFzc2V0IH0gZnJvbSAnc2VsZWN0b3JzL3Nob3cnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaG93IH0pID0+IHtcbiAgY29uc3QgeyBjbGFpbURhdGE6IHsgdGl0bGUgfSB9ID0gc2VsZWN0QXNzZXQoc2hvdyk7XG4gIHJldHVybiB7XG4gICAgdGl0bGUsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL0Fzc2V0VGl0bGUvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5jb25zdCBBc3NldFRpdGxlID0gKHsgdGl0bGUgfSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXY+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQtLWxhcmdlJz57dGl0bGV9PC9zcGFuPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXNzZXRUaXRsZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbnRhaW5lcnMvQXNzZXRUaXRsZS92aWV3LmpzeCIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHsgc2VsZWN0QXNzZXQgfSBmcm9tICdzZWxlY3RvcnMvc2hvdyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICAvLyBzZWxlY3QgYXNzZXRcbiAgY29uc3QgYXNzZXQgPSBzZWxlY3RBc3NldChzaG93KTtcbiAgLy8gIHJldHVybiBwcm9wc1xuICByZXR1cm4ge1xuICAgIGFzc2V0LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9Bc3NldEluZm8vaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuXG5jbGFzcyBBc3NldEluZm8gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5jb3B5VG9DbGlwYm9hcmQgPSB0aGlzLmNvcHlUb0NsaXBib2FyZC5iaW5kKHRoaXMpO1xuICB9XG4gIGNvcHlUb0NsaXBib2FyZCAoZXZlbnQpIHtcbiAgICB2YXIgZWxlbWVudFRvQ29weSA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmVsZW1lbnR0b2NvcHk7XG4gICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50VG9Db3B5KTtcbiAgICBlbGVtZW50LnNlbGVjdCgpO1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7ZXJyb3I6ICdPb3BzLCB1bmFibGUgdG8gY29weSd9KTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGFzc2V0OiB7IHNob3J0SWQsIGNsYWltRGF0YSA6IHsgY2hhbm5lbE5hbWUsIGNlcnRpZmljYXRlSWQsIGRlc2NyaXB0aW9uLCBuYW1lLCBjbGFpbUlkLCBmaWxlRXh0LCBjb250ZW50VHlwZSwgdGh1bWJuYWlsLCBob3N0IH0gfSB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAge2NoYW5uZWxOYW1lICYmXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS13aWRlIHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMiBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQnPkNoYW5uZWw6PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS04IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ndGV4dCc+PExpbmsgdG89e2AvJHtjaGFubmVsTmFtZX06JHtjZXJ0aWZpY2F0ZUlkfWB9PntjaGFubmVsTmFtZX08L0xpbms+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIHtkZXNjcmlwdGlvbiAmJlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0td2lkZSByb3ctLW5vLXRvcCc+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSd0ZXh0Jz57ZGVzY3JpcHRpb259PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgaWQ9J3Nob3ctc2hhcmUtYnV0dG9ucyc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLXdpZGUgcm93LS1uby10b3AnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTIgY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQnPlNoYXJlOjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdyb3cgcm93LS1zaG9ydCByb3ctLXdpZGUgZmxleC1jb250YWluZXItLXJvdyBmbGV4LWNvbnRhaW5lci0tc3BhY2UtYmV0d2Vlbi1ib3R0b20gZmxleC1jb250YWluZXItLXdyYXAnPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9e2BodHRwczovL3R3aXR0ZXIuY29tL2ludGVudC90d2VldD90ZXh0PSR7aG9zdH0vJHtzaG9ydElkfS8ke25hbWV9YH0+dHdpdHRlcjwvYT5cbiAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPXtgaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3NoYXJlci9zaGFyZXIucGhwP3U9JHtob3N0fS8ke3Nob3J0SWR9LyR7bmFtZX1gfT5mYWNlYm9vazwvYT5cbiAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPXtgaHR0cDovL3R1bWJsci5jb20vd2lkZ2V0cy9zaGFyZS90b29sP2Nhbm9uaWNhbFVybD0ke2hvc3R9LyR7c2hvcnRJZH0vJHtuYW1lfWB9PnR1bWJscjwvYT5cbiAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPXtgaHR0cHM6Ly93d3cucmVkZGl0LmNvbS9zdWJtaXQ/dXJsPSR7aG9zdH0vJHtzaG9ydElkfS8ke25hbWV9JnRpdGxlPSR7bmFtZX1gfT5yZWRkaXQ8L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS13aWRlIHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICA8ZGl2IGlkPSdzaG93LXNob3J0LWxpbmsnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTIgY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQnPkxpbms6PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tOCBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1zaG9ydCByb3ctLXdpZGUnPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS03Jz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbnB1dC1lcnJvcicgaWQ9J2lucHV0LWVycm9yLWNvcHktc2hvcnQtbGluaycgaGlkZGVuPSd0cnVlJz5lcnJvciBoZXJlPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J3Nob3J0LWxpbmsnIGNsYXNzTmFtZT0naW5wdXQtZGlzYWJsZWQgaW5wdXQtdGV4dC0tZnVsbC13aWR0aCcgcmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgc3BlbGxDaGVjaz0nZmFsc2UnXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtgJHtob3N0fS8ke3Nob3J0SWR9LyR7bmFtZX0uJHtmaWxlRXh0fWB9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2VsZWN0fSAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0xJyAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0yJz5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLXByaW1hcnkgYnV0dG9uLS13aWRlJyBkYXRhLWVsZW1lbnR0b2NvcHk9J3Nob3J0LWxpbmsnXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuY29weVRvQ2xpcGJvYXJkfT5jb3B5XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgaWQ9J3Nob3ctZW1iZWQtY29kZSc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMiBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ndGV4dCc+RW1iZWQ6PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tOCBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1zaG9ydCByb3ctLXdpZGUnPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS03Jz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbnB1dC1lcnJvcicgaWQ9J2lucHV0LWVycm9yLWNvcHktZW1iZWQtdGV4dCcgaGlkZGVuPSd0cnVlJz5lcnJvciBoZXJlPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7KGNvbnRlbnRUeXBlID09PSAndmlkZW8vbXA0JykgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZW1iZWQtdGV4dCcgY2xhc3NOYW1lPSdpbnB1dC1kaXNhYmxlZCBpbnB1dC10ZXh0LS1mdWxsLXdpZHRoJyByZWFkT25seVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2VsZWN0fSBzcGVsbENoZWNrPSdmYWxzZSdcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YDx2aWRlbyB3aWR0aD1cIjEwMCVcIiBjb250cm9scyBwb3N0ZXI9XCIke3RodW1ibmFpbH1cIiBzcmM9XCIke2hvc3R9LyR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9XCIvPjwvdmlkZW8+YH0gLz5cbiAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZW1iZWQtdGV4dCcgY2xhc3NOYW1lPSdpbnB1dC1kaXNhYmxlZCBpbnB1dC10ZXh0LS1mdWxsLXdpZHRoJyByZWFkT25seVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2VsZWN0fSBzcGVsbENoZWNrPSdmYWxzZSdcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YDxpbWcgc3JjPVwiJHtob3N0fS8ke2NsYWltSWR9LyR7bmFtZX0uJHtmaWxlRXh0fVwiLz5gfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMScgLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMic+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT0nYnV0dG9uLS1wcmltYXJ5IGJ1dHRvbi0td2lkZScgZGF0YS1lbGVtZW50dG9jb3B5PSdlbWJlZC10ZXh0J1xuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmNvcHlUb0NsaXBib2FyZH0+Y29weVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1zcGFjZS1iZXR3ZWVuLWJvdHRvbSc+XG4gICAgICAgICAgPExpbmsgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0bz17YC8ke3Nob3J0SWR9LyR7bmFtZX0uJHtmaWxlRXh0fWB9PjxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9J3RleHQnPkRpcmVjdCBMaW5rPC9zcGFuPjwvTGluaz5cbiAgICAgICAgICA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIGhyZWY9e2Ake2hvc3R9LyR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9YH0gZG93bmxvYWQ9e25hbWV9PkRvd25sb2FkPC9hPlxuICAgICAgICAgIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vbGJyeS5pby9kbWNhJz5SZXBvcnQ8L2E+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBc3NldEluZm87XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb250YWluZXJzL0Fzc2V0SW5mby92aWV3LmpzeCIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaG93IH0pID0+IHtcbiAgLy8gc2VsZWN0IHJlcXVlc3QgaW5mb1xuICBjb25zdCByZXF1ZXN0SWQgPSBzaG93LnJlcXVlc3QuaWQ7XG4gIC8vIHNlbGVjdCByZXF1ZXN0XG4gIGNvbnN0IHByZXZpb3VzUmVxdWVzdCA9IHNob3cucmVxdWVzdExpc3RbcmVxdWVzdElkXSB8fCBudWxsO1xuICAvLyBzZWxlY3QgY2hhbm5lbFxuICBsZXQgY2hhbm5lbDtcbiAgaWYgKHByZXZpb3VzUmVxdWVzdCkge1xuICAgIGNvbnN0IGNoYW5uZWxLZXkgPSBwcmV2aW91c1JlcXVlc3Qua2V5O1xuICAgIGNoYW5uZWwgPSBzaG93LmNoYW5uZWxMaXN0W2NoYW5uZWxLZXldIHx8IG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9TaG93Q2hhbm5lbC9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU0VPIGZyb20gJ2NvbXBvbmVudHMvU0VPJztcbmltcG9ydCBFcnJvclBhZ2UgZnJvbSAnY29tcG9uZW50cy9FcnJvclBhZ2UnO1xuaW1wb3J0IE5hdkJhciBmcm9tICdjb250YWluZXJzL05hdkJhcic7XG5pbXBvcnQgQ2hhbm5lbENsYWltc0Rpc3BsYXkgZnJvbSAnY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheSc7XG5cbmNsYXNzIFNob3dDaGFubmVsIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGNoYW5uZWwgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKGNoYW5uZWwpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgbG9uZ0lkLCBzaG9ydElkIH0gPSBjaGFubmVsO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8U0VPIHBhZ2VUaXRsZT17bmFtZX0gY2hhbm5lbD17Y2hhbm5lbH0gLz5cbiAgICAgICAgICA8TmF2QmFyIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwgcm93LS1wYWRkZWQnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTEwJz5cbiAgICAgICAgICAgICAgPGgyPmNoYW5uZWwgbmFtZToge25hbWV9PC9oMj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXsnZmluZS1wcmludCd9PmZ1bGwgY2hhbm5lbCBpZDoge2xvbmdJZH08L3A+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT17J2ZpbmUtcHJpbnQnfT5zaG9ydCBjaGFubmVsIGlkOiB7c2hvcnRJZH08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0xMCc+XG4gICAgICAgICAgICAgIDxDaGFubmVsQ2xhaW1zRGlzcGxheSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9O1xuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JQYWdlIGVycm9yPXsnbG9hZGluZyBjaGFubmVsIGRhdGEuLi4nfSAvPlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNob3dDaGFubmVsO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9TaG93Q2hhbm5lbC92aWV3LmpzeCIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBvblVwZGF0ZUNoYW5uZWxDbGFpbXMgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIC8vIHNlbGVjdCBjaGFubmVsIGtleVxuICBjb25zdCByZXF1ZXN0ID0gc2hvdy5yZXF1ZXN0TGlzdFtzaG93LnJlcXVlc3QuaWRdO1xuICBjb25zdCBjaGFubmVsS2V5ID0gcmVxdWVzdC5rZXk7XG4gIC8vIHNlbGVjdCBjaGFubmVsIGNsYWltc1xuICBjb25zdCBjaGFubmVsID0gc2hvdy5jaGFubmVsTGlzdFtjaGFubmVsS2V5XSB8fCBudWxsO1xuICAvLyByZXR1cm4gcHJvcHNcbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsS2V5LFxuICAgIGNoYW5uZWwsXG4gIH07XG59O1xuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSB7XG4gIG9uVXBkYXRlQ2hhbm5lbENsYWltcyxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheS9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXNzZXRQcmV2aWV3IGZyb20gJ2NvbXBvbmVudHMvQXNzZXRQcmV2aWV3JztcblxuY2xhc3MgQ2hhbm5lbENsYWltc0Rpc3BsYXkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zaG93TmV4dFJlc3VsdHNQYWdlID0gdGhpcy5zaG93TmV4dFJlc3VsdHNQYWdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zaG93UHJldmlvdXNSZXN1bHRzUGFnZSA9IHRoaXMuc2hvd1ByZXZpb3VzUmVzdWx0c1BhZ2UuYmluZCh0aGlzKTtcbiAgfVxuICBzaG93UHJldmlvdXNSZXN1bHRzUGFnZSAoKSB7XG4gICAgY29uc3QgeyBjaGFubmVsOiB7IGNsYWltc0RhdGE6IHsgY3VycmVudFBhZ2UgfSB9IH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHByZXZpb3VzUGFnZSA9IHBhcnNlSW50KGN1cnJlbnRQYWdlKSAtIDE7XG4gICAgdGhpcy5zaG93TmV3UGFnZShwcmV2aW91c1BhZ2UpO1xuICB9XG4gIHNob3dOZXh0UmVzdWx0c1BhZ2UgKCkge1xuICAgIGNvbnN0IHsgY2hhbm5lbDogeyBjbGFpbXNEYXRhOiB7IGN1cnJlbnRQYWdlIH0gfSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBuZXh0UGFnZSA9IHBhcnNlSW50KGN1cnJlbnRQYWdlKSArIDE7XG4gICAgdGhpcy5zaG93TmV3UGFnZShuZXh0UGFnZSk7XG4gIH1cbiAgc2hvd05ld1BhZ2UgKHBhZ2UpIHtcbiAgICBjb25zdCB7IGNoYW5uZWxLZXksIGNoYW5uZWw6IHsgbmFtZSwgbG9uZ0lkIH0gfSA9IHRoaXMucHJvcHM7XG4gICAgdGhpcy5wcm9wcy5vblVwZGF0ZUNoYW5uZWxDbGFpbXMoY2hhbm5lbEtleSwgbmFtZSwgbG9uZ0lkLCBwYWdlKTtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgY2hhbm5lbDogeyBjbGFpbXNEYXRhOiB7IGNsYWltcywgY3VycmVudFBhZ2UsIHRvdGFsUGFnZXMgfSB9IH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tdGFsbCc+XG4gICAgICAgIHsoY2xhaW1zLmxlbmd0aCA+IDApID8gKFxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICB7Y2xhaW1zLm1hcCgoY2xhaW0sIGluZGV4KSA9PiA8QXNzZXRQcmV2aWV3XG4gICAgICAgICAgICAgIGNsYWltRGF0YT17Y2xhaW19XG4gICAgICAgICAgICAgIGtleT17YCR7Y2xhaW0ubmFtZX0tJHtpbmRleH1gfVxuICAgICAgICAgICAgLz4pfVxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgeyhjdXJyZW50UGFnZSA+IDEpICYmXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXsnYnV0dG9uLS1zZWNvbmRhcnknfSBvbkNsaWNrPXt0aGlzLnNob3dQcmV2aW91c1Jlc3VsdHNQYWdlfT5QcmV2aW91cyBQYWdlPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgeyhjdXJyZW50UGFnZSA8IHRvdGFsUGFnZXMpICYmXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXsnYnV0dG9uLS1zZWNvbmRhcnknfSBvbkNsaWNrPXt0aGlzLnNob3dOZXh0UmVzdWx0c1BhZ2V9Pk5leHQgUGFnZTwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8cD5UaGVyZSBhcmUgbm8gY2xhaW1zIGluIHRoaXMgY2hhbm5lbDwvcD5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IENoYW5uZWxDbGFpbXNEaXNwbGF5O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVhY3QvY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheS92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5jb25zdCB7IGFzc2V0RGVmYXVsdHM6IHsgdGh1bWJuYWlsOiBkZWZhdWx0VGh1bWJuYWlsIH0gfSA9IHJlcXVpcmUoJy4uLy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5cbmNvbnN0IEFzc2V0UHJldmlldyA9ICh7IGNsYWltRGF0YTogeyBuYW1lLCBjbGFpbUlkLCBmaWxlRXh0LCBjb250ZW50VHlwZSwgdGh1bWJuYWlsIH0gfSkgPT4ge1xuICBjb25zdCBkaXJlY3RTb3VyY2VMaW5rID0gYCR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9YDtcbiAgY29uc3Qgc2hvd1VybExpbmsgPSBgLyR7Y2xhaW1JZH0vJHtuYW1lfWA7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9J2Fzc2V0LWhvbGRlcic+XG4gICAgICA8TGluayB0bz17c2hvd1VybExpbmt9ID5cbiAgICAgICAgeygoKSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvanBlZyc6XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9qcGcnOlxuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvcG5nJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL2dpZic6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnYXNzZXQtcHJldmlldyd9XG4gICAgICAgICAgICAgICAgICBzcmM9e2RpcmVjdFNvdXJjZUxpbmt9XG4gICAgICAgICAgICAgICAgICBhbHQ9e25hbWV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgJ3ZpZGVvL21wNCc6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnYXNzZXQtcHJldmlldyB2aWRlbyd9XG4gICAgICAgICAgICAgICAgICBzcmM9e3RodW1ibmFpbCB8fCBkZWZhdWx0VGh1bWJuYWlsfVxuICAgICAgICAgICAgICAgICAgYWx0PXtuYW1lfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxwPnVuc3VwcG9ydGVkIGZpbGUgdHlwZTwvcD5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCl9XG4gICAgICA8L0xpbms+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBc3NldFByZXZpZXc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9jb21wb25lbnRzL0Fzc2V0UHJldmlldy9pbmRleC5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE5hdkJhciBmcm9tICdjb250YWluZXJzL05hdkJhcic7XG5pbXBvcnQgSGVsbWV0IGZyb20gJ3JlYWN0LWhlbG1ldCc7XG5jb25zdCB7IGRldGFpbHM6IHsgdGl0bGUsIGhvc3QgfSB9ID0gcmVxdWlyZSgnLi4vLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxuY2xhc3MgRm91ck9oRm9yUGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxIZWxtZXQ+XG4gICAgICAgICAgPHRpdGxlPnt0aXRsZX0gLSA0MDQ8L3RpdGxlPlxuICAgICAgICAgIDxsaW5rIHJlbD0nY2Fub25pY2FsJyBocmVmPXtgJHtob3N0fS80MDRgfSAvPlxuICAgICAgICA8L0hlbG1ldD5cbiAgICAgICAgPE5hdkJhciAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkJz5cbiAgICAgICAgICA8aDI+NDA0PC9oMj5cbiAgICAgICAgICA8cD5UaGF0IHBhZ2UgZG9lcyBub3QgZXhpc3Q8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm91ck9oRm9yUGFnZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2NvbXBvbmVudHMvRm91ck9oRm91clBhZ2UvaW5kZXguanN4IiwiY29uc3QgeyBzZW5kR0FTZXJ2ZUV2ZW50IH0gPSByZXF1aXJlKCcuLi9oZWxwZXJzL2dvb2dsZUFuYWx5dGljcycpO1xuY29uc3QgeyBkZXRlcm1pbmVSZXNwb25zZVR5cGUsIGZsaXBDbGFpbU5hbWVBbmRJZEZvckJhY2t3YXJkc0NvbXBhdGliaWxpdHksIGxvZ1JlcXVlc3REYXRhLCBnZXRDbGFpbUlkQW5kU2VydmVBc3NldCB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9zZXJ2ZUhlbHBlcnMuanMnKTtcbmNvbnN0IGxicnlVcmkgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2xicnlVcmkuanMnKTtcbmNvbnN0IGhhbmRsZVNob3dSZW5kZXIgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2hhbmRsZVNob3dSZW5kZXIuanN4Jyk7XG5jb25zdCBTRVJWRSA9ICdTRVJWRSc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGFwcCkgPT4ge1xuICAvLyByb3V0ZSB0byBzZXJ2ZSBhIHNwZWNpZmljIGFzc2V0IHVzaW5nIHRoZSBjaGFubmVsIG9yIGNsYWltIGlkXG4gIGFwcC5nZXQoJy86aWRlbnRpZmllci86Y2xhaW0nLCAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB7IGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zIH0gPSByZXE7XG4gICAgLy8gZGVjaWRlIGlmIHRoaXMgaXMgYSBzaG93IHJlcXVlc3RcbiAgICBsZXQgaGFzRmlsZUV4dGVuc2lvbjtcbiAgICB0cnkge1xuICAgICAgKHsgaGFzRmlsZUV4dGVuc2lvbiB9ID0gbGJyeVVyaS5wYXJzZU1vZGlmaWVyKHBhcmFtcy5jbGFpbSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICAgIGxldCByZXNwb25zZVR5cGUgPSBkZXRlcm1pbmVSZXNwb25zZVR5cGUoaGFzRmlsZUV4dGVuc2lvbiwgaGVhZGVycyk7XG4gICAgaWYgKHJlc3BvbnNlVHlwZSAhPT0gU0VSVkUpIHtcbiAgICAgIHJldHVybiBoYW5kbGVTaG93UmVuZGVyKHJlcSwgcmVzKTtcbiAgICB9XG4gICAgLy8gaGFuZGxlIHNlcnZlIHJlcXVlc3RcbiAgICAvLyBzZW5kIGdvb2dsZSBhbmFseXRpY3NcbiAgICBzZW5kR0FTZXJ2ZUV2ZW50KGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCk7XG4gICAgLy8gcGFyc2UgdGhlIGNsYWltXG4gICAgbGV0IGNsYWltTmFtZTtcbiAgICB0cnkge1xuICAgICAgKHsgY2xhaW1OYW1lIH0gPSBsYnJ5VXJpLnBhcnNlQ2xhaW0ocGFyYW1zLmNsYWltKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICB9XG4gICAgLy8gcGFyc2UgdGhlIGlkZW50aWZpZXJcbiAgICBsZXQgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltSWQ7XG4gICAgdHJ5IHtcbiAgICAgICh7IGlzQ2hhbm5lbCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbUlkIH0gPSBsYnJ5VXJpLnBhcnNlSWRlbnRpZmllcihwYXJhbXMuaWRlbnRpZmllcikpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICAgIGlmICghaXNDaGFubmVsKSB7XG4gICAgICBbY2xhaW1JZCwgY2xhaW1OYW1lXSA9IGZsaXBDbGFpbU5hbWVBbmRJZEZvckJhY2t3YXJkc0NvbXBhdGliaWxpdHkoY2xhaW1JZCwgY2xhaW1OYW1lKTtcbiAgICB9XG4gICAgLy8gbG9nIHRoZSByZXF1ZXN0IGRhdGEgZm9yIGRlYnVnZ2luZ1xuICAgIGxvZ1JlcXVlc3REYXRhKHJlc3BvbnNlVHlwZSwgY2xhaW1OYW1lLCBjaGFubmVsTmFtZSwgY2xhaW1JZCk7XG4gICAgLy8gZ2V0IHRoZSBjbGFpbSBJZCBhbmQgdGhlbiBzZXJ2ZSB0aGUgYXNzZXRcbiAgICBnZXRDbGFpbUlkQW5kU2VydmVBc3NldChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltTmFtZSwgY2xhaW1JZCwgb3JpZ2luYWxVcmwsIGlwLCByZXMpO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gc2VydmUgdGhlIHdpbm5pbmcgYXNzZXQgYXQgYSBjbGFpbSBvciBhIGNoYW5uZWwgcGFnZVxuICBhcHAuZ2V0KCcvOmNsYWltJywgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgeyBoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9ID0gcmVxO1xuICAgIC8vIGRlY2lkZSBpZiB0aGlzIGlzIGEgc2hvdyByZXF1ZXN0XG4gICAgbGV0IGhhc0ZpbGVFeHRlbnNpb247XG4gICAgdHJ5IHtcbiAgICAgICh7IGhhc0ZpbGVFeHRlbnNpb24gfSA9IGxicnlVcmkucGFyc2VNb2RpZmllcihwYXJhbXMuY2xhaW0pKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgICBsZXQgcmVzcG9uc2VUeXBlID0gZGV0ZXJtaW5lUmVzcG9uc2VUeXBlKGhhc0ZpbGVFeHRlbnNpb24sIGhlYWRlcnMpO1xuICAgIGlmIChyZXNwb25zZVR5cGUgIT09IFNFUlZFKSB7XG4gICAgICByZXR1cm4gaGFuZGxlU2hvd1JlbmRlcihyZXEsIHJlcyk7XG4gICAgfVxuICAgIC8vIGhhbmRsZSBzZXJ2ZSByZXF1ZXN0XG4gICAgLy8gc2VuZCBnb29nbGUgYW5hbHl0aWNzXG4gICAgc2VuZEdBU2VydmVFdmVudChoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwpO1xuICAgIC8vIHBhcnNlIHRoZSBjbGFpbVxuICAgIGxldCBjbGFpbU5hbWU7XG4gICAgdHJ5IHtcbiAgICAgICh7Y2xhaW1OYW1lfSA9IGxicnlVcmkucGFyc2VDbGFpbShwYXJhbXMuY2xhaW0pKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgICAvLyBsb2cgdGhlIHJlcXVlc3QgZGF0YSBmb3IgZGVidWdnaW5nXG4gICAgbG9nUmVxdWVzdERhdGEocmVzcG9uc2VUeXBlLCBjbGFpbU5hbWUsIG51bGwsIG51bGwpO1xuICAgIC8vIGdldCB0aGUgY2xhaW0gSWQgYW5kIHRoZW4gc2VydmUgdGhlIGFzc2V0XG4gICAgZ2V0Q2xhaW1JZEFuZFNlcnZlQXNzZXQobnVsbCwgbnVsbCwgY2xhaW1OYW1lLCBudWxsLCBvcmlnaW5hbFVybCwgaXAsIHJlcyk7XG4gIH0pO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JvdXRlcy9zZXJ2ZS1yb3V0ZXMuanMiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCB7IGdldENsYWltSWQsIGdldExvY2FsRmlsZVJlY29yZCB9ID0gcmVxdWlyZSgnLi4vY29udHJvbGxlcnMvc2VydmVDb250cm9sbGVyLmpzJyk7XG5jb25zdCB7IGhhbmRsZUVycm9yUmVzcG9uc2UgfSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvZXJyb3JIYW5kbGVycy5qcycpO1xuXG5jb25zdCBTRVJWRSA9ICdTRVJWRSc7XG5jb25zdCBTSE9XID0gJ1NIT1cnO1xuY29uc3QgTk9fRklMRSA9ICdOT19GSUxFJztcbmNvbnN0IE5PX0NIQU5ORUwgPSAnTk9fQ0hBTk5FTCc7XG5jb25zdCBOT19DTEFJTSA9ICdOT19DTEFJTSc7XG5cbmZ1bmN0aW9uIGNsaWVudEFjY2VwdHNIdG1sICh7YWNjZXB0fSkge1xuICByZXR1cm4gYWNjZXB0ICYmIGFjY2VwdC5tYXRjaCgvdGV4dFxcL2h0bWwvKTtcbn07XG5cbmZ1bmN0aW9uIHJlcXVlc3RJc0Zyb21Ccm93c2VyIChoZWFkZXJzKSB7XG4gIHJldHVybiBoZWFkZXJzWyd1c2VyLWFnZW50J10gJiYgaGVhZGVyc1sndXNlci1hZ2VudCddLm1hdGNoKC9Nb3ppbGxhLyk7XG59O1xuXG5mdW5jdGlvbiBjbGllbnRXYW50c0Fzc2V0ICh7YWNjZXB0LCByYW5nZX0pIHtcbiAgY29uc3QgaW1hZ2VJc1dhbnRlZCA9IGFjY2VwdCAmJiBhY2NlcHQubWF0Y2goL2ltYWdlXFwvLiovKSAmJiAhYWNjZXB0Lm1hdGNoKC90ZXh0XFwvaHRtbC8pICYmICFhY2NlcHQubWF0Y2goL3RleHRcXC9cXCovKTtcbiAgY29uc3QgdmlkZW9Jc1dhbnRlZCA9IGFjY2VwdCAmJiByYW5nZTtcbiAgcmV0dXJuIGltYWdlSXNXYW50ZWQgfHwgdmlkZW9Jc1dhbnRlZDtcbn07XG5cbmZ1bmN0aW9uIGlzVmFsaWRDbGFpbUlkIChjbGFpbUlkKSB7XG4gIHJldHVybiAoKGNsYWltSWQubGVuZ3RoID09PSA0MCkgJiYgIS9bXkEtWmEtejAtOV0vZy50ZXN0KGNsYWltSWQpKTtcbn07XG5cbmZ1bmN0aW9uIGlzVmFsaWRTaG9ydElkIChjbGFpbUlkKSB7XG4gIHJldHVybiBjbGFpbUlkLmxlbmd0aCA9PT0gMTsgIC8vIGl0IHNob3VsZCByZWFsbHkgZXZhbHVhdGUgdGhlIHNob3J0IHVybCBpdHNlbGZcbn07XG5cbmZ1bmN0aW9uIGlzVmFsaWRTaG9ydElkT3JDbGFpbUlkIChpbnB1dCkge1xuICByZXR1cm4gKGlzVmFsaWRDbGFpbUlkKGlucHV0KSB8fCBpc1ZhbGlkU2hvcnRJZChpbnB1dCkpO1xufTtcblxuZnVuY3Rpb24gc2VydmVBc3NldFRvQ2xpZW50IChjbGFpbUlkLCBuYW1lLCByZXMpIHtcbiAgcmV0dXJuIGdldExvY2FsRmlsZVJlY29yZChjbGFpbUlkLCBuYW1lKVxuICAgIC50aGVuKGZpbGVSZWNvcmQgPT4ge1xuICAgICAgLy8gY2hlY2sgdGhhdCBhIGxvY2FsIHJlY29yZCB3YXMgZm91bmRcbiAgICAgIGlmIChmaWxlUmVjb3JkID09PSBOT19GSUxFKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDMwNykucmVkaXJlY3QoYC9hcGkvY2xhaW0vZ2V0LyR7bmFtZX0vJHtjbGFpbUlkfWApO1xuICAgICAgfVxuICAgICAgLy8gc2VydmUgdGhlIGZpbGVcbiAgICAgIGNvbnN0IHtmaWxlUGF0aCwgZmlsZVR5cGV9ID0gZmlsZVJlY29yZDtcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBzZXJ2aW5nIGZpbGU6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICBjb25zdCBzZW5kRmlsZU9wdGlvbnMgPSB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnWC1Db250ZW50LVR5cGUtT3B0aW9ucyc6ICdub3NuaWZmJyxcbiAgICAgICAgICAnQ29udGVudC1UeXBlJyAgICAgICAgICA6IGZpbGVUeXBlIHx8ICdpbWFnZS9qcGVnJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICByZXMuc3RhdHVzKDIwMCkuc2VuZEZpbGUoZmlsZVBhdGgsIHNlbmRGaWxlT3B0aW9ucyk7XG4gICAgfSlcbiAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q2xhaW1JZEFuZFNlcnZlQXNzZXQgKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgY2xhaW1OYW1lLCBjbGFpbUlkLCBvcmlnaW5hbFVybCwgaXAsIHJlcykge1xuICAgIC8vIGdldCB0aGUgY2xhaW0gSWQgYW5kIHRoZW4gc2VydmUgdGhlIGFzc2V0XG4gICAgZ2V0Q2xhaW1JZChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltTmFtZSwgY2xhaW1JZClcbiAgICAgIC50aGVuKGZ1bGxDbGFpbUlkID0+IHtcbiAgICAgICAgaWYgKGZ1bGxDbGFpbUlkID09PSBOT19DTEFJTSkge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdubyBjbGFpbSBpZCBjb3VsZCBiZSBmb3VuZCd9KTtcbiAgICAgICAgfSBlbHNlIGlmIChmdWxsQ2xhaW1JZCA9PT0gTk9fQ0hBTk5FTCkge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdubyBjaGFubmVsIGlkIGNvdWxkIGJlIGZvdW5kJ30pO1xuICAgICAgICB9XG4gICAgICAgIHNlcnZlQXNzZXRUb0NsaWVudChmdWxsQ2xhaW1JZCwgY2xhaW1OYW1lLCByZXMpO1xuICAgICAgICAvLyBwb3N0VG9TdGF0cyhyZXNwb25zZVR5cGUsIG9yaWdpbmFsVXJsLCBpcCwgY2xhaW1OYW1lLCBmdWxsQ2xhaW1JZCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBoYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICAgIC8vIHBvc3RUb1N0YXRzKHJlc3BvbnNlVHlwZSwgb3JpZ2luYWxVcmwsIGlwLCBjbGFpbU5hbWUsIGZ1bGxDbGFpbUlkLCAnZmFpbCcpO1xuICAgICAgfSk7XG4gIH0sXG4gIGRldGVybWluZVJlc3BvbnNlVHlwZSAoaGFzRmlsZUV4dGVuc2lvbiwgaGVhZGVycykge1xuICAgIGxldCByZXNwb25zZVR5cGU7XG4gICAgaWYgKGhhc0ZpbGVFeHRlbnNpb24pIHtcbiAgICAgIHJlc3BvbnNlVHlwZSA9IFNFUlZFOyAgLy8gYXNzdW1lIGEgc2VydmUgcmVxdWVzdCBpZiBmaWxlIGV4dGVuc2lvbiBpcyBwcmVzZW50XG4gICAgICBpZiAoY2xpZW50QWNjZXB0c0h0bWwoaGVhZGVycykpIHsgIC8vIGlmIHRoZSByZXF1ZXN0IGNvbWVzIGZyb20gYSBicm93c2VyLCBjaGFuZ2UgaXQgdG8gYSBzaG93IHJlcXVlc3RcbiAgICAgICAgcmVzcG9uc2VUeXBlID0gU0hPVztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzcG9uc2VUeXBlID0gU0hPVztcbiAgICAgIGlmIChjbGllbnRXYW50c0Fzc2V0KGhlYWRlcnMpICYmIHJlcXVlc3RJc0Zyb21Ccm93c2VyKGhlYWRlcnMpKSB7ICAvLyB0aGlzIGlzIGluIGNhc2Ugc29tZW9uZSBlbWJlZHMgYSBzaG93IHVybFxuICAgICAgICBsb2dnZXIuZGVidWcoJ1Nob3cgcmVxdWVzdCBjYW1lIGZyb20gYnJvd3NlciBidXQgd2FudHMgYW4gaW1hZ2UvdmlkZW8uIENoYW5naW5nIHJlc3BvbnNlIHRvIHNlcnZlLi4uJyk7XG4gICAgICAgIHJlc3BvbnNlVHlwZSA9IFNFUlZFO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VUeXBlO1xuICB9LFxuICBmbGlwQ2xhaW1OYW1lQW5kSWRGb3JCYWNrd2FyZHNDb21wYXRpYmlsaXR5IChpZGVudGlmaWVyLCBuYW1lKSB7XG4gICAgLy8gdGhpcyBpcyBhIHBhdGNoIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSB3aXRoICcvbmFtZS9jbGFpbV9pZCcgdXJsIGZvcm1hdFxuICAgIGlmIChpc1ZhbGlkU2hvcnRJZE9yQ2xhaW1JZChuYW1lKSAmJiAhaXNWYWxpZFNob3J0SWRPckNsYWltSWQoaWRlbnRpZmllcikpIHtcbiAgICAgIGNvbnN0IHRlbXBOYW1lID0gbmFtZTtcbiAgICAgIG5hbWUgPSBpZGVudGlmaWVyO1xuICAgICAgaWRlbnRpZmllciA9IHRlbXBOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gW2lkZW50aWZpZXIsIG5hbWVdO1xuICB9LFxuICBsb2dSZXF1ZXN0RGF0YSAocmVzcG9uc2VUeXBlLCBjbGFpbU5hbWUsIGNoYW5uZWxOYW1lLCBjbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdyZXNwb25zZVR5cGUgPT09JywgcmVzcG9uc2VUeXBlKTtcbiAgICBsb2dnZXIuZGVidWcoJ2NsYWltIG5hbWUgPT09ICcsIGNsYWltTmFtZSk7XG4gICAgbG9nZ2VyLmRlYnVnKCdjaGFubmVsIG5hbWUgPT09JywgY2hhbm5lbE5hbWUpO1xuICAgIGxvZ2dlci5kZWJ1ZygnY2xhaW0gaWQgPT09JywgY2xhaW1JZCk7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vaGVscGVycy9zZXJ2ZUhlbHBlcnMuanMiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBSRUdFWFBfSU5WQUxJRF9DTEFJTSAgOiAvW15BLVphLXowLTktXS9nLFxuICBSRUdFWFBfSU5WQUxJRF9DSEFOTkVMOiAvW15BLVphLXowLTktQF0vZyxcbiAgUkVHRVhQX0FERFJFU1MgICAgICAgIDogL15iKD89W14wT0lsXXszMiwzM30pWzAtOUEtWmEtel17MzIsMzN9JC8sXG4gIENIQU5ORUxfQ0hBUiAgICAgICAgICA6ICdAJyxcbiAgcGFyc2VJZGVudGlmaWVyICAgICAgIDogZnVuY3Rpb24gKGlkZW50aWZpZXIpIHtcbiAgICBsb2dnZXIuZGVidWcoJ3BhcnNpbmcgaWRlbnRpZmllcjonLCBpZGVudGlmaWVyKTtcbiAgICBjb25zdCBjb21wb25lbnRzUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgJyhbXjokIy9dKiknICsgLy8gdmFsdWUgKHN0b3BzIGF0IHRoZSBmaXJzdCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICAgJyhbOiQjXT8pKFteL10qKScgLy8gbW9kaWZpZXIgc2VwYXJhdG9yLCBtb2RpZmllciAoc3RvcHMgYXQgdGhlIGZpcnN0IHBhdGggc2VwYXJhdG9yIG9yIGVuZClcbiAgICApO1xuICAgIGNvbnN0IFtwcm90bywgdmFsdWUsIG1vZGlmaWVyU2VwZXJhdG9yLCBtb2RpZmllcl0gPSBjb21wb25lbnRzUmVnZXhcbiAgICAgIC5leGVjKGlkZW50aWZpZXIpXG4gICAgICAubWFwKG1hdGNoID0+IG1hdGNoIHx8IG51bGwpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtwcm90b30sICR7dmFsdWV9LCAke21vZGlmaWVyU2VwZXJhdG9yfSwgJHttb2RpZmllcn1gKTtcblxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG5hbWVcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgdXJsLiAgTm8gY2hhbm5lbCBuYW1lIHByb3ZpZGVkIGJlZm9yZSBcIiR7bW9kaWZpZXJTZXBlcmF0b3J9XCJgKTtcbiAgICB9XG4gICAgY29uc3QgaXNDaGFubmVsID0gdmFsdWUuc3RhcnRzV2l0aChtb2R1bGUuZXhwb3J0cy5DSEFOTkVMX0NIQVIpO1xuICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gaXNDaGFubmVsID8gdmFsdWUgOiBudWxsO1xuICAgIGxldCBjbGFpbUlkO1xuICAgIGlmIChpc0NoYW5uZWwpIHtcbiAgICAgIGlmICghY2hhbm5lbE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjaGFubmVsIG5hbWUgYWZ0ZXIgQC4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hbWVCYWRDaGFycyA9IChjaGFubmVsTmFtZSkubWF0Y2gobW9kdWxlLmV4cG9ydHMuUkVHRVhQX0lOVkFMSURfQ0hBTk5FTCk7XG4gICAgICBpZiAobmFtZUJhZENoYXJzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXJzIGluIGNoYW5uZWwgbmFtZTogJHtuYW1lQmFkQ2hhcnMuam9pbignLCAnKX0uYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsYWltSWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBtb2RpZmllclxuICAgIGxldCBjaGFubmVsQ2xhaW1JZDtcbiAgICBpZiAobW9kaWZpZXJTZXBlcmF0b3IpIHtcbiAgICAgIGlmICghbW9kaWZpZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBtb2RpZmllciBwcm92aWRlZCBhZnRlciBzZXBhcmF0b3IgXCIke21vZGlmaWVyU2VwZXJhdG9yfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RpZmllclNlcGVyYXRvciA9PT0gJzonKSB7XG4gICAgICAgIGNoYW5uZWxDbGFpbUlkID0gbW9kaWZpZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIiR7bW9kaWZpZXJTZXBlcmF0b3J9XCIgbW9kaWZpZXIgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQ2hhbm5lbCxcbiAgICAgIGNoYW5uZWxOYW1lLFxuICAgICAgY2hhbm5lbENsYWltSWQsXG4gICAgICBjbGFpbUlkLFxuICAgIH07XG4gIH0sXG4gIHBhcnNlQ2xhaW06IGZ1bmN0aW9uIChjbGFpbSkge1xuICAgIGxvZ2dlci5kZWJ1ZygncGFyc2luZyBuYW1lOicsIGNsYWltKTtcbiAgICBjb25zdCBjb21wb25lbnRzUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgJyhbXjokIy8uXSopJyArIC8vIG5hbWUgKHN0b3BzIGF0IHRoZSBmaXJzdCBtb2RpZmllcilcbiAgICAgICcoWzokIy5dPykoW14vXSopJyAvLyBtb2RpZmllciBzZXBhcmF0b3IsIG1vZGlmaWVyIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCBjbGFpbU5hbWUsIG1vZGlmaWVyU2VwZXJhdG9yLCBtb2RpZmllcl0gPSBjb21wb25lbnRzUmVnZXhcbiAgICAgIC5leGVjKGNsYWltKVxuICAgICAgLm1hcChtYXRjaCA9PiBtYXRjaCB8fCBudWxsKTtcbiAgICBsb2dnZXIuZGVidWcoYCR7cHJvdG99LCAke2NsYWltTmFtZX0sICR7bW9kaWZpZXJTZXBlcmF0b3J9LCAke21vZGlmaWVyfWApO1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHByb2Nlc3MgbmFtZVxuICAgIGlmICghY2xhaW1OYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNsYWltIG5hbWUgcHJvdmlkZWQgYmVmb3JlIC4nKTtcbiAgICB9XG4gICAgY29uc3QgbmFtZUJhZENoYXJzID0gKGNsYWltTmFtZSkubWF0Y2gobW9kdWxlLmV4cG9ydHMuUkVHRVhQX0lOVkFMSURfQ0xBSU0pO1xuICAgIGlmIChuYW1lQmFkQ2hhcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXJzIGluIGNsYWltIG5hbWU6ICR7bmFtZUJhZENoYXJzLmpvaW4oJywgJyl9LmApO1xuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBtb2RpZmllclxuICAgIGlmIChtb2RpZmllclNlcGVyYXRvcikge1xuICAgICAgaWYgKCFtb2RpZmllcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpbGUgZXh0ZW5zaW9uIHByb3ZpZGVkIGFmdGVyIHNlcGFyYXRvciAke21vZGlmaWVyU2VwZXJhdG9yfS5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RpZmllclNlcGVyYXRvciAhPT0gJy4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7bW9kaWZpZXJTZXBlcmF0b3J9IG1vZGlmaWVyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGNsYWltIG5hbWVgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gcmV0dXJuIHJlc3VsdHNcbiAgICByZXR1cm4ge1xuICAgICAgY2xhaW1OYW1lLFxuICAgIH07XG4gIH0sXG4gIHBhcnNlTW9kaWZpZXI6IGZ1bmN0aW9uIChjbGFpbSkge1xuICAgIGxvZ2dlci5kZWJ1ZygncGFyc2luZyBtb2RpZmllcjonLCBjbGFpbSk7XG4gICAgY29uc3QgY29tcG9uZW50c1JlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICcoW146JCMvLl0qKScgKyAvLyBuYW1lIChzdG9wcyBhdCB0aGUgZmlyc3QgbW9kaWZpZXIpXG4gICAgICAnKFs6JCMuXT8pKFteL10qKScgLy8gbW9kaWZpZXIgc2VwYXJhdG9yLCBtb2RpZmllciAoc3RvcHMgYXQgdGhlIGZpcnN0IHBhdGggc2VwYXJhdG9yIG9yIGVuZClcbiAgICApO1xuICAgIGNvbnN0IFtwcm90bywgY2xhaW1OYW1lLCBtb2RpZmllclNlcGVyYXRvciwgbW9kaWZpZXJdID0gY29tcG9uZW50c1JlZ2V4XG4gICAgICAuZXhlYyhjbGFpbSlcbiAgICAgIC5tYXAobWF0Y2ggPT4gbWF0Y2ggfHwgbnVsbCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAke3Byb3RvfSwgJHtjbGFpbU5hbWV9LCAke21vZGlmaWVyU2VwZXJhdG9yfSwgJHttb2RpZmllcn1gKTtcbiAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBtb2RpZmllclxuICAgIGxldCBoYXNGaWxlRXh0ZW5zaW9uID0gZmFsc2U7XG4gICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yKSB7XG4gICAgICBoYXNGaWxlRXh0ZW5zaW9uID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc0ZpbGVFeHRlbnNpb24sXG4gICAgfTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9oZWxwZXJzL2xicnlVcmkuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyVG9TdHJpbmcgfSBmcm9tICdyZWFjdC1kb20vc2VydmVyJztcbmltcG9ydCB7IGNyZWF0ZVN0b3JlLCBhcHBseU1pZGRsZXdhcmUgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgUmVkdWNlciBmcm9tICcuLi9yZWFjdC9yZWR1Y2Vycyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IFN0YXRpY1JvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IEdBTGlzdGVuZXIgZnJvbSAnLi4vcmVhY3QvY29tcG9uZW50cy9HQUxpc3RlbmVyJztcbmltcG9ydCBBcHAgZnJvbSAnLi4vcmVhY3QvYXBwJztcbmltcG9ydCByZW5kZXJGdWxsUGFnZSBmcm9tICcuL3JlbmRlckZ1bGxQYWdlJztcbmltcG9ydCBjcmVhdGVTYWdhTWlkZGxld2FyZSBmcm9tICdyZWR1eC1zYWdhJztcbmltcG9ydCB7IGNhbGwgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnO1xuaW1wb3J0IHsgaGFuZGxlU2hvd1BhZ2VVcmkgfSBmcm9tICcuLi9yZWFjdC9zYWdhcy9zaG93X3VyaSc7XG5pbXBvcnQgeyBvbkhhbmRsZVNob3dQYWdlVXJpIH0gZnJvbSAnLi4vcmVhY3QvYWN0aW9ucy9zaG93JztcblxuaW1wb3J0IEhlbG1ldCBmcm9tICdyZWFjdC1oZWxtZXQnO1xuXG5jb25zdCByZXR1cm5TYWdhV2l0aFBhcmFtcyA9IChzYWdhLCBwYXJhbXMpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uICogKCkge1xuICAgIHlpZWxkIGNhbGwoc2FnYSwgcGFyYW1zKTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gKHJlcSwgcmVzKSA9PiB7XG4gIGxldCBjb250ZXh0ID0ge307XG5cbiAgLy8gY3JlYXRlIGFuZCBhcHBseSBtaWRkbGV3YXJlXG4gIGNvbnN0IHNhZ2FNaWRkbGV3YXJlID0gY3JlYXRlU2FnYU1pZGRsZXdhcmUoKTtcbiAgY29uc3QgbWlkZGxld2FyZSA9IGFwcGx5TWlkZGxld2FyZShzYWdhTWlkZGxld2FyZSk7XG5cbiAgLy8gY3JlYXRlIGEgbmV3IFJlZHV4IHN0b3JlIGluc3RhbmNlXG4gIGNvbnN0IHN0b3JlID0gY3JlYXRlU3RvcmUoUmVkdWNlciwgbWlkZGxld2FyZSk7XG5cbiAgLy8gY3JlYXRlIHNhZ2FcbiAgY29uc3QgYWN0aW9uID0gb25IYW5kbGVTaG93UGFnZVVyaShyZXEucGFyYW1zKTtcbiAgY29uc3Qgc2FnYSA9IHJldHVyblNhZ2FXaXRoUGFyYW1zKGhhbmRsZVNob3dQYWdlVXJpLCBhY3Rpb24pO1xuXG4gIC8vIHJ1biB0aGUgc2FnYSBtaWRkbGV3YXJlXG4gIHNhZ2FNaWRkbGV3YXJlXG4gICAgLnJ1bihzYWdhKVxuICAgIC5kb25lXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gcmVuZGVyIGNvbXBvbmVudCB0byBhIHN0cmluZ1xuICAgICAgY29uc3QgaHRtbCA9IHJlbmRlclRvU3RyaW5nKFxuICAgICAgICA8UHJvdmlkZXIgc3RvcmU9e3N0b3JlfT5cbiAgICAgICAgICA8U3RhdGljUm91dGVyIGxvY2F0aW9uPXtyZXEudXJsfSBjb250ZXh0PXtjb250ZXh0fT5cbiAgICAgICAgICAgIDxHQUxpc3RlbmVyPlxuICAgICAgICAgICAgICA8QXBwIC8+XG4gICAgICAgICAgICA8L0dBTGlzdGVuZXI+XG4gICAgICAgICAgPC9TdGF0aWNSb3V0ZXI+XG4gICAgICAgIDwvUHJvdmlkZXI+XG4gICAgICApO1xuXG4gICAgICAvLyBnZXQgaGVhZCB0YWdzIGZyb20gaGVsbWV0XG4gICAgICBjb25zdCBoZWxtZXQgPSBIZWxtZXQucmVuZGVyU3RhdGljKCk7XG5cbiAgICAgIC8vIGNoZWNrIGZvciBhIHJlZGlyZWN0XG4gICAgICBpZiAoY29udGV4dC51cmwpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5yZWRpcmVjdCgzMDEsIGNvbnRleHQudXJsKTtcbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IHRoZSBpbml0aWFsIHN0YXRlIGZyb20gb3VyIFJlZHV4IHN0b3JlXG4gICAgICBjb25zdCBwcmVsb2FkZWRTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG5cbiAgICAgIC8vIHNlbmQgdGhlIHJlbmRlcmVkIHBhZ2UgYmFjayB0byB0aGUgY2xpZW50XG4gICAgICByZXMuc2VuZChyZW5kZXJGdWxsUGFnZShoZWxtZXQsIGh0bWwsIHByZWxvYWRlZFN0YXRlKSk7XG4gICAgfSk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vaGVscGVycy9oYW5kbGVTaG93UmVuZGVyLmpzeCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZHV4LXNhZ2FcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWR1eC1zYWdhXCJcbi8vIG1vZHVsZSBpZCA9IDE0N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBjYWxsLCBwdXQsIHRha2VMYXRlc3QgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnO1xuaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMnO1xuaW1wb3J0IHsgb25SZXF1ZXN0RXJyb3IsIG9uTmV3Q2hhbm5lbFJlcXVlc3QsIG9uTmV3QXNzZXRSZXF1ZXN0IH0gZnJvbSAnYWN0aW9ucy9zaG93JztcbmltcG9ydCB7IG5ld0Fzc2V0UmVxdWVzdCB9IGZyb20gJ3NhZ2FzL3Nob3dfYXNzZXQnO1xuaW1wb3J0IHsgbmV3Q2hhbm5lbFJlcXVlc3QgfSBmcm9tICdzYWdhcy9zaG93X2NoYW5uZWwnO1xuaW1wb3J0IGxicnlVcmkgZnJvbSAndXRpbHMvbGJyeVVyaSc7XG5cbmZ1bmN0aW9uICogcGFyc2VBbmRVcGRhdGVJZGVudGlmaWVyQW5kQ2xhaW0gKG1vZGlmaWVyLCBjbGFpbSkge1xuICAvLyB0aGlzIGlzIGEgcmVxdWVzdCBmb3IgYW4gYXNzZXRcbiAgLy8gY2xhaW0gd2lsbCBiZSBhbiBhc3NldCBjbGFpbVxuICAvLyB0aGUgaWRlbnRpZmllciBjb3VsZCBiZSBhIGNoYW5uZWwgb3IgYSBjbGFpbSBpZFxuICBsZXQgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltSWQsIGNsYWltTmFtZSwgZXh0ZW5zaW9uO1xuICB0cnkge1xuICAgICh7IGlzQ2hhbm5lbCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbUlkIH0gPSBsYnJ5VXJpLnBhcnNlSWRlbnRpZmllcihtb2RpZmllcikpO1xuICAgICh7IGNsYWltTmFtZSwgZXh0ZW5zaW9uIH0gPSBsYnJ5VXJpLnBhcnNlQ2xhaW0oY2xhaW0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyB0cmlnZ2VyIGFuIG5ldyBhY3Rpb24gdG8gdXBkYXRlIHRoZSBzdG9yZVxuICBpZiAoaXNDaGFubmVsKSB7XG4gICAgcmV0dXJuIHlpZWxkIGNhbGwobmV3QXNzZXRSZXF1ZXN0LCBvbk5ld0Fzc2V0UmVxdWVzdChjbGFpbU5hbWUsIG51bGwsIGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgZXh0ZW5zaW9uKSk7XG4gIH07XG4gIHlpZWxkIGNhbGwobmV3QXNzZXRSZXF1ZXN0LCBvbk5ld0Fzc2V0UmVxdWVzdChjbGFpbU5hbWUsIGNsYWltSWQsIG51bGwsIG51bGwsIGV4dGVuc2lvbikpO1xufVxuZnVuY3Rpb24gKiBwYXJzZUFuZFVwZGF0ZUNsYWltT25seSAoY2xhaW0pIHtcbiAgLy8gdGhpcyBjb3VsZCBiZSBhIHJlcXVlc3QgZm9yIGFuIGFzc2V0IG9yIGEgY2hhbm5lbCBwYWdlXG4gIC8vIGNsYWltIGNvdWxkIGJlIGFuIGFzc2V0IGNsYWltIG9yIGEgY2hhbm5lbCBjbGFpbVxuICBsZXQgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQ7XG4gIHRyeSB7XG4gICAgKHsgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQgfSA9IGxicnlVcmkucGFyc2VJZGVudGlmaWVyKGNsYWltKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgLy8gdHJpZ2dlciBhbiBuZXcgYWN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RvcmVcbiAgLy8gcmV0dXJuIGVhcmx5IGlmIHRoaXMgcmVxdWVzdCBpcyBmb3IgYSBjaGFubmVsXG4gIGlmIChpc0NoYW5uZWwpIHtcbiAgICByZXR1cm4geWllbGQgY2FsbChuZXdDaGFubmVsUmVxdWVzdCwgb25OZXdDaGFubmVsUmVxdWVzdChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpKTtcbiAgfVxuICAvLyBpZiBub3QgZm9yIGEgY2hhbm5lbCwgcGFyc2UgdGhlIGNsYWltIHJlcXVlc3RcbiAgbGV0IGNsYWltTmFtZSwgZXh0ZW5zaW9uO1xuICB0cnkge1xuICAgICh7Y2xhaW1OYW1lLCBleHRlbnNpb259ID0gbGJyeVVyaS5wYXJzZUNsYWltKGNsYWltKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgeWllbGQgY2FsbChuZXdBc3NldFJlcXVlc3QsIG9uTmV3QXNzZXRSZXF1ZXN0KGNsYWltTmFtZSwgbnVsbCwgbnVsbCwgbnVsbCwgZXh0ZW5zaW9uKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiAqIGhhbmRsZVNob3dQYWdlVXJpIChhY3Rpb24pIHtcbiAgY29uc3QgeyBpZGVudGlmaWVyLCBjbGFpbSB9ID0gYWN0aW9uLmRhdGE7XG4gIGlmIChpZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIHlpZWxkIGNhbGwocGFyc2VBbmRVcGRhdGVJZGVudGlmaWVyQW5kQ2xhaW0sIGlkZW50aWZpZXIsIGNsYWltKTtcbiAgfVxuICB5aWVsZCBjYWxsKHBhcnNlQW5kVXBkYXRlQ2xhaW1Pbmx5LCBjbGFpbSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gKiB3YXRjaEhhbmRsZVNob3dQYWdlVXJpICgpIHtcbiAgeWllbGQgdGFrZUxhdGVzdChhY3Rpb25zLkhBTkRMRV9TSE9XX1VSSSwgaGFuZGxlU2hvd1BhZ2VVcmkpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L3NhZ2FzL3Nob3dfdXJpLmpzIiwiaW1wb3J0IHsgY2FsbCwgcHV0LCBzZWxlY3QsIHRha2VMYXRlc3QgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnO1xuaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMnO1xuaW1wb3J0IHsgYWRkUmVxdWVzdFRvUmVxdWVzdExpc3QsIG9uUmVxdWVzdEVycm9yLCBvblJlcXVlc3RVcGRhdGUsIGFkZEFzc2V0VG9Bc3NldExpc3QgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IHsgZ2V0TG9uZ0NsYWltSWQsIGdldFNob3J0SWQsIGdldENsYWltRGF0YSB9IGZyb20gJ2FwaS9hc3NldEFwaSc7XG5pbXBvcnQgeyBzZWxlY3RTaG93U3RhdGUgfSBmcm9tICdzZWxlY3RvcnMvc2hvdyc7XG5cbmV4cG9ydCBmdW5jdGlvbiAqIG5ld0Fzc2V0UmVxdWVzdCAoYWN0aW9uKSB7XG4gIGNvbnN0IHsgcmVxdWVzdFR5cGUsIHJlcXVlc3RJZCwgbmFtZSwgbW9kaWZpZXIgfSA9IGFjdGlvbi5kYXRhO1xuICAvLyBwdXQgYW4gYWN0aW9uIHRvIHVwZGF0ZSB0aGUgcmVxdWVzdCBpbiByZWR1eFxuICB5aWVsZCBwdXQob25SZXF1ZXN0VXBkYXRlKHJlcXVlc3RUeXBlLCByZXF1ZXN0SWQpKTtcbiAgLy8gaXMgdGhpcyBhbiBleGlzdGluZyByZXF1ZXN0P1xuICAvLyBJZiB0aGlzIHVyaSBpcyBpbiB0aGUgcmVxdWVzdCBsaXN0LCBpdCdzIGFscmVhZHkgYmVlbiBmZXRjaGVkXG4gIGNvbnN0IHN0YXRlID0geWllbGQgc2VsZWN0KHNlbGVjdFNob3dTdGF0ZSk7XG4gIGlmIChzdGF0ZS5yZXF1ZXN0TGlzdFtyZXF1ZXN0SWRdKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gZ2V0IGxvbmcgaWQgJiYgYWRkIHJlcXVlc3QgdG8gcmVxdWVzdCBsaXN0XG4gIGxldCBsb25nSWQ7XG4gIHRyeSB7XG4gICAgKHtkYXRhOiBsb25nSWR9ID0geWllbGQgY2FsbChnZXRMb25nQ2xhaW1JZCwgbmFtZSwgbW9kaWZpZXIpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICBjb25zdCBhc3NldEtleSA9IGBhIyR7bmFtZX0jJHtsb25nSWR9YDtcbiAgeWllbGQgcHV0KGFkZFJlcXVlc3RUb1JlcXVlc3RMaXN0KHJlcXVlc3RJZCwgbnVsbCwgYXNzZXRLZXkpKTtcbiAgLy8gaXMgdGhpcyBhbiBleGlzdGluZyBhc3NldD9cbiAgLy8gSWYgdGhpcyBhc3NldCBpcyBpbiB0aGUgYXNzZXQgbGlzdCwgaXQncyBhbHJlYWR5IGJlZW4gZmV0Y2hlZFxuICBpZiAoc3RhdGUuYXNzZXRMaXN0W2Fzc2V0S2V5XSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGdldCBzaG9ydCBJZFxuICBsZXQgc2hvcnRJZDtcbiAgdHJ5IHtcbiAgICAoe2RhdGE6IHNob3J0SWR9ID0geWllbGQgY2FsbChnZXRTaG9ydElkLCBuYW1lLCBsb25nSWQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyBnZXQgYXNzZXQgY2xhaW0gZGF0YVxuICBsZXQgY2xhaW1EYXRhO1xuICB0cnkge1xuICAgICh7ZGF0YTogY2xhaW1EYXRhfSA9IHlpZWxkIGNhbGwoZ2V0Q2xhaW1EYXRhLCBuYW1lLCBsb25nSWQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyBhZGQgYXNzZXQgdG8gYXNzZXQgbGlzdFxuICB5aWVsZCBwdXQoYWRkQXNzZXRUb0Fzc2V0TGlzdChhc3NldEtleSwgbnVsbCwgbmFtZSwgbG9uZ0lkLCBzaG9ydElkLCBjbGFpbURhdGEpKTtcbiAgLy8gY2xlYXIgYW55IGVycm9ycyBpbiByZXF1ZXN0IGVycm9yXG4gIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihudWxsKSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gKiB3YXRjaE5ld0Fzc2V0UmVxdWVzdCAoKSB7XG4gIHlpZWxkIHRha2VMYXRlc3QoYWN0aW9ucy5BU1NFVF9SRVFVRVNUX05FVywgbmV3QXNzZXRSZXF1ZXN0KTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC9zYWdhcy9zaG93X2Fzc2V0LmpzIiwiaW1wb3J0IFJlcXVlc3QgZnJvbSAndXRpbHMvcmVxdWVzdCc7XG5jb25zdCB7IGRldGFpbHM6IHsgaG9zdCB9IH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9uZ0NsYWltSWQgKG5hbWUsIG1vZGlmaWVyKSB7XG4gIGxldCBib2R5ID0ge307XG4gIC8vIGNyZWF0ZSByZXF1ZXN0IHBhcmFtc1xuICBpZiAobW9kaWZpZXIpIHtcbiAgICBpZiAobW9kaWZpZXIuaWQpIHtcbiAgICAgIGJvZHlbJ2NsYWltSWQnXSA9IG1vZGlmaWVyLmlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBib2R5WydjaGFubmVsTmFtZSddID0gbW9kaWZpZXIuY2hhbm5lbC5uYW1lO1xuICAgICAgYm9keVsnY2hhbm5lbENsYWltSWQnXSA9IG1vZGlmaWVyLmNoYW5uZWwuaWQ7XG4gICAgfVxuICB9XG4gIGJvZHlbJ2NsYWltTmFtZSddID0gbmFtZTtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIG1ldGhvZCA6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5ICAgOiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgfTtcbiAgLy8gY3JlYXRlIHVybFxuICBjb25zdCB1cmwgPSBgJHtob3N0fS9hcGkvY2xhaW0vbG9uZy1pZGA7XG4gIC8vIHJldHVybiB0aGUgcmVxdWVzdCBwcm9taXNlXG4gIHJldHVybiBSZXF1ZXN0KHVybCwgcGFyYW1zKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaG9ydElkIChuYW1lLCBjbGFpbUlkKSB7XG4gIGNvbnN0IHVybCA9IGAke2hvc3R9L2FwaS9jbGFpbS9zaG9ydC1pZC8ke2NsYWltSWR9LyR7bmFtZX1gO1xuICByZXR1cm4gUmVxdWVzdCh1cmwpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsYWltRGF0YSAobmFtZSwgY2xhaW1JZCkge1xuICBjb25zdCB1cmwgPSBgJHtob3N0fS9hcGkvY2xhaW0vZGF0YS8ke25hbWV9LyR7Y2xhaW1JZH1gO1xuICByZXR1cm4gUmVxdWVzdCh1cmwpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2FwaS9hc3NldEFwaS5qcyIsImltcG9ydCB7Y2FsbCwgcHV0LCBzZWxlY3QsIHRha2VMYXRlc3R9IGZyb20gJ3JlZHV4LXNhZ2EvZWZmZWN0cyc7XG5pbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJ2NvbnN0YW50cy9zaG93X2FjdGlvbl90eXBlcyc7XG5pbXBvcnQgeyBhZGROZXdDaGFubmVsVG9DaGFubmVsTGlzdCwgYWRkUmVxdWVzdFRvUmVxdWVzdExpc3QsIG9uUmVxdWVzdEVycm9yLCBvblJlcXVlc3RVcGRhdGUsIHVwZGF0ZUNoYW5uZWxDbGFpbXMgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IHsgZ2V0Q2hhbm5lbENsYWltcywgZ2V0Q2hhbm5lbERhdGEgfSBmcm9tICdhcGkvY2hhbm5lbEFwaSc7XG5pbXBvcnQgeyBzZWxlY3RTaG93U3RhdGUgfSBmcm9tICdzZWxlY3RvcnMvc2hvdyc7XG5cbmV4cG9ydCBmdW5jdGlvbiAqIG5ld0NoYW5uZWxSZXF1ZXN0IChhY3Rpb24pIHtcbiAgY29uc3QgeyByZXF1ZXN0VHlwZSwgcmVxdWVzdElkLCBjaGFubmVsTmFtZSwgY2hhbm5lbElkIH0gPSBhY3Rpb24uZGF0YTtcbiAgLy8gcHV0IGFuIGFjdGlvbiB0byB1cGRhdGUgdGhlIHJlcXVlc3QgaW4gcmVkdXhcbiAgeWllbGQgcHV0KG9uUmVxdWVzdFVwZGF0ZShyZXF1ZXN0VHlwZSwgcmVxdWVzdElkKSk7XG4gIC8vIGlzIHRoaXMgYW4gZXhpc3RpbmcgcmVxdWVzdD9cbiAgLy8gSWYgdGhpcyB1cmkgaXMgaW4gdGhlIHJlcXVlc3QgbGlzdCwgaXQncyBhbHJlYWR5IGJlZW4gZmV0Y2hlZFxuICBjb25zdCBzdGF0ZSA9IHlpZWxkIHNlbGVjdChzZWxlY3RTaG93U3RhdGUpO1xuICBpZiAoc3RhdGUucmVxdWVzdExpc3RbcmVxdWVzdElkXSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGdldCBjaGFubmVsIGxvbmcgaWRcbiAgbGV0IGxvbmdJZCwgc2hvcnRJZDtcbiAgdHJ5IHtcbiAgICAoeyBkYXRhOiB7bG9uZ0NoYW5uZWxDbGFpbUlkOiBsb25nSWQsIHNob3J0Q2hhbm5lbENsYWltSWQ6IHNob3J0SWR9IH0gPSB5aWVsZCBjYWxsKGdldENoYW5uZWxEYXRhLCBjaGFubmVsTmFtZSwgY2hhbm5lbElkKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgLy8gc3RvcmUgdGhlIHJlcXVlc3QgaW4gdGhlIGNoYW5uZWwgcmVxdWVzdHMgbGlzdFxuICBjb25zdCBjaGFubmVsS2V5ID0gYGMjJHtjaGFubmVsTmFtZX0jJHtsb25nSWR9YDtcbiAgeWllbGQgcHV0KGFkZFJlcXVlc3RUb1JlcXVlc3RMaXN0KHJlcXVlc3RJZCwgbnVsbCwgY2hhbm5lbEtleSkpO1xuICAvLyBpcyB0aGlzIGFuIGV4aXN0aW5nIGNoYW5uZWw/XG4gIC8vIElmIHRoaXMgY2hhbm5lbCBpcyBpbiB0aGUgY2hhbm5lbCBsaXN0LCBpdCdzIGFscmVhZHkgYmVlbiBmZXRjaGVkXG4gIGlmIChzdGF0ZS5jaGFubmVsTGlzdFtjaGFubmVsS2V5XSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGdldCBjaGFubmVsIGNsYWltcyBkYXRhXG4gIGxldCBjbGFpbXNEYXRhO1xuICB0cnkge1xuICAgICh7IGRhdGE6IGNsYWltc0RhdGEgfSA9IHlpZWxkIGNhbGwoZ2V0Q2hhbm5lbENsYWltcywgY2hhbm5lbE5hbWUsIGxvbmdJZCwgMSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB5aWVsZCBwdXQob25SZXF1ZXN0RXJyb3IoZXJyb3IubWVzc2FnZSkpO1xuICB9XG4gIC8vIHN0b3JlIHRoZSBjaGFubmVsIGRhdGEgaW4gdGhlIGNoYW5uZWwgbGlzdFxuICB5aWVsZCBwdXQoYWRkTmV3Q2hhbm5lbFRvQ2hhbm5lbExpc3QoY2hhbm5lbEtleSwgY2hhbm5lbE5hbWUsIHNob3J0SWQsIGxvbmdJZCwgY2xhaW1zRGF0YSkpO1xuICAvLyBjbGVhciBhbnkgcmVxdWVzdCBlcnJvcnNcbiAgeWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKG51bGwpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uICogd2F0Y2hOZXdDaGFubmVsUmVxdWVzdCAoKSB7XG4gIHlpZWxkIHRha2VMYXRlc3QoYWN0aW9ucy5DSEFOTkVMX1JFUVVFU1RfTkVXLCBuZXdDaGFubmVsUmVxdWVzdCk7XG59O1xuXG5mdW5jdGlvbiAqIGdldE5ld0NsYWltc0FuZFVwZGF0ZUNoYW5uZWwgKGFjdGlvbikge1xuICBjb25zdCB7IGNoYW5uZWxLZXksIG5hbWUsIGxvbmdJZCwgcGFnZSB9ID0gYWN0aW9uLmRhdGE7XG4gIGxldCBjbGFpbXNEYXRhO1xuICB0cnkge1xuICAgICh7IGRhdGE6IGNsYWltc0RhdGEgfSA9IHlpZWxkIGNhbGwoZ2V0Q2hhbm5lbENsYWltcywgbmFtZSwgbG9uZ0lkLCBwYWdlKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgeWllbGQgcHV0KHVwZGF0ZUNoYW5uZWxDbGFpbXMoY2hhbm5lbEtleSwgY2xhaW1zRGF0YSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gKiB3YXRjaFVwZGF0ZUNoYW5uZWxDbGFpbXMgKCkge1xuICB5aWVsZCB0YWtlTGF0ZXN0KGFjdGlvbnMuQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX0FTWU5DLCBnZXROZXdDbGFpbXNBbmRVcGRhdGVDaGFubmVsKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L3NhZ2FzL3Nob3dfY2hhbm5lbC5qcyIsImltcG9ydCBSZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuY29uc3QgeyBkZXRhaWxzOiB7IGhvc3QgfSB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5uZWxEYXRhIChuYW1lLCBpZCkge1xuICBpZiAoIWlkKSBpZCA9ICdub25lJztcbiAgY29uc3QgdXJsID0gYCR7aG9zdH0vYXBpL2NoYW5uZWwvZGF0YS8ke25hbWV9LyR7aWR9YDtcbiAgcmV0dXJuIFJlcXVlc3QodXJsKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVsQ2xhaW1zIChuYW1lLCBsb25nSWQsIHBhZ2UpIHtcbiAgaWYgKCFwYWdlKSBwYWdlID0gMTtcbiAgY29uc3QgdXJsID0gYCR7aG9zdH0vYXBpL2NoYW5uZWwvY2xhaW1zLyR7bmFtZX0vJHtsb25nSWR9LyR7cGFnZX1gO1xuICByZXR1cm4gUmVxdWVzdCh1cmwpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3JlYWN0L2FwaS9jaGFubmVsQXBpLmpzIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIFJFR0VYUF9JTlZBTElEX0NMQUlNICA6IC9bXkEtWmEtejAtOS1dL2csXG4gIFJFR0VYUF9JTlZBTElEX0NIQU5ORUw6IC9bXkEtWmEtejAtOS1AXS9nLFxuICBSRUdFWFBfQUREUkVTUyAgICAgICAgOiAvXmIoPz1bXjBPSWxdezMyLDMzfSlbMC05QS1aYS16XXszMiwzM30kLyxcbiAgQ0hBTk5FTF9DSEFSICAgICAgICAgIDogJ0AnLFxuICBwYXJzZUlkZW50aWZpZXIgICAgICAgOiBmdW5jdGlvbiAoaWRlbnRpZmllcikge1xuICAgIGNvbnN0IGNvbXBvbmVudHNSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAnKFteOiQjL10qKScgKyAvLyB2YWx1ZSAoc3RvcHMgYXQgdGhlIGZpcnN0IHNlcGFyYXRvciBvciBlbmQpXG4gICAgICAnKFs6JCNdPykoW14vXSopJyAvLyBtb2RpZmllciBzZXBhcmF0b3IsIG1vZGlmaWVyIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCB2YWx1ZSwgbW9kaWZpZXJTZXBlcmF0b3IsIG1vZGlmaWVyXSA9IGNvbXBvbmVudHNSZWdleCAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgLmV4ZWMoaWRlbnRpZmllcilcbiAgICAgIC5tYXAobWF0Y2ggPT4gbWF0Y2ggfHwgbnVsbCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBuYW1lXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVjayB5b3VyIFVSTC4gIE5vIGNoYW5uZWwgbmFtZSBwcm92aWRlZCBiZWZvcmUgXCIke21vZGlmaWVyU2VwZXJhdG9yfVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IGlzQ2hhbm5lbCA9IHZhbHVlLnN0YXJ0c1dpdGgobW9kdWxlLmV4cG9ydHMuQ0hBTk5FTF9DSEFSKTtcbiAgICBjb25zdCBjaGFubmVsTmFtZSA9IGlzQ2hhbm5lbCA/IHZhbHVlIDogbnVsbDtcbiAgICBsZXQgY2xhaW1JZDtcbiAgICBpZiAoaXNDaGFubmVsKSB7XG4gICAgICBpZiAoIWNoYW5uZWxOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2hlY2sgeW91ciBVUkwuICBObyBjaGFubmVsIG5hbWUgYWZ0ZXIgXCJAXCIuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBuYW1lQmFkQ2hhcnMgPSAoY2hhbm5lbE5hbWUpLm1hdGNoKG1vZHVsZS5leHBvcnRzLlJFR0VYUF9JTlZBTElEX0NIQU5ORUwpO1xuICAgICAgaWYgKG5hbWVCYWRDaGFycykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgVVJMLiAgSW52YWxpZCBjaGFyYWN0ZXJzIGluIGNoYW5uZWwgbmFtZTogXCIke25hbWVCYWRDaGFycy5qb2luKCcsICcpfVwiLmApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjbGFpbUlkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHByb2Nlc3MgbW9kaWZpZXJcbiAgICBsZXQgY2hhbm5lbENsYWltSWQ7XG4gICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yKSB7XG4gICAgICBpZiAoIW1vZGlmaWVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciBVUkwuICBObyBtb2RpZmllciBwcm92aWRlZCBhZnRlciBzZXBhcmF0b3IgXCIke21vZGlmaWVyU2VwZXJhdG9yfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RpZmllclNlcGVyYXRvciA9PT0gJzonKSB7XG4gICAgICAgIGNoYW5uZWxDbGFpbUlkID0gbW9kaWZpZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgVVJMLiAgVGhlIFwiJHttb2RpZmllclNlcGVyYXRvcn1cIiBtb2RpZmllciBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaXNDaGFubmVsLFxuICAgICAgY2hhbm5lbE5hbWUsXG4gICAgICBjaGFubmVsQ2xhaW1JZDogY2hhbm5lbENsYWltSWQgfHwgbnVsbCxcbiAgICAgIGNsYWltSWQgICAgICAgOiBjbGFpbUlkIHx8IG51bGwsXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VDbGFpbTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBjb25zdCBjb21wb25lbnRzUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgJyhbXjokIy8uXSopJyArIC8vIG5hbWUgKHN0b3BzIGF0IHRoZSBmaXJzdCBleHRlbnNpb24pXG4gICAgICAnKFs6JCMuXT8pKFteL10qKScgLy8gZXh0ZW5zaW9uIHNlcGFyYXRvciwgZXh0ZW5zaW9uIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCBjbGFpbU5hbWUsIGV4dGVuc2lvblNlcGVyYXRvciwgZXh0ZW5zaW9uXSA9IGNvbXBvbmVudHNSZWdleCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICAuZXhlYyhuYW1lKVxuICAgICAgLm1hcChtYXRjaCA9PiBtYXRjaCB8fCBudWxsKTtcblxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG5hbWVcbiAgICBpZiAoIWNsYWltTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaGVjayB5b3VyIFVSTC4gIE5vIGNsYWltIG5hbWUgcHJvdmlkZWQgYmVmb3JlIFwiLlwiJyk7XG4gICAgfVxuICAgIGNvbnN0IG5hbWVCYWRDaGFycyA9IChjbGFpbU5hbWUpLm1hdGNoKG1vZHVsZS5leHBvcnRzLlJFR0VYUF9JTlZBTElEX0NMQUlNKTtcbiAgICBpZiAobmFtZUJhZENoYXJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgVVJMLiAgSW52YWxpZCBjaGFyYWN0ZXJzIGluIGNsYWltIG5hbWU6IFwiJHtuYW1lQmFkQ2hhcnMuam9pbignLCAnKX1cIi5gKTtcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgYW5kIHByb2Nlc3MgZXh0ZW5zaW9uXG4gICAgaWYgKGV4dGVuc2lvblNlcGVyYXRvcikge1xuICAgICAgaWYgKCFleHRlbnNpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVjayB5b3VyIFVSTC4gIE5vIGZpbGUgZXh0ZW5zaW9uIHByb3ZpZGVkIGFmdGVyIHNlcGFyYXRvciBcIiR7ZXh0ZW5zaW9uU2VwZXJhdG9yfVwiLmApO1xuICAgICAgfVxuICAgICAgaWYgKGV4dGVuc2lvblNlcGVyYXRvciAhPT0gJy4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciBVUkwuICBUaGUgXCIke2V4dGVuc2lvblNlcGVyYXRvcn1cIiBzZXBhcmF0b3IgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgY2xhaW0gbmFtZS5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYWltTmFtZSxcbiAgICAgIGV4dGVuc2lvbjogZXh0ZW5zaW9uIHx8IG51bGwsXG4gICAgfTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZWFjdC91dGlscy9sYnJ5VXJpLmpzIiwiY29uc3QgaGFuZGxlUGFnZVJlbmRlciA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvaGFuZGxlUGFnZVJlbmRlci5qc3gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBhcHAgPT4ge1xuICAvLyBhIGNhdGNoLWFsbCByb3V0ZSBpZiBzb21lb25lIHZpc2l0cyBhIHBhZ2UgdGhhdCBkb2VzIG5vdCBleGlzdFxuICBhcHAudXNlKCcqJywgKHJlcSwgcmVzKSA9PiB7XG4gICAgLy8gc2VuZCByZXNwb25zZVxuICAgIGhhbmRsZVBhZ2VSZW5kZXIocmVxLCByZXMpO1xuICB9KTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yb3V0ZXMvZmFsbGJhY2stcm91dGVzLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==