made with requirebin
-
-
Save majman/cde40a6a47d4529198b7f99c702cc4eb to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Clarifai = require('clarifai'); | |
Clarifai.initialize({ | |
'clientId': {clientId}, | |
'clientSecret': {clientSecret} | |
}); | |
function imageToDataUrl(url){ | |
return new Promise(function(resolve, reject) { | |
var img = new Image(); | |
img.crossOrigin = 'Anonymous'; | |
img.onload = function() { | |
var canvas = document.createElement('canvas'); | |
var ctx = canvas.getContext('2d'); | |
canvas.height = this.height; | |
canvas.width = this.width; | |
ctx.drawImage(this, 0, 0); | |
var dataURL = canvas.toDataURL("image/jpeg", 0.9); | |
resolve(dataURL); | |
}; | |
img.src = url; | |
}); | |
} | |
imageToDataUrl('http://i.imgur.com/CC8EqQh.jpg').then( | |
function(dataURL){ | |
var b64 = dataURL.split('base64,')[1]; | |
Clarifai.getTagsByImageBytes(b64).then( | |
function(resp){ | |
console.log('success', resp); | |
}, | |
function(resp){ | |
console.log('error', resp); | |
}); | |
} | |
); | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
setTimeout(function(){ | |
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
// shim for using process in browser | |
var process = module.exports = {}; | |
process.nextTick = (function () { | |
var canSetImmediate = typeof window !== 'undefined' | |
&& window.setImmediate; | |
var canMutationObserver = typeof window !== 'undefined' | |
&& window.MutationObserver; | |
var canPost = typeof window !== 'undefined' | |
&& window.postMessage && window.addEventListener | |
; | |
if (canSetImmediate) { | |
return function (f) { return window.setImmediate(f) }; | |
} | |
var queue = []; | |
if (canMutationObserver) { | |
var hiddenDiv = document.createElement("div"); | |
var observer = new MutationObserver(function () { | |
var queueList = queue.slice(); | |
queue.length = 0; | |
queueList.forEach(function (fn) { | |
fn(); | |
}); | |
}); | |
observer.observe(hiddenDiv, { attributes: true }); | |
return function nextTick(fn) { | |
if (!queue.length) { | |
hiddenDiv.setAttribute('yes', 'no'); | |
} | |
queue.push(fn); | |
}; | |
} | |
if (canPost) { | |
window.addEventListener('message', function (ev) { | |
var source = ev.source; | |
if ((source === window || source === null) && ev.data === 'process-tick') { | |
ev.stopPropagation(); | |
if (queue.length > 0) { | |
var fn = queue.shift(); | |
fn(); | |
} | |
} | |
}, true); | |
return function nextTick(fn) { | |
queue.push(fn); | |
window.postMessage('process-tick', '*'); | |
}; | |
} | |
return function nextTick(fn) { | |
setTimeout(fn, 0); | |
}; | |
})(); | |
process.title = 'browser'; | |
process.browser = true; | |
process.env = {}; | |
process.argv = []; | |
function noop() {} | |
process.on = noop; | |
process.addListener = noop; | |
process.once = noop; | |
process.off = noop; | |
process.removeListener = noop; | |
process.removeAllListeners = noop; | |
process.emit = noop; | |
process.binding = function (name) { | |
throw new Error('process.binding is not supported'); | |
}; | |
// TODO(shtylman) | |
process.cwd = function () { return '/' }; | |
process.chdir = function (dir) { | |
throw new Error('process.chdir is not supported'); | |
}; | |
},{}],2:[function(require,module,exports){ | |
module.exports.handle = function(promise, callback) { | |
if ( callback !== undefined && callback !== null ) { | |
promise.then( | |
function(data) { | |
callback(null, data); | |
}, | |
function(err) { | |
callback(err, null); | |
} | |
); | |
} | |
}; | |
},{}],3:[function(require,module,exports){ | |
var Promise = require('es6-promise').Promise; | |
var axios = require('axios'); | |
var config = require('./config'); | |
var token = require('./token'); | |
var request = require('./request'); | |
var response = require('./response'); | |
var path = '/v1/color'; | |
module.exports.getByUrl = function(imageUrl) { | |
return new Promise(function(resolve, reject) { | |
token.get().then( | |
function(tokenString) { | |
return getRequest(imageUrl, tokenString); | |
} | |
).then( | |
function (_response) { | |
response.handleV1(_response, resolve, reject); | |
} | |
).catch( | |
function(err){ | |
response.errorV1(err, reject); | |
} | |
); | |
}); | |
}; | |
module.exports.getByImageBytes = function(imageBytes, _options) { | |
var options = _options || {}; | |
return new Promise(function(resolve, reject) { | |
token.get().then( | |
function(tokenString) { | |
return postRequest(imageBytes, tokenString, options); | |
} | |
).then( | |
function (_response) { | |
response.handleV1(_response, resolve, reject); | |
} | |
).catch( | |
function(err){ | |
response.errorV1(err, reject); | |
} | |
); | |
}); | |
}; | |
function getRequest(imageUrl, tokenString) { | |
var url = config.get('apiEndpoint') + path; | |
var data = request.getImageUrlParams(imageUrl); | |
return axios.post(url, data, { | |
'headers': request.getHeaders(tokenString) | |
}); | |
}; | |
function postRequest(imageBytes, tokenString, options) { | |
var url = config.get('apiEndpoint') + path; | |
var data = {'encoded_image': imageBytes}; | |
data = request.fillOptionalParams(data, options); | |
return axios.post(url, data, { | |
'headers': request.getHeaders(tokenString), | |
'content-type': 'application/x-www-form-urlencoded' | |
}); | |
}; | |
},{"./config":4,"./request":8,"./response":9,"./token":11,"axios":13,"es6-promise":30}],4:[function(require,module,exports){ | |
var config = { | |
'apiEndpoint': undefined, | |
'clientId': undefined, | |
'clientSecret': undefined, | |
'token': undefined | |
}; | |
module.exports = { | |
get: function(key) { | |
return config[key]; | |
}, | |
set: function(key, value) { | |
if (value) { | |
config[key] = value; | |
} | |
}, | |
delete: function(key) { | |
config[key] = undefined; | |
} | |
}; | |
},{}],5:[function(require,module,exports){ | |
var Promise = require('es6-promise').Promise; | |
var axios = require('axios'); | |
var config = require('./config'); | |
var token = require('./token'); | |
var request = require('./request'); | |
var response = require('./response'); | |
var path = '/v1/feedback'; | |
module.exports.create = function(imageUrl, _options) { | |
var options = _options || {}; | |
return new Promise(function(resolve, reject) { | |
token.get().then( | |
function(tokenString) { | |
return createRequest(imageUrl, tokenString, options); | |
} | |
).then( | |
function (_response) { | |
response.handleV1(_response, resolve, reject); | |
} | |
).catch( | |
function(err){ | |
response.errorV1(err, reject); | |
} | |
); | |
}); | |
}; | |
function createRequest(imageUrl, tokenString, options) { | |
var url = config.get('apiEndpoint') + path; | |
var data = request.getImageUrlParams(imageUrl); | |
data = request.fillOptionalParams(data, options); | |
return axios.post(url, data, { | |
'headers': request.getHeaders(tokenString) | |
}); | |
}; | |
},{"./config":4,"./request":8,"./response":9,"./token":11,"axios":13,"es6-promise":30}],6:[function(require,module,exports){ | |
var Promise = require('es6-promise').Promise; | |
var axios = require('axios'); | |
var config = require('./config'); | |
var token = require('./token'); | |
var request = require('./request'); | |
var response = require('./response'); | |
var path = '/v1/info'; | |
module.exports.get = function() { | |
return new Promise(executor); | |
}; | |
function executor(resolve, reject) { | |
token.get().then( | |
function(tokenString) { | |
return getRequest(tokenString); | |
} | |
).then( | |
function (_response) { | |
response.handleV1(_response, resolve, reject); | |
} | |
).catch( | |
function(err){ | |
response.errorV1(err, reject); | |
} | |
); | |
}; | |
function getRequest(tokenString) { | |
var url = config.get('apiEndpoint') + path; | |
return axios.get(url, { | |
'headers': request.getHeaders(tokenString), | |
}); | |
}; | |
},{"./config":4,"./request":8,"./response":9,"./token":11,"axios":13,"es6-promise":30}],7:[function(require,module,exports){ | |
var Promise = require('es6-promise').Promise; | |
var axios = require('axios'); | |
var config = require('./config'); | |
var token = require('./token'); | |
var request = require('./request'); | |
var response = require('./response'); | |
var path = '/v1/info/languages'; | |
module.exports.get = function() { | |
return new Promise(executor); | |
}; | |
function executor(resolve, reject) { | |
token.get().then( | |
function(tokenString) { | |
return getRequest(tokenString); | |
} | |
).then( | |
function (_response) { | |
response.handleV1(_response, resolve, reject); | |
} | |
).catch( | |
function(err){ | |
response.errorV1(err, reject); | |
} | |
); | |
}; | |
function getRequest(tokenString) { | |
var url = config.get('apiEndpoint') + path; | |
return axios.get(url, { | |
'headers': request.getHeaders(tokenString), | |
}); | |
}; | |
},{"./config":4,"./request":8,"./response":9,"./token":11,"axios":13,"es6-promise":30}],8:[function(require,module,exports){ | |
// utils for helping with the request | |
module.exports.transformDataToParams = function(data) { | |
var str = []; | |
for ( var p in data ) { | |
if (data.hasOwnProperty(p) && data[p]) { | |
if (typeof data[p] === 'string'){ | |
str.push(encodeURIComponent(p) + '=' + encodeURIComponent(data[p])); | |
}; | |
if (typeof data[p] === 'object'){ | |
for ( var i in data[p] ) { | |
str.push(encodeURIComponent(p) + '=' + encodeURIComponent(data[p][i])); | |
} | |
} | |
} | |
} | |
return str.join('&'); | |
}; | |
module.exports.getHeaders = function(tokenString) { | |
return { | |
'Authorization': 'Bearer ' + tokenString | |
}; | |
}; | |
module.exports.getImageUrlParams = function(imageUrl) { | |
var data = {}; | |
if ( typeof imageUrl === 'string' ) { | |
data.url = [imageUrl]; | |
}; | |
if ( typeof imageUrl === 'object' ) { | |
data.url = imageUrl; | |
}; | |
return data; | |
}; | |
module.exports.fillOptionalParams = function(data, optionalParams) { | |
for ( var i in optionalParams ) { | |
var j = i.replace(/([A-Z])/g, '_$1').replace(/^_/,'').toLowerCase(); | |
var params = optionalParams[i]; | |
if ( typeof params === 'object' && params.length > 0) { | |
params = optionalParams[i].join(','); | |
} | |
data[j] = params; | |
}; | |
return data; | |
}; | |
module.exports.fillOptionalData = function(data, optionalData) { | |
for ( var i in optionalData ) { | |
var j = i.replace(/([A-Z])/g, '_$1').replace(/^_/,'').toLowerCase(); | |
var params = optionalData[i]; | |
data[j] = params; | |
}; | |
return data; | |
}; | |
},{}],9:[function(require,module,exports){ | |
// utils for helping with the response | |
module.exports.handleV1 = function(response, resolve, reject) { | |
if ( response.status === 200 || response.status === 201 ) { | |
resolve(response.data); | |
} else { | |
reject(response.data); | |
} | |
}; | |
module.exports.errorV1 = function(err, reject) { | |
if ( err.data ) { | |
reject(err.data); | |
} else { | |
reject(err); | |
} | |
}; | |
module.exports.handleV2 = function(response, resolve, reject) { | |
if ( response.status === 200 || response.status === 201 ) { | |
resolve(response.data); | |
} else { | |
reject(response.data); | |
} | |
}; | |
module.exports.errorV2 = function(err, reject) { | |
if ( err.data ) { | |
reject(err.data); | |
} else { | |
reject(err); | |
} | |
}; | |
},{}],10:[function(require,module,exports){ | |
var Promise = require('es6-promise').Promise; | |
var axios = require('axios'); | |
var config = require('./config'); | |
var token = require('./token'); | |
var request = require('./request'); | |
var response = require('./response'); | |
var path = '/v1/tag'; | |
module.exports.getByUrl = function(imageUrl, _options) { | |
var options = _options || {}; | |
return new Promise(function(resolve, reject) { | |
token.get().then( | |
function(tokenString) { | |
return getRequest(imageUrl, tokenString, options); | |
} | |
).then( | |
function (_response) { | |
response.handleV1(_response, resolve, reject); | |
} | |
).catch( | |
function(err){ | |
response.errorV1(err, reject); | |
} | |
); | |
}); | |
}; | |
module.exports.getByImageBytes = function(imageBytes, _options) { | |
var options = _options || {}; | |
return new Promise(function(resolve, reject) { | |
token.get().then( | |
function(tokenString) { | |
return postRequest(imageBytes, tokenString, options); | |
} | |
).then( | |
function (_response) { | |
response.handleV1(_response, resolve, reject); | |
} | |
).catch( | |
function(err){ | |
response.errorV1(err, reject); | |
} | |
); | |
}); | |
}; | |
function getRequest(imageUrl, tokenString, options) { | |
var url = config.get('apiEndpoint') + path; | |
var data = request.getImageUrlParams(imageUrl); | |
data = request.fillOptionalParams(data, options); | |
return axios.post(url, data, { | |
'headers': request.getHeaders(tokenString) | |
}); | |
}; | |
function postRequest(imageBytes, tokenString, options) { | |
var url = config.get('apiEndpoint') + path; | |
var data = {'encoded_image': imageBytes}; | |
data = request.fillOptionalParams(data, options); | |
return axios.post(url, data, { | |
'headers': request.getHeaders(tokenString), | |
'content-type': 'application/x-www-form-urlencoded' | |
}); | |
}; | |
},{"./config":4,"./request":8,"./response":9,"./token":11,"axios":13,"es6-promise":30}],11:[function(require,module,exports){ | |
var Promise = require('es6-promise').Promise; | |
var axios = require('axios'); | |
var config = require('./config'); | |
var request = require('./request'); | |
module.exports.get = function() { | |
return new Promise(executor); | |
}; | |
module.exports.set = function(_token) { | |
var token = _token; | |
if (typeof _token === 'string') { | |
token = { | |
'access_token': _token, | |
'expires_in': 176400 | |
}; | |
} | |
if (token.access_token && token.expires_in) { | |
setExpireTime(token); | |
config.set('token', token); | |
return true; | |
} | |
return false; | |
}; | |
module.exports.delete = function() { | |
config.delete('token'); | |
}; | |
function executor(resolve, reject) { | |
var now = new Date().getTime(); | |
var tokenFromConfig = config.get('token'); | |
if ( tokenFromConfig !== undefined && tokenFromConfig.expireTime > now ) { | |
resolve(tokenFromConfig.access_token); | |
} else { | |
getRequest().then( | |
function(response) { | |
if ( response.status === 200 ) { | |
var token = response.data; | |
setExpireTime(token); | |
config.set('token', token); | |
resolve(token.access_token); | |
} else { | |
reject(response); | |
} | |
}, | |
reject | |
); | |
} | |
}; | |
function setExpireTime(token) { | |
var now = new Date().getTime(); | |
token.expireTime = now + (token.expires_in * 1000); | |
} | |
function getRequest() { | |
var url = config.get('apiEndpoint') + '/v1/token'; | |
var data = getData(); | |
return axios.post(url, data, { | |
'transformRequest': [ | |
function() { | |
return request.transformDataToParams(data); | |
} | |
] | |
}); | |
}; | |
function getData() { | |
var clientId = config.get('clientId'); | |
var clientSecret = config.get('clientSecret'); | |
return { | |
'grant_type': 'client_credentials', | |
'client_id': clientId, | |
'client_secret': clientSecret | |
}; | |
}; | |
// todo (dk) add retry https://www.npmjs.com/package/retry | |
},{"./config":4,"./request":8,"axios":13,"es6-promise":30}],12:[function(require,module,exports){ | |
var Promise = require('es6-promise').Promise; | |
var axios = require('axios'); | |
var config = require('./config'); | |
var token = require('./token'); | |
var request = require('./request'); | |
var response = require('./response'); | |
var path = '/v1/usage'; | |
module.exports.get = function() { | |
return new Promise(executor); | |
}; | |
function executor(resolve, reject) { | |
token.get().then( | |
function(tokenString) { | |
return getRequest(tokenString); | |
} | |
).then( | |
function (_response) { | |
response.handleV1(_response, resolve, reject); | |
} | |
).catch( | |
function(err){ | |
response.errorV1(err, reject); | |
} | |
); | |
}; | |
function getRequest(tokenString) { | |
var url = config.get('apiEndpoint') + path; | |
return axios.get(url, { | |
'headers': request.getHeaders(tokenString), | |
}); | |
}; | |
},{"./config":4,"./request":8,"./response":9,"./token":11,"axios":13,"es6-promise":30}],13:[function(require,module,exports){ | |
module.exports = require('./lib/axios'); | |
},{"./lib/axios":15}],14:[function(require,module,exports){ | |
'use strict'; | |
var utils = require('./../utils'); | |
var buildURL = require('./../helpers/buildURL'); | |
var parseHeaders = require('./../helpers/parseHeaders'); | |
var transformData = require('./../helpers/transformData'); | |
var isURLSameOrigin = require('./../helpers/isURLSameOrigin'); | |
var btoa = window.btoa || require('./../helpers/btoa'); | |
module.exports = function xhrAdapter(resolve, reject, config) { | |
var requestData = config.data; | |
var requestHeaders = config.headers; | |
if (utils.isFormData(requestData)) { | |
delete requestHeaders['Content-Type']; // Let the browser set it | |
} | |
var request = new XMLHttpRequest(); | |
// For IE 8/9 CORS support | |
// Only supports POST and GET calls and doesn't returns the response headers. | |
if (window.XDomainRequest && !('withCredentials' in request) && !isURLSameOrigin(config.url)) { | |
request = new window.XDomainRequest(); | |
} | |
// HTTP basic authentication | |
if (config.auth) { | |
var username = config.auth.username || ''; | |
var password = config.auth.password || ''; | |
requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); | |
} | |
request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true); | |
// Set the request timeout in MS | |
request.timeout = config.timeout; | |
// Listen for ready state | |
request.onload = function handleLoad() { | |
if (!request) { | |
return; | |
} | |
// Prepare the response | |
var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; | |
var responseData = ['text', ''].indexOf(config.responseType || '') !== -1 ? request.responseText : request.response; | |
var response = { | |
data: transformData( | |
responseData, | |
responseHeaders, | |
config.transformResponse | |
), | |
// IE sends 1223 instead of 204 (https://github.com/mzabriskie/axios/issues/201) | |
status: request.status === 1223 ? 204 : request.status, | |
statusText: request.status === 1223 ? 'No Content' : request.statusText, | |
headers: responseHeaders, | |
config: config | |
}; | |
// Resolve or reject the Promise based on the status | |
((response.status >= 200 && response.status < 300) || | |
(!('status' in request) && response.responseText) ? | |
resolve : | |
reject)(response); | |
// Clean up request | |
request = null; | |
}; | |
// Handle low level network errors | |
request.onerror = function handleError() { | |
// Real errors are hidden from us by the browser | |
// onerror should only fire if it's a network error | |
reject(new Error('Network Error')); | |
// Clean up request | |
request = null; | |
}; | |
// Add xsrf header | |
// This is only done if running in a standard browser environment. | |
// Specifically not if we're in a web worker, or react-native. | |
if (utils.isStandardBrowserEnv()) { | |
var cookies = require('./../helpers/cookies'); | |
// Add xsrf header | |
var xsrfValue = config.withCredentials || isURLSameOrigin(config.url) ? | |
cookies.read(config.xsrfCookieName) : | |
undefined; | |
if (xsrfValue) { | |
requestHeaders[config.xsrfHeaderName] = xsrfValue; | |
} | |
} | |
// Add headers to the request | |
if ('setRequestHeader' in request) { | |
utils.forEach(requestHeaders, function setRequestHeader(val, key) { | |
if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { | |
// Remove Content-Type if data is undefined | |
delete requestHeaders[key]; | |
} else { | |
// Otherwise add header to the request | |
request.setRequestHeader(key, val); | |
} | |
}); | |
} | |
// Add withCredentials to request if needed | |
if (config.withCredentials) { | |
request.withCredentials = true; | |
} | |
// Add responseType to request if needed | |
if (config.responseType) { | |
try { | |
request.responseType = config.responseType; | |
} catch (e) { | |
if (request.responseType !== 'json') { | |
throw e; | |
} | |
} | |
} | |
if (utils.isArrayBuffer(requestData)) { | |
requestData = new DataView(requestData); | |
} | |
// Send the request | |
request.send(requestData); | |
}; | |
},{"./../helpers/btoa":20,"./../helpers/buildURL":21,"./../helpers/cookies":23,"./../helpers/isURLSameOrigin":25,"./../helpers/parseHeaders":26,"./../helpers/transformData":28,"./../utils":29}],15:[function(require,module,exports){ | |
'use strict'; | |
var defaults = require('./defaults'); | |
var utils = require('./utils'); | |
var dispatchRequest = require('./core/dispatchRequest'); | |
var InterceptorManager = require('./core/InterceptorManager'); | |
var isAbsoluteURL = require('./helpers/isAbsoluteURL'); | |
var combineURLs = require('./helpers/combineURLs'); | |
var bind = require('./helpers/bind'); | |
var transformData = require('./helpers/transformData'); | |
function Axios(defaultConfig) { | |
this.defaults = utils.merge({}, defaultConfig); | |
this.interceptors = { | |
request: new InterceptorManager(), | |
response: new InterceptorManager() | |
}; | |
} | |
Axios.prototype.request = function request(config) { | |
/*eslint no-param-reassign:0*/ | |
// Allow for axios('example/url'[, config]) a la fetch API | |
if (typeof config === 'string') { | |
config = utils.merge({ | |
url: arguments[0] | |
}, arguments[1]); | |
} | |
config = utils.merge(defaults, this.defaults, { method: 'get' }, config); | |
// Support baseURL config | |
if (config.baseURL && !isAbsoluteURL(config.url)) { | |
config.url = combineURLs(config.baseURL, config.url); | |
} | |
// Don't allow overriding defaults.withCredentials | |
config.withCredentials = config.withCredentials || this.defaults.withCredentials; | |
// Transform request data | |
config.data = transformData( | |
config.data, | |
config.headers, | |
config.transformRequest | |
); | |
// Flatten headers | |
config.headers = utils.merge( | |
config.headers.common || {}, | |
config.headers[config.method] || {}, | |
config.headers || {} | |
); | |
utils.forEach( | |
['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], | |
function cleanHeaderConfig(method) { | |
delete config.headers[method]; | |
} | |
); | |
// Hook up interceptors middleware | |
var chain = [dispatchRequest, undefined]; | |
var promise = Promise.resolve(config); | |
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { | |
chain.unshift(interceptor.fulfilled, interceptor.rejected); | |
}); | |
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { | |
chain.push(interceptor.fulfilled, interceptor.rejected); | |
}); | |
while (chain.length) { | |
promise = promise.then(chain.shift(), chain.shift()); | |
} | |
return promise; | |
}; | |
var defaultInstance = new Axios(defaults); | |
var axios = module.exports = bind(Axios.prototype.request, defaultInstance); | |
axios.create = function create(defaultConfig) { | |
return new Axios(defaultConfig); | |
}; | |
// Expose defaults | |
axios.defaults = defaultInstance.defaults; | |
// Expose all/spread | |
axios.all = function all(promises) { | |
return Promise.all(promises); | |
}; | |
axios.spread = require('./helpers/spread'); | |
// Expose interceptors | |
axios.interceptors = defaultInstance.interceptors; | |
// Provide aliases for supported request methods | |
utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { | |
/*eslint func-names:0*/ | |
Axios.prototype[method] = function(url, config) { | |
return this.request(utils.merge(config || {}, { | |
method: method, | |
url: url | |
})); | |
}; | |
axios[method] = bind(Axios.prototype[method], defaultInstance); | |
}); | |
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { | |
/*eslint func-names:0*/ | |
Axios.prototype[method] = function(url, data, config) { | |
return this.request(utils.merge(config || {}, { | |
method: method, | |
url: url, | |
data: data | |
})); | |
}; | |
axios[method] = bind(Axios.prototype[method], defaultInstance); | |
}); | |
},{"./core/InterceptorManager":16,"./core/dispatchRequest":17,"./defaults":18,"./helpers/bind":19,"./helpers/combineURLs":22,"./helpers/isAbsoluteURL":24,"./helpers/spread":27,"./helpers/transformData":28,"./utils":29}],16:[function(require,module,exports){ | |
'use strict'; | |
var utils = require('./../utils'); | |
function InterceptorManager() { | |
this.handlers = []; | |
} | |
/** | |
* Add a new interceptor to the stack | |
* | |
* @param {Function} fulfilled The function to handle `then` for a `Promise` | |
* @param {Function} rejected The function to handle `reject` for a `Promise` | |
* | |
* @return {Number} An ID used to remove interceptor later | |
*/ | |
InterceptorManager.prototype.use = function use(fulfilled, rejected) { | |
this.handlers.push({ | |
fulfilled: fulfilled, | |
rejected: rejected | |
}); | |
return this.handlers.length - 1; | |
}; | |
/** | |
* Remove an interceptor from the stack | |
* | |
* @param {Number} id The ID that was returned by `use` | |
*/ | |
InterceptorManager.prototype.eject = function eject(id) { | |
if (this.handlers[id]) { | |
this.handlers[id] = null; | |
} | |
}; | |
/** | |
* Iterate over all the registered interceptors | |
* | |
* This method is particularly useful for skipping over any | |
* interceptors that may have become `null` calling `eject`. | |
* | |
* @param {Function} fn The function to call for each interceptor | |
*/ | |
InterceptorManager.prototype.forEach = function forEach(fn) { | |
utils.forEach(this.handlers, function forEachHandler(h) { | |
if (h !== null) { | |
fn(h); | |
} | |
}); | |
}; | |
module.exports = InterceptorManager; | |
},{"./../utils":29}],17:[function(require,module,exports){ | |
(function (process){ | |
'use strict'; | |
/** | |
* Dispatch a request to the server using whichever adapter | |
* is supported by the current environment. | |
* | |
* @param {object} config The config that is to be used for the request | |
* @returns {Promise} The Promise to be fulfilled | |
*/ | |
module.exports = function dispatchRequest(config) { | |
return new Promise(function executor(resolve, reject) { | |
try { | |
var adapter; | |
if (typeof config.adapter === 'function') { | |
// For custom adapter support | |
adapter = config.adapter; | |
} else if (typeof XMLHttpRequest !== 'undefined') { | |
// For browsers use XHR adapter | |
adapter = require('../adapters/xhr'); | |
} else if (typeof process !== 'undefined') { | |
// For node use HTTP adapter | |
adapter = require('../adapters/http'); | |
} | |
if (typeof adapter === 'function') { | |
adapter(resolve, reject, config); | |
} | |
} catch (e) { | |
reject(e); | |
} | |
}); | |
}; | |
}).call(this,require('_process')) | |
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB3aGljaGV2ZXIgYWRhcHRlclxuICogaXMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBhZGFwdGVyO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5hZGFwdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvciBjdXN0b20gYWRhcHRlciBzdXBwb3J0XG4gICAgICAgIGFkYXB0ZXIgPSBjb25maWcuYWRhcHRlcjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG4gICAgICAgIGFkYXB0ZXIgPSByZXF1aXJlKCcuLi9hZGFwdGVycy94aHInKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIEZvciBub2RlIHVzZSBIVFRQIGFkYXB0ZXJcbiAgICAgICAgYWRhcHRlciA9IHJlcXVpcmUoJy4uL2FkYXB0ZXJzL2h0dHAnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBhZGFwdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFkYXB0ZXIocmVzb2x2ZSwgcmVqZWN0LCBjb25maWcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChlKTtcbiAgICB9XG4gIH0pO1xufTtcblxuIl19 | |
},{"../adapters/http":14,"../adapters/xhr":14,"_process":1}],18:[function(require,module,exports){ | |
'use strict'; | |
var utils = require('./utils'); | |
var PROTECTION_PREFIX = /^\)\]\}',?\n/; | |
var DEFAULT_CONTENT_TYPE = { | |
'Content-Type': 'application/x-www-form-urlencoded' | |
}; | |
module.exports = { | |
transformRequest: [function transformResponseJSON(data, headers) { | |
if (utils.isFormData(data)) { | |
return data; | |
} | |
if (utils.isArrayBuffer(data)) { | |
return data; | |
} | |
if (utils.isArrayBufferView(data)) { | |
return data.buffer; | |
} | |
if (utils.isObject(data) && !utils.isFile(data) && !utils.isBlob(data)) { | |
// Set application/json if no Content-Type has been specified | |
if (!utils.isUndefined(headers)) { | |
utils.forEach(headers, function processContentTypeHeader(val, key) { | |
if (key.toLowerCase() === 'content-type') { | |
headers['Content-Type'] = val; | |
} | |
}); | |
if (utils.isUndefined(headers['Content-Type'])) { | |
headers['Content-Type'] = 'application/json;charset=utf-8'; | |
} | |
} | |
return JSON.stringify(data); | |
} | |
return data; | |
}], | |
transformResponse: [function transformResponseJSON(data) { | |
/*eslint no-param-reassign:0*/ | |
if (typeof data === 'string') { | |
data = data.replace(PROTECTION_PREFIX, ''); | |
try { | |
data = JSON.parse(data); | |
} catch (e) { /* Ignore */ } | |
} | |
return data; | |
}], | |
headers: { | |
common: { | |
'Accept': 'application/json, text/plain, */*' | |
}, | |
patch: utils.merge(DEFAULT_CONTENT_TYPE), | |
post: utils.merge(DEFAULT_CONTENT_TYPE), | |
put: utils.merge(DEFAULT_CONTENT_TYPE) | |
}, | |
timeout: 0, | |
xsrfCookieName: 'XSRF-TOKEN', | |
xsrfHeaderName: 'X-XSRF-TOKEN' | |
}; | |
},{"./utils":29}],19:[function(require,module,exports){ | |
'use strict'; | |
module.exports = function bind(fn, thisArg) { | |
return function wrap() { | |
var args = new Array(arguments.length); | |
for (var i = 0; i < args.length; i++) { | |
args[i] = arguments[i]; | |
} | |
return fn.apply(thisArg, args); | |
}; | |
}; | |
},{}],20:[function(require,module,exports){ | |
'use strict'; | |
// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js | |
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; | |
function InvalidCharacterError(message) { | |
this.message = message; | |
} | |
InvalidCharacterError.prototype = new Error; | |
InvalidCharacterError.prototype.code = 5; | |
InvalidCharacterError.prototype.name = 'InvalidCharacterError'; | |
function btoa(input) { | |
var str = String(input); | |
var output = ''; | |
for ( | |
// initialize result and counter | |
var block, charCode, idx = 0, map = chars; | |
// if the next str index does not exist: | |
// change the mapping table to "=" | |
// check if d has no fractional digits | |
str.charAt(idx | 0) || (map = '=', idx % 1); | |
// "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8 | |
output += map.charAt(63 & block >> 8 - idx % 1 * 8) | |
) { | |
charCode = str.charCodeAt(idx += 3 / 4); | |
if (charCode > 0xFF) { | |
throw new InvalidCharacterError('INVALID_CHARACTER_ERR: DOM Exception 5'); | |
} | |
block = block << 8 | charCode; | |
} | |
return output; | |
} | |
module.exports = btoa; | |
},{}],21:[function(require,module,exports){ | |
'use strict'; | |
var utils = require('./../utils'); | |
function encode(val) { | |
return encodeURIComponent(val). | |
replace(/%40/gi, '@'). | |
replace(/%3A/gi, ':'). | |
replace(/%24/g, '$'). | |
replace(/%2C/gi, ','). | |
replace(/%20/g, '+'). | |
replace(/%5B/gi, '['). | |
replace(/%5D/gi, ']'); | |
} | |
/** | |
* Build a URL by appending params to the end | |
* | |
* @param {string} url The base of the url (e.g., http://www.google.com) | |
* @param {object} [params] The params to be appended | |
* @returns {string} The formatted url | |
*/ | |
module.exports = function buildURL(url, params, paramsSerializer) { | |
/*eslint no-param-reassign:0*/ | |
if (!params) { | |
return url; | |
} | |
var serializedParams; | |
if (paramsSerializer) { | |
serializedParams = paramsSerializer(params); | |
} else { | |
var parts = []; | |
utils.forEach(params, function serialize(val, key) { | |
if (val === null || typeof val === 'undefined') { | |
return; | |
} | |
if (utils.isArray(val)) { | |
key = key + '[]'; | |
} | |
if (!utils.isArray(val)) { | |
val = [val]; | |
} | |
utils.forEach(val, function parseValue(v) { | |
if (utils.isDate(v)) { | |
v = v.toISOString(); | |
} else if (utils.isObject(v)) { | |
v = JSON.stringify(v); | |
} | |
parts.push(encode(key) + '=' + encode(v)); | |
}); | |
}); | |
serializedParams = parts.join('&'); | |
} | |
if (serializedParams) { | |
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; | |
} | |
return url; | |
}; | |
},{"./../utils":29}],22:[function(require,module,exports){ | |
'use strict'; | |
/** | |
* Creates a new URL by combining the specified URLs | |
* | |
* @param {string} baseURL The base URL | |
* @param {string} relativeURL The relative URL | |
* @returns {string} The combined URL | |
*/ | |
module.exports = function combineURLs(baseURL, relativeURL) { | |
return baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, ''); | |
}; | |
},{}],23:[function(require,module,exports){ | |
'use strict'; | |
var utils = require('./../utils'); | |
module.exports = ( | |
utils.isStandardBrowserEnv() ? | |
// Standard browser envs support document.cookie | |
(function standardBrowserEnv() { | |
return { | |
write: function write(name, value, expires, path, domain, secure) { | |
var cookie = []; | |
cookie.push(name + '=' + encodeURIComponent(value)); | |
if (utils.isNumber(expires)) { | |
cookie.push('expires=' + new Date(expires).toGMTString()); | |
} | |
if (utils.isString(path)) { | |
cookie.push('path=' + path); | |
} | |
if (utils.isString(domain)) { | |
cookie.push('domain=' + domain); | |
} | |
if (secure === true) { | |
cookie.push('secure'); | |
} | |
document.cookie = cookie.join('; '); | |
}, | |
read: function read(name) { | |
var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); | |
return (match ? decodeURIComponent(match[3]) : null); | |
}, | |
remove: function remove(name) { | |
this.write(name, '', Date.now() - 86400000); | |
} | |
}; | |
})() : | |
// Non standard browser env (web workers, react-native) lack needed support. | |
(function nonStandardBrowserEnv() { | |
return { | |
write: function write() {}, | |
read: function read() { return null; }, | |
remove: function remove() {} | |
}; | |
})() | |
); | |
},{"./../utils":29}],24:[function(require,module,exports){ | |
'use strict'; | |
/** | |
* Determines whether the specified URL is absolute | |
* | |
* @param {string} url The URL to test | |
* @returns {boolean} True if the specified URL is absolute, otherwise false | |
*/ | |
module.exports = function isAbsoluteURL(url) { | |
// A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL). | |
// RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed | |
// by any combination of letters, digits, plus, period, or hyphen. | |
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); | |
}; | |
},{}],25:[function(require,module,exports){ | |
'use strict'; | |
var utils = require('./../utils'); | |
module.exports = ( | |
utils.isStandardBrowserEnv() ? | |
// Standard browser envs have full support of the APIs needed to test | |
// whether the request URL is of the same origin as current location. | |
(function standardBrowserEnv() { | |
var msie = /(msie|trident)/i.test(navigator.userAgent); | |
var urlParsingNode = document.createElement('a'); | |
var originURL; | |
/** | |
* Parse a URL to discover it's components | |
* | |
* @param {String} url The URL to be parsed | |
* @returns {Object} | |
*/ | |
function resolveURL(url) { | |
var href = url; | |
if (msie) { | |
// IE needs attribute set twice to normalize properties | |
urlParsingNode.setAttribute('href', href); | |
href = urlParsingNode.href; | |
} | |
urlParsingNode.setAttribute('href', href); | |
// urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils | |
return { | |
href: urlParsingNode.href, | |
protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', | |
host: urlParsingNode.host, | |
search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', | |
hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', | |
hostname: urlParsingNode.hostname, | |
port: urlParsingNode.port, | |
pathname: (urlParsingNode.pathname.charAt(0) === '/') ? | |
urlParsingNode.pathname : | |
'/' + urlParsingNode.pathname | |
}; | |
} | |
originURL = resolveURL(window.location.href); | |
/** | |
* Determine if a URL shares the same origin as the current location | |
* | |
* @param {String} requestURL The URL to test | |
* @returns {boolean} True if URL shares the same origin, otherwise false | |
*/ | |
return function isURLSameOrigin(requestURL) { | |
var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; | |
return (parsed.protocol === originURL.protocol && | |
parsed.host === originURL.host); | |
}; | |
})() : | |
// Non standard browser envs (web workers, react-native) lack needed support. | |
(function nonStandardBrowserEnv() { | |
return function isURLSameOrigin() { | |
return true; | |
}; | |
})() | |
); | |
},{"./../utils":29}],26:[function(require,module,exports){ | |
'use strict'; | |
var utils = require('./../utils'); | |
/** | |
* Parse headers into an object | |
* | |
* ``` | |
* Date: Wed, 27 Aug 2014 08:58:49 GMT | |
* Content-Type: application/json | |
* Connection: keep-alive | |
* Transfer-Encoding: chunked | |
* ``` | |
* | |
* @param {String} headers Headers needing to be parsed | |
* @returns {Object} Headers parsed into an object | |
*/ | |
module.exports = function parseHeaders(headers) { | |
var parsed = {}; | |
var key; | |
var val; | |
var i; | |
if (!headers) { return parsed; } | |
utils.forEach(headers.split('\n'), function parser(line) { | |
i = line.indexOf(':'); | |
key = utils.trim(line.substr(0, i)).toLowerCase(); | |
val = utils.trim(line.substr(i + 1)); | |
if (key) { | |
parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; | |
} | |
}); | |
return parsed; | |
}; | |
},{"./../utils":29}],27:[function(require,module,exports){ | |
'use strict'; | |
/** | |
* Syntactic sugar for invoking a function and expanding an array for arguments. | |
* | |
* Common use case would be to use `Function.prototype.apply`. | |
* | |
* ```js | |
* function f(x, y, z) {} | |
* var args = [1, 2, 3]; | |
* f.apply(null, args); | |
* ``` | |
* | |
* With `spread` this example can be re-written. | |
* | |
* ```js | |
* spread(function(x, y, z) {})([1, 2, 3]); | |
* ``` | |
* | |
* @param {Function} callback | |
* @returns {Function} | |
*/ | |
module.exports = function spread(callback) { | |
return function wrap(arr) { | |
return callback.apply(null, arr); | |
}; | |
}; | |
},{}],28:[function(require,module,exports){ | |
'use strict'; | |
var utils = require('./../utils'); | |
/** | |
* Transform the data for a request or a response | |
* | |
* @param {Object|String} data The data to be transformed | |
* @param {Array} headers The headers for the request or response | |
* @param {Array|Function} fns A single function or Array of functions | |
* @returns {*} The resulting transformed data | |
*/ | |
module.exports = function transformData(data, headers, fns) { | |
/*eslint no-param-reassign:0*/ | |
utils.forEach(fns, function transform(fn) { | |
data = fn(data, headers); | |
}); | |
return data; | |
}; | |
},{"./../utils":29}],29:[function(require,module,exports){ | |
'use strict'; | |
/*global toString:true*/ | |
// utils is a library of generic helper functions non-specific to axios | |
var toString = Object.prototype.toString; | |
/** | |
* Determine if a value is an Array | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if value is an Array, otherwise false | |
*/ | |
function isArray(val) { | |
return toString.call(val) === '[object Array]'; | |
} | |
/** | |
* Determine if a value is an ArrayBuffer | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if value is an ArrayBuffer, otherwise false | |
*/ | |
function isArrayBuffer(val) { | |
return toString.call(val) === '[object ArrayBuffer]'; | |
} | |
/** | |
* Determine if a value is a FormData | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if value is an FormData, otherwise false | |
*/ | |
function isFormData(val) { | |
return toString.call(val) === '[object FormData]'; | |
} | |
/** | |
* Determine if a value is a view on an ArrayBuffer | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false | |
*/ | |
function isArrayBufferView(val) { | |
var result; | |
if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { | |
result = ArrayBuffer.isView(val); | |
} else { | |
result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); | |
} | |
return result; | |
} | |
/** | |
* Determine if a value is a String | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if value is a String, otherwise false | |
*/ | |
function isString(val) { | |
return typeof val === 'string'; | |
} | |
/** | |
* Determine if a value is a Number | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if value is a Number, otherwise false | |
*/ | |
function isNumber(val) { | |
return typeof val === 'number'; | |
} | |
/** | |
* Determine if a value is undefined | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if the value is undefined, otherwise false | |
*/ | |
function isUndefined(val) { | |
return typeof val === 'undefined'; | |
} | |
/** | |
* Determine if a value is an Object | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if value is an Object, otherwise false | |
*/ | |
function isObject(val) { | |
return val !== null && typeof val === 'object'; | |
} | |
/** | |
* Determine if a value is a Date | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if value is a Date, otherwise false | |
*/ | |
function isDate(val) { | |
return toString.call(val) === '[object Date]'; | |
} | |
/** | |
* Determine if a value is a File | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if value is a File, otherwise false | |
*/ | |
function isFile(val) { | |
return toString.call(val) === '[object File]'; | |
} | |
/** | |
* Determine if a value is a Blob | |
* | |
* @param {Object} val The value to test | |
* @returns {boolean} True if value is a Blob, otherwise false | |
*/ | |
function isBlob(val) { | |
return toString.call(val) === '[object Blob]'; | |
} | |
/** | |
* Trim excess whitespace off the beginning and end of a string | |
* | |
* @param {String} str The String to trim | |
* @returns {String} The String freed of excess whitespace | |
*/ | |
function trim(str) { | |
return str.replace(/^\s*/, '').replace(/\s*$/, ''); | |
} | |
/** | |
* Determine if we're running in a standard browser environment | |
* | |
* This allows axios to run in a web worker, and react-native. | |
* Both environments support XMLHttpRequest, but not fully standard globals. | |
* | |
* web workers: | |
* typeof window -> undefined | |
* typeof document -> undefined | |
* | |
* react-native: | |
* typeof document.createElement -> undefined | |
*/ | |
function isStandardBrowserEnv() { | |
return ( | |
typeof window !== 'undefined' && | |
typeof document !== 'undefined' && | |
typeof document.createElement === 'function' | |
); | |
} | |
/** | |
* Iterate over an Array or an Object invoking a function for each item. | |
* | |
* If `obj` is an Array callback will be called passing | |
* the value, index, and complete array for each item. | |
* | |
* If 'obj' is an Object callback will be called passing | |
* the value, key, and complete object for each property. | |
* | |
* @param {Object|Array} obj The object to iterate | |
* @param {Function} fn The callback to invoke for each item | |
*/ | |
function forEach(obj, fn) { | |
// Don't bother if no value provided | |
if (obj === null || typeof obj === 'undefined') { | |
return; | |
} | |
// Force an array if not already something iterable | |
if (typeof obj !== 'object' && !isArray(obj)) { | |
/*eslint no-param-reassign:0*/ | |
obj = [obj]; | |
} | |
if (isArray(obj)) { | |
// Iterate over array values | |
for (var i = 0, l = obj.length; i < l; i++) { | |
fn.call(null, obj[i], i, obj); | |
} | |
} else { | |
// Iterate over object keys | |
for (var key in obj) { | |
if (obj.hasOwnProperty(key)) { | |
fn.call(null, obj[key], key, obj); | |
} | |
} | |
} | |
} | |
/** | |
* Accepts varargs expecting each argument to be an object, then | |
* immutably merges the properties of each object and returns result. | |
* | |
* When multiple objects contain the same key the later object in | |
* the arguments list will take precedence. | |
* | |
* Example: | |
* | |
* ```js | |
* var result = merge({foo: 123}, {foo: 456}); | |
* console.log(result.foo); // outputs 456 | |
* ``` | |
* | |
* @param {Object} obj1 Object to merge | |
* @returns {Object} Result of all merge properties | |
*/ | |
function merge(/* obj1, obj2, obj3, ... */) { | |
var result = {}; | |
function assignValue(val, key) { | |
if (typeof result[key] === 'object' && typeof val === 'object') { | |
result[key] = merge(result[key], val); | |
} else { | |
result[key] = val; | |
} | |
} | |
for (var i = 0, l = arguments.length; i < l; i++) { | |
forEach(arguments[i], assignValue); | |
} | |
return result; | |
} | |
module.exports = { | |
isArray: isArray, | |
isArrayBuffer: isArrayBuffer, | |
isFormData: isFormData, | |
isArrayBufferView: isArrayBufferView, | |
isString: isString, | |
isNumber: isNumber, | |
isObject: isObject, | |
isUndefined: isUndefined, | |
isDate: isDate, | |
isFile: isFile, | |
isBlob: isBlob, | |
isStandardBrowserEnv: isStandardBrowserEnv, | |
forEach: forEach, | |
merge: merge, | |
trim: trim | |
}; | |
},{}],30:[function(require,module,exports){ | |
(function (process,global){ | |
/*! | |
* @overview es6-promise - a tiny implementation of Promises/A+. | |
* @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) | |
* @license Licensed under MIT license | |
* See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE | |
* @version 3.1.2 | |
*/ | |
(function() { | |
"use strict"; | |
function lib$es6$promise$utils$$objectOrFunction(x) { | |
return typeof x === 'function' || (typeof x === 'object' && x !== null); | |
} | |
function lib$es6$promise$utils$$isFunction(x) { | |
return typeof x === 'function'; | |
} | |
function lib$es6$promise$utils$$isMaybeThenable(x) { | |
return typeof x === 'object' && x !== null; | |
} | |
var lib$es6$promise$utils$$_isArray; | |
if (!Array.isArray) { | |
lib$es6$promise$utils$$_isArray = function (x) { | |
return Object.prototype.toString.call(x) === '[object Array]'; | |
}; | |
} else { | |
lib$es6$promise$utils$$_isArray = Array.isArray; | |
} | |
var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray; | |
var lib$es6$promise$asap$$len = 0; | |
var lib$es6$promise$asap$$vertxNext; | |
var lib$es6$promise$asap$$customSchedulerFn; | |
var lib$es6$promise$asap$$asap = function asap(callback, arg) { | |
lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback; | |
lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg; | |
lib$es6$promise$asap$$len += 2; | |
if (lib$es6$promise$asap$$len === 2) { | |
// If len is 2, that means that we need to schedule an async flush. | |
// If additional callbacks are queued before the queue is flushed, they | |
// will be processed by this flush that we are scheduling. | |
if (lib$es6$promise$asap$$customSchedulerFn) { | |
lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush); | |
} else { | |
lib$es6$promise$asap$$scheduleFlush(); | |
} | |
} | |
} | |
function lib$es6$promise$asap$$setScheduler(scheduleFn) { | |
lib$es6$promise$asap$$customSchedulerFn = scheduleFn; | |
} | |
function lib$es6$promise$asap$$setAsap(asapFn) { | |
lib$es6$promise$asap$$asap = asapFn; | |
} | |
var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined; | |
var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {}; | |
var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver; | |
var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; | |
// test for web worker but not in IE10 | |
var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' && | |
typeof importScripts !== 'undefined' && | |
typeof MessageChannel !== 'undefined'; | |
// node | |
function lib$es6$promise$asap$$useNextTick() { | |
// node version 0.10.x displays a deprecation warning when nextTick is used recursively | |
// see https://github.com/cujojs/when/issues/410 for details | |
return function() { | |
process.nextTick(lib$es6$promise$asap$$flush); | |
}; | |
} | |
// vertx | |
function lib$es6$promise$asap$$useVertxTimer() { | |
return function() { | |
lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush); | |
}; | |
} | |
function lib$es6$promise$asap$$useMutationObserver() { | |
var iterations = 0; | |
var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush); | |
var node = document.createTextNode(''); | |
observer.observe(node, { characterData: true }); | |
return function() { | |
node.data = (iterations = ++iterations % 2); | |
}; | |
} | |
// web worker | |
function lib$es6$promise$asap$$useMessageChannel() { | |
var channel = new MessageChannel(); | |
channel.port1.onmessage = lib$es6$promise$asap$$flush; | |
return function () { | |
channel.port2.postMessage(0); | |
}; | |
} | |
function lib$es6$promise$asap$$useSetTimeout() { | |
return function() { | |
setTimeout(lib$es6$promise$asap$$flush, 1); | |
}; | |
} | |
var lib$es6$promise$asap$$queue = new Array(1000); | |
function lib$es6$promise$asap$$flush() { | |
for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) { | |
var callback = lib$es6$promise$asap$$queue[i]; | |
var arg = lib$es6$promise$asap$$queue[i+1]; | |
callback(arg); | |
lib$es6$promise$asap$$queue[i] = undefined; | |
lib$es6$promise$asap$$queue[i+1] = undefined; | |
} | |
lib$es6$promise$asap$$len = 0; | |
} | |
function lib$es6$promise$asap$$attemptVertx() { | |
try { | |
var r = require; | |
var vertx = r('vertx'); | |
lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext; | |
return lib$es6$promise$asap$$useVertxTimer(); | |
} catch(e) { | |
return lib$es6$promise$asap$$useSetTimeout(); | |
} | |
} | |
var lib$es6$promise$asap$$scheduleFlush; | |
// Decide what async method to use to triggering processing of queued callbacks: | |
if (lib$es6$promise$asap$$isNode) { | |
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick(); | |
} else if (lib$es6$promise$asap$$BrowserMutationObserver) { | |
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver(); | |
} else if (lib$es6$promise$asap$$isWorker) { | |
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel(); | |
} else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') { | |
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertx(); | |
} else { | |
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout(); | |
} | |
function lib$es6$promise$then$$then(onFulfillment, onRejection) { | |
var parent = this; | |
var state = parent._state; | |
if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) { | |
return this; | |
} | |
var child = new this.constructor(lib$es6$promise$$internal$$noop); | |
var result = parent._result; | |
if (state) { | |
var callback = arguments[state - 1]; | |
lib$es6$promise$asap$$asap(function(){ | |
lib$es6$promise$$internal$$invokeCallback(state, child, callback, result); | |
}); | |
} else { | |
lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection); | |
} | |
return child; | |
} | |
var lib$es6$promise$then$$default = lib$es6$promise$then$$then; | |
function lib$es6$promise$promise$resolve$$resolve(object) { | |
/*jshint validthis:true */ | |
var Constructor = this; | |
if (object && typeof object === 'object' && object.constructor === Constructor) { | |
return object; | |
} | |
var promise = new Constructor(lib$es6$promise$$internal$$noop); | |
lib$es6$promise$$internal$$resolve(promise, object); | |
return promise; | |
} | |
var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve; | |
function lib$es6$promise$$internal$$noop() {} | |
var lib$es6$promise$$internal$$PENDING = void 0; | |
var lib$es6$promise$$internal$$FULFILLED = 1; | |
var lib$es6$promise$$internal$$REJECTED = 2; | |
var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject(); | |
function lib$es6$promise$$internal$$selfFulfillment() { | |
return new TypeError("You cannot resolve a promise with itself"); | |
} | |
function lib$es6$promise$$internal$$cannotReturnOwn() { | |
return new TypeError('A promises callback cannot return that same promise.'); | |
} | |
function lib$es6$promise$$internal$$getThen(promise) { | |
try { | |
return promise.then; | |
} catch(error) { | |
lib$es6$promise$$internal$$GET_THEN_ERROR.error = error; | |
return lib$es6$promise$$internal$$GET_THEN_ERROR; | |
} | |
} | |
function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) { | |
try { | |
then.call(value, fulfillmentHandler, rejectionHandler); | |
} catch(e) { | |
return e; | |
} | |
} | |
function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) { | |
lib$es6$promise$asap$$asap(function(promise) { | |
var sealed = false; | |
var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) { | |
if (sealed) { return; } | |
sealed = true; | |
if (thenable !== value) { | |
lib$es6$promise$$internal$$resolve(promise, value); | |
} else { | |
lib$es6$promise$$internal$$fulfill(promise, value); | |
} | |
}, function(reason) { | |
if (sealed) { return; } | |
sealed = true; | |
lib$es6$promise$$internal$$reject(promise, reason); | |
}, 'Settle: ' + (promise._label || ' unknown promise')); | |
if (!sealed && error) { | |
sealed = true; | |
lib$es6$promise$$internal$$reject(promise, error); | |
} | |
}, promise); | |
} | |
function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) { | |
if (thenable._state === lib$es6$promise$$internal$$FULFILLED) { | |
lib$es6$promise$$internal$$fulfill(promise, thenable._result); | |
} else if (thenable._state === lib$es6$promise$$internal$$REJECTED) { | |
lib$es6$promise$$internal$$reject(promise, thenable._result); | |
} else { | |
lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) { | |
lib$es6$promise$$internal$$resolve(promise, value); | |
}, function(reason) { | |
lib$es6$promise$$internal$$reject(promise, reason); | |
}); | |
} | |
} | |
function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable, then) { | |
if (maybeThenable.constructor === promise.constructor && | |
then === lib$es6$promise$then$$default && | |
constructor.resolve === lib$es6$promise$promise$resolve$$default) { | |
lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable); | |
} else { | |
if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) { | |
lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error); | |
} else if (then === undefined) { | |
lib$es6$promise$$internal$$fulfill(promise, maybeThenable); | |
} else if (lib$es6$promise$utils$$isFunction(then)) { | |
lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then); | |
} else { | |
lib$es6$promise$$internal$$fulfill(promise, maybeThenable); | |
} | |
} | |
} | |
function lib$es6$promise$$internal$$resolve(promise, value) { | |
if (promise === value) { | |
lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFulfillment()); | |
} else if (lib$es6$promise$utils$$objectOrFunction(value)) { | |
lib$es6$promise$$internal$$handleMaybeThenable(promise, value, lib$es6$promise$$internal$$getThen(value)); | |
} else { | |
lib$es6$promise$$internal$$fulfill(promise, value); | |
} | |
} | |
function lib$es6$promise$$internal$$publishRejection(promise) { | |
if (promise._onerror) { | |
promise._onerror(promise._result); | |
} | |
lib$es6$promise$$internal$$publish(promise); | |
} | |
function lib$es6$promise$$internal$$fulfill(promise, value) { | |
if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; } | |
promise._result = value; | |
promise._state = lib$es6$promise$$internal$$FULFILLED; | |
if (promise._subscribers.length !== 0) { | |
lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, promise); | |
} | |
} | |
function lib$es6$promise$$internal$$reject(promise, reason) { | |
if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; } | |
promise._state = lib$es6$promise$$internal$$REJECTED; | |
promise._result = reason; | |
lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection, promise); | |
} | |
function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) { | |
var subscribers = parent._subscribers; | |
var length = subscribers.length; | |
parent._onerror = null; | |
subscribers[length] = child; | |
subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment; | |
subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection; | |
if (length === 0 && parent._state) { | |
lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, parent); | |
} | |
} | |
function lib$es6$promise$$internal$$publish(promise) { | |
var subscribers = promise._subscribers; | |
var settled = promise._state; | |
if (subscribers.length === 0) { return; } | |
var child, callback, detail = promise._result; | |
for (var i = 0; i < subscribers.length; i += 3) { | |
child = subscribers[i]; | |
callback = subscribers[i + settled]; | |
if (child) { | |
lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail); | |
} else { | |
callback(detail); | |
} | |
} | |
promise._subscribers.length = 0; | |
} | |
function lib$es6$promise$$internal$$ErrorObject() { | |
this.error = null; | |
} | |
var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject(); | |
function lib$es6$promise$$internal$$tryCatch(callback, detail) { | |
try { | |
return callback(detail); | |
} catch(e) { | |
lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e; | |
return lib$es6$promise$$internal$$TRY_CATCH_ERROR; | |
} | |
} | |
function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) { | |
var hasCallback = lib$es6$promise$utils$$isFunction(callback), | |
value, error, succeeded, failed; | |
if (hasCallback) { | |
value = lib$es6$promise$$internal$$tryCatch(callback, detail); | |
if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) { | |
failed = true; | |
error = value.error; | |
value = null; | |
} else { | |
succeeded = true; | |
} | |
if (promise === value) { | |
lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn()); | |
return; | |
} | |
} else { | |
value = detail; | |
succeeded = true; | |
} | |
if (promise._state !== lib$es6$promise$$internal$$PENDING) { | |
// noop | |
} else if (hasCallback && succeeded) { | |
lib$es6$promise$$internal$$resolve(promise, value); | |
} else if (failed) { | |
lib$es6$promise$$internal$$reject(promise, error); | |
} else if (settled === lib$es6$promise$$internal$$FULFILLED) { | |
lib$es6$promise$$internal$$fulfill(promise, value); | |
} else if (settled === lib$es6$promise$$internal$$REJECTED) { | |
lib$es6$promise$$internal$$reject(promise, value); | |
} | |
} | |
function lib$es6$promise$$internal$$initializePromise(promise, resolver) { | |
try { | |
resolver(function resolvePromise(value){ | |
lib$es6$promise$$internal$$resolve(promise, value); | |
}, function rejectPromise(reason) { | |
lib$es6$promise$$internal$$reject(promise, reason); | |
}); | |
} catch(e) { | |
lib$es6$promise$$internal$$reject(promise, e); | |
} | |
} | |
function lib$es6$promise$promise$all$$all(entries) { | |
return new lib$es6$promise$enumerator$$default(this, entries).promise; | |
} | |
var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all; | |
function lib$es6$promise$promise$race$$race(entries) { | |
/*jshint validthis:true */ | |
var Constructor = this; | |
var promise = new Constructor(lib$es6$promise$$internal$$noop); | |
if (!lib$es6$promise$utils$$isArray(entries)) { | |
lib$es6$promise$$internal$$reject(promise, new TypeError('You must pass an array to race.')); | |
return promise; | |
} | |
var length = entries.length; | |
function onFulfillment(value) { | |
lib$es6$promise$$internal$$resolve(promise, value); | |
} | |
function onRejection(reason) { | |
lib$es6$promise$$internal$$reject(promise, reason); | |
} | |
for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) { | |
lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection); | |
} | |
return promise; | |
} | |
var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race; | |
function lib$es6$promise$promise$reject$$reject(reason) { | |
/*jshint validthis:true */ | |
var Constructor = this; | |
var promise = new Constructor(lib$es6$promise$$internal$$noop); | |
lib$es6$promise$$internal$$reject(promise, reason); | |
return promise; | |
} | |
var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject; | |
var lib$es6$promise$promise$$counter = 0; | |
function lib$es6$promise$promise$$needsResolver() { | |
throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); | |
} | |
function lib$es6$promise$promise$$needsNew() { | |
throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); | |
} | |
var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise; | |
/** | |
Promise objects represent the eventual result of an asynchronous operation. The | |
primary way of interacting with a promise is through its `then` method, which | |
registers callbacks to receive either a promise's eventual value or the reason | |
why the promise cannot be fulfilled. | |
Terminology | |
----------- | |
- `promise` is an object or function with a `then` method whose behavior conforms to this specification. | |
- `thenable` is an object or function that defines a `then` method. | |
- `value` is any legal JavaScript value (including undefined, a thenable, or a promise). | |
- `exception` is a value that is thrown using the throw statement. | |
- `reason` is a value that indicates why a promise was rejected. | |
- `settled` the final resting state of a promise, fulfilled or rejected. | |
A promise can be in one of three states: pending, fulfilled, or rejected. | |
Promises that are fulfilled have a fulfillment value and are in the fulfilled | |
state. Promises that are rejected have a rejection reason and are in the | |
rejected state. A fulfillment value is never a thenable. | |
Promises can also be said to *resolve* a value. If this value is also a | |
promise, then the original promise's settled state will match the value's | |
settled state. So a promise that *resolves* a promise that rejects will | |
itself reject, and a promise that *resolves* a promise that fulfills will | |
itself fulfill. | |
Basic Usage: | |
------------ | |
```js | |
var promise = new Promise(function(resolve, reject) { | |
// on success | |
resolve(value); | |
// on failure | |
reject(reason); | |
}); | |
promise.then(function(value) { | |
// on fulfillment | |
}, function(reason) { | |
// on rejection | |
}); | |
``` | |
Advanced Usage: | |
--------------- | |
Promises shine when abstracting away asynchronous interactions such as | |
`XMLHttpRequest`s. | |
```js | |
function getJSON(url) { | |
return new Promise(function(resolve, reject){ | |
var xhr = new XMLHttpRequest(); | |
xhr.open('GET', url); | |
xhr.onreadystatechange = handler; | |
xhr.responseType = 'json'; | |
xhr.setRequestHeader('Accept', 'application/json'); | |
xhr.send(); | |
function handler() { | |
if (this.readyState === this.DONE) { | |
if (this.status === 200) { | |
resolve(this.response); | |
} else { | |
reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); | |
} | |
} | |
}; | |
}); | |
} | |
getJSON('/posts.json').then(function(json) { | |
// on fulfillment | |
}, function(reason) { | |
// on rejection | |
}); | |
``` | |
Unlike callbacks, promises are great composable primitives. | |
```js | |
Promise.all([ | |
getJSON('/posts'), | |
getJSON('/comments') | |
]).then(function(values){ | |
values[0] // => postsJSON | |
values[1] // => commentsJSON | |
return values; | |
}); | |
``` | |
@class Promise | |
@param {function} resolver | |
Useful for tooling. | |
@constructor | |
*/ | |
function lib$es6$promise$promise$$Promise(resolver) { | |
this._id = lib$es6$promise$promise$$counter++; | |
this._state = undefined; | |
this._result = undefined; | |
this._subscribers = []; | |
if (lib$es6$promise$$internal$$noop !== resolver) { | |
typeof resolver !== 'function' && lib$es6$promise$promise$$needsResolver(); | |
this instanceof lib$es6$promise$promise$$Promise ? lib$es6$promise$$internal$$initializePromise(this, resolver) : lib$es6$promise$promise$$needsNew(); | |
} | |
} | |
lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default; | |
lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default; | |
lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default; | |
lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default; | |
lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler; | |
lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap; | |
lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap; | |
lib$es6$promise$promise$$Promise.prototype = { | |
constructor: lib$es6$promise$promise$$Promise, | |
/** | |
The primary way of interacting with a promise is through its `then` method, | |
which registers callbacks to receive either a promise's eventual value or the | |
reason why the promise cannot be fulfilled. | |
```js | |
findUser().then(function(user){ | |
// user is available | |
}, function(reason){ | |
// user is unavailable, and you are given the reason why | |
}); | |
``` | |
Chaining | |
-------- | |
The return value of `then` is itself a promise. This second, 'downstream' | |
promise is resolved with the return value of the first promise's fulfillment | |
or rejection handler, or rejected if the handler throws an exception. | |
```js | |
findUser().then(function (user) { | |
return user.name; | |
}, function (reason) { | |
return 'default name'; | |
}).then(function (userName) { | |
// If `findUser` fulfilled, `userName` will be the user's name, otherwise it | |
// will be `'default name'` | |
}); | |
findUser().then(function (user) { | |
throw new Error('Found user, but still unhappy'); | |
}, function (reason) { | |
throw new Error('`findUser` rejected and we're unhappy'); | |
}).then(function (value) { | |
// never reached | |
}, function (reason) { | |
// if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. | |
// If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. | |
}); | |
``` | |
If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. | |
```js | |
findUser().then(function (user) { | |
throw new PedagogicalException('Upstream error'); | |
}).then(function (value) { | |
// never reached | |
}).then(function (value) { | |
// never reached | |
}, function (reason) { | |
// The `PedgagocialException` is propagated all the way down to here | |
}); | |
``` | |
Assimilation | |
------------ | |
Sometimes the value you want to propagate to a downstream promise can only be | |
retrieved asynchronously. This can be achieved by returning a promise in the | |
fulfillment or rejection handler. The downstream promise will then be pending | |
until the returned promise is settled. This is called *assimilation*. | |
```js | |
findUser().then(function (user) { | |
return findCommentsByAuthor(user); | |
}).then(function (comments) { | |
// The user's comments are now available | |
}); | |
``` | |
If the assimliated promise rejects, then the downstream promise will also reject. | |
```js | |
findUser().then(function (user) { | |
return findCommentsByAuthor(user); | |
}).then(function (comments) { | |
// If `findCommentsByAuthor` fulfills, we'll have the value here | |
}, function (reason) { | |
// If `findCommentsByAuthor` rejects, we'll have the reason here | |
}); | |
``` | |
Simple Example | |
-------------- | |
Synchronous Example | |
```javascript | |
var result; | |
try { | |
result = findResult(); | |
// success | |
} catch(reason) { | |
// failure | |
} | |
``` | |
Errback Example | |
```js | |
findResult(function(result, err){ | |
if (err) { | |
// failure | |
} else { | |
// success | |
} | |
}); | |
``` | |
Promise Example; | |
```javascript | |
findResult().then(function(result){ | |
// success | |
}, function(reason){ | |
// failure | |
}); | |
``` | |
Advanced Example | |
-------------- | |
Synchronous Example | |
```javascript | |
var author, books; | |
try { | |
author = findAuthor(); | |
books = findBooksByAuthor(author); | |
// success | |
} catch(reason) { | |
// failure | |
} | |
``` | |
Errback Example | |
```js | |
function foundBooks(books) { | |
} | |
function failure(reason) { | |
} | |
findAuthor(function(author, err){ | |
if (err) { | |
failure(err); | |
// failure | |
} else { | |
try { | |
findBoooksByAuthor(author, function(books, err) { | |
if (err) { | |
failure(err); | |
} else { | |
try { | |
foundBooks(books); | |
} catch(reason) { | |
failure(reason); | |
} | |
} | |
}); | |
} catch(error) { | |
failure(err); | |
} | |
// success | |
} | |
}); | |
``` | |
Promise Example; | |
```javascript | |
findAuthor(). | |
then(findBooksByAuthor). | |
then(function(books){ | |
// found books | |
}).catch(function(reason){ | |
// something went wrong | |
}); | |
``` | |
@method then | |
@param {Function} onFulfilled | |
@param {Function} onRejected | |
Useful for tooling. | |
@return {Promise} | |
*/ | |
then: lib$es6$promise$then$$default, | |
/** | |
`catch` is simply sugar for `then(undefined, onRejection)` which makes it the same | |
as the catch block of a try/catch statement. | |
```js | |
function findAuthor(){ | |
throw new Error('couldn't find that author'); | |
} | |
// synchronous | |
try { | |
findAuthor(); | |
} catch(reason) { | |
// something went wrong | |
} | |
// async with promises | |
findAuthor().catch(function(reason){ | |
// something went wrong | |
}); | |
``` | |
@method catch | |
@param {Function} onRejection | |
Useful for tooling. | |
@return {Promise} | |
*/ | |
'catch': function(onRejection) { | |
return this.then(null, onRejection); | |
} | |
}; | |
var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator; | |
function lib$es6$promise$enumerator$$Enumerator(Constructor, input) { | |
this._instanceConstructor = Constructor; | |
this.promise = new Constructor(lib$es6$promise$$internal$$noop); | |
if (Array.isArray(input)) { | |
this._input = input; | |
this.length = input.length; | |
this._remaining = input.length; | |
this._result = new Array(this.length); | |
if (this.length === 0) { | |
lib$es6$promise$$internal$$fulfill(this.promise, this._result); | |
} else { | |
this.length = this.length || 0; | |
this._enumerate(); | |
if (this._remaining === 0) { | |
lib$es6$promise$$internal$$fulfill(this.promise, this._result); | |
} | |
} | |
} else { | |
lib$es6$promise$$internal$$reject(this.promise, this._validationError()); | |
} | |
} | |
lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() { | |
return new Error('Array Methods must be provided an Array'); | |
}; | |
lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() { | |
var length = this.length; | |
var input = this._input; | |
for (var i = 0; this._state === lib$es6$promise$$internal$$PENDING && i < length; i++) { | |
this._eachEntry(input[i], i); | |
} | |
}; | |
lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) { | |
var c = this._instanceConstructor; | |
var resolve = c.resolve; | |
if (resolve === lib$es6$promise$promise$resolve$$default) { | |
var then = lib$es6$promise$$internal$$getThen(entry); | |
if (then === lib$es6$promise$then$$default && | |
entry._state !== lib$es6$promise$$internal$$PENDING) { | |
this._settledAt(entry._state, i, entry._result); | |
} else if (typeof then !== 'function') { | |
this._remaining--; | |
this._result[i] = entry; | |
} else if (c === lib$es6$promise$promise$$default) { | |
var promise = new c(lib$es6$promise$$internal$$noop); | |
lib$es6$promise$$internal$$handleMaybeThenable(promise, entry, then); | |
this._willSettleAt(promise, i); | |
} else { | |
this._willSettleAt(new c(function(resolve) { resolve(entry); }), i); | |
} | |
} else { | |
this._willSettleAt(resolve(entry), i); | |
} | |
}; | |
lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) { | |
var promise = this.promise; | |
if (promise._state === lib$es6$promise$$internal$$PENDING) { | |
this._remaining--; | |
if (state === lib$es6$promise$$internal$$REJECTED) { | |
lib$es6$promise$$internal$$reject(promise, value); | |
} else { | |
this._result[i] = value; | |
} | |
} | |
if (this._remaining === 0) { | |
lib$es6$promise$$internal$$fulfill(promise, this._result); | |
} | |
}; | |
lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) { | |
var enumerator = this; | |
lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) { | |
enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value); | |
}, function(reason) { | |
enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason); | |
}); | |
}; | |
function lib$es6$promise$polyfill$$polyfill() { | |
var local; | |
if (typeof global !== 'undefined') { | |
local = global; | |
} else if (typeof self !== 'undefined') { | |
local = self; | |
} else { | |
try { | |
local = Function('return this')(); | |
} catch (e) { | |
throw new Error('polyfill failed because global object is unavailable in this environment'); | |
} | |
} | |
var P = local.Promise; | |
if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) { | |
return; | |
} | |
local.Promise = lib$es6$promise$promise$$default; | |
} | |
var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill; | |
var lib$es6$promise$umd$$ES6Promise = { | |
'Promise': lib$es6$promise$promise$$default, | |
'polyfill': lib$es6$promise$polyfill$$default | |
}; | |
/* global define:true module:true window: true */ | |
if (typeof define === 'function' && define['amd']) { | |
define(function() { return lib$es6$promise$umd$$ES6Promise; }); | |
} else if (typeof module !== 'undefined' && module['exports']) { | |
module['exports'] = lib$es6$promise$umd$$ES6Promise; | |
} else if (typeof this !== 'undefined') { | |
this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise; | |
} | |
lib$es6$promise$polyfill$$default(); | |
}).call(this); | |
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | |
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAb3ZlcnZpZXcgZXM2LXByb21pc2UgLSBhIHRpbnkgaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZXMvQSsuXG4gKiBAY29weXJpZ2h0IENvcHlyaWdodCAoYykgMjAxNCBZZWh1ZGEgS2F0eiwgVG9tIERhbGUsIFN0ZWZhbiBQZW5uZXIgYW5kIGNvbnRyaWJ1dG9ycyAoQ29udmVyc2lvbiB0byBFUzYgQVBJIGJ5IEpha2UgQXJjaGliYWxkKVxuICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZVxuICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2pha2VhcmNoaWJhbGQvZXM2LXByb21pc2UvbWFzdGVyL0xJQ0VOU0VcbiAqIEB2ZXJzaW9uICAgMy4xLjJcbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRvYmplY3RPckZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyB8fCAodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc01heWJlVGhlbmFibGUoeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5O1xuICAgIGlmICghQXJyYXkuaXNBcnJheSkge1xuICAgICAgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0FycmF5ID0gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiA9IDA7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQ7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRjdXN0b21TY2hlZHVsZXJGbjtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcCA9IGZ1bmN0aW9uIGFzYXAoY2FsbGJhY2ssIGFyZykge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2xpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW5dID0gY2FsbGJhY2s7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiArIDFdID0gYXJnO1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiArPSAyO1xuICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPT09IDIpIHtcbiAgICAgICAgLy8gSWYgbGVuIGlzIDIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGFzeW5jIGZsdXNoLlxuICAgICAgICAvLyBJZiBhZGRpdGlvbmFsIGNhbGxiYWNrcyBhcmUgcXVldWVkIGJlZm9yZSB0aGUgcXVldWUgaXMgZmx1c2hlZCwgdGhleVxuICAgICAgICAvLyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGlzIGZsdXNoIHRoYXQgd2UgYXJlIHNjaGVkdWxpbmcuXG4gICAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4obGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldFNjaGVkdWxlcihzY2hlZHVsZUZuKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4gPSBzY2hlZHVsZUZuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRBc2FwKGFzYXBGbikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAgPSBhc2FwRm47XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyV2luZG93ID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyB8fCB7fTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3Nlckdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcblxuICAgIC8vIHRlc3QgZm9yIHdlYiB3b3JrZXIgYnV0IG5vdCBpbiBJRTEwXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc1dvcmtlciA9IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBpbXBvcnRTY3JpcHRzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJztcblxuICAgIC8vIG5vZGVcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTmV4dFRpY2soKSB7XG4gICAgICAvLyBub2RlIHZlcnNpb24gMC4xMC54IGRpc3BsYXlzIGEgZGVwcmVjYXRpb24gd2FybmluZyB3aGVuIG5leHRUaWNrIGlzIHVzZWQgcmVjdXJzaXZlbHlcbiAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY3Vqb2pzL3doZW4vaXNzdWVzLzQxMCBmb3IgZGV0YWlsc1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHZlcnR4XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVZlcnR4VGltZXIoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU11dGF0aW9uT2JzZXJ2ZXIoKSB7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgbGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIG5vZGUuZGF0YSA9IChpdGVyYXRpb25zID0gKytpdGVyYXRpb25zICUgMik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHdlYiB3b3JrZXJcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTWVzc2FnZUNoYW5uZWwoKSB7XG4gICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2g7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0VGltZW91dChsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gsIDEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlID0gbmV3IEFycmF5KDEwMDApO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbjsgaSs9Mikge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaV07XG4gICAgICAgIHZhciBhcmcgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaSsxXTtcblxuICAgICAgICBjYWxsYmFjayhhcmcpO1xuXG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2krMV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhdHRlbXB0VmVydHgoKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgciA9IHJlcXVpcmU7XG4gICAgICAgIHZhciB2ZXJ0eCA9IHIoJ3ZlcnR4Jyk7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQgPSB2ZXJ0eC5ydW5Pbkxvb3AgfHwgdmVydHgucnVuT25Db250ZXh0O1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVZlcnR4VGltZXIoKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVNldFRpbWVvdXQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2g7XG4gICAgLy8gRGVjaWRlIHdoYXQgYXN5bmMgbWV0aG9kIHRvIHVzZSB0byB0cmlnZ2VyaW5nIHByb2Nlc3Npbmcgb2YgcXVldWVkIGNhbGxiYWNrczpcbiAgICBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGlzTm9kZSkge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTmV4dFRpY2soKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTXV0YXRpb25PYnNlcnZlcigpO1xuICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGlzV29ya2VyKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJXaW5kb3cgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXR0ZW1wdFZlcnR4KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVNldFRpbWVvdXQoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHRoZW4kJHRoZW4ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzO1xuICAgICAgdmFyIHN0YXRlID0gcGFyZW50Ll9zdGF0ZTtcblxuICAgICAgaWYgKHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQgJiYgIW9uRnVsZmlsbG1lbnQgfHwgc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEICYmICFvblJlamVjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIGNoaWxkID0gbmV3IHRoaXMuY29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICB2YXIgcmVzdWx0ID0gcGFyZW50Ll9yZXN1bHQ7XG5cbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbc3RhdGUgLSAxXTtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAoZnVuY3Rpb24oKXtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbnZva2VDYWxsYmFjayhzdGF0ZSwgY2hpbGQsIGNhbGxiYWNrLCByZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSR0aGVuJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHRoZW4kJHRoZW47XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkcmVzb2x2ZShvYmplY3QpIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gICAgICBpZiAob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gQ29uc3RydWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIG9iamVjdCk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRyZXNvbHZlO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCgpIHt9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAgID0gdm9pZCAwO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQgPSAxO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCAgPSAyO1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SID0gbmV3IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCk7XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzZWxmRnVsZmlsbG1lbnQoKSB7XG4gICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGZcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkY2Fubm90UmV0dXJuT3duKCkge1xuICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRnZXRUaGVuKHByb21pc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW47XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SLmVycm9yID0gZXJyb3I7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlUaGVuKHRoZW4sIHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUsIHRoZW4pIHtcbiAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChmdW5jdGlvbihwcm9taXNlKSB7XG4gICAgICAgIHZhciBzZWFsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGVycm9yID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5VGhlbih0aGVuLCB0aGVuYWJsZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBpZiAoc2VhbGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoZW5hYmxlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgaWYgKHNlYWxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0sICdTZXR0bGU6ICcgKyAocHJvbWlzZS5fbGFiZWwgfHwgJyB1bmtub3duIHByb21pc2UnKSk7XG5cbiAgICAgICAgaWYgKCFzZWFsZWQgJiYgZXJyb3IpIHtcbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sIHByb21pc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlKSB7XG4gICAgICBpZiAodGhlbmFibGUuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAodGhlbmFibGUuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUodGhlbmFibGUsIHVuZGVmaW5lZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSwgdGhlbikge1xuICAgICAgaWYgKG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IgPT09IHByb21pc2UuY29uc3RydWN0b3IgJiZcbiAgICAgICAgICB0aGVuID09PSBsaWIkZXM2JHByb21pc2UkdGhlbiQkZGVmYXVsdCAmJlxuICAgICAgICAgIGNvbnN0cnVjdG9yLnJlc29sdmUgPT09IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhlbiA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IuZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHRoZW4pKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUsIHRoZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHNlbGZGdWxmaWxsbWVudCgpKTtcbiAgICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRvYmplY3RPckZ1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRnZXRUaGVuKHZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgICAgIGlmIChwcm9taXNlLl9vbmVycm9yKSB7XG4gICAgICAgIHByb21pc2UuX29uZXJyb3IocHJvbWlzZS5fcmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaChwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHsgcmV0dXJuOyB9XG5cbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fc3RhdGUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQ7XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaCwgcHJvbWlzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbikge1xuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7IHJldHVybjsgfVxuICAgICAgcHJvbWlzZS5fc3RhdGUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRDtcbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHJlYXNvbjtcblxuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaFJlamVjdGlvbiwgcHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gICAgICB2YXIgc3Vic2NyaWJlcnMgPSBwYXJlbnQuX3N1YnNjcmliZXJzO1xuICAgICAgdmFyIGxlbmd0aCA9IHN1YnNjcmliZXJzLmxlbmd0aDtcblxuICAgICAgcGFyZW50Ll9vbmVycm9yID0gbnVsbDtcblxuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoXSA9IGNoaWxkO1xuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEXSA9IG9uRnVsZmlsbG1lbnQ7XG4gICAgICBzdWJzY3JpYmVyc1tsZW5ndGggKyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRF0gID0gb25SZWplY3Rpb247XG5cbiAgICAgIGlmIChsZW5ndGggPT09IDAgJiYgcGFyZW50Ll9zdGF0ZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoLCBwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gocHJvbWlzZSkge1xuICAgICAgdmFyIHN1YnNjcmliZXJzID0gcHJvbWlzZS5fc3Vic2NyaWJlcnM7XG4gICAgICB2YXIgc2V0dGxlZCA9IHByb21pc2UuX3N0YXRlO1xuXG4gICAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuXG4gICAgICB2YXIgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwgPSBwcm9taXNlLl9yZXN1bHQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgY2hpbGQgPSBzdWJzY3JpYmVyc1tpXTtcbiAgICAgICAgY2FsbGJhY2sgPSBzdWJzY3JpYmVyc1tpICsgc2V0dGxlZF07XG5cbiAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IgPSBuZXcgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKTtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeUNhdGNoKGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhkZXRhaWwpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUi5lcnJvciA9IGU7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgcHJvbWlzZSwgY2FsbGJhY2ssIGRldGFpbCkge1xuICAgICAgdmFyIGhhc0NhbGxiYWNrID0gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKGNhbGxiYWNrKSxcbiAgICAgICAgICB2YWx1ZSwgZXJyb3IsIHN1Y2NlZWRlZCwgZmFpbGVkO1xuXG4gICAgICBpZiAoaGFzQ2FsbGJhY2spIHtcbiAgICAgICAgdmFsdWUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlDYXRjaChjYWxsYmFjaywgZGV0YWlsKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUikge1xuICAgICAgICAgIGZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3IgPSB2YWx1ZS5lcnJvcjtcbiAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRjYW5ub3RSZXR1cm5Pd24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGV0YWlsO1xuICAgICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgLy8gbm9vcFxuICAgICAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVkZWQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGZhaWxlZCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVyKGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHZhbHVlKXtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkYWxsKGVudHJpZXMpIHtcbiAgICAgIHJldHVybiBuZXcgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJGRlZmF1bHQodGhpcywgZW50cmllcykucHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkYWxsO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJHJhY2UoZW50cmllcykge1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuXG4gICAgICBpZiAoIWxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNBcnJheShlbnRyaWVzKSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgZnVuY3Rpb24gb25GdWxmaWxsbWVudCh2YWx1ZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25SZWplY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcgJiYgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShDb25zdHJ1Y3Rvci5yZXNvbHZlKGVudHJpZXNbaV0pLCB1bmRlZmluZWQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkcmFjZTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJHJlamVjdChyZWFzb24pIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRyZWplY3Q7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGNvdW50ZXIgPSAwO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzUmVzb2x2ZXIoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGEgcmVzb2x2ZXIgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBwcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzTmV3KCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZTtcbiAgICAvKipcbiAgICAgIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgICAgIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsIHdoaWNoXG4gICAgICByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJvbWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZSByZWFzb25cbiAgICAgIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gICAgICBUZXJtaW5vbG9neVxuICAgICAgLS0tLS0tLS0tLS1cblxuICAgICAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgICAgIC0gYHRoZW5hYmxlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgYHRoZW5gIG1ldGhvZC5cbiAgICAgIC0gYHZhbHVlYCBpcyBhbnkgbGVnYWwgSmF2YVNjcmlwdCB2YWx1ZSAoaW5jbHVkaW5nIHVuZGVmaW5lZCwgYSB0aGVuYWJsZSwgb3IgYSBwcm9taXNlKS5cbiAgICAgIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAgICAgLSBgcmVhc29uYCBpcyBhIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoeSBhIHByb21pc2Ugd2FzIHJlamVjdGVkLlxuICAgICAgLSBgc2V0dGxlZGAgdGhlIGZpbmFsIHJlc3Rpbmcgc3RhdGUgb2YgYSBwcm9taXNlLCBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQuXG5cbiAgICAgIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICAgICAgUHJvbWlzZXMgdGhhdCBhcmUgZnVsZmlsbGVkIGhhdmUgYSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgYXJlIGluIHRoZSBmdWxmaWxsZWRcbiAgICAgIHN0YXRlLiAgUHJvbWlzZXMgdGhhdCBhcmUgcmVqZWN0ZWQgaGF2ZSBhIHJlamVjdGlvbiByZWFzb24gYW5kIGFyZSBpbiB0aGVcbiAgICAgIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gICAgICBQcm9taXNlcyBjYW4gYWxzbyBiZSBzYWlkIHRvICpyZXNvbHZlKiBhIHZhbHVlLiAgSWYgdGhpcyB2YWx1ZSBpcyBhbHNvIGFcbiAgICAgIHByb21pc2UsIHRoZW4gdGhlIG9yaWdpbmFsIHByb21pc2UncyBzZXR0bGVkIHN0YXRlIHdpbGwgbWF0Y2ggdGhlIHZhbHVlJ3NcbiAgICAgIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICAgICAgaXRzZWxmIHJlamVjdCwgYW5kIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2lsbFxuICAgICAgaXRzZWxmIGZ1bGZpbGwuXG5cblxuICAgICAgQmFzaWMgVXNhZ2U6XG4gICAgICAtLS0tLS0tLS0tLS1cblxuICAgICAgYGBganNcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIC8vIG9uIHN1Y2Nlc3NcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gb24gZmFpbHVyZVxuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gb24gZnVsZmlsbG1lbnRcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAvLyBvbiByZWplY3Rpb25cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFkdmFuY2VkIFVzYWdlOlxuICAgICAgLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFByb21pc2VzIHNoaW5lIHdoZW4gYWJzdHJhY3RpbmcgYXdheSBhc3luY2hyb25vdXMgaW50ZXJhY3Rpb25zIHN1Y2ggYXNcbiAgICAgIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gICAgICBgYGBqc1xuICAgICAgZnVuY3Rpb24gZ2V0SlNPTih1cmwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCk7XG4gICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdqc29uJztcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICAgICAgZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuRE9ORSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgICAgICAvLyBvbiBmdWxmaWxsbWVudFxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIC8vIG9uIHJlamVjdGlvblxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICAgICAgYGBganNcbiAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgICAgIGdldEpTT04oJy9jb21tZW50cycpXG4gICAgICBdKS50aGVuKGZ1bmN0aW9uKHZhbHVlcyl7XG4gICAgICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICAgICAgdmFsdWVzWzFdIC8vID0+IGNvbW1lbnRzSlNPTlxuXG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAY2xhc3MgUHJvbWlzZVxuICAgICAgQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZXJcbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UocmVzb2x2ZXIpIHtcbiAgICAgIHRoaXMuX2lkID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGNvdW50ZXIrKztcbiAgICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3Vic2NyaWJlcnMgPSBbXTtcblxuICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3AgIT09IHJlc29sdmVyKSB7XG4gICAgICAgIHR5cGVvZiByZXNvbHZlciAhPT0gJ2Z1bmN0aW9uJyAmJiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNSZXNvbHZlcigpO1xuICAgICAgICB0aGlzIGluc3RhbmNlb2YgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UgPyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbml0aWFsaXplUHJvbWlzZSh0aGlzLCByZXNvbHZlcikgOiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNOZXcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5hbGwgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmFjZSA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmVzb2x2ZSA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmVqZWN0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLl9zZXRTY2hlZHVsZXIgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0U2NoZWR1bGVyO1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLl9zZXRBc2FwID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldEFzYXA7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuX2FzYXAgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcDtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnByb3RvdHlwZSA9IHtcbiAgICAgIGNvbnN0cnVjdG9yOiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZSxcblxuICAgIC8qKlxuICAgICAgVGhlIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsXG4gICAgICB3aGljaCByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJvbWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZVxuICAgICAgcmVhc29uIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uKHVzZXIpe1xuICAgICAgICAvLyB1c2VyIGlzIGF2YWlsYWJsZVxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gdXNlciBpcyB1bmF2YWlsYWJsZSwgYW5kIHlvdSBhcmUgZ2l2ZW4gdGhlIHJlYXNvbiB3aHlcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIENoYWluaW5nXG4gICAgICAtLS0tLS0tLVxuXG4gICAgICBUaGUgcmV0dXJuIHZhbHVlIG9mIGB0aGVuYCBpcyBpdHNlbGYgYSBwcm9taXNlLiAgVGhpcyBzZWNvbmQsICdkb3duc3RyZWFtJ1xuICAgICAgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZpcnN0IHByb21pc2UncyBmdWxmaWxsbWVudFxuICAgICAgb3IgcmVqZWN0aW9uIGhhbmRsZXIsIG9yIHJlamVjdGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24uXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHVzZXIubmFtZTtcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0IG5hbWUnO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodXNlck5hbWUpIHtcbiAgICAgICAgLy8gSWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGB1c2VyTmFtZWAgd2lsbCBiZSB0aGUgdXNlcidzIG5hbWUsIG90aGVyd2lzZSBpdFxuICAgICAgICAvLyB3aWxsIGJlIGAnZGVmYXVsdCBuYW1lJ2BcbiAgICAgIH0pO1xuXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScpO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gaWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGByZWFzb25gIHdpbGwgYmUgJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jy5cbiAgICAgICAgLy8gSWYgYGZpbmRVc2VyYCByZWplY3RlZCwgYHJlYXNvbmAgd2lsbCBiZSAnYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScuXG4gICAgICB9KTtcbiAgICAgIGBgYFxuICAgICAgSWYgdGhlIGRvd25zdHJlYW0gcHJvbWlzZSBkb2VzIG5vdCBzcGVjaWZ5IGEgcmVqZWN0aW9uIGhhbmRsZXIsIHJlamVjdGlvbiByZWFzb25zIHdpbGwgYmUgcHJvcGFnYXRlZCBmdXJ0aGVyIGRvd25zdHJlYW0uXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBlZGFnb2dpY2FsRXhjZXB0aW9uKCdVcHN0cmVhbSBlcnJvcicpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBUaGUgYFBlZGdhZ29jaWFsRXhjZXB0aW9uYCBpcyBwcm9wYWdhdGVkIGFsbCB0aGUgd2F5IGRvd24gdG8gaGVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQXNzaW1pbGF0aW9uXG4gICAgICAtLS0tLS0tLS0tLS1cblxuICAgICAgU29tZXRpbWVzIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBwcm9wYWdhdGUgdG8gYSBkb3duc3RyZWFtIHByb21pc2UgY2FuIG9ubHkgYmVcbiAgICAgIHJldHJpZXZlZCBhc3luY2hyb25vdXNseS4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgcmV0dXJuaW5nIGEgcHJvbWlzZSBpbiB0aGVcbiAgICAgIGZ1bGZpbGxtZW50IG9yIHJlamVjdGlvbiBoYW5kbGVyLiBUaGUgZG93bnN0cmVhbSBwcm9taXNlIHdpbGwgdGhlbiBiZSBwZW5kaW5nXG4gICAgICB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzZXR0bGVkLiBUaGlzIGlzIGNhbGxlZCAqYXNzaW1pbGF0aW9uKi5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgICAvLyBUaGUgdXNlcidzIGNvbW1lbnRzIGFyZSBub3cgYXZhaWxhYmxlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBJZiB0aGUgYXNzaW1saWF0ZWQgcHJvbWlzZSByZWplY3RzLCB0aGVuIHRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCBhbHNvIHJlamVjdC5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIGZ1bGZpbGxzLCB3ZSdsbCBoYXZlIHRoZSB2YWx1ZSBoZXJlXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgcmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFNpbXBsZSBFeGFtcGxlXG4gICAgICAtLS0tLS0tLS0tLS0tLVxuXG4gICAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZpbmRSZXN1bHQoKTtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfVxuICAgICAgYGBgXG5cbiAgICAgIEVycmJhY2sgRXhhbXBsZVxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFJlc3VsdChmdW5jdGlvbihyZXN1bHQsIGVycil7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAvLyBmYWlsdXJlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBQcm9taXNlIEV4YW1wbGU7XG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIGZpbmRSZXN1bHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFkdmFuY2VkIEV4YW1wbGVcbiAgICAgIC0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFN5bmNocm9ub3VzIEV4YW1wbGVcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgdmFyIGF1dGhvciwgYm9va3M7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF1dGhvciA9IGZpbmRBdXRob3IoKTtcbiAgICAgICAgYm9va3MgID0gZmluZEJvb2tzQnlBdXRob3IoYXV0aG9yKTtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfVxuICAgICAgYGBgXG5cbiAgICAgIEVycmJhY2sgRXhhbXBsZVxuXG4gICAgICBgYGBqc1xuXG4gICAgICBmdW5jdGlvbiBmb3VuZEJvb2tzKGJvb2tzKSB7XG5cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmFpbHVyZShyZWFzb24pIHtcblxuICAgICAgfVxuXG4gICAgICBmaW5kQXV0aG9yKGZ1bmN0aW9uKGF1dGhvciwgZXJyKXtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICAvLyBmYWlsdXJlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpbmRCb29va3NCeUF1dGhvcihhdXRob3IsIGZ1bmN0aW9uKGJvb2tzLCBlcnIpIHtcbiAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgZm91bmRCb29rcyhib29rcyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgIGZhaWx1cmUocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBQcm9taXNlIEV4YW1wbGU7XG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIGZpbmRBdXRob3IoKS5cbiAgICAgICAgdGhlbihmaW5kQm9va3NCeUF1dGhvcikuXG4gICAgICAgIHRoZW4oZnVuY3Rpb24oYm9va3Mpe1xuICAgICAgICAgIC8vIGZvdW5kIGJvb2tzXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQG1ldGhvZCB0aGVuXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvbkZ1bGZpbGxlZFxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3RlZFxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgICAgdGhlbjogbGliJGVzNiRwcm9taXNlJHRoZW4kJGRlZmF1bHQsXG5cbiAgICAvKipcbiAgICAgIGBjYXRjaGAgaXMgc2ltcGx5IHN1Z2FyIGZvciBgdGhlbih1bmRlZmluZWQsIG9uUmVqZWN0aW9uKWAgd2hpY2ggbWFrZXMgaXQgdGhlIHNhbWVcbiAgICAgIGFzIHRoZSBjYXRjaCBibG9jayBvZiBhIHRyeS9jYXRjaCBzdGF0ZW1lbnQuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmdW5jdGlvbiBmaW5kQXV0aG9yKCl7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGRuJ3QgZmluZCB0aGF0IGF1dGhvcicpO1xuICAgICAgfVxuXG4gICAgICAvLyBzeW5jaHJvbm91c1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmluZEF1dGhvcigpO1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH1cblxuICAgICAgLy8gYXN5bmMgd2l0aCBwcm9taXNlc1xuICAgICAgZmluZEF1dGhvcigpLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAbWV0aG9kIGNhdGNoXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGlvblxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvcjtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvcihDb25zdHJ1Y3RvciwgaW5wdXQpIHtcbiAgICAgIHRoaXMuX2luc3RhbmNlQ29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHRoaXMuX2lucHV0ICAgICA9IGlucHV0O1xuICAgICAgICB0aGlzLmxlbmd0aCAgICAgPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIHRoaXMuX3JlbWFpbmluZyA9IGlucHV0Lmxlbmd0aDtcblxuICAgICAgICB0aGlzLl9yZXN1bHQgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwodGhpcy5wcm9taXNlLCB0aGlzLl9yZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMDtcbiAgICAgICAgICB0aGlzLl9lbnVtZXJhdGUoKTtcbiAgICAgICAgICBpZiAodGhpcy5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHRoaXMucHJvbWlzZSwgdGhpcy5fcmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdCh0aGlzLnByb21pc2UsIHRoaXMuX3ZhbGlkYXRpb25FcnJvcigpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5Jyk7XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fZW51bWVyYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGVuZ3RoICA9IHRoaXMubGVuZ3RoO1xuICAgICAgdmFyIGlucHV0ICAgPSB0aGlzLl9pbnB1dDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IHRoaXMuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HICYmIGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLl9lYWNoRW50cnkoaW5wdXRbaV0sIGkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX2VhY2hFbnRyeSA9IGZ1bmN0aW9uKGVudHJ5LCBpKSB7XG4gICAgICB2YXIgYyA9IHRoaXMuX2luc3RhbmNlQ29uc3RydWN0b3I7XG4gICAgICB2YXIgcmVzb2x2ZSA9IGMucmVzb2x2ZTtcblxuICAgICAgaWYgKHJlc29sdmUgPT09IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQpIHtcbiAgICAgICAgdmFyIHRoZW4gPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRnZXRUaGVuKGVudHJ5KTtcblxuICAgICAgICBpZiAodGhlbiA9PT0gbGliJGVzNiRwcm9taXNlJHRoZW4kJGRlZmF1bHQgJiZcbiAgICAgICAgICAgIGVudHJ5Ll9zdGF0ZSAhPT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykge1xuICAgICAgICAgIHRoaXMuX3NldHRsZWRBdChlbnRyeS5fc3RhdGUsIGksIGVudHJ5Ll9yZXN1bHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGVuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhpcy5fcmVtYWluaW5nLS07XG4gICAgICAgICAgdGhpcy5fcmVzdWx0W2ldID0gZW50cnk7XG4gICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQpIHtcbiAgICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBjKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgZW50cnksIHRoZW4pO1xuICAgICAgICAgIHRoaXMuX3dpbGxTZXR0bGVBdChwcm9taXNlLCBpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl93aWxsU2V0dGxlQXQobmV3IGMoZnVuY3Rpb24ocmVzb2x2ZSkgeyByZXNvbHZlKGVudHJ5KTsgfSksIGkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl93aWxsU2V0dGxlQXQocmVzb2x2ZShlbnRyeSksIGkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3NldHRsZWRBdCA9IGZ1bmN0aW9uKHN0YXRlLCBpLCB2YWx1ZSkge1xuICAgICAgdmFyIHByb21pc2UgPSB0aGlzLnByb21pc2U7XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykge1xuICAgICAgICB0aGlzLl9yZW1haW5pbmctLTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9yZXN1bHRbaV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdGhpcy5fcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl93aWxsU2V0dGxlQXQgPSBmdW5jdGlvbihwcm9taXNlLCBpKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShwcm9taXNlLCB1bmRlZmluZWQsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3NldHRsZWRBdChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQsIGksIHZhbHVlKTtcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQsIGksIHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkcG9seWZpbGwoKSB7XG4gICAgICB2YXIgbG9jYWw7XG5cbiAgICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsID0gZ2xvYmFsO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBsb2NhbCA9IHNlbGY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGxvY2FsID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgUCA9IGxvY2FsLlByb21pc2U7XG5cbiAgICAgIGlmIChQICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQLnJlc29sdmUoKSkgPT09ICdbb2JqZWN0IFByb21pc2VdJyAmJiAhUC5jYXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbG9jYWwuUHJvbWlzZSA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0O1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRwb2x5ZmlsbDtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlID0ge1xuICAgICAgJ1Byb21pc2UnOiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdCxcbiAgICAgICdwb2x5ZmlsbCc6IGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdFxuICAgIH07XG5cbiAgICAvKiBnbG9iYWwgZGVmaW5lOnRydWUgbW9kdWxlOnRydWUgd2luZG93OiB0cnVlICovXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSkge1xuICAgICAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTsgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGVbJ2V4cG9ydHMnXSkge1xuICAgICAgbW9kdWxlWydleHBvcnRzJ10gPSBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzWydFUzZQcm9taXNlJ10gPSBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlO1xuICAgIH1cblxuICAgIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdCgpO1xufSkuY2FsbCh0aGlzKTtcblxuIl19 | |
},{"_process":1}],"clarifai":[function(require,module,exports){ | |
(function (process,global){ | |
var config = require('./lib/config'); | |
var token = require('./lib/token'); | |
var tag = require('./lib/tag'); | |
var info = require('./lib/info'); | |
var languages = require('./lib/languages'); | |
var callback = require('./lib/callback'); | |
var color = require('./lib/color'); | |
var feedback = require('./lib/feedback'); | |
var usage = require('./lib/usage'); | |
module.exports = global.Clarifai = { | |
initialize: function(options) { | |
config.set('apiEndpoint', options.apiEndpoint || process.env.API_ENDPOINT || 'https://api.clarifai.com'); | |
config.set('clientId', options.clientId || process.env.CLIENT_ID); | |
config.set('clientSecret', options.clientSecret || process.env.CLIENT_SECRET); | |
token.delete(); | |
}, | |
/** | |
* Gets a token from the API using client credentials | |
* @method getToken | |
* @param {Function} callback A node-style calback function that accepts err, token (optional) | |
* @return {Promise(token, error} A Promise that is fulfilled with the token string or rejected with an error | |
*/ | |
getToken: function(_callback) { | |
var promise = token.get(); | |
callback.handle(promise, _callback); | |
return promise; | |
}, | |
/** | |
* Sets the token to use for the API | |
* @method setToken | |
* @param {String} _token The token you are setting | |
* @return {Boolean} true if token has valid fields, false if not | |
*/ | |
setToken: function(_token) { | |
return token.set(_token); | |
}, | |
/** | |
* Deletes the token | |
* @method deleteToken | |
*/ | |
deleteToken: function() { | |
token.delete(); | |
}, | |
/** | |
* Gets tags given a url | |
* @method getTagsByUrl | |
* @param {String} or {Array} url A publicly accessible url of the image. | |
* @param {Object} options Object with keys explained below: (optional) | |
* @param {String} model The model used to tag the image (optional) | |
* @param {String} language The language used to tag the image (optional) | |
* @param {String} or {Array} selectClasses Restrict the tags returned | |
* @param {String} or {Array} localId Provide a localId for each url to simplify tracking requests (optional) | |
* @param {Function} A node-style calback function that accepts err, token (optional) | |
* @return {Promise(token, error} A Promise that is fulfilled with the API response or rejected with an error | |
*/ | |
getTagsByUrl: function(url, options, _callback) { | |
var callbackFn = _callback; | |
if ( typeof options === 'function' ) { | |
callbackFn = options; | |
}; | |
var promise = tag.getByUrl(url, options); | |
callback.handle(promise, callbackFn); | |
return promise; | |
}, | |
/** | |
* Gets tags given image bytes | |
* @method getTagsByImageBytes | |
* @param {String} image bytes Base64 encoded image bytes. | |
* @param {Object} options Object with keys explained below: (optional) | |
* @param {String} model The model used to tag the image (optional) | |
* @param {String} language The language used to tag the image (optional) | |
* @param {String} or {Array} selectClasses Restrict the tags returned | |
* @param {String} or {Array} localId Provide a localId for each url to simplify tracking requests (optional) | |
* @param {Function} A node-style calback function that accepts err, token (optional) | |
* @return {Promise(token, error} A Promise that is fulfilled with the API response or rejected with an error | |
*/ | |
getTagsByImageBytes: function(imageBytes, options, _callback) { | |
var callbackFn = _callback; | |
if ( typeof options === 'function' ) { | |
callbackFn = options; | |
}; | |
var promise = tag.getByImageBytes(imageBytes, options); | |
callback.handle(promise, callbackFn); | |
return promise; | |
}, | |
/** | |
* Gets API info | |
* @method getInfo | |
* @param {Function} callback A node-style calback function that accepts err, token (optional) | |
* @return {Promise(token, error} A Promise that is fulfilled with the API response or rejected with an error | |
*/ | |
getInfo: function(_callback) { | |
var promise = info.get(); | |
callback.handle(promise, _callback); | |
return promise; | |
}, | |
/** | |
* Gets languages supported by the API | |
* @method getLanguages | |
* @param {Function} callback A node-style calback function that accepts err, token (optional) | |
* @return {Promise(token, error} A Promise that is fulfilled with the API response or rejected with an error | |
*/ | |
getLanguages: function(_callback) { | |
var promise = languages.get(); | |
callback.handle(promise, _callback); | |
return promise; | |
}, | |
/** | |
* Gets colors given a url | |
* @method getColorByUrl | |
* @param {String} or {Array} url A publicly accessible url of the image. | |
* @param {Function} A node-style calback function that accepts err, token (optional) | |
* @return {Promise(token, error} A Promise that is fulfilled with the API response or rejected with an error | |
*/ | |
getColorsByUrl: function(url, _callback) { | |
var promise = color.getByUrl(url); | |
callback.handle(promise, _callback); | |
return promise; | |
}, | |
/** | |
* Gets colors given image bytes | |
* @method getColorsByImageBytes | |
* @param {String} url A publicly accessible url of the image. | |
* @param {Function} A node-style calback function that accepts err, token (optional) | |
* @return {Promise(token, error} A Promise that is fulfilled with the API response or rejected with an error | |
*/ | |
getColorsByImageBytes: function(imageBytes, _callback) { | |
var promise = color.getByImageBytes(imageBytes); | |
callback.handle(promise, _callback); | |
return promise; | |
}, | |
/** | |
* Gets API usage | |
* @method getUsage | |
* @param {Function} callback A node-style calback function that accepts err, token (optional) | |
* @return {Promise(token, error} A Promise that is fulfilled with the API response or rejected with an error | |
*/ | |
getUsage: function(_callback) { | |
var promise = usage.get(); | |
callback.handle(promise, _callback); | |
return promise; | |
}, | |
/** | |
* Provide feedback for a url or list of urls | |
* @method createFeedback | |
* @param {String} or {Array} url A publicly accessible url of the image. | |
* @param {Object} options Object with keys explained below: (optional) | |
* @param {String} or {Array} addTags Add additional tags that are relevant to the given image(s) (optional) | |
* @param {String} or {Array} removeTags Remove tags that are not relevant to the given image(s) (optional) | |
* @param {String} or {Array} similarUrls Tell the system two or more images are similar (optional) | |
* @param {String} or {Array} disSimilarUrls Tell the system two or more images are dissimilar (optional) | |
* @param {String} or {Array} searchClick Tell the system that the search result was relevant to the query (optional) | |
* @param {Function} A node-style calback function that accepts err, token (optional) | |
* @return {Promise(token, error} A Promise that is fulfilled with the API response or rejected with an error | |
*/ | |
createFeedback: function(url, options, _callback) { | |
var callbackFn = _callback; | |
if ( typeof options === 'function' ) { | |
callbackFn = options; | |
}; | |
var promise = feedback.create(url, options); | |
callback.handle(promise, callbackFn); | |
return promise; | |
} | |
}; | |
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | |
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29uZmlnID0gcmVxdWlyZSgnLi9saWIvY29uZmlnJyk7XG52YXIgdG9rZW4gPSByZXF1aXJlKCcuL2xpYi90b2tlbicpO1xudmFyIHRhZyA9IHJlcXVpcmUoJy4vbGliL3RhZycpO1xudmFyIGluZm8gPSByZXF1aXJlKCcuL2xpYi9pbmZvJyk7XG52YXIgbGFuZ3VhZ2VzID0gcmVxdWlyZSgnLi9saWIvbGFuZ3VhZ2VzJyk7XG52YXIgY2FsbGJhY2sgPSByZXF1aXJlKCcuL2xpYi9jYWxsYmFjaycpO1xudmFyIGNvbG9yID0gcmVxdWlyZSgnLi9saWIvY29sb3InKTtcbnZhciBmZWVkYmFjayA9IHJlcXVpcmUoJy4vbGliL2ZlZWRiYWNrJyk7XG52YXIgdXNhZ2UgPSByZXF1aXJlKCcuL2xpYi91c2FnZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5DbGFyaWZhaSA9IHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbmZpZy5zZXQoJ2FwaUVuZHBvaW50Jywgb3B0aW9ucy5hcGlFbmRwb2ludCB8fCBwcm9jZXNzLmVudi5BUElfRU5EUE9JTlQgfHwgJ2h0dHBzOi8vYXBpLmNsYXJpZmFpLmNvbScpO1xuICAgIGNvbmZpZy5zZXQoJ2NsaWVudElkJywgb3B0aW9ucy5jbGllbnRJZCB8fCBwcm9jZXNzLmVudi5DTElFTlRfSUQpO1xuICAgIGNvbmZpZy5zZXQoJ2NsaWVudFNlY3JldCcsIG9wdGlvbnMuY2xpZW50U2VjcmV0IHx8IHByb2Nlc3MuZW52LkNMSUVOVF9TRUNSRVQpO1xuICAgIHRva2VuLmRlbGV0ZSgpO1xuICB9LFxuICAvKipcbiAgKiBHZXRzIGEgdG9rZW4gZnJvbSB0aGUgQVBJIHVzaW5nIGNsaWVudCBjcmVkZW50aWFsc1xuICAqIEBtZXRob2QgZ2V0VG9rZW5cbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSAgICBjYWxsYmFjayAgICBBIG5vZGUtc3R5bGUgY2FsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgZXJyLCB0b2tlbiAob3B0aW9uYWwpXG4gICogQHJldHVybiB7UHJvbWlzZSh0b2tlbiwgZXJyb3J9IEEgUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB0b2tlbiBzdHJpbmcgb3IgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvclxuICAqL1xuICBnZXRUb2tlbjogZnVuY3Rpb24oX2NhbGxiYWNrKSB7XG4gICAgdmFyIHByb21pc2UgPSB0b2tlbi5nZXQoKTtcbiAgICBjYWxsYmFjay5oYW5kbGUocHJvbWlzZSwgX2NhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgLyoqXG4gICogU2V0cyB0aGUgdG9rZW4gdG8gdXNlIGZvciB0aGUgQVBJXG4gICogQG1ldGhvZCBzZXRUb2tlblxuICAqIEBwYXJhbSB7U3RyaW5nfSAgICBfdG9rZW4gICAgVGhlIHRva2VuIHlvdSBhcmUgc2V0dGluZ1xuICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdG9rZW4gaGFzIHZhbGlkIGZpZWxkcywgZmFsc2UgaWYgbm90XG4gICovXG4gIHNldFRva2VuOiBmdW5jdGlvbihfdG9rZW4pIHtcbiAgICByZXR1cm4gdG9rZW4uc2V0KF90b2tlbik7XG4gIH0sXG4gIC8qKlxuICAqIERlbGV0ZXMgdGhlIHRva2VuXG4gICogQG1ldGhvZCBkZWxldGVUb2tlblxuICAqL1xuICBkZWxldGVUb2tlbjogZnVuY3Rpb24oKSB7XG4gICAgdG9rZW4uZGVsZXRlKCk7XG4gIH0sXG4gIC8qKlxuICAqIEdldHMgdGFncyBnaXZlbiBhIHVybFxuICAqIEBtZXRob2QgZ2V0VGFnc0J5VXJsXG4gICogQHBhcmFtIHtTdHJpbmd9IG9yIHtBcnJheX0gICAgICB1cmwgICAgICAgICAgICAgQSBwdWJsaWNseSBhY2Nlc3NpYmxlIHVybCBvZiB0aGUgaW1hZ2UuXG4gICogQHBhcmFtIHtPYmplY3R9ICAgICAgICAgICAgICAgICBvcHRpb25zICAgICAgICAgT2JqZWN0IHdpdGgga2V5cyBleHBsYWluZWQgYmVsb3c6IChvcHRpb25hbClcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gICAgICAgICAgICAgIG1vZGVsICAgICAgICAgICBUaGUgbW9kZWwgdXNlZCB0byB0YWcgdGhlIGltYWdlIChvcHRpb25hbClcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gICAgICAgICAgICAgIGxhbmd1YWdlICAgICAgICBUaGUgbGFuZ3VhZ2UgdXNlZCB0byB0YWcgdGhlIGltYWdlIChvcHRpb25hbClcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gb3Ige0FycmF5fSAgIHNlbGVjdENsYXNzZXMgICBSZXN0cmljdCB0aGUgdGFncyByZXR1cm5lZFxuICAqICAgIEBwYXJhbSB7U3RyaW5nfSBvciB7QXJyYXl9ICAgbG9jYWxJZCAgICAgICAgIFByb3ZpZGUgYSBsb2NhbElkIGZvciBlYWNoIHVybCB0byBzaW1wbGlmeSB0cmFja2luZyByZXF1ZXN0cyAob3B0aW9uYWwpXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBub2RlLXN0eWxlIGNhbGJhY2sgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGVyciwgdG9rZW4gKG9wdGlvbmFsKVxuICAqIEByZXR1cm4ge1Byb21pc2UodG9rZW4sIGVycm9yfSAgICAgICAgICAgICAgICAgIEEgUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSBBUEkgcmVzcG9uc2Ugb3IgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvclxuICAqL1xuICBnZXRUYWdzQnlVcmw6IGZ1bmN0aW9uKHVybCwgb3B0aW9ucywgX2NhbGxiYWNrKSB7XG4gICAgdmFyIGNhbGxiYWNrRm4gPSBfY2FsbGJhY2s7XG4gICAgaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyApIHtcbiAgICAgIGNhbGxiYWNrRm4gPSBvcHRpb25zO1xuICAgIH07XG4gICAgdmFyIHByb21pc2UgPSB0YWcuZ2V0QnlVcmwodXJsLCBvcHRpb25zKTtcbiAgICBjYWxsYmFjay5oYW5kbGUocHJvbWlzZSwgY2FsbGJhY2tGbik7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH0sXG4gIC8qKlxuICAqIEdldHMgdGFncyBnaXZlbiBpbWFnZSBieXRlc1xuICAqIEBtZXRob2QgZ2V0VGFnc0J5SW1hZ2VCeXRlc1xuICAqIEBwYXJhbSB7U3RyaW5nfSAgICAgICAgICAgICAgICAgaW1hZ2UgYnl0ZXMgICAgIEJhc2U2NCBlbmNvZGVkIGltYWdlIGJ5dGVzLlxuICAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgICAgb3B0aW9ucyAgICAgICAgIE9iamVjdCB3aXRoIGtleXMgZXhwbGFpbmVkIGJlbG93OiAob3B0aW9uYWwpXG4gICogICAgQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICBtb2RlbCAgICAgICAgICAgVGhlIG1vZGVsIHVzZWQgdG8gdGFnIHRoZSBpbWFnZSAob3B0aW9uYWwpXG4gICogICAgQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICBsYW5ndWFnZSAgICAgICAgVGhlIGxhbmd1YWdlIHVzZWQgdG8gdGFnIHRoZSBpbWFnZSAob3B0aW9uYWwpXG4gICogICAgQHBhcmFtIHtTdHJpbmd9IG9yIHtBcnJheX0gICBzZWxlY3RDbGFzc2VzICAgUmVzdHJpY3QgdGhlIHRhZ3MgcmV0dXJuZWRcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gb3Ige0FycmF5fSAgIGxvY2FsSWQgICAgICAgICBQcm92aWRlIGEgbG9jYWxJZCBmb3IgZWFjaCB1cmwgdG8gc2ltcGxpZnkgdHJhY2tpbmcgcmVxdWVzdHMgKG9wdGlvbmFsKVxuICAqIEBwYXJhbSB7RnVuY3Rpb259ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgbm9kZS1zdHlsZSBjYWxiYWNrIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBlcnIsIHRva2VuIChvcHRpb25hbClcbiAgKiBAcmV0dXJuIHtQcm9taXNlKHRva2VuLCBlcnJvcn0gICAgICAgICAgICAgICAgICBBIFByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgQVBJIHJlc3BvbnNlIG9yIHJlamVjdGVkIHdpdGggYW4gZXJyb3JcbiAgKi9cbiAgZ2V0VGFnc0J5SW1hZ2VCeXRlczogZnVuY3Rpb24oaW1hZ2VCeXRlcywgb3B0aW9ucywgX2NhbGxiYWNrKSB7XG4gICAgdmFyIGNhbGxiYWNrRm4gPSBfY2FsbGJhY2s7XG4gICAgaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyApIHtcbiAgICAgIGNhbGxiYWNrRm4gPSBvcHRpb25zO1xuICAgIH07XG4gICAgdmFyIHByb21pc2UgPSB0YWcuZ2V0QnlJbWFnZUJ5dGVzKGltYWdlQnl0ZXMsIG9wdGlvbnMpO1xuICAgIGNhbGxiYWNrLmhhbmRsZShwcm9taXNlLCBjYWxsYmFja0ZuKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgLyoqXG4gICogR2V0cyBBUEkgaW5mb1xuICAqIEBtZXRob2QgZ2V0SW5mb1xuICAqIEBwYXJhbSB7RnVuY3Rpb259ICAgIGNhbGxiYWNrICAgIEEgbm9kZS1zdHlsZSBjYWxiYWNrIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBlcnIsIHRva2VuIChvcHRpb25hbClcbiAgKiBAcmV0dXJuIHtQcm9taXNlKHRva2VuLCBlcnJvcn0gQSBQcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIEFQSSByZXNwb25zZSBvciByZWplY3RlZCB3aXRoIGFuIGVycm9yXG4gICovXG4gIGdldEluZm86IGZ1bmN0aW9uKF9jYWxsYmFjaykge1xuICAgIHZhciBwcm9taXNlID0gaW5mby5nZXQoKTtcbiAgICBjYWxsYmFjay5oYW5kbGUocHJvbWlzZSwgX2NhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgLyoqXG4gICogR2V0cyBsYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IHRoZSBBUElcbiAgKiBAbWV0aG9kIGdldExhbmd1YWdlc1xuICAqIEBwYXJhbSB7RnVuY3Rpb259ICAgIGNhbGxiYWNrICAgIEEgbm9kZS1zdHlsZSBjYWxiYWNrIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBlcnIsIHRva2VuIChvcHRpb25hbClcbiAgKiBAcmV0dXJuIHtQcm9taXNlKHRva2VuLCBlcnJvcn0gQSBQcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIEFQSSByZXNwb25zZSBvciByZWplY3RlZCB3aXRoIGFuIGVycm9yXG4gICovXG4gIGdldExhbmd1YWdlczogZnVuY3Rpb24oX2NhbGxiYWNrKSB7XG4gICAgdmFyIHByb21pc2UgPSBsYW5ndWFnZXMuZ2V0KCk7XG4gICAgY2FsbGJhY2suaGFuZGxlKHByb21pc2UsIF9jYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH0sXG4gIC8qKlxuICAqIEdldHMgY29sb3JzIGdpdmVuIGEgdXJsXG4gICogQG1ldGhvZCBnZXRDb2xvckJ5VXJsXG4gICogQHBhcmFtIHtTdHJpbmd9IG9yIHtBcnJheX0gICB1cmwgICAgQSBwdWJsaWNseSBhY2Nlc3NpYmxlIHVybCBvZiB0aGUgaW1hZ2UuXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gQSBub2RlLXN0eWxlIGNhbGJhY2sgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGVyciwgdG9rZW4gKG9wdGlvbmFsKVxuICAqIEByZXR1cm4ge1Byb21pc2UodG9rZW4sIGVycm9yfSBBIFByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgQVBJIHJlc3BvbnNlIG9yIHJlamVjdGVkIHdpdGggYW4gZXJyb3JcbiAgKi9cbiAgZ2V0Q29sb3JzQnlVcmw6IGZ1bmN0aW9uKHVybCwgX2NhbGxiYWNrKSB7XG4gICAgdmFyIHByb21pc2UgPSBjb2xvci5nZXRCeVVybCh1cmwpO1xuICAgIGNhbGxiYWNrLmhhbmRsZShwcm9taXNlLCBfY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9LFxuICAvKipcbiAgKiBHZXRzIGNvbG9ycyBnaXZlbiBpbWFnZSBieXRlc1xuICAqIEBtZXRob2QgZ2V0Q29sb3JzQnlJbWFnZUJ5dGVzXG4gICogQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICAgICAgdXJsICAgIEEgcHVibGljbHkgYWNjZXNzaWJsZSB1cmwgb2YgdGhlIGltYWdlLlxuICAqIEBwYXJhbSB7RnVuY3Rpb259ICAgICAgICAgICAgICAgICAgICAgICBBIG5vZGUtc3R5bGUgY2FsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgZXJyLCB0b2tlbiAob3B0aW9uYWwpXG4gICogQHJldHVybiB7UHJvbWlzZSh0b2tlbiwgZXJyb3J9ICAgICAgICAgIEEgUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSBBUEkgcmVzcG9uc2Ugb3IgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvclxuICAqL1xuICBnZXRDb2xvcnNCeUltYWdlQnl0ZXM6IGZ1bmN0aW9uKGltYWdlQnl0ZXMsIF9jYWxsYmFjaykge1xuICAgIHZhciBwcm9taXNlID0gY29sb3IuZ2V0QnlJbWFnZUJ5dGVzKGltYWdlQnl0ZXMpO1xuICAgIGNhbGxiYWNrLmhhbmRsZShwcm9taXNlLCBfY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9LFxuICAvKipcbiAgKiBHZXRzIEFQSSB1c2FnZVxuICAqIEBtZXRob2QgZ2V0VXNhZ2VcbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSAgICBjYWxsYmFjayAgICBBIG5vZGUtc3R5bGUgY2FsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgZXJyLCB0b2tlbiAob3B0aW9uYWwpXG4gICogQHJldHVybiB7UHJvbWlzZSh0b2tlbiwgZXJyb3J9IEEgUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSBBUEkgcmVzcG9uc2Ugb3IgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvclxuICAqL1xuICBnZXRVc2FnZTogZnVuY3Rpb24oX2NhbGxiYWNrKSB7XG4gICAgdmFyIHByb21pc2UgPSB1c2FnZS5nZXQoKTtcbiAgICBjYWxsYmFjay5oYW5kbGUocHJvbWlzZSwgX2NhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgIC8qKlxuICAqIFByb3ZpZGUgZmVlZGJhY2sgZm9yIGEgdXJsIG9yIGxpc3Qgb2YgdXJsc1xuICAqIEBtZXRob2QgY3JlYXRlRmVlZGJhY2tcbiAgKiBAcGFyYW0ge1N0cmluZ30gb3Ige0FycmF5fSAgIHVybCAgICBBIHB1YmxpY2x5IGFjY2Vzc2libGUgdXJsIG9mIHRoZSBpbWFnZS5cbiAgKiBAcGFyYW0ge09iamVjdH0gICAgb3B0aW9ucyAgT2JqZWN0IHdpdGgga2V5cyBleHBsYWluZWQgYmVsb3c6IChvcHRpb25hbClcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gb3Ige0FycmF5fSAgICBhZGRUYWdzICBBZGQgYWRkaXRpb25hbCB0YWdzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBnaXZlbiBpbWFnZShzKSAob3B0aW9uYWwpXG4gICogICAgQHBhcmFtIHtTdHJpbmd9IG9yIHtBcnJheX0gICAgcmVtb3ZlVGFncyAgUmVtb3ZlIHRhZ3MgdGhhdCBhcmUgbm90IHJlbGV2YW50IHRvIHRoZSBnaXZlbiBpbWFnZShzKSAob3B0aW9uYWwpXG4gICogICAgQHBhcmFtIHtTdHJpbmd9IG9yIHtBcnJheX0gICAgc2ltaWxhclVybHMgIFRlbGwgdGhlIHN5c3RlbSB0d28gb3IgbW9yZSBpbWFnZXMgYXJlIHNpbWlsYXIgKG9wdGlvbmFsKVxuICAqICAgIEBwYXJhbSB7U3RyaW5nfSBvciB7QXJyYXl9ICAgIGRpc1NpbWlsYXJVcmxzICBUZWxsIHRoZSBzeXN0ZW0gdHdvIG9yIG1vcmUgaW1hZ2VzIGFyZSBkaXNzaW1pbGFyIChvcHRpb25hbClcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gb3Ige0FycmF5fSAgICBzZWFyY2hDbGljayAgICBUZWxsIHRoZSBzeXN0ZW0gdGhhdCB0aGUgc2VhcmNoIHJlc3VsdCB3YXMgcmVsZXZhbnQgdG8gdGhlIHF1ZXJ5IChvcHRpb25hbClcbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBBIG5vZGUtc3R5bGUgY2FsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgZXJyLCB0b2tlbiAob3B0aW9uYWwpXG4gICogQHJldHVybiB7UHJvbWlzZSh0b2tlbiwgZXJyb3J9IEEgUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSBBUEkgcmVzcG9uc2Ugb3IgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvclxuICAqL1xuICBjcmVhdGVGZWVkYmFjazogZnVuY3Rpb24odXJsLCBvcHRpb25zLCBfY2FsbGJhY2spIHtcbiAgICB2YXIgY2FsbGJhY2tGbiA9IF9jYWxsYmFjaztcbiAgICBpZiAoIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nICkge1xuICAgICAgY2FsbGJhY2tGbiA9IG9wdGlvbnM7XG4gICAgfTtcbiAgICB2YXIgcHJvbWlzZSA9IGZlZWRiYWNrLmNyZWF0ZSh1cmwsIG9wdGlvbnMpO1xuICAgIGNhbGxiYWNrLmhhbmRsZShwcm9taXNlLCBjYWxsYmFja0ZuKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxufTtcbiJdfQ== | |
},{"./lib/callback":2,"./lib/color":3,"./lib/config":4,"./lib/feedback":5,"./lib/info":6,"./lib/languages":7,"./lib/tag":10,"./lib/token":11,"./lib/usage":12,"_process":1}]},{},[]) | |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsImxpYi9jYWxsYmFjay5qcyIsImxpYi9jb2xvci5qcyIsImxpYi9jb25maWcuanMiLCJsaWIvZmVlZGJhY2suanMiLCJsaWIvaW5mby5qcyIsImxpYi9sYW5ndWFnZXMuanMiLCJsaWIvcmVxdWVzdC5qcyIsImxpYi9yZXNwb25zZS5qcyIsImxpYi90YWcuanMiLCJsaWIvdG9rZW4uanMiLCJsaWIvdXNhZ2UuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvZGVmYXVsdHMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idG9hLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2J1aWxkVVJMLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwcmVhZC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90cmFuc2Zvcm1EYXRhLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzIiwiaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbnByb2Nlc3MubmV4dFRpY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW5TZXRJbW1lZGlhdGUgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5zZXRJbW1lZGlhdGU7XG4gICAgdmFyIGNhbk11dGF0aW9uT2JzZXJ2ZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyO1xuICAgIHZhciBjYW5Qb3N0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAmJiB3aW5kb3cucG9zdE1lc3NhZ2UgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXJcbiAgICA7XG5cbiAgICBpZiAoY2FuU2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZikgeyByZXR1cm4gd2luZG93LnNldEltbWVkaWF0ZShmKSB9O1xuICAgIH1cblxuICAgIHZhciBxdWV1ZSA9IFtdO1xuXG4gICAgaWYgKGNhbk11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgdmFyIGhpZGRlbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWV1ZUxpc3QgPSBxdWV1ZS5zbGljZSgpO1xuICAgICAgICAgICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIHF1ZXVlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShoaWRkZW5EaXYsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgICAgIGlmICghcXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaGlkZGVuRGl2LnNldEF0dHJpYnV0ZSgneWVzJywgJ25vJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGZuKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoY2FuUG9zdCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGV2LnNvdXJjZTtcbiAgICAgICAgICAgIGlmICgoc291cmNlID09PSB3aW5kb3cgfHwgc291cmNlID09PSBudWxsKSAmJiBldi5kYXRhID09PSAncHJvY2Vzcy10aWNrJykge1xuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKCdwcm9jZXNzLXRpY2snLCAnKicpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTtcbiAgICB9O1xufSkoKTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG4vLyBUT0RPKHNodHlsbWFuKVxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cy5oYW5kbGUgPSBmdW5jdGlvbihwcm9taXNlLCBjYWxsYmFjaykge1xuICBpZiAoIGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgIGNhbGxiYWNrICE9PSBudWxsICkge1xuICAgIHByb21pc2UudGhlbihcbiAgICAgIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIGNhbGxiYWNrKGVyciwgbnVsbCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufTsiLCJ2YXIgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcbnZhciBheGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcbnZhciB0b2tlbiA9IHJlcXVpcmUoJy4vdG9rZW4nKTtcbnZhciByZXF1ZXN0ID0gcmVxdWlyZSgnLi9yZXF1ZXN0Jyk7XG52YXIgcmVzcG9uc2UgPSByZXF1aXJlKCcuL3Jlc3BvbnNlJyk7XG5cbnZhciBwYXRoID0gJy92MS9jb2xvcic7XG5cbm1vZHVsZS5leHBvcnRzLmdldEJ5VXJsID0gZnVuY3Rpb24oaW1hZ2VVcmwpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHRva2VuLmdldCgpLnRoZW4oXG4gICAgICBmdW5jdGlvbih0b2tlblN0cmluZykge1xuICAgICAgICByZXR1cm4gZ2V0UmVxdWVzdChpbWFnZVVybCwgdG9rZW5TdHJpbmcpO1xuICAgICAgfVxuICAgICkudGhlbihcbiAgICAgIGZ1bmN0aW9uIChfcmVzcG9uc2UpIHtcbiAgICAgICAgcmVzcG9uc2UuaGFuZGxlVjEoX3Jlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfVxuICAgICkuY2F0Y2goXG4gICAgICBmdW5jdGlvbihlcnIpe1xuICAgICAgICByZXNwb25zZS5lcnJvclYxKGVyciwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmdldEJ5SW1hZ2VCeXRlcyA9IGZ1bmN0aW9uKGltYWdlQnl0ZXMsIF9vcHRpb25zKSB7XG4gIHZhciBvcHRpb25zID0gX29wdGlvbnMgfHwge307XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB0b2tlbi5nZXQoKS50aGVuKFxuICAgICAgZnVuY3Rpb24odG9rZW5TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHBvc3RSZXF1ZXN0KGltYWdlQnl0ZXMsIHRva2VuU3RyaW5nLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICApLnRoZW4oXG4gICAgICBmdW5jdGlvbiAoX3Jlc3BvbnNlKSB7XG4gICAgICAgIHJlc3BvbnNlLmhhbmRsZVYxKF9yZXNwb25zZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICApLmNhdGNoKFxuICAgICAgZnVuY3Rpb24oZXJyKXtcbiAgICAgICAgcmVzcG9uc2UuZXJyb3JWMShlcnIsIHJlamVjdCk7XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBnZXRSZXF1ZXN0KGltYWdlVXJsLCB0b2tlblN0cmluZykge1xuICB2YXIgdXJsID0gY29uZmlnLmdldCgnYXBpRW5kcG9pbnQnKSArIHBhdGg7XG4gIHZhciBkYXRhID0gcmVxdWVzdC5nZXRJbWFnZVVybFBhcmFtcyhpbWFnZVVybCk7XG4gIHJldHVybiBheGlvcy5wb3N0KHVybCwgZGF0YSwge1xuICAgICdoZWFkZXJzJzogcmVxdWVzdC5nZXRIZWFkZXJzKHRva2VuU3RyaW5nKVxuICB9KTtcbn07XG5cbmZ1bmN0aW9uIHBvc3RSZXF1ZXN0KGltYWdlQnl0ZXMsIHRva2VuU3RyaW5nLCBvcHRpb25zKSB7XG4gIHZhciB1cmwgPSBjb25maWcuZ2V0KCdhcGlFbmRwb2ludCcpICsgcGF0aDtcbiAgdmFyIGRhdGEgPSB7J2VuY29kZWRfaW1hZ2UnOiBpbWFnZUJ5dGVzfTtcbiAgZGF0YSA9IHJlcXVlc3QuZmlsbE9wdGlvbmFsUGFyYW1zKGRhdGEsIG9wdGlvbnMpO1xuICByZXR1cm4gYXhpb3MucG9zdCh1cmwsIGRhdGEsIHtcbiAgICAnaGVhZGVycyc6IHJlcXVlc3QuZ2V0SGVhZGVycyh0b2tlblN0cmluZyksXG4gICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gIH0pO1xufTtcbiIsInZhciBjb25maWcgPSB7XG4gICdhcGlFbmRwb2ludCc6IHVuZGVmaW5lZCxcbiAgJ2NsaWVudElkJzogdW5kZWZpbmVkLFxuICAnY2xpZW50U2VjcmV0JzogdW5kZWZpbmVkLFxuICAndG9rZW4nOiB1bmRlZmluZWRcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBjb25maWdba2V5XTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBjb25maWdba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSxcbiAgZGVsZXRlOiBmdW5jdGlvbihrZXkpIHtcbiAgICBjb25maWdba2V5XSA9IHVuZGVmaW5lZDtcbiAgfVxufTsiLCJ2YXIgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcbnZhciBheGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcbnZhciB0b2tlbiA9IHJlcXVpcmUoJy4vdG9rZW4nKTtcbnZhciByZXF1ZXN0ID0gcmVxdWlyZSgnLi9yZXF1ZXN0Jyk7XG52YXIgcmVzcG9uc2UgPSByZXF1aXJlKCcuL3Jlc3BvbnNlJyk7XG5cbnZhciBwYXRoID0gJy92MS9mZWVkYmFjayc7XG5cbm1vZHVsZS5leHBvcnRzLmNyZWF0ZSA9IGZ1bmN0aW9uKGltYWdlVXJsLCBfb3B0aW9ucykge1xuICB2YXIgb3B0aW9ucyA9IF9vcHRpb25zIHx8IHt9O1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdG9rZW4uZ2V0KCkudGhlbihcbiAgICAgIGZ1bmN0aW9uKHRva2VuU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0KGltYWdlVXJsLCB0b2tlblN0cmluZywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgKS50aGVuKFxuICAgICAgZnVuY3Rpb24gKF9yZXNwb25zZSkge1xuICAgICAgICByZXNwb25zZS5oYW5kbGVWMShfcmVzcG9uc2UsIHJlc29sdmUsIHJlamVjdCk7IFxuICAgICAgfVxuICAgICkuY2F0Y2goXG4gICAgICBmdW5jdGlvbihlcnIpe1xuICAgICAgICByZXNwb25zZS5lcnJvclYxKGVyciwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3QoaW1hZ2VVcmwsIHRva2VuU3RyaW5nLCBvcHRpb25zKSB7XG4gIHZhciB1cmwgPSBjb25maWcuZ2V0KCdhcGlFbmRwb2ludCcpICsgcGF0aDtcbiAgdmFyIGRhdGEgPSByZXF1ZXN0LmdldEltYWdlVXJsUGFyYW1zKGltYWdlVXJsKTtcbiAgZGF0YSA9IHJlcXVlc3QuZmlsbE9wdGlvbmFsUGFyYW1zKGRhdGEsIG9wdGlvbnMpO1xuICByZXR1cm4gYXhpb3MucG9zdCh1cmwsIGRhdGEsIHtcbiAgICAnaGVhZGVycyc6IHJlcXVlc3QuZ2V0SGVhZGVycyh0b2tlblN0cmluZylcbiAgfSk7XG59OyIsInZhciBQcm9taXNlID0gcmVxdWlyZSgnZXM2LXByb21pc2UnKS5Qcm9taXNlO1xudmFyIGF4aW9zID0gcmVxdWlyZSgnYXhpb3MnKTtcbnZhciBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZycpO1xudmFyIHRva2VuID0gcmVxdWlyZSgnLi90b2tlbicpO1xudmFyIHJlcXVlc3QgPSByZXF1aXJlKCcuL3JlcXVlc3QnKTtcbnZhciByZXNwb25zZSA9IHJlcXVpcmUoJy4vcmVzcG9uc2UnKTtcblxudmFyIHBhdGggPSAnL3YxL2luZm8nO1xuXG5tb2R1bGUuZXhwb3J0cy5nZXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGV4ZWN1dG9yKTtcbn07XG5cbmZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICB0b2tlbi5nZXQoKS50aGVuKFxuICAgIGZ1bmN0aW9uKHRva2VuU3RyaW5nKSB7XG4gICAgICByZXR1cm4gZ2V0UmVxdWVzdCh0b2tlblN0cmluZyk7XG4gICAgfVxuICApLnRoZW4oXG4gICAgZnVuY3Rpb24gKF9yZXNwb25zZSkge1xuICAgICAgcmVzcG9uc2UuaGFuZGxlVjEoX3Jlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpOyBcbiAgICB9XG4gICkuY2F0Y2goXG4gICAgZnVuY3Rpb24oZXJyKXtcbiAgICAgIHJlc3BvbnNlLmVycm9yVjEoZXJyLCByZWplY3QpO1xuICAgIH1cbiAgKTtcbn07IFxuXG5mdW5jdGlvbiBnZXRSZXF1ZXN0KHRva2VuU3RyaW5nKSB7XG4gIHZhciB1cmwgPSBjb25maWcuZ2V0KCdhcGlFbmRwb2ludCcpICsgcGF0aDtcbiAgcmV0dXJuIGF4aW9zLmdldCh1cmwsIHtcbiAgICAnaGVhZGVycyc6IHJlcXVlc3QuZ2V0SGVhZGVycyh0b2tlblN0cmluZyksXG4gIH0pO1xufTsiLCJ2YXIgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcbnZhciBheGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcbnZhciB0b2tlbiA9IHJlcXVpcmUoJy4vdG9rZW4nKTtcbnZhciByZXF1ZXN0ID0gcmVxdWlyZSgnLi9yZXF1ZXN0Jyk7XG52YXIgcmVzcG9uc2UgPSByZXF1aXJlKCcuL3Jlc3BvbnNlJyk7XG5cbnZhciBwYXRoID0gJy92MS9pbmZvL2xhbmd1YWdlcyc7XG5cbm1vZHVsZS5leHBvcnRzLmdldCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZXhlY3V0b3IpO1xufTtcblxuZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHRva2VuLmdldCgpLnRoZW4oXG4gICAgZnVuY3Rpb24odG9rZW5TdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRSZXF1ZXN0KHRva2VuU3RyaW5nKTtcbiAgICB9XG4gICkudGhlbihcbiAgICBmdW5jdGlvbiAoX3Jlc3BvbnNlKSB7XG4gICAgICByZXNwb25zZS5oYW5kbGVWMShfcmVzcG9uc2UsIHJlc29sdmUsIHJlamVjdCk7IFxuICAgIH1cbiAgKS5jYXRjaChcbiAgICBmdW5jdGlvbihlcnIpe1xuICAgICAgcmVzcG9uc2UuZXJyb3JWMShlcnIsIHJlamVjdCk7XG4gICAgfVxuICApO1xufTtcblxuZnVuY3Rpb24gZ2V0UmVxdWVzdCh0b2tlblN0cmluZykge1xuICB2YXIgdXJsID0gY29uZmlnLmdldCgnYXBpRW5kcG9pbnQnKSArIHBhdGg7XG4gIHJldHVybiBheGlvcy5nZXQodXJsLCB7XG4gICAgJ2hlYWRlcnMnOiByZXF1ZXN0LmdldEhlYWRlcnModG9rZW5TdHJpbmcpLFxuICB9KTtcbn07IiwiLy8gdXRpbHMgZm9yIGhlbHBpbmcgd2l0aCB0aGUgcmVxdWVzdFxuXG5tb2R1bGUuZXhwb3J0cy50cmFuc2Zvcm1EYXRhVG9QYXJhbXMgPSBmdW5jdGlvbihkYXRhKSB7XG4gIHZhciBzdHIgPSBbXTtcbiAgZm9yICggdmFyIHAgaW4gZGF0YSApIHtcbiAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwKSAmJiBkYXRhW3BdKSB7XG4gICAgICBpZiAodHlwZW9mIGRhdGFbcF0gPT09ICdzdHJpbmcnKXtcbiAgICAgICAgc3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHApICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGRhdGFbcF0pKTtcbiAgICAgIH07XG4gICAgICBpZiAodHlwZW9mIGRhdGFbcF0gPT09ICdvYmplY3QnKXtcbiAgICAgICAgZm9yICggdmFyIGkgaW4gZGF0YVtwXSApIHtcbiAgICAgICAgICBzdHIucHVzaChlbmNvZGVVUklDb21wb25lbnQocCkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoZGF0YVtwXVtpXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHIuam9pbignJicpO1xufTtcblxubW9kdWxlLmV4cG9ydHMuZ2V0SGVhZGVycyA9IGZ1bmN0aW9uKHRva2VuU3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgJ0F1dGhvcml6YXRpb24nOiAnQmVhcmVyICcgKyB0b2tlblN0cmluZ1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMuZ2V0SW1hZ2VVcmxQYXJhbXMgPSBmdW5jdGlvbihpbWFnZVVybCkge1xuICB2YXIgZGF0YSA9IHt9O1xuICBpZiAoIHR5cGVvZiBpbWFnZVVybCA9PT0gJ3N0cmluZycgKSB7XG4gICAgZGF0YS51cmwgPSBbaW1hZ2VVcmxdO1xuICB9O1xuICBpZiAoIHR5cGVvZiBpbWFnZVVybCA9PT0gJ29iamVjdCcgKSB7XG4gICAgZGF0YS51cmwgPSBpbWFnZVVybDtcbiAgfTtcbiAgcmV0dXJuIGRhdGE7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5maWxsT3B0aW9uYWxQYXJhbXMgPSBmdW5jdGlvbihkYXRhLCBvcHRpb25hbFBhcmFtcykge1xuICBmb3IgKCB2YXIgaSBpbiBvcHRpb25hbFBhcmFtcyApIHtcbiAgICB2YXIgaiA9IGkucmVwbGFjZSgvKFtBLVpdKS9nLCAnXyQxJykucmVwbGFjZSgvXl8vLCcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBwYXJhbXMgPSBvcHRpb25hbFBhcmFtc1tpXTtcbiAgICBpZiAoIHR5cGVvZiBwYXJhbXMgPT09ICdvYmplY3QnICYmIHBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbXMgPSBvcHRpb25hbFBhcmFtc1tpXS5qb2luKCcsJyk7XG4gICAgfVxuICAgIGRhdGFbal0gPSBwYXJhbXM7XG4gIH07XG4gIHJldHVybiBkYXRhO1xufTtcblxubW9kdWxlLmV4cG9ydHMuZmlsbE9wdGlvbmFsRGF0YSA9IGZ1bmN0aW9uKGRhdGEsIG9wdGlvbmFsRGF0YSkge1xuICBmb3IgKCB2YXIgaSBpbiBvcHRpb25hbERhdGEgKSB7XG4gICAgdmFyIGogPSBpLnJlcGxhY2UoLyhbQS1aXSkvZywgJ18kMScpLnJlcGxhY2UoL15fLywnJykudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcGFyYW1zID0gb3B0aW9uYWxEYXRhW2ldO1xuICAgIGRhdGFbal0gPSBwYXJhbXM7XG4gIH07XG4gIHJldHVybiBkYXRhO1xufTsiLCIvLyB1dGlscyBmb3IgaGVscGluZyB3aXRoIHRoZSByZXNwb25zZVxuXG5tb2R1bGUuZXhwb3J0cy5oYW5kbGVWMSA9IGZ1bmN0aW9uKHJlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpIHtcbiAgaWYgKCByZXNwb25zZS5zdGF0dXMgPT09IDIwMCB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwMSApIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChyZXNwb25zZS5kYXRhKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZXJyb3JWMSA9IGZ1bmN0aW9uKGVyciwgcmVqZWN0KSB7XG4gIGlmICggZXJyLmRhdGEgKSB7XG4gICAgcmVqZWN0KGVyci5kYXRhKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QoZXJyKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuaGFuZGxlVjIgPSBmdW5jdGlvbihyZXNwb25zZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIGlmICggcmVzcG9uc2Uuc3RhdHVzID09PSAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDEgKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QocmVzcG9uc2UuZGF0YSk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmVycm9yVjIgPSBmdW5jdGlvbihlcnIsIHJlamVjdCkge1xuICBpZiAoIGVyci5kYXRhICkge1xuICAgIHJlamVjdChlcnIuZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KGVycik7XG4gIH1cbn07XG4iLCJ2YXIgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcbnZhciBheGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcbnZhciB0b2tlbiA9IHJlcXVpcmUoJy4vdG9rZW4nKTtcbnZhciByZXF1ZXN0ID0gcmVxdWlyZSgnLi9yZXF1ZXN0Jyk7XG52YXIgcmVzcG9uc2UgPSByZXF1aXJlKCcuL3Jlc3BvbnNlJyk7XG5cbnZhciBwYXRoID0gJy92MS90YWcnO1xuXG5tb2R1bGUuZXhwb3J0cy5nZXRCeVVybCA9IGZ1bmN0aW9uKGltYWdlVXJsLCBfb3B0aW9ucykge1xuICB2YXIgb3B0aW9ucyA9IF9vcHRpb25zIHx8IHt9O1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdG9rZW4uZ2V0KCkudGhlbihcbiAgICAgIGZ1bmN0aW9uKHRva2VuU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBnZXRSZXF1ZXN0KGltYWdlVXJsLCB0b2tlblN0cmluZywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgKS50aGVuKFxuICAgICAgZnVuY3Rpb24gKF9yZXNwb25zZSkge1xuICAgICAgICByZXNwb25zZS5oYW5kbGVWMShfcmVzcG9uc2UsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9XG4gICAgKS5jYXRjaChcbiAgICAgIGZ1bmN0aW9uKGVycil7XG4gICAgICAgIHJlc3BvbnNlLmVycm9yVjEoZXJyLCByZWplY3QpO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMuZ2V0QnlJbWFnZUJ5dGVzID0gZnVuY3Rpb24oaW1hZ2VCeXRlcywgX29wdGlvbnMpIHtcbiAgdmFyIG9wdGlvbnMgPSBfb3B0aW9ucyB8fCB7fTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHRva2VuLmdldCgpLnRoZW4oXG4gICAgICBmdW5jdGlvbih0b2tlblN0cmluZykge1xuICAgICAgICByZXR1cm4gcG9zdFJlcXVlc3QoaW1hZ2VCeXRlcywgdG9rZW5TdHJpbmcsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICkudGhlbihcbiAgICAgIGZ1bmN0aW9uIChfcmVzcG9uc2UpIHtcbiAgICAgICAgcmVzcG9uc2UuaGFuZGxlVjEoX3Jlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfVxuICAgICkuY2F0Y2goXG4gICAgICBmdW5jdGlvbihlcnIpe1xuICAgICAgICByZXNwb25zZS5lcnJvclYxKGVyciwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGdldFJlcXVlc3QoaW1hZ2VVcmwsIHRva2VuU3RyaW5nLCBvcHRpb25zKSB7XG4gIHZhciB1cmwgPSBjb25maWcuZ2V0KCdhcGlFbmRwb2ludCcpICsgcGF0aDtcbiAgdmFyIGRhdGEgPSByZXF1ZXN0LmdldEltYWdlVXJsUGFyYW1zKGltYWdlVXJsKTtcbiAgZGF0YSA9IHJlcXVlc3QuZmlsbE9wdGlvbmFsUGFyYW1zKGRhdGEsIG9wdGlvbnMpO1xuICByZXR1cm4gYXhpb3MucG9zdCh1cmwsIGRhdGEsIHtcbiAgICAnaGVhZGVycyc6IHJlcXVlc3QuZ2V0SGVhZGVycyh0b2tlblN0cmluZylcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBwb3N0UmVxdWVzdChpbWFnZUJ5dGVzLCB0b2tlblN0cmluZywgb3B0aW9ucykge1xuICB2YXIgdXJsID0gY29uZmlnLmdldCgnYXBpRW5kcG9pbnQnKSArIHBhdGg7XG4gIHZhciBkYXRhID0geydlbmNvZGVkX2ltYWdlJzogaW1hZ2VCeXRlc307XG4gIGRhdGEgPSByZXF1ZXN0LmZpbGxPcHRpb25hbFBhcmFtcyhkYXRhLCBvcHRpb25zKTtcbiAgcmV0dXJuIGF4aW9zLnBvc3QodXJsLCBkYXRhLCB7XG4gICAgJ2hlYWRlcnMnOiByZXF1ZXN0LmdldEhlYWRlcnModG9rZW5TdHJpbmcpLFxuICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICB9KTtcbn07XG4iLCJ2YXIgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcbnZhciBheGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcbnZhciByZXF1ZXN0ID0gcmVxdWlyZSgnLi9yZXF1ZXN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzLmdldCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZXhlY3V0b3IpO1xufTtcblxubW9kdWxlLmV4cG9ydHMuc2V0ID0gZnVuY3Rpb24oX3Rva2VuKSB7XG4gIHZhciB0b2tlbiA9IF90b2tlbjtcbiAgaWYgKHR5cGVvZiBfdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgdG9rZW4gPSB7XG4gICAgICAnYWNjZXNzX3Rva2VuJzogX3Rva2VuLFxuICAgICAgJ2V4cGlyZXNfaW4nOiAxNzY0MDBcbiAgICB9O1xuICB9XG4gIGlmICh0b2tlbi5hY2Nlc3NfdG9rZW4gJiYgdG9rZW4uZXhwaXJlc19pbikge1xuICAgIHNldEV4cGlyZVRpbWUodG9rZW4pO1xuICAgIGNvbmZpZy5zZXQoJ3Rva2VuJywgdG9rZW4pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmRlbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICBjb25maWcuZGVsZXRlKCd0b2tlbicpO1xufTtcblxuZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgdmFyIHRva2VuRnJvbUNvbmZpZyA9IGNvbmZpZy5nZXQoJ3Rva2VuJyk7XG4gIGlmICggdG9rZW5Gcm9tQ29uZmlnICE9PSB1bmRlZmluZWQgJiYgIHRva2VuRnJvbUNvbmZpZy5leHBpcmVUaW1lID4gbm93ICkge1xuICAgIHJlc29sdmUodG9rZW5Gcm9tQ29uZmlnLmFjY2Vzc190b2tlbik7XG4gIH0gZWxzZSB7XG4gICAgZ2V0UmVxdWVzdCgpLnRoZW4oXG4gICAgICBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICBpZiAoIHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwICkge1xuICAgICAgICAgIHZhciB0b2tlbiA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgc2V0RXhwaXJlVGltZSh0b2tlbik7XG4gICAgICAgICAgY29uZmlnLnNldCgndG9rZW4nLCB0b2tlbik7XG4gICAgICAgICAgcmVzb2x2ZSh0b2tlbi5hY2Nlc3NfdG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZWplY3RcbiAgICApO1xuICB9XG59O1xuXG5mdW5jdGlvbiBzZXRFeHBpcmVUaW1lKHRva2VuKSB7XG4gIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgdG9rZW4uZXhwaXJlVGltZSA9IG5vdyArICh0b2tlbi5leHBpcmVzX2luICogMTAwMCk7XG59XG5cbmZ1bmN0aW9uIGdldFJlcXVlc3QoKSB7XG4gIHZhciB1cmwgPSBjb25maWcuZ2V0KCdhcGlFbmRwb2ludCcpICsgJy92MS90b2tlbic7XG4gIHZhciBkYXRhID0gZ2V0RGF0YSgpO1xuICByZXR1cm4gYXhpb3MucG9zdCh1cmwsIGRhdGEsIHtcbiAgICAndHJhbnNmb3JtUmVxdWVzdCc6IFtcbiAgICAgIGZ1bmN0aW9uKCkgeyBcbiAgICAgICAgcmV0dXJuIHJlcXVlc3QudHJhbnNmb3JtRGF0YVRvUGFyYW1zKGRhdGEpOyBcbiAgICAgIH1cbiAgICBdXG4gIH0pO1xufTtcblxuZnVuY3Rpb24gZ2V0RGF0YSgpIHtcbiAgdmFyIGNsaWVudElkID0gY29uZmlnLmdldCgnY2xpZW50SWQnKTtcbiAgdmFyIGNsaWVudFNlY3JldCA9IGNvbmZpZy5nZXQoJ2NsaWVudFNlY3JldCcpO1xuICByZXR1cm4ge1xuICAgICdncmFudF90eXBlJzogJ2NsaWVudF9jcmVkZW50aWFscycsXG4gICAgJ2NsaWVudF9pZCc6IGNsaWVudElkLFxuICAgICdjbGllbnRfc2VjcmV0JzogY2xpZW50U2VjcmV0XG4gIH07XG59O1xuXG4vLyB0b2RvIChkaykgYWRkIHJldHJ5IGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3JldHJ5IiwidmFyIFByb21pc2UgPSByZXF1aXJlKCdlczYtcHJvbWlzZScpLlByb21pc2U7XG52YXIgYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xudmFyIGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnJyk7XG52YXIgdG9rZW4gPSByZXF1aXJlKCcuL3Rva2VuJyk7XG52YXIgcmVxdWVzdCA9IHJlcXVpcmUoJy4vcmVxdWVzdCcpO1xudmFyIHJlc3BvbnNlID0gcmVxdWlyZSgnLi9yZXNwb25zZScpO1xuXG52YXIgcGF0aCA9ICcvdjEvdXNhZ2UnO1xuXG5tb2R1bGUuZXhwb3J0cy5nZXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGV4ZWN1dG9yKTtcbn07XG5cbmZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICB0b2tlbi5nZXQoKS50aGVuKFxuICAgIGZ1bmN0aW9uKHRva2VuU3RyaW5nKSB7XG4gICAgICByZXR1cm4gZ2V0UmVxdWVzdCh0b2tlblN0cmluZyk7XG4gICAgfVxuICApLnRoZW4oXG4gICAgZnVuY3Rpb24gKF9yZXNwb25zZSkge1xuICAgICAgcmVzcG9uc2UuaGFuZGxlVjEoX3Jlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpOyBcbiAgICB9XG4gICkuY2F0Y2goXG4gICAgZnVuY3Rpb24oZXJyKXtcbiAgICAgIHJlc3BvbnNlLmVycm9yVjEoZXJyLCByZWplY3QpO1xuICAgIH1cbiAgKTtcbn07IFxuXG5mdW5jdGlvbiBnZXRSZXF1ZXN0KHRva2VuU3RyaW5nKSB7XG4gIHZhciB1cmwgPSBjb25maWcuZ2V0KCdhcGlFbmRwb2ludCcpICsgcGF0aDtcbiAgcmV0dXJuIGF4aW9zLmdldCh1cmwsIHtcbiAgICAnaGVhZGVycyc6IHJlcXVlc3QuZ2V0SGVhZGVycyh0b2tlblN0cmluZyksXG4gIH0pO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2F4aW9zJyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvYnVpbGRVUkwnKTtcbnZhciBwYXJzZUhlYWRlcnMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvcGFyc2VIZWFkZXJzJyk7XG52YXIgdHJhbnNmb3JtRGF0YSA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy90cmFuc2Zvcm1EYXRhJyk7XG52YXIgaXNVUkxTYW1lT3JpZ2luID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbicpO1xudmFyIGJ0b2EgPSB3aW5kb3cuYnRvYSB8fCByZXF1aXJlKCcuLy4uL2hlbHBlcnMvYnRvYScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHhockFkYXB0ZXIocmVzb2x2ZSwgcmVqZWN0LCBjb25maWcpIHtcbiAgdmFyIHJlcXVlc3REYXRhID0gY29uZmlnLmRhdGE7XG4gIHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuXG4gIGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSkge1xuICAgIGRlbGV0ZSByZXF1ZXN0SGVhZGVyc1snQ29udGVudC1UeXBlJ107IC8vIExldCB0aGUgYnJvd3NlciBzZXQgaXRcbiAgfVxuXG4gIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgLy8gRm9yIElFIDgvOSBDT1JTIHN1cHBvcnRcbiAgLy8gT25seSBzdXBwb3J0cyBQT1NUIGFuZCBHRVQgY2FsbHMgYW5kIGRvZXNuJ3QgcmV0dXJucyB0aGUgcmVzcG9uc2UgaGVhZGVycy5cbiAgaWYgKHdpbmRvdy5YRG9tYWluUmVxdWVzdCAmJiAhKCd3aXRoQ3JlZGVudGlhbHMnIGluIHJlcXVlc3QpICYmICFpc1VSTFNhbWVPcmlnaW4oY29uZmlnLnVybCkpIHtcbiAgICByZXF1ZXN0ID0gbmV3IHdpbmRvdy5YRG9tYWluUmVxdWVzdCgpO1xuICB9XG5cbiAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICB2YXIgdXNlcm5hbWUgPSBjb25maWcuYXV0aC51c2VybmFtZSB8fCAnJztcbiAgICB2YXIgcGFzc3dvcmQgPSBjb25maWcuYXV0aC5wYXNzd29yZCB8fCAnJztcbiAgICByZXF1ZXN0SGVhZGVycy5BdXRob3JpemF0aW9uID0gJ0Jhc2ljICcgKyBidG9hKHVzZXJuYW1lICsgJzonICsgcGFzc3dvcmQpO1xuICB9XG5cbiAgcmVxdWVzdC5vcGVuKGNvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgYnVpbGRVUkwoY29uZmlnLnVybCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLCB0cnVlKTtcblxuICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuICByZXF1ZXN0LnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcblxuICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlXG4gIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCA/IHBhcnNlSGVhZGVycyhyZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSA6IG51bGw7XG4gICAgdmFyIHJlc3BvbnNlRGF0YSA9IFsndGV4dCcsICcnXS5pbmRleE9mKGNvbmZpZy5yZXNwb25zZVR5cGUgfHwgJycpICE9PSAtMSA/IHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICB2YXIgcmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiB0cmFuc2Zvcm1EYXRhKFxuICAgICAgICByZXNwb25zZURhdGEsXG4gICAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICApLFxuICAgICAgLy8gSUUgc2VuZHMgMTIyMyBpbnN0ZWFkIG9mIDIwNCAoaHR0cHM6Ly9naXRodWIuY29tL216YWJyaXNraWUvYXhpb3MvaXNzdWVzLzIwMSlcbiAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzID09PSAxMjIzID8gJ05vIENvbnRlbnQnIDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgY29uZmlnOiBjb25maWdcbiAgICB9O1xuXG4gICAgLy8gUmVzb2x2ZSBvciByZWplY3QgdGhlIFByb21pc2UgYmFzZWQgb24gdGhlIHN0YXR1c1xuICAgICgocmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCAzMDApIHx8XG4gICAgICghKCdzdGF0dXMnIGluIHJlcXVlc3QpICYmIHJlc3BvbnNlLnJlc3BvbnNlVGV4dCkgP1xuICAgICAgcmVzb2x2ZSA6XG4gICAgICByZWplY3QpKHJlc3BvbnNlKTtcblxuICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICByZXF1ZXN0ID0gbnVsbDtcbiAgfTtcblxuICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgIHJlamVjdChuZXcgRXJyb3IoJ05ldHdvcmsgRXJyb3InKSk7XG5cbiAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgcmVxdWVzdCA9IG51bGw7XG4gIH07XG5cbiAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gIC8vIFRoaXMgaXMgb25seSBkb25lIGlmIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50LlxuICAvLyBTcGVjaWZpY2FsbHkgbm90IGlmIHdlJ3JlIGluIGEgd2ViIHdvcmtlciwgb3IgcmVhY3QtbmF0aXZlLlxuICBpZiAodXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSkge1xuICAgIHZhciBjb29raWVzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2Nvb2tpZXMnKTtcblxuICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgIHZhciB4c3JmVmFsdWUgPSBjb25maWcud2l0aENyZWRlbnRpYWxzIHx8IGlzVVJMU2FtZU9yaWdpbihjb25maWcudXJsKSA/XG4gICAgICAgIGNvb2tpZXMucmVhZChjb25maWcueHNyZkNvb2tpZU5hbWUpIDpcbiAgICAgICAgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbY29uZmlnLnhzcmZIZWFkZXJOYW1lXSA9IHhzcmZWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICBpZiAodHlwZW9mIHJlcXVlc3REYXRhID09PSAndW5kZWZpbmVkJyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgLy8gUmVtb3ZlIENvbnRlbnQtVHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBhZGQgaGVhZGVyIHRvIHRoZSByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gIGlmIChjb25maWcud2l0aENyZWRlbnRpYWxzKSB7XG4gICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICB9XG5cbiAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICBpZiAoY29uZmlnLnJlc3BvbnNlVHlwZSkge1xuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IGNvbmZpZy5yZXNwb25zZVR5cGU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHJlcXVlc3QucmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcihyZXF1ZXN0RGF0YSkpIHtcbiAgICByZXF1ZXN0RGF0YSA9IG5ldyBEYXRhVmlldyhyZXF1ZXN0RGF0YSk7XG4gIH1cblxuICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZGlzcGF0Y2hSZXF1ZXN0ID0gcmVxdWlyZSgnLi9jb3JlL2Rpc3BhdGNoUmVxdWVzdCcpO1xudmFyIEludGVyY2VwdG9yTWFuYWdlciA9IHJlcXVpcmUoJy4vY29yZS9JbnRlcmNlcHRvck1hbmFnZXInKTtcbnZhciBpc0Fic29sdXRlVVJMID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwnKTtcbnZhciBjb21iaW5lVVJMcyA9IHJlcXVpcmUoJy4vaGVscGVycy9jb21iaW5lVVJMcycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvYmluZCcpO1xudmFyIHRyYW5zZm9ybURhdGEgPSByZXF1aXJlKCcuL2hlbHBlcnMvdHJhbnNmb3JtRGF0YScpO1xuXG5mdW5jdGlvbiBBeGlvcyhkZWZhdWx0Q29uZmlnKSB7XG4gIHRoaXMuZGVmYXVsdHMgPSB1dGlscy5tZXJnZSh7fSwgZGVmYXVsdENvbmZpZyk7XG4gIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gIH07XG59XG5cbkF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gcmVxdWVzdChjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnID0gdXRpbHMubWVyZ2Uoe1xuICAgICAgdXJsOiBhcmd1bWVudHNbMF1cbiAgICB9LCBhcmd1bWVudHNbMV0pO1xuICB9XG5cbiAgY29uZmlnID0gdXRpbHMubWVyZ2UoZGVmYXVsdHMsIHRoaXMuZGVmYXVsdHMsIHsgbWV0aG9kOiAnZ2V0JyB9LCBjb25maWcpO1xuXG4gIC8vIFN1cHBvcnQgYmFzZVVSTCBjb25maWdcbiAgaWYgKGNvbmZpZy5iYXNlVVJMICYmICFpc0Fic29sdXRlVVJMKGNvbmZpZy51cmwpKSB7XG4gICAgY29uZmlnLnVybCA9IGNvbWJpbmVVUkxzKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgfVxuXG4gIC8vIERvbid0IGFsbG93IG92ZXJyaWRpbmcgZGVmYXVsdHMud2l0aENyZWRlbnRpYWxzXG4gIGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgPSBjb25maWcud2l0aENyZWRlbnRpYWxzIHx8IHRoaXMuZGVmYXVsdHMud2l0aENyZWRlbnRpYWxzO1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgIGNvbmZpZy5kYXRhLFxuICAgIGNvbmZpZy5oZWFkZXJzLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gIGNvbmZpZy5oZWFkZXJzID0gdXRpbHMubWVyZ2UoXG4gICAgY29uZmlnLmhlYWRlcnMuY29tbW9uIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzW2NvbmZpZy5tZXRob2RdIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzIHx8IHt9XG4gICk7XG5cbiAgdXRpbHMuZm9yRWFjaChcbiAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICBmdW5jdGlvbiBjbGVhbkhlYWRlckNvbmZpZyhtZXRob2QpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuaGVhZGVyc1ttZXRob2RdO1xuICAgIH1cbiAgKTtcblxuICAvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG4gIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxudmFyIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBBeGlvcyhkZWZhdWx0cyk7XG52YXIgYXhpb3MgPSBtb2R1bGUuZXhwb3J0cyA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGRlZmF1bHRJbnN0YW5jZSk7XG5cbmF4aW9zLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShkZWZhdWx0Q29uZmlnKSB7XG4gIHJldHVybiBuZXcgQXhpb3MoZGVmYXVsdENvbmZpZyk7XG59O1xuXG4vLyBFeHBvc2UgZGVmYXVsdHNcbmF4aW9zLmRlZmF1bHRzID0gZGVmYXVsdEluc3RhbmNlLmRlZmF1bHRzO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuYXhpb3Muc3ByZWFkID0gcmVxdWlyZSgnLi9oZWxwZXJzL3NwcmVhZCcpO1xuXG4vLyBFeHBvc2UgaW50ZXJjZXB0b3JzXG5heGlvcy5pbnRlcmNlcHRvcnMgPSBkZWZhdWx0SW5zdGFuY2UuaW50ZXJjZXB0b3JzO1xuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXRpbHMubWVyZ2UoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsXG4gICAgfSkpO1xuICB9O1xuICBheGlvc1ttZXRob2RdID0gYmluZChBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSwgZGVmYXVsdEluc3RhbmNlKTtcbn0pO1xuXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCh1dGlscy5tZXJnZShjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgdXJsOiB1cmwsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSkpO1xuICB9O1xuICBheGlvc1ttZXRob2RdID0gYmluZChBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSwgZGVmYXVsdEluc3RhbmNlKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIEludGVyY2VwdG9yTWFuYWdlcigpIHtcbiAgdGhpcy5oYW5kbGVycyA9IFtdO1xufVxuXG4vKipcbiAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICpcbiAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCkge1xuICB0aGlzLmhhbmRsZXJzLnB1c2goe1xuICAgIGZ1bGZpbGxlZDogZnVsZmlsbGVkLFxuICAgIHJlamVjdGVkOiByZWplY3RlZFxuICB9KTtcbiAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmVqZWN0ID0gZnVuY3Rpb24gZWplY3QoaWQpIHtcbiAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gKlxuICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZm4pIHtcbiAgdXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgIGZuKGgpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVyY2VwdG9yTWFuYWdlcjtcbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgd2hpY2hldmVyIGFkYXB0ZXJcbiAqIGlzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHRyeSB7XG4gICAgICB2YXIgYWRhcHRlcjtcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuYWRhcHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGb3IgY3VzdG9tIGFkYXB0ZXIgc3VwcG9ydFxuICAgICAgICBhZGFwdGVyID0gY29uZmlnLmFkYXB0ZXI7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gRm9yIGJyb3dzZXJzIHVzZSBYSFIgYWRhcHRlclxuICAgICAgICBhZGFwdGVyID0gcmVxdWlyZSgnLi4vYWRhcHRlcnMveGhyJyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBGb3Igbm9kZSB1c2UgSFRUUCBhZGFwdGVyXG4gICAgICAgIGFkYXB0ZXIgPSByZXF1aXJlKCcuLi9hZGFwdGVycy9odHRwJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgYWRhcHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhZGFwdGVyKHJlc29sdmUsIHJlamVjdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QoZSk7XG4gICAgfVxuICB9KTtcbn07XG5cblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5aGVHbHZjeTlzYVdJdlkyOXlaUzlrYVhOd1lYUmphRkpsY1hWbGMzUXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaWQxYzJVZ2MzUnlhV04wSnp0Y2JseHVMeW9xWEc0Z0tpQkVhWE53WVhSamFDQmhJSEpsY1hWbGMzUWdkRzhnZEdobElITmxjblpsY2lCMWMybHVaeUIzYUdsamFHVjJaWElnWVdSaGNIUmxjbHh1SUNvZ2FYTWdjM1Z3Y0c5eWRHVmtJR0o1SUhSb1pTQmpkWEp5Wlc1MElHVnVkbWx5YjI1dFpXNTBMbHh1SUNwY2JpQXFJRUJ3WVhKaGJTQjdiMkpxWldOMGZTQmpiMjVtYVdjZ1ZHaGxJR052Ym1acFp5QjBhR0YwSUdseklIUnZJR0psSUhWelpXUWdabTl5SUhSb1pTQnlaWEYxWlhOMFhHNGdLaUJBY21WMGRYSnVjeUI3VUhKdmJXbHpaWDBnVkdobElGQnliMjFwYzJVZ2RHOGdZbVVnWm5Wc1ptbHNiR1ZrWEc0Z0tpOWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdablZ1WTNScGIyNGdaR2x6Y0dGMFkyaFNaWEYxWlhOMEtHTnZibVpwWnlrZ2UxeHVJQ0J5WlhSMWNtNGdibVYzSUZCeWIyMXBjMlVvWm5WdVkzUnBiMjRnWlhobFkzVjBiM0lvY21WemIyeDJaU3dnY21WcVpXTjBLU0I3WEc0Z0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUhaaGNpQmhaR0Z3ZEdWeU8xeHVYRzRnSUNBZ0lDQnBaaUFvZEhsd1pXOW1JR052Ym1acFp5NWhaR0Z3ZEdWeUlEMDlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRVp2Y2lCamRYTjBiMjBnWVdSaGNIUmxjaUJ6ZFhCd2IzSjBYRzRnSUNBZ0lDQWdJR0ZrWVhCMFpYSWdQU0JqYjI1bWFXY3VZV1JoY0hSbGNqdGNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9kSGx3Wlc5bUlGaE5URWgwZEhCU1pYRjFaWE4wSUNFOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJQ0FnSUNBdkx5QkdiM0lnWW5KdmQzTmxjbk1nZFhObElGaElVaUJoWkdGd2RHVnlYRzRnSUNBZ0lDQWdJR0ZrWVhCMFpYSWdQU0J5WlhGMWFYSmxLQ2N1TGk5aFpHRndkR1Z5Y3k5NGFISW5LVHRjYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvZEhsd1pXOW1JSEJ5YjJObGMzTWdJVDA5SUNkMWJtUmxabWx1WldRbktTQjdYRzRnSUNBZ0lDQWdJQzh2SUVadmNpQnViMlJsSUhWelpTQklWRlJRSUdGa1lYQjBaWEpjYmlBZ0lDQWdJQ0FnWVdSaGNIUmxjaUE5SUhKbGNYVnBjbVVvSnk0dUwyRmtZWEIwWlhKekwyaDBkSEFuS1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQmhaR0Z3ZEdWeUlEMDlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNBZ0lHRmtZWEIwWlhJb2NtVnpiMngyWlN3Z2NtVnFaV04wTENCamIyNW1hV2NwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDBnWTJGMFkyZ2dLR1VwSUh0Y2JpQWdJQ0FnSUhKbGFtVmpkQ2hsS1R0Y2JpQWdJQ0I5WEc0Z0lIMHBPMXh1ZlR0Y2JseHVJbDE5IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBQUk9URUNUSU9OX1BSRUZJWCA9IC9eXFwpXFxdXFx9Jyw/XFxuLztcbnZhciBERUZBVUxUX0NPTlRFTlRfVFlQRSA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlSlNPTihkYXRhLCBoZWFkZXJzKSB7XG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNPYmplY3QoZGF0YSkgJiYgIXV0aWxzLmlzRmlsZShkYXRhKSAmJiAhdXRpbHMuaXNCbG9iKGRhdGEpKSB7XG4gICAgICAvLyBTZXQgYXBwbGljYXRpb24vanNvbiBpZiBubyBDb250ZW50LVR5cGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnMpKSB7XG4gICAgICAgIHV0aWxzLmZvckVhY2goaGVhZGVycywgZnVuY3Rpb24gcHJvY2Vzc0NvbnRlbnRUeXBlSGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodXRpbHMuaXNVbmRlZmluZWQoaGVhZGVyc1snQ29udGVudC1UeXBlJ10pKSB7XG4gICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZUpTT04oZGF0YSkge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoUFJPVEVDVElPTl9QUkVGSVgsICcnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkgeyAvKiBJZ25vcmUgKi8gfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgaGVhZGVyczoge1xuICAgIGNvbW1vbjoge1xuICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonXG4gICAgfSxcbiAgICBwYXRjaDogdXRpbHMubWVyZ2UoREVGQVVMVF9DT05URU5UX1RZUEUpLFxuICAgIHBvc3Q6IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKSxcbiAgICBwdXQ6IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKVxuICB9LFxuXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBidG9hIHBvbHlmaWxsIGZvciBJRTwxMCBjb3VydGVzeSBodHRwczovL2dpdGh1Yi5jb20vZGF2aWRjaGFtYmVycy9CYXNlNjQuanNcblxudmFyIGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89JztcblxuZnVuY3Rpb24gSW52YWxpZENoYXJhY3RlckVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbn1cbkludmFsaWRDaGFyYWN0ZXJFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3I7XG5JbnZhbGlkQ2hhcmFjdGVyRXJyb3IucHJvdG90eXBlLmNvZGUgPSA1O1xuSW52YWxpZENoYXJhY3RlckVycm9yLnByb3RvdHlwZS5uYW1lID0gJ0ludmFsaWRDaGFyYWN0ZXJFcnJvcic7XG5cbmZ1bmN0aW9uIGJ0b2EoaW5wdXQpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyhpbnB1dCk7XG4gIHZhciBvdXRwdXQgPSAnJztcbiAgZm9yIChcbiAgICAvLyBpbml0aWFsaXplIHJlc3VsdCBhbmQgY291bnRlclxuICAgIHZhciBibG9jaywgY2hhckNvZGUsIGlkeCA9IDAsIG1hcCA9IGNoYXJzO1xuICAgIC8vIGlmIHRoZSBuZXh0IHN0ciBpbmRleCBkb2VzIG5vdCBleGlzdDpcbiAgICAvLyAgIGNoYW5nZSB0aGUgbWFwcGluZyB0YWJsZSB0byBcIj1cIlxuICAgIC8vICAgY2hlY2sgaWYgZCBoYXMgbm8gZnJhY3Rpb25hbCBkaWdpdHNcbiAgICBzdHIuY2hhckF0KGlkeCB8IDApIHx8IChtYXAgPSAnPScsIGlkeCAlIDEpO1xuICAgIC8vIFwiOCAtIGlkeCAlIDEgKiA4XCIgZ2VuZXJhdGVzIHRoZSBzZXF1ZW5jZSAyLCA0LCA2LCA4XG4gICAgb3V0cHV0ICs9IG1hcC5jaGFyQXQoNjMgJiBibG9jayA+PiA4IC0gaWR4ICUgMSAqIDgpXG4gICkge1xuICAgIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaWR4ICs9IDMgLyA0KTtcbiAgICBpZiAoY2hhckNvZGUgPiAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENoYXJhY3RlckVycm9yKCdJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IERPTSBFeGNlcHRpb24gNScpO1xuICAgIH1cbiAgICBibG9jayA9IGJsb2NrIDw8IDggfCBjaGFyQ29kZTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ0b2E7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkuXG4gICAgcmVwbGFjZSgvJTQwL2dpLCAnQCcpLlxuICAgIHJlcGxhY2UoLyUzQS9naSwgJzonKS5cbiAgICByZXBsYWNlKC8lMjQvZywgJyQnKS5cbiAgICByZXBsYWNlKC8lMkMvZ2ksICcsJykuXG4gICAgcmVwbGFjZSgvJTIwL2csICcrJykuXG4gICAgcmVwbGFjZSgvJTVCL2dpLCAnWycpLlxuICAgIHJlcGxhY2UoLyU1RC9naSwgJ10nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHVybFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJ1aWxkVVJMKHVybCwgcGFyYW1zLCBwYXJhbXNTZXJpYWxpemVyKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICBpZiAoIXBhcmFtcykge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICB2YXIgc2VyaWFsaXplZFBhcmFtcztcbiAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIpIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gcGFyYW1zU2VyaWFsaXplcihwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuXG4gICAgdXRpbHMuZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWwsIGtleSkge1xuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh1dGlscy5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAga2V5ID0ga2V5ICsgJ1tdJztcbiAgICAgIH1cblxuICAgICAgaWYgKCF1dGlscy5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFsID0gW3ZhbF07XG4gICAgICB9XG5cbiAgICAgIHV0aWxzLmZvckVhY2godmFsLCBmdW5jdGlvbiBwYXJzZVZhbHVlKHYpIHtcbiAgICAgICAgaWYgKHV0aWxzLmlzRGF0ZSh2KSkge1xuICAgICAgICAgIHYgPSB2LnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodXRpbHMuaXNPYmplY3QodikpIHtcbiAgICAgICAgICB2ID0gSlNPTi5zdHJpbmdpZnkodik7XG4gICAgICAgIH1cbiAgICAgICAgcGFydHMucHVzaChlbmNvZGUoa2V5KSArICc9JyArIGVuY29kZSh2KSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJ0cy5qb2luKCcmJyk7XG4gIH1cblxuICBpZiAoc2VyaWFsaXplZFBhcmFtcykge1xuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59O1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gYmFzZVVSTC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIHJlbGF0aXZlVVJMLnJlcGxhY2UoL15cXC8rLywgJycpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgICAgdmFyIGNvb2tpZSA9IFtdO1xuICAgICAgICBjb29raWUucHVzaChuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpKSB7XG4gICAgICAgICAgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKHBhdGgpKSB7XG4gICAgICAgICAgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKGRvbWFpbikpIHtcbiAgICAgICAgICBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlY3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgICAgfSxcblxuICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZChuYW1lKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgICB9LFxuXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShuYW1lKSB7XG4gICAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIHJldHVybiB7XG4gICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUoKSB7fSxcbiAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH0pKClcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZFxcK1xcLVxcLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG4gIC8vIHdoZXRoZXIgdGhlIHJlcXVlc3QgVVJMIGlzIG9mIHRoZSBzYW1lIG9yaWdpbiBhcyBjdXJyZW50IGxvY2F0aW9uLlxuICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIHZhciBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICB2YXIgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgdmFyIG9yaWdpblVSTDtcblxuICAgIC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXQncyBjb21wb25lbnRzXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHBhcnNlZFxuICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc29sdmVVUkwodXJsKSB7XG4gICAgICB2YXIgaHJlZiA9IHVybDtcblxuICAgICAgaWYgKG1zaWUpIHtcbiAgICAgICAgLy8gSUUgbmVlZHMgYXR0cmlidXRlIHNldCB0d2ljZSB0byBub3JtYWxpemUgcHJvcGVydGllc1xuICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgICAgICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG4gICAgICB9XG5cbiAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuXG4gICAgICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gICAgICByZXR1cm4ge1xuICAgICAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLFxuICAgICAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuICAgICAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LFxuICAgICAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpIDogJycsXG4gICAgICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG4gICAgICAgIGhvc3RuYW1lOiB1cmxQYXJzaW5nTm9kZS5ob3N0bmFtZSxcbiAgICAgICAgcG9ydDogdXJsUGFyc2luZ05vZGUucG9ydCxcbiAgICAgICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgP1xuICAgICAgICAgICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgb3JpZ2luVVJMID0gcmVzb2x2ZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICAvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcbiAgICAgIHZhciBwYXJzZWQgPSAodXRpbHMuaXNTdHJpbmcocmVxdWVzdFVSTCkpID8gcmVzb2x2ZVVSTChyZXF1ZXN0VVJMKSA6IHJlcXVlc3RVUkw7XG4gICAgICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVVJMLnByb3RvY29sICYmXG4gICAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVVJMLmhvc3QpO1xuICAgIH07XG4gIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH0pKClcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykge1xuICB2YXIgcGFyc2VkID0ge307XG4gIHZhciBrZXk7XG4gIHZhciB2YWw7XG4gIHZhciBpO1xuXG4gIGlmICghaGVhZGVycykgeyByZXR1cm4gcGFyc2VkOyB9XG5cbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cigwLCBpKSkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKGkgKyAxKSk7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGJlIHRyYW5zZm9ybWVkXG4gKiBAcGFyYW0ge0FycmF5fSBoZWFkZXJzIFRoZSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCBvciByZXNwb25zZVxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgZm5zKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICB1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuKGRhdGEsIGhlYWRlcnMpO1xuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZ2xvYmFsIHRvU3RyaW5nOnRydWUqL1xuXG4vLyB1dGlscyBpcyBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIG5vbi1zcGVjaWZpYyB0byBheGlvc1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5KHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBGb3JtRGF0YSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRm9ybURhdGEodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZvcm1EYXRhXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKHZhbC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0ZpbGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZpbGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJsb2JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jsb2IodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEJsb2JdJztcbn1cblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiB0cmltKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpLnJlcGxhY2UoL1xccyokLywgJycpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IC0+IHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBpc1N0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbikge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgJiYgIWlzQXJyYXkob2JqKSkge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFjY2VwdHMgdmFyYXJncyBleHBlY3RpbmcgZWFjaCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3QsIHRoZW5cbiAqIGltbXV0YWJseSBtZXJnZXMgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBvYmplY3QgYW5kIHJldHVybnMgcmVzdWx0LlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIGtleSB0aGUgbGF0ZXIgb2JqZWN0IGluXG4gKiB0aGUgYXJndW1lbnRzIGxpc3Qgd2lsbCB0YWtlIHByZWNlZGVuY2UuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlc3VsdCA9IG1lcmdlKHtmb286IDEyM30sIHtmb286IDQ1Nn0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LmZvbyk7IC8vIG91dHB1dHMgNDU2XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xuICAgIGlmICh0eXBlb2YgcmVzdWx0W2tleV0gPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKHJlc3VsdFtrZXldLCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0FycmF5OiBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyOiBpc0FycmF5QnVmZmVyLFxuICBpc0Zvcm1EYXRhOiBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldzogaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nOiBpc1N0cmluZyxcbiAgaXNOdW1iZXI6IGlzTnVtYmVyLFxuICBpc09iamVjdDogaXNPYmplY3QsXG4gIGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlOiBpc0RhdGUsXG4gIGlzRmlsZTogaXNGaWxlLFxuICBpc0Jsb2I6IGlzQmxvYixcbiAgaXNTdGFuZGFyZEJyb3dzZXJFbnY6IGlzU3RhbmRhcmRCcm93c2VyRW52LFxuICBmb3JFYWNoOiBmb3JFYWNoLFxuICBtZXJnZTogbWVyZ2UsXG4gIHRyaW06IHRyaW1cbn07XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbi8qIVxuICogQG92ZXJ2aWV3IGVzNi1wcm9taXNlIC0gYSB0aW55IGltcGxlbWVudGF0aW9uIG9mIFByb21pc2VzL0ErLlxuICogQGNvcHlyaWdodCBDb3B5cmlnaHQgKGMpIDIwMTQgWWVodWRhIEthdHosIFRvbSBEYWxlLCBTdGVmYW4gUGVubmVyIGFuZCBjb250cmlidXRvcnMgKENvbnZlcnNpb24gdG8gRVM2IEFQSSBieSBKYWtlIEFyY2hpYmFsZClcbiAqIEBsaWNlbnNlICAgTGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2VcbiAqICAgICAgICAgICAgU2VlIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qYWtlYXJjaGliYWxkL2VzNi1wcm9taXNlL21hc3Rlci9MSUNFTlNFXG4gKiBAdmVyc2lvbiAgIDMuMS4yXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkb2JqZWN0T3JGdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzRnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNNYXliZVRoZW5hYmxlKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXkgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNBcnJheSA9IGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXk7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPSAwO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0O1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm47XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAgPSBmdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBhcmcpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuXSA9IGNhbGxiYWNrO1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2xpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gKyAxXSA9IGFyZztcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gKz0gMjtcbiAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuID09PSAyKSB7XG4gICAgICAgIC8vIElmIGxlbiBpcyAyLCB0aGF0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBhc3luYyBmbHVzaC5cbiAgICAgICAgLy8gSWYgYWRkaXRpb25hbCBjYWxsYmFja3MgYXJlIHF1ZXVlZCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGZsdXNoZWQsIHRoZXlcbiAgICAgICAgLy8gd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBmbHVzaCB0aGF0IHdlIGFyZSBzY2hlZHVsaW5nLlxuICAgICAgICBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRTY2hlZHVsZXIoc2NoZWR1bGVGbikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuID0gc2NoZWR1bGVGbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0QXNhcChhc2FwRm4pIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwID0gYXNhcEZuO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyR2xvYmFsID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJXaW5kb3cgfHwge307XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyR2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGlzTm9kZSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB7fS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXSc7XG5cbiAgICAvLyB0ZXN0IGZvciB3ZWIgd29ya2VyIGJ1dCBub3QgaW4gSUUxMFxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNXb3JrZXIgPSB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2YgaW1wb3J0U2NyaXB0cyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgICAvLyBub2RlXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU5leHRUaWNrKCkge1xuICAgICAgLy8gbm9kZSB2ZXJzaW9uIDAuMTAueCBkaXNwbGF5cyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hlbiBuZXh0VGljayBpcyB1c2VkIHJlY3Vyc2l2ZWx5XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2N1am9qcy93aGVuL2lzc3Vlcy80MTAgZm9yIGRldGFpbHNcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyB2ZXJ0eFxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VWZXJ0eFRpbWVyKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0KGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNdXRhdGlvbk9ic2VydmVyKCkge1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgdmFyIG9ic2VydmVyID0gbmV3IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlcihsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBub2RlLmRhdGEgPSAoaXRlcmF0aW9ucyA9ICsraXRlcmF0aW9ucyAlIDIpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyB3ZWIgd29ya2VyXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU1lc3NhZ2VDaGFubmVsKCkge1xuICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVNldFRpbWVvdXQoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldFRpbWVvdXQobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoLCAxKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZSA9IG5ldyBBcnJheSgxMDAwKTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2goKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW47IGkrPTIpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2ldO1xuICAgICAgICB2YXIgYXJnID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2krMV07XG5cbiAgICAgICAgY2FsbGJhY2soYXJnKTtcblxuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpKzFdID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXR0ZW1wdFZlcnR4KCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHIgPSByZXF1aXJlO1xuICAgICAgICB2YXIgdmVydHggPSByKCd2ZXJ0eCcpO1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0ID0gdmVydHgucnVuT25Mb29wIHx8IHZlcnR4LnJ1bk9uQ29udGV4dDtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VWZXJ0eFRpbWVyKCk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VTZXRUaW1lb3V0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoO1xuICAgIC8vIERlY2lkZSB3aGF0IGFzeW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxsYmFja3M6XG4gICAgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc05vZGUpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU5leHRUaWNrKCk7XG4gICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU11dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc1dvcmtlcikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTWVzc2FnZUNoYW5uZWwoKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyV2luZG93ID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGF0dGVtcHRWZXJ0eCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VTZXRUaW1lb3V0KCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR0aGVuJCR0aGVuKG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gICAgICB2YXIgcGFyZW50ID0gdGhpcztcbiAgICAgIHZhciBzdGF0ZSA9IHBhcmVudC5fc3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEICYmICFvbkZ1bGZpbGxtZW50IHx8IHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCAmJiAhb25SZWplY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBjaGlsZCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgdmFyIHJlc3VsdCA9IHBhcmVudC5fcmVzdWx0O1xuXG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzW3N0YXRlIC0gMV07XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc3RhdGUsIGNoaWxkLCBjYWxsYmFjaywgcmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUocGFyZW50LCBjaGlsZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkdGhlbiQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSR0aGVuJCR0aGVuO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJHJlc29sdmUob2JqZWN0KSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICAgICAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QuY29uc3RydWN0b3IgPT09IENvbnN0cnVjdG9yKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCBvYmplY3QpO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkcmVzb2x2ZTtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3AoKSB7fVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcgICA9IHZvaWQgMDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEID0gMTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQgID0gMjtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUiA9IG5ldyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc2VsZkZ1bGZpbGxtZW50KCkge1xuICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJZb3UgY2Fubm90IHJlc29sdmUgYSBwcm9taXNlIHdpdGggaXRzZWxmXCIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGNhbm5vdFJldHVybk93bigpIHtcbiAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKCdBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZ2V0VGhlbihwcm9taXNlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUi5lcnJvciA9IGVycm9yO1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5VGhlbih0aGVuLCB2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlLCB0aGVuKSB7XG4gICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAoZnVuY3Rpb24ocHJvbWlzZSkge1xuICAgICAgICB2YXIgc2VhbGVkID0gZmFsc2U7XG4gICAgICAgIHZhciBlcnJvciA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeVRoZW4odGhlbiwgdGhlbmFibGUsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKHNlYWxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGVuYWJsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgIGlmIChzZWFsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcblxuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICB9LCAnU2V0dGxlOiAnICsgKHByb21pc2UuX2xhYmVsIHx8ICcgdW5rbm93biBwcm9taXNlJykpO1xuXG4gICAgICAgIGlmICghc2VhbGVkICYmIGVycm9yKSB7XG4gICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCBwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVPd25UaGVuYWJsZShwcm9taXNlLCB0aGVuYWJsZSkge1xuICAgICAgaWYgKHRoZW5hYmxlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2UgaWYgKHRoZW5hYmxlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHRoZW5hYmxlLl9yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHRoZW5hYmxlLCB1bmRlZmluZWQsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUsIHRoZW4pIHtcbiAgICAgIGlmIChtYXliZVRoZW5hYmxlLmNvbnN0cnVjdG9yID09PSBwcm9taXNlLmNvbnN0cnVjdG9yICYmXG4gICAgICAgICAgdGhlbiA9PT0gbGliJGVzNiRwcm9taXNlJHRoZW4kJGRlZmF1bHQgJiZcbiAgICAgICAgICBjb25zdHJ1Y3Rvci5yZXNvbHZlID09PSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0KSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoZW4gPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SLmVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbih0aGVuKSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZUZvcmVpZ25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlLCB0aGVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSkge1xuICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzZWxmRnVsZmlsbG1lbnQoKSk7XG4gICAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSR1dGlscyQkb2JqZWN0T3JGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZ2V0VGhlbih2YWx1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaFJlamVjdGlvbihwcm9taXNlKSB7XG4gICAgICBpZiAocHJvbWlzZS5fb25lcnJvcikge1xuICAgICAgICBwcm9taXNlLl9vbmVycm9yKHByb21pc2UuX3Jlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gocHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSkge1xuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7IHJldHVybjsgfVxuXG4gICAgICBwcm9taXNlLl9yZXN1bHQgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3N0YXRlID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEO1xuXG4gICAgICBpZiAocHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gsIHByb21pc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pIHtcbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykgeyByZXR1cm47IH1cbiAgICAgIHByb21pc2UuX3N0YXRlID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQ7XG4gICAgICBwcm9taXNlLl9yZXN1bHQgPSByZWFzb247XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2hSZWplY3Rpb24sIHByb21pc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICAgICAgdmFyIHN1YnNjcmliZXJzID0gcGFyZW50Ll9zdWJzY3JpYmVycztcbiAgICAgIHZhciBsZW5ndGggPSBzdWJzY3JpYmVycy5sZW5ndGg7XG5cbiAgICAgIHBhcmVudC5fb25lcnJvciA9IG51bGw7XG5cbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDtcbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aCArIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50O1xuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURURdICA9IG9uUmVqZWN0aW9uO1xuXG4gICAgICBpZiAobGVuZ3RoID09PSAwICYmIHBhcmVudC5fc3RhdGUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaCwgcGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoKHByb21pc2UpIHtcbiAgICAgIHZhciBzdWJzY3JpYmVycyA9IHByb21pc2UuX3N1YnNjcmliZXJzO1xuICAgICAgdmFyIHNldHRsZWQgPSBwcm9taXNlLl9zdGF0ZTtcblxuICAgICAgaWYgKHN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgICAgdmFyIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsID0gcHJvbWlzZS5fcmVzdWx0O1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YnNjcmliZXJzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07XG4gICAgICAgIGNhbGxiYWNrID0gc3Vic2NyaWJlcnNbaSArIHNldHRsZWRdO1xuXG4gICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayhkZXRhaWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb21pc2UuX3N1YnNjcmliZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKSB7XG4gICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SID0gbmV3IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCk7XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlDYXRjaChjYWxsYmFjaywgZGV0YWlsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZGV0YWlsKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IuZXJyb3IgPSBlO1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHNldHRsZWQsIHByb21pc2UsIGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgICAgIHZhciBoYXNDYWxsYmFjayA9IGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbihjYWxsYmFjayksXG4gICAgICAgICAgdmFsdWUsIGVycm9yLCBzdWNjZWVkZWQsIGZhaWxlZDtcblxuICAgICAgaWYgKGhhc0NhbGxiYWNrKSB7XG4gICAgICAgIHZhbHVlID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCk7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IpIHtcbiAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgIGVycm9yID0gdmFsdWUuZXJyb3I7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkY2Fubm90UmV0dXJuT3duKCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGRldGFpbDtcbiAgICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2FsbGJhY2sgJiYgc3VjY2VlZGVkKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChmYWlsZWQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGluaXRpYWxpemVQcm9taXNlKHByb21pc2UsIHJlc29sdmVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXNvbHZlcihmdW5jdGlvbiByZXNvbHZlUHJvbWlzZSh2YWx1ZSl7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIHJlamVjdFByb21pc2UocmVhc29uKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGFsbChlbnRyaWVzKSB7XG4gICAgICByZXR1cm4gbmV3IGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRkZWZhdWx0KHRoaXMsIGVudHJpZXMpLnByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGFsbDtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRyYWNlKGVudHJpZXMpIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcblxuICAgICAgaWYgKCFsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzQXJyYXkoZW50cmllcykpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gcmFjZS4nKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbG1lbnQodmFsdWUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0aW9uKHJlYXNvbikge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IHByb21pc2UuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HICYmIGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUoQ29uc3RydWN0b3IucmVzb2x2ZShlbnRyaWVzW2ldKSwgdW5kZWZpbmVkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJHJhY2U7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRyZWplY3QocmVhc29uKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkcmVqZWN0O1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRjb3VudGVyID0gMDtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc1Jlc29sdmVyKCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc05ldygpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdQcm9taXNlJzogUGxlYXNlIHVzZSB0aGUgJ25ldycgb3BlcmF0b3IsIHRoaXMgb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2U7XG4gICAgLyoqXG4gICAgICBQcm9taXNlIG9iamVjdHMgcmVwcmVzZW50IHRoZSBldmVudHVhbCByZXN1bHQgb2YgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4gVGhlXG4gICAgICBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLCB3aGljaFxuICAgICAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGUgcmVhc29uXG4gICAgICB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC5cblxuICAgICAgVGVybWlub2xvZ3lcbiAgICAgIC0tLS0tLS0tLS0tXG5cbiAgICAgIC0gYHByb21pc2VgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB3aXRoIGEgYHRoZW5gIG1ldGhvZCB3aG9zZSBiZWhhdmlvciBjb25mb3JtcyB0byB0aGlzIHNwZWNpZmljYXRpb24uXG4gICAgICAtIGB0aGVuYWJsZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBhIGB0aGVuYCBtZXRob2QuXG4gICAgICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2FsIEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEgcHJvbWlzZSkuXG4gICAgICAtIGBleGNlcHRpb25gIGlzIGEgdmFsdWUgdGhhdCBpcyB0aHJvd24gdXNpbmcgdGhlIHRocm93IHN0YXRlbWVudC5cbiAgICAgIC0gYHJlYXNvbmAgaXMgYSB2YWx1ZSB0aGF0IGluZGljYXRlcyB3aHkgYSBwcm9taXNlIHdhcyByZWplY3RlZC5cbiAgICAgIC0gYHNldHRsZWRgIHRoZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuXG4gICAgICBBIHByb21pc2UgY2FuIGJlIGluIG9uZSBvZiB0aHJlZSBzdGF0ZXM6IHBlbmRpbmcsIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQuXG5cbiAgICAgIFByb21pc2VzIHRoYXQgYXJlIGZ1bGZpbGxlZCBoYXZlIGEgZnVsZmlsbG1lbnQgdmFsdWUgYW5kIGFyZSBpbiB0aGUgZnVsZmlsbGVkXG4gICAgICBzdGF0ZS4gIFByb21pc2VzIHRoYXQgYXJlIHJlamVjdGVkIGhhdmUgYSByZWplY3Rpb24gcmVhc29uIGFuZCBhcmUgaW4gdGhlXG4gICAgICByZWplY3RlZCBzdGF0ZS4gIEEgZnVsZmlsbG1lbnQgdmFsdWUgaXMgbmV2ZXIgYSB0aGVuYWJsZS5cblxuICAgICAgUHJvbWlzZXMgY2FuIGFsc28gYmUgc2FpZCB0byAqcmVzb2x2ZSogYSB2YWx1ZS4gIElmIHRoaXMgdmFsdWUgaXMgYWxzbyBhXG4gICAgICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzXG4gICAgICBzZXR0bGVkIHN0YXRlLiAgU28gYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCByZWplY3RzIHdpbGxcbiAgICAgIGl0c2VsZiByZWplY3QsIGFuZCBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpbGxcbiAgICAgIGl0c2VsZiBmdWxmaWxsLlxuXG5cbiAgICAgIEJhc2ljIFVzYWdlOlxuICAgICAgLS0tLS0tLS0tLS0tXG5cbiAgICAgIGBgYGpzXG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAvLyBvbiBzdWNjZXNzXG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuXG4gICAgICAgIC8vIG9uIGZhaWx1cmVcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcblxuICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgLy8gb24gcmVqZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBZHZhbmNlZCBVc2FnZTpcbiAgICAgIC0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzXG4gICAgICBgWE1MSHR0cFJlcXVlc3Rgcy5cblxuICAgICAgYGBganNcbiAgICAgIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpO1xuICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBoYW5kbGVyO1xuICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnanNvbic7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgICAgeGhyLnNlbmQoKTtcblxuICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVzcG9uc2UpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2dldEpTT046IGAnICsgdXJsICsgJ2AgZmFpbGVkIHdpdGggc3RhdHVzOiBbJyArIHRoaXMuc3RhdHVzICsgJ10nKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZ2V0SlNPTignL3Bvc3RzLmpzb24nKS50aGVuKGZ1bmN0aW9uKGpzb24pIHtcbiAgICAgICAgLy8gb24gZnVsZmlsbG1lbnRcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAvLyBvbiByZWplY3Rpb25cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFVubGlrZSBjYWxsYmFja3MsIHByb21pc2VzIGFyZSBncmVhdCBjb21wb3NhYmxlIHByaW1pdGl2ZXMuXG5cbiAgICAgIGBgYGpzXG4gICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgIGdldEpTT04oJy9wb3N0cycpLFxuICAgICAgICBnZXRKU09OKCcvY29tbWVudHMnKVxuICAgICAgXSkudGhlbihmdW5jdGlvbih2YWx1ZXMpe1xuICAgICAgICB2YWx1ZXNbMF0gLy8gPT4gcG9zdHNKU09OXG4gICAgICAgIHZhbHVlc1sxXSAvLyA9PiBjb21tZW50c0pTT05cblxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQGNsYXNzIFByb21pc2VcbiAgICAgIEBwYXJhbSB7ZnVuY3Rpb259IHJlc29sdmVyXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlKHJlc29sdmVyKSB7XG4gICAgICB0aGlzLl9pZCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRjb3VudGVyKys7XG4gICAgICB0aGlzLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3Jlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3N1YnNjcmliZXJzID0gW107XG5cbiAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wICE9PSByZXNvbHZlcikge1xuICAgICAgICB0eXBlb2YgcmVzb2x2ZXIgIT09ICdmdW5jdGlvbicgJiYgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzUmVzb2x2ZXIoKTtcbiAgICAgICAgdGhpcyBpbnN0YW5jZW9mIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlID8gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW5pdGlhbGl6ZVByb21pc2UodGhpcywgcmVzb2x2ZXIpIDogbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzTmV3KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuYWxsID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJhY2UgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJlc29sdmUgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJlamVjdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fc2V0U2NoZWR1bGVyID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldFNjaGVkdWxlcjtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fc2V0QXNhcCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRBc2FwO1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLl9hc2FwID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXA7XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5wcm90b3R5cGUgPSB7XG4gICAgICBjb25zdHJ1Y3RvcjogbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UsXG5cbiAgICAvKipcbiAgICAgIFRoZSBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLFxuICAgICAgd2hpY2ggcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGVcbiAgICAgIHJlYXNvbiB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXtcbiAgICAgICAgLy8gdXNlciBpcyBhdmFpbGFibGVcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBDaGFpbmluZ1xuICAgICAgLS0tLS0tLS1cblxuICAgICAgVGhlIHJldHVybiB2YWx1ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJvbWlzZS4gIFRoaXMgc2Vjb25kLCAnZG93bnN0cmVhbSdcbiAgICAgIHByb21pc2UgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmaXJzdCBwcm9taXNlJ3MgZnVsZmlsbG1lbnRcbiAgICAgIG9yIHJlamVjdGlvbiBoYW5kbGVyLCBvciByZWplY3RlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiB1c2VyLm5hbWU7XG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJztcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVzZXJOYW1lKSB7XG4gICAgICAgIC8vIElmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgdXNlck5hbWVgIHdpbGwgYmUgdGhlIHVzZXIncyBuYW1lLCBvdGhlcndpc2UgaXRcbiAgICAgICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgXG4gICAgICB9KTtcblxuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHknKTtcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jyk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIGlmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgcmVhc29uYCB3aWxsIGJlICdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScuXG4gICAgICAgIC8vIElmIGBmaW5kVXNlcmAgcmVqZWN0ZWQsIGByZWFzb25gIHdpbGwgYmUgJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknLlxuICAgICAgfSk7XG4gICAgICBgYGBcbiAgICAgIElmIHRoZSBkb3duc3RyZWFtIHByb21pc2UgZG9lcyBub3Qgc3BlY2lmeSBhIHJlamVjdGlvbiBoYW5kbGVyLCByZWplY3Rpb24gcmVhc29ucyB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciBkb3duc3RyZWFtLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBQZWRhZ29naWNhbEV4Y2VwdGlvbignVXBzdHJlYW0gZXJyb3InKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gVGhlIGBQZWRnYWdvY2lhbEV4Y2VwdGlvbmAgaXMgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBkb3duIHRvIGhlcmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFzc2ltaWxhdGlvblxuICAgICAgLS0tLS0tLS0tLS0tXG5cbiAgICAgIFNvbWV0aW1lcyB0aGUgdmFsdWUgeW91IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGEgZG93bnN0cmVhbSBwcm9taXNlIGNhbiBvbmx5IGJlXG4gICAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3VzbHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJldHVybmluZyBhIHByb21pc2UgaW4gdGhlXG4gICAgICBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gaGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIHRoZW4gYmUgcGVuZGluZ1xuICAgICAgdW50aWwgdGhlIHJldHVybmVkIHByb21pc2UgaXMgc2V0dGxlZC4gVGhpcyBpcyBjYWxsZWQgKmFzc2ltaWxhdGlvbiouXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAgICAgLy8gVGhlIHVzZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWlsYWJsZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgSWYgdGhlIGFzc2ltbGlhdGVkIHByb21pc2UgcmVqZWN0cywgdGhlbiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIHdpbGwgYWxzbyByZWplY3QuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCBmdWxmaWxscywgd2UnbGwgaGF2ZSB0aGUgdmFsdWUgaGVyZVxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIHJlamVjdHMsIHdlJ2xsIGhhdmUgdGhlIHJlYXNvbiBoZXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBTaW1wbGUgRXhhbXBsZVxuICAgICAgLS0tLS0tLS0tLS0tLS1cblxuICAgICAgU3luY2hyb25vdXMgRXhhbXBsZVxuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBmaW5kUmVzdWx0KCk7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH1cbiAgICAgIGBgYFxuXG4gICAgICBFcnJiYWNrIEV4YW1wbGVcblxuICAgICAgYGBganNcbiAgICAgIGZpbmRSZXN1bHQoZnVuY3Rpb24ocmVzdWx0LCBlcnIpe1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgUHJvbWlzZSBFeGFtcGxlO1xuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBZHZhbmNlZCBFeGFtcGxlXG4gICAgICAtLS0tLS0tLS0tLS0tLVxuXG4gICAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIHZhciBhdXRob3IsIGJvb2tzO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhdXRob3IgPSBmaW5kQXV0aG9yKCk7XG4gICAgICAgIGJvb2tzICA9IGZpbmRCb29rc0J5QXV0aG9yKGF1dGhvcik7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH1cbiAgICAgIGBgYFxuXG4gICAgICBFcnJiYWNrIEV4YW1wbGVcblxuICAgICAgYGBganNcblxuICAgICAgZnVuY3Rpb24gZm91bmRCb29rcyhib29rcykge1xuXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZhaWx1cmUocmVhc29uKSB7XG5cbiAgICAgIH1cblxuICAgICAgZmluZEF1dGhvcihmdW5jdGlvbihhdXRob3IsIGVycil7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaW5kQm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5jdGlvbihib29rcywgZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGZvdW5kQm9va3MoYm9va3MpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgUHJvbWlzZSBFeGFtcGxlO1xuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICBmaW5kQXV0aG9yKCkuXG4gICAgICAgIHRoZW4oZmluZEJvb2tzQnlBdXRob3IpLlxuICAgICAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXtcbiAgICAgICAgICAvLyBmb3VuZCBib29rc1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBtZXRob2QgdGhlblxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25GdWxmaWxsZWRcbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0ZWRcbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICAgIHRoZW46IGxpYiRlczYkcHJvbWlzZSR0aGVuJCRkZWZhdWx0LFxuXG4gICAgLyoqXG4gICAgICBgY2F0Y2hgIGlzIHNpbXBseSBzdWdhciBmb3IgYHRoZW4odW5kZWZpbmVkLCBvblJlamVjdGlvbilgIHdoaWNoIG1ha2VzIGl0IHRoZSBzYW1lXG4gICAgICBhcyB0aGUgY2F0Y2ggYmxvY2sgb2YgYSB0cnkvY2F0Y2ggc3RhdGVtZW50LlxuXG4gICAgICBgYGBqc1xuICAgICAgZnVuY3Rpb24gZmluZEF1dGhvcigpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkbid0IGZpbmQgdGhhdCBhdXRob3InKTtcbiAgICAgIH1cblxuICAgICAgLy8gc3luY2hyb25vdXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbmRBdXRob3IoKTtcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9XG5cbiAgICAgIC8vIGFzeW5jIHdpdGggcHJvbWlzZXNcbiAgICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQG1ldGhvZCBjYXRjaFxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3Rpb25cbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3I7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IoQ29uc3RydWN0b3IsIGlucHV0KSB7XG4gICAgICB0aGlzLl9pbnN0YW5jZUNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgICB0aGlzLnByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICB0aGlzLl9pbnB1dCAgICAgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5sZW5ndGggICAgID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICB0aGlzLl9yZW1haW5pbmcgPSBpbnB1dC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHRoaXMucHJvbWlzZSwgdGhpcy5fcmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgdGhpcy5fZW51bWVyYXRlKCk7XG4gICAgICAgICAgaWYgKHRoaXMuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbCh0aGlzLnByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QodGhpcy5wcm9taXNlLCB0aGlzLl92YWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0FycmF5IE1ldGhvZHMgbXVzdCBiZSBwcm92aWRlZCBhbiBBcnJheScpO1xuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX2VudW1lcmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxlbmd0aCAgPSB0aGlzLmxlbmd0aDtcbiAgICAgIHZhciBpbnB1dCAgID0gdGhpcy5faW5wdXQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyB0aGlzLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5fZWFjaEVudHJ5KGlucHV0W2ldLCBpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9lYWNoRW50cnkgPSBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgICAgdmFyIGMgPSB0aGlzLl9pbnN0YW5jZUNvbnN0cnVjdG9yO1xuICAgICAgdmFyIHJlc29sdmUgPSBjLnJlc29sdmU7XG5cbiAgICAgIGlmIChyZXNvbHZlID09PSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0KSB7XG4gICAgICAgIHZhciB0aGVuID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZ2V0VGhlbihlbnRyeSk7XG5cbiAgICAgICAgaWYgKHRoZW4gPT09IGxpYiRlczYkcHJvbWlzZSR0aGVuJCRkZWZhdWx0ICYmXG4gICAgICAgICAgICBlbnRyeS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgICB0aGlzLl9zZXR0bGVkQXQoZW50cnkuX3N0YXRlLCBpLCBlbnRyeS5fcmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhlbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRoaXMuX3JlbWFpbmluZy0tO1xuICAgICAgICAgIHRoaXMuX3Jlc3VsdFtpXSA9IGVudHJ5O1xuICAgICAgICB9IGVsc2UgaWYgKGMgPT09IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0KSB7XG4gICAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgYyhsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIGVudHJ5LCB0aGVuKTtcbiAgICAgICAgICB0aGlzLl93aWxsU2V0dGxlQXQocHJvbWlzZSwgaSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KG5ldyBjKGZ1bmN0aW9uKHJlc29sdmUpIHsgcmVzb2x2ZShlbnRyeSk7IH0pLCBpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KHJlc29sdmUoZW50cnkpLCBpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9zZXR0bGVkQXQgPSBmdW5jdGlvbihzdGF0ZSwgaSwgdmFsdWUpIHtcbiAgICAgIHZhciBwcm9taXNlID0gdGhpcy5wcm9taXNlO1xuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgdGhpcy5fcmVtYWluaW5nLS07XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVzdWx0W2ldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fd2lsbFNldHRsZUF0ID0gZnVuY3Rpb24ocHJvbWlzZSwgaSkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUocHJvbWlzZSwgdW5kZWZpbmVkLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVELCBpLCB2YWx1ZSk7XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVELCBpLCByZWFzb24pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJHBvbHlmaWxsKCkge1xuICAgICAgdmFyIGxvY2FsO1xuXG4gICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBsb2NhbCA9IGdsb2JhbDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbG9jYWwgPSBzZWxmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBsb2NhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BvbHlmaWxsIGZhaWxlZCBiZWNhdXNlIGdsb2JhbCBvYmplY3QgaXMgdW5hdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIFAgPSBsb2NhbC5Qcm9taXNlO1xuXG4gICAgICBpZiAoUCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUC5yZXNvbHZlKCkpID09PSAnW29iamVjdCBQcm9taXNlXScgJiYgIVAuY2FzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvY2FsLlByb21pc2UgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdDtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkcG9seWZpbGw7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZSA9IHtcbiAgICAgICdQcm9taXNlJzogbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQsXG4gICAgICAncG9seWZpbGwnOiBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHRcbiAgICB9O1xuXG4gICAgLyogZ2xvYmFsIGRlZmluZTp0cnVlIG1vZHVsZTp0cnVlIHdpbmRvdzogdHJ1ZSAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pIHtcbiAgICAgIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7IH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlWydleHBvcnRzJ10pIHtcbiAgICAgIG1vZHVsZVsnZXhwb3J0cyddID0gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpc1snRVM2UHJvbWlzZSddID0gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHQoKTtcbn0pLmNhbGwodGhpcyk7XG5cblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJyksdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTlsY3pZdGNISnZiV2x6WlM5a2FYTjBMMlZ6Tmkxd2NtOXRhWE5sTG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN1FVRkJRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRU0lzSW1acGJHVWlPaUpuWlc1bGNtRjBaV1F1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5b2hYRzRnS2lCQWIzWmxjblpwWlhjZ1pYTTJMWEJ5YjIxcGMyVWdMU0JoSUhScGJua2dhVzF3YkdWdFpXNTBZWFJwYjI0Z2IyWWdVSEp2YldselpYTXZRU3N1WEc0Z0tpQkFZMjl3ZVhKcFoyaDBJRU52Y0hseWFXZG9kQ0FvWXlrZ01qQXhOQ0JaWldoMVpHRWdTMkYwZWl3Z1ZHOXRJRVJoYkdVc0lGTjBaV1poYmlCUVpXNXVaWElnWVc1a0lHTnZiblJ5YVdKMWRHOXljeUFvUTI5dWRtVnljMmx2YmlCMGJ5QkZVellnUVZCSklHSjVJRXBoYTJVZ1FYSmphR2xpWVd4a0tWeHVJQ29nUUd4cFkyVnVjMlVnSUNCTWFXTmxibk5sWkNCMWJtUmxjaUJOU1ZRZ2JHbGpaVzV6WlZ4dUlDb2dJQ0FnSUNBZ0lDQWdJQ0JUWldVZ2FIUjBjSE02THk5eVlYY3VaMmwwYUhWaWRYTmxjbU52Ym5SbGJuUXVZMjl0TDJwaGEyVmhjbU5vYVdKaGJHUXZaWE0yTFhCeWIyMXBjMlV2YldGemRHVnlMMHhKUTBWT1UwVmNiaUFxSUVCMlpYSnphVzl1SUNBZ015NHhMakpjYmlBcUwxeHVYRzRvWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnWENKMWMyVWdjM1J5YVdOMFhDSTdYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1J2WW1wbFkzUlBja1oxYm1OMGFXOXVLSGdwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUIwZVhCbGIyWWdlQ0E5UFQwZ0oyWjFibU4wYVc5dUp5QjhmQ0FvZEhsd1pXOW1JSGdnUFQwOUlDZHZZbXBsWTNRbklDWW1JSGdnSVQwOUlHNTFiR3dwTzF4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUjFkR2xzY3lRa2FYTkdkVzVqZEdsdmJpaDRLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkSGx3Wlc5bUlIZ2dQVDA5SUNkbWRXNWpkR2x2YmljN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSFYwYVd4ekpDUnBjMDFoZVdKbFZHaGxibUZpYkdVb2VDa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlIUjVjR1Z2WmlCNElEMDlQU0FuYjJKcVpXTjBKeUFtSmlCNElDRTlQU0J1ZFd4c08xeHVJQ0FnSUgxY2JseHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa2RYUnBiSE1rSkY5cGMwRnljbUY1TzF4dUlDQWdJR2xtSUNnaFFYSnlZWGt1YVhOQmNuSmhlU2tnZTF4dUlDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSFYwYVd4ekpDUmZhWE5CY25KaGVTQTlJR1oxYm1OMGFXOXVJQ2g0S1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuTG1OaGJHd29lQ2tnUFQwOUlDZGJiMkpxWldOMElFRnljbUY1WFNjN1hHNGdJQ0FnSUNCOU8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtkWFJwYkhNa0pGOXBjMEZ5Y21GNUlEMGdRWEp5WVhrdWFYTkJjbkpoZVR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0IyWVhJZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1JwYzBGeWNtRjVJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSFYwYVd4ekpDUmZhWE5CY25KaGVUdGNiaUFnSUNCMllYSWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkd4bGJpQTlJREE3WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUjJaWEowZUU1bGVIUTdYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSamRYTjBiMjFUWTJobFpIVnNaWEpHYmp0Y2JseHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWVhOaGNDQTlJR1oxYm1OMGFXOXVJR0Z6WVhBb1kyRnNiR0poWTJzc0lHRnlaeWtnZTF4dUlDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pIRjFaWFZsVzJ4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnNaVzVkSUQwZ1kyRnNiR0poWTJzN1hHNGdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjWFZsZFdWYmJHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR3hsYmlBcklERmRJRDBnWVhKbk8xeHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR3hsYmlBclBTQXlPMXh1SUNBZ0lDQWdhV1lnS0d4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnNaVzRnUFQwOUlESXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1NXWWdiR1Z1SUdseklESXNJSFJvWVhRZ2JXVmhibk1nZEdoaGRDQjNaU0J1WldWa0lIUnZJSE5qYUdWa2RXeGxJR0Z1SUdGemVXNWpJR1pzZFhOb0xseHVJQ0FnSUNBZ0lDQXZMeUJKWmlCaFpHUnBkR2x2Ym1Gc0lHTmhiR3hpWVdOcmN5QmhjbVVnY1hWbGRXVmtJR0psWm05eVpTQjBhR1VnY1hWbGRXVWdhWE1nWm14MWMyaGxaQ3dnZEdobGVWeHVJQ0FnSUNBZ0lDQXZMeUIzYVd4c0lHSmxJSEJ5YjJObGMzTmxaQ0JpZVNCMGFHbHpJR1pzZFhOb0lIUm9ZWFFnZDJVZ1lYSmxJSE5qYUdWa2RXeHBibWN1WEc0Z0lDQWdJQ0FnSUdsbUlDaHNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWTNWemRHOXRVMk5vWldSMWJHVnlSbTRwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWTNWemRHOXRVMk5vWldSMWJHVnlSbTRvYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHWnNkWE5vS1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYzJOb1pXUjFiR1ZHYkhWemFDZ3BPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhObGRGTmphR1ZrZFd4bGNpaHpZMmhsWkhWc1pVWnVLU0I3WEc0Z0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa1kzVnpkRzl0VTJOb1pXUjFiR1Z5Um00Z1BTQnpZMmhsWkhWc1pVWnVPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1J6WlhSQmMyRndLR0Z6WVhCR2Jpa2dlMXh1SUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkdGellYQWdQU0JoYzJGd1JtNDdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSaWNtOTNjMlZ5VjJsdVpHOTNJRDBnS0hSNWNHVnZaaUIzYVc1a2IzY2dJVDA5SUNkMWJtUmxabWx1WldRbktTQS9JSGRwYm1SdmR5QTZJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHSnliM2R6WlhKSGJHOWlZV3dnUFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZbkp2ZDNObGNsZHBibVJ2ZHlCOGZDQjdmVHRjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pFSnliM2R6WlhKTmRYUmhkR2x2Yms5aWMyVnlkbVZ5SUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR0p5YjNkelpYSkhiRzlpWVd3dVRYVjBZWFJwYjI1UFluTmxjblpsY2lCOGZDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWW5KdmQzTmxja2RzYjJKaGJDNVhaV0pMYVhSTmRYUmhkR2x2Yms5aWMyVnlkbVZ5TzF4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWthWE5PYjJSbElEMGdkSGx3Wlc5bUlIQnliMk5sYzNNZ0lUMDlJQ2QxYm1SbFptbHVaV1FuSUNZbUlIdDlMblJ2VTNSeWFXNW5MbU5oYkd3b2NISnZZMlZ6Y3lrZ1BUMDlJQ2RiYjJKcVpXTjBJSEJ5YjJObGMzTmRKenRjYmx4dUlDQWdJQzh2SUhSbGMzUWdabTl5SUhkbFlpQjNiM0pyWlhJZ1luVjBJRzV2ZENCcGJpQkpSVEV3WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnBjMWR2Y210bGNpQTlJSFI1Y0dWdlppQlZhVzUwT0VOc1lXMXdaV1JCY25KaGVTQWhQVDBnSjNWdVpHVm1hVzVsWkNjZ0ppWmNiaUFnSUNBZ0lIUjVjR1Z2WmlCcGJYQnZjblJUWTNKcGNIUnpJQ0U5UFNBbmRXNWtaV1pwYm1Wa0p5QW1KbHh1SUNBZ0lDQWdkSGx3Wlc5bUlFMWxjM05oWjJWRGFHRnVibVZzSUNFOVBTQW5kVzVrWldacGJtVmtKenRjYmx4dUlDQWdJQzh2SUc1dlpHVmNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtkWE5sVG1WNGRGUnBZMnNvS1NCN1hHNGdJQ0FnSUNBdkx5QnViMlJsSUhabGNuTnBiMjRnTUM0eE1DNTRJR1JwYzNCc1lYbHpJR0VnWkdWd2NtVmpZWFJwYjI0Z2QyRnlibWx1WnlCM2FHVnVJRzVsZUhSVWFXTnJJR2x6SUhWelpXUWdjbVZqZFhKemFYWmxiSGxjYmlBZ0lDQWdJQzh2SUhObFpTQm9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZZM1ZxYjJwekwzZG9aVzR2YVhOemRXVnpMelF4TUNCbWIzSWdaR1YwWVdsc2MxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ0lDQndjbTlqWlhOekxtNWxlSFJVYVdOcktHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JtYkhWemFDazdYRzRnSUNBZ0lDQjlPMXh1SUNBZ0lIMWNibHh1SUNBZ0lDOHZJSFpsY25SNFhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pIVnpaVlpsY25SNFZHbHRaWElvS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1IyWlhKMGVFNWxlSFFvYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHWnNkWE5vS1R0Y2JpQWdJQ0FnSUgwN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pIVnpaVTExZEdGMGFXOXVUMkp6WlhKMlpYSW9LU0I3WEc0Z0lDQWdJQ0IyWVhJZ2FYUmxjbUYwYVc5dWN5QTlJREE3WEc0Z0lDQWdJQ0IyWVhJZ2IySnpaWEoyWlhJZ1BTQnVaWGNnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pFSnliM2R6WlhKTmRYUmhkR2x2Yms5aWMyVnlkbVZ5S0d4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUm1iSFZ6YUNrN1hHNGdJQ0FnSUNCMllYSWdibTlrWlNBOUlHUnZZM1Z0Wlc1MExtTnlaV0YwWlZSbGVIUk9iMlJsS0NjbktUdGNiaUFnSUNBZ0lHOWljMlZ5ZG1WeUxtOWljMlZ5ZG1Vb2JtOWtaU3dnZXlCamFHRnlZV04wWlhKRVlYUmhPaUIwY25WbElIMHBPMXh1WEc0Z0lDQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdJQ0FnSUc1dlpHVXVaR0YwWVNBOUlDaHBkR1Z5WVhScGIyNXpJRDBnS3l0cGRHVnlZWFJwYjI1eklDVWdNaWs3WEc0Z0lDQWdJQ0I5TzF4dUlDQWdJSDFjYmx4dUlDQWdJQzh2SUhkbFlpQjNiM0pyWlhKY2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2RYTmxUV1Z6YzJGblpVTm9ZVzV1Wld3b0tTQjdYRzRnSUNBZ0lDQjJZWElnWTJoaGJtNWxiQ0E5SUc1bGR5Qk5aWE56WVdkbFEyaGhibTVsYkNncE8xeHVJQ0FnSUNBZ1kyaGhibTVsYkM1d2IzSjBNUzV2Ym0xbGMzTmhaMlVnUFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtabXgxYzJnN1hHNGdJQ0FnSUNCeVpYUjFjbTRnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQmphR0Z1Ym1Wc0xuQnZjblF5TG5CdmMzUk5aWE56WVdkbEtEQXBPMXh1SUNBZ0lDQWdmVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrZFhObFUyVjBWR2x0Wlc5MWRDZ3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpZ3BJSHRjYmlBZ0lDQWdJQ0FnYzJWMFZHbHRaVzkxZENoc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtabXgxYzJnc0lERXBPMXh1SUNBZ0lDQWdmVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pIRjFaWFZsSUQwZ2JtVjNJRUZ5Y21GNUtERXdNREFwTzF4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSbWJIVnphQ2dwSUh0Y2JpQWdJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR3hsYmpzZ2FTczlNaWtnZTF4dUlDQWdJQ0FnSUNCMllYSWdZMkZzYkdKaFkyc2dQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2NYVmxkV1ZiYVYwN1hHNGdJQ0FnSUNBZ0lIWmhjaUJoY21jZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrY1hWbGRXVmJhU3N4WFR0Y2JseHVJQ0FnSUNBZ0lDQmpZV3hzWW1GamF5aGhjbWNwTzF4dVhHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1J4ZFdWMVpWdHBYU0E5SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSEYxWlhWbFcya3JNVjBnUFNCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JzWlc0Z1BTQXdPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JoZEhSbGJYQjBWbVZ5ZEhnb0tTQjdYRzRnSUNBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnSUNCMllYSWdjaUE5SUhKbGNYVnBjbVU3WEc0Z0lDQWdJQ0FnSUhaaGNpQjJaWEowZUNBOUlISW9KM1psY25SNEp5azdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSMlpYSjBlRTVsZUhRZ1BTQjJaWEowZUM1eWRXNVBia3h2YjNBZ2ZId2dkbVZ5ZEhndWNuVnVUMjVEYjI1MFpYaDBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhWelpWWmxjblI0VkdsdFpYSW9LVHRjYmlBZ0lDQWdJSDBnWTJGMFkyZ29aU2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pIVnpaVk5sZEZScGJXVnZkWFFvS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0IyWVhJZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSE5qYUdWa2RXeGxSbXgxYzJnN1hHNGdJQ0FnTHk4Z1JHVmphV1JsSUhkb1lYUWdZWE41Ym1NZ2JXVjBhRzlrSUhSdklIVnpaU0IwYnlCMGNtbG5aMlZ5YVc1bklIQnliMk5sYzNOcGJtY2diMllnY1hWbGRXVmtJR05oYkd4aVlXTnJjenBjYmlBZ0lDQnBaaUFvYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHbHpUbTlrWlNrZ2UxeHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSE5qYUdWa2RXeGxSbXgxYzJnZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrZFhObFRtVjRkRlJwWTJzb0tUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JDY205M2MyVnlUWFYwWVhScGIyNVBZbk5sY25abGNpa2dlMXh1SUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhOamFHVmtkV3hsUm14MWMyZ2dQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2RYTmxUWFYwWVhScGIyNVBZbk5sY25abGNpZ3BPMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9iR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkdselYyOXlhMlZ5S1NCN1hHNGdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjMk5vWldSMWJHVkdiSFZ6YUNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1IxYzJWTlpYTnpZV2RsUTJoaGJtNWxiQ2dwTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHSnliM2R6WlhKWGFXNWtiM2NnUFQwOUlIVnVaR1ZtYVc1bFpDQW1KaUIwZVhCbGIyWWdjbVZ4ZFdseVpTQTlQVDBnSjJaMWJtTjBhVzl1SnlrZ2UxeHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSE5qYUdWa2RXeGxSbXgxYzJnZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWVhSMFpXMXdkRlpsY25SNEtDazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnpZMmhsWkhWc1pVWnNkWE5vSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSFZ6WlZObGRGUnBiV1Z2ZFhRb0tUdGNiaUFnSUNCOVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSFJvWlc0a0pIUm9aVzRvYjI1R2RXeG1hV3hzYldWdWRDd2diMjVTWldwbFkzUnBiMjRwSUh0Y2JpQWdJQ0FnSUhaaGNpQndZWEpsYm5RZ1BTQjBhR2x6TzF4dUlDQWdJQ0FnZG1GeUlITjBZWFJsSUQwZ2NHRnlaVzUwTGw5emRHRjBaVHRjYmx4dUlDQWdJQ0FnYVdZZ0tITjBZWFJsSUQwOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUkdWVXhHU1V4TVJVUWdKaVlnSVc5dVJuVnNabWxzYkcxbGJuUWdmSHdnYzNSaGRHVWdQVDA5SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkZKRlNrVkRWRVZFSUNZbUlDRnZibEpsYW1WamRHbHZiaWtnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN6dGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdkbUZ5SUdOb2FXeGtJRDBnYm1WM0lIUm9hWE11WTI5dWMzUnlkV04wYjNJb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2JtOXZjQ2s3WEc0Z0lDQWdJQ0IyWVhJZ2NtVnpkV3gwSUQwZ2NHRnlaVzUwTGw5eVpYTjFiSFE3WEc1Y2JpQWdJQ0FnSUdsbUlDaHpkR0YwWlNrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWTJGc2JHSmhZMnNnUFNCaGNtZDFiV1Z1ZEhOYmMzUmhkR1VnTFNBeFhUdGNiaUFnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkdGellYQW9ablZ1WTNScGIyNG9LWHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNScGJuWnZhMlZEWVd4c1ltRmpheWh6ZEdGMFpTd2dZMmhwYkdRc0lHTmhiR3hpWVdOckxDQnlaWE4xYkhRcE8xeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSE4xWW5OamNtbGlaU2h3WVhKbGJuUXNJR05vYVd4a0xDQnZia1oxYkdacGJHeHRaVzUwTENCdmJsSmxhbVZqZEdsdmJpazdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJSEpsZEhWeWJpQmphR2xzWkR0Y2JpQWdJQ0I5WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1IwYUdWdUpDUmtaV1poZFd4MElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIUm9aVzRrSkhSb1pXNDdYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrY21WemIyeDJaU1FrY21WemIyeDJaU2h2WW1wbFkzUXBJSHRjYmlBZ0lDQWdJQzhxYW5Ob2FXNTBJSFpoYkdsa2RHaHBjenAwY25WbElDb3ZYRzRnSUNBZ0lDQjJZWElnUTI5dWMzUnlkV04wYjNJZ1BTQjBhR2x6TzF4dVhHNGdJQ0FnSUNCcFppQW9iMkpxWldOMElDWW1JSFI1Y0dWdlppQnZZbXBsWTNRZ1BUMDlJQ2R2WW1wbFkzUW5JQ1ltSUc5aWFtVmpkQzVqYjI1emRISjFZM1J2Y2lBOVBUMGdRMjl1YzNSeWRXTjBiM0lwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUc5aWFtVmpkRHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnZG1GeUlIQnliMjFwYzJVZ1BTQnVaWGNnUTI5dWMzUnlkV04wYjNJb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2JtOXZjQ2s3WEc0Z0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J5WlhOdmJIWmxLSEJ5YjIxcGMyVXNJRzlpYW1WamRDazdYRzRnSUNBZ0lDQnlaWFIxY200Z2NISnZiV2x6WlR0Y2JpQWdJQ0I5WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKSEpsYzI5c2RtVWtKR1JsWm1GMWJIUWdQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUnlaWE52YkhabEpDUnlaWE52YkhabE8xeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2JtOXZjQ2dwSUh0OVhHNWNiaUFnSUNCMllYSWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtVRVZPUkVsT1J5QWdJRDBnZG05cFpDQXdPMXh1SUNBZ0lIWmhjaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JHVlV4R1NVeE1SVVFnUFNBeE8xeHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlNSVXBGUTFSRlJDQWdQU0F5TzF4dVhHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pFZEZWRjlVU0VWT1gwVlNVazlTSUQwZ2JtVjNJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRVZ5Y205eVQySnFaV04wS0NrN1hHNWNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSelpXeG1SblZzWm1sc2JHMWxiblFvS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lGUjVjR1ZGY25KdmNpaGNJbGx2ZFNCallXNXViM1FnY21WemIyeDJaU0JoSUhCeWIyMXBjMlVnZDJsMGFDQnBkSE5sYkdaY0lpazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1kyRnVibTkwVW1WMGRYSnVUM2R1S0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUc1bGR5QlVlWEJsUlhKeWIzSW9KMEVnY0hKdmJXbHpaWE1nWTJGc2JHSmhZMnNnWTJGdWJtOTBJSEpsZEhWeWJpQjBhR0YwSUhOaGJXVWdjSEp2YldselpTNG5LVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUm5aWFJVYUdWdUtIQnliMjFwYzJVcElIdGNiaUFnSUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ3Y205dGFYTmxMblJvWlc0N1hHNGdJQ0FnSUNCOUlHTmhkR05vS0dWeWNtOXlLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkVkRlZGOVVTRVZPWDBWU1VrOVNMbVZ5Y205eUlEMGdaWEp5YjNJN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSSFJWUmZWRWhGVGw5RlVsSlBVanRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUjBjbmxVYUdWdUtIUm9aVzRzSUhaaGJIVmxMQ0JtZFd4bWFXeHNiV1Z1ZEVoaGJtUnNaWElzSUhKbGFtVmpkR2x2YmtoaGJtUnNaWElwSUh0Y2JpQWdJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQWdJSFJvWlc0dVkyRnNiQ2gyWVd4MVpTd2dablZzWm1sc2JHMWxiblJJWVc1a2JHVnlMQ0J5WldwbFkzUnBiMjVJWVc1a2JHVnlLVHRjYmlBZ0lDQWdJSDBnWTJGMFkyZ29aU2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JvWVc1a2JHVkdiM0psYVdkdVZHaGxibUZpYkdVb2NISnZiV2x6WlN3Z2RHaGxibUZpYkdVc0lIUm9aVzRwSUh0Y2JpQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZWE5oY0NobWRXNWpkR2x2Ymlod2NtOXRhWE5sS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ6WldGc1pXUWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lDQWdkbUZ5SUdWeWNtOXlJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrZEhKNVZHaGxiaWgwYUdWdUxDQjBhR1Z1WVdKc1pTd2dablZ1WTNScGIyNG9kbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdJQ0JwWmlBb2MyVmhiR1ZrS1NCN0lISmxkSFZ5YmpzZ2ZWeHVJQ0FnSUNBZ0lDQWdJSE5sWVd4bFpDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0hSb1pXNWhZbXhsSUNFOVBTQjJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WemIyeDJaU2h3Y205dGFYTmxMQ0IyWVd4MVpTazdYRzRnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHWjFiR1pwYkd3b2NISnZiV2x6WlN3Z2RtRnNkV1VwTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRvY21WaGMyOXVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLSE5sWVd4bFpDa2dleUJ5WlhSMWNtNDdJSDFjYmlBZ0lDQWdJQ0FnSUNCelpXRnNaV1FnUFNCMGNuVmxPMXh1WEc0Z0lDQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnFaV04wS0hCeWIyMXBjMlVzSUhKbFlYTnZiaWs3WEc0Z0lDQWdJQ0FnSUgwc0lDZFRaWFIwYkdVNklDY2dLeUFvY0hKdmJXbHpaUzVmYkdGaVpXd2dmSHdnSnlCMWJtdHViM2R1SUhCeWIyMXBjMlVuS1NrN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0NGelpXRnNaV1FnSmlZZ1pYSnliM0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnpaV0ZzWldRZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxhbVZqZENod2NtOXRhWE5sTENCbGNuSnZjaWs3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgwc0lIQnliMjFwYzJVcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdoaGJtUnNaVTkzYmxSb1pXNWhZbXhsS0hCeWIyMXBjMlVzSUhSb1pXNWhZbXhsS1NCN1hHNGdJQ0FnSUNCcFppQW9kR2hsYm1GaWJHVXVYM04wWVhSbElEMDlQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JHVlV4R1NVeE1SVVFwSUh0Y2JpQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1puVnNabWxzYkNod2NtOXRhWE5sTENCMGFHVnVZV0pzWlM1ZmNtVnpkV3gwS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2RHaGxibUZpYkdVdVgzTjBZWFJsSUQwOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlNSVXBGUTFSRlJDa2dlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J5WldwbFkzUW9jSEp2YldselpTd2dkR2hsYm1GaWJHVXVYM0psYzNWc2RDazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnpkV0p6WTNKcFltVW9kR2hsYm1GaWJHVXNJSFZ1WkdWbWFXNWxaQ3dnWm5WdVkzUnBiMjRvZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpYTnZiSFpsS0hCeWIyMXBjMlVzSUhaaGJIVmxLVHRjYmlBZ0lDQWdJQ0FnZlN3Z1puVnVZM1JwYjI0b2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZxWldOMEtIQnliMjFwYzJVc0lISmxZWE52YmlrN1hHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHaGhibVJzWlUxaGVXSmxWR2hsYm1GaWJHVW9jSEp2YldselpTd2diV0Y1WW1WVWFHVnVZV0pzWlN3Z2RHaGxiaWtnZTF4dUlDQWdJQ0FnYVdZZ0tHMWhlV0psVkdobGJtRmliR1V1WTI5dWMzUnlkV04wYjNJZ1BUMDlJSEJ5YjIxcGMyVXVZMjl1YzNSeWRXTjBiM0lnSmlaY2JpQWdJQ0FnSUNBZ0lDQjBhR1Z1SUQwOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa2RHaGxiaVFrWkdWbVlYVnNkQ0FtSmx4dUlDQWdJQ0FnSUNBZ0lHTnZibk4wY25WamRHOXlMbkpsYzI5c2RtVWdQVDA5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKSEpsYzI5c2RtVWtKR1JsWm1GMWJIUXBJSHRjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrYUdGdVpHeGxUM2R1VkdobGJtRmliR1VvY0hKdmJXbHpaU3dnYldGNVltVlVhR1Z1WVdKc1pTazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvZEdobGJpQTlQVDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrUjBWVVgxUklSVTVmUlZKU1QxSXBJSHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpXcGxZM1FvY0hKdmJXbHpaU3dnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrUjBWVVgxUklSVTVmUlZKU1QxSXVaWEp5YjNJcE8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFJvWlc0Z1BUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHWjFiR1pwYkd3b2NISnZiV2x6WlN3Z2JXRjVZbVZVYUdWdVlXSnNaU2s3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1JwYzBaMWJtTjBhVzl1S0hSb1pXNHBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2FHRnVaR3hsUm05eVpXbG5ibFJvWlc1aFlteGxLSEJ5YjIxcGMyVXNJRzFoZVdKbFZHaGxibUZpYkdVc0lIUm9aVzRwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHWjFiR1pwYkd3b2NISnZiV2x6WlN3Z2JXRjVZbVZVYUdWdVlXSnNaU2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J5WlhOdmJIWmxLSEJ5YjIxcGMyVXNJSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQnBaaUFvY0hKdmJXbHpaU0E5UFQwZ2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnFaV04wS0hCeWIyMXBjMlVzSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhObGJHWkdkV3htYVd4c2JXVnVkQ2dwS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1J2WW1wbFkzUlBja1oxYm1OMGFXOXVLSFpoYkhWbEtTa2dlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JvWVc1a2JHVk5ZWGxpWlZSb1pXNWhZbXhsS0hCeWIyMXBjMlVzSUhaaGJIVmxMQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JuWlhSVWFHVnVLSFpoYkhWbEtTazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUm1kV3htYVd4c0tIQnliMjFwYzJVc0lIWmhiSFZsS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J3ZFdKc2FYTm9VbVZxWldOMGFXOXVLSEJ5YjIxcGMyVXBJSHRjYmlBZ0lDQWdJR2xtSUNod2NtOXRhWE5sTGw5dmJtVnljbTl5S1NCN1hHNGdJQ0FnSUNBZ0lIQnliMjFwYzJVdVgyOXVaWEp5YjNJb2NISnZiV2x6WlM1ZmNtVnpkV3gwS1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NIVmliR2x6YUNod2NtOXRhWE5sS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JtZFd4bWFXeHNLSEJ5YjIxcGMyVXNJSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQnBaaUFvY0hKdmJXbHpaUzVmYzNSaGRHVWdJVDA5SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkZCRlRrUkpUa2NwSUhzZ2NtVjBkWEp1T3lCOVhHNWNiaUFnSUNBZ0lIQnliMjFwYzJVdVgzSmxjM1ZzZENBOUlIWmhiSFZsTzF4dUlDQWdJQ0FnY0hKdmJXbHpaUzVmYzNSaGRHVWdQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JHVlV4R1NVeE1SVVE3WEc1Y2JpQWdJQ0FnSUdsbUlDaHdjbTl0YVhObExsOXpkV0p6WTNKcFltVnljeTVzWlc1bmRHZ2dJVDA5SURBcElIdGNiaUFnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkdGellYQW9iR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjSFZpYkdsemFDd2djSEp2YldselpTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnFaV04wS0hCeWIyMXBjMlVzSUhKbFlYTnZiaWtnZTF4dUlDQWdJQ0FnYVdZZ0tIQnliMjFwYzJVdVgzTjBZWFJsSUNFOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlFSVTVFU1U1SEtTQjdJSEpsZEhWeWJqc2dmVnh1SUNBZ0lDQWdjSEp2YldselpTNWZjM1JoZEdVZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlNSVXBGUTFSRlJEdGNiaUFnSUNBZ0lIQnliMjFwYzJVdVgzSmxjM1ZzZENBOUlISmxZWE52Ymp0Y2JseHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR0Z6WVhBb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NIVmliR2x6YUZKbGFtVmpkR2x2Yml3Z2NISnZiV2x6WlNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrYzNWaWMyTnlhV0psS0hCaGNtVnVkQ3dnWTJocGJHUXNJRzl1Um5Wc1ptbHNiRzFsYm5Rc0lHOXVVbVZxWldOMGFXOXVLU0I3WEc0Z0lDQWdJQ0IyWVhJZ2MzVmljMk55YVdKbGNuTWdQU0J3WVhKbGJuUXVYM04xWW5OamNtbGlaWEp6TzF4dUlDQWdJQ0FnZG1GeUlHeGxibWQwYUNBOUlITjFZbk5qY21saVpYSnpMbXhsYm1kMGFEdGNibHh1SUNBZ0lDQWdjR0Z5Wlc1MExsOXZibVZ5Y205eUlEMGdiblZzYkR0Y2JseHVJQ0FnSUNBZ2MzVmljMk55YVdKbGNuTmJiR1Z1WjNSb1hTQTlJR05vYVd4a08xeHVJQ0FnSUNBZ2MzVmljMk55YVdKbGNuTmJiR1Z1WjNSb0lDc2diR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtSbFZNUmtsTVRFVkVYU0E5SUc5dVJuVnNabWxzYkcxbGJuUTdYRzRnSUNBZ0lDQnpkV0p6WTNKcFltVnljMXRzWlc1bmRHZ2dLeUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JTUlVwRlExUkZSRjBnSUQwZ2IyNVNaV3BsWTNScGIyNDdYRzVjYmlBZ0lDQWdJR2xtSUNoc1pXNW5kR2dnUFQwOUlEQWdKaVlnY0dGeVpXNTBMbDl6ZEdGMFpTa2dlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa1lYTmhjQ2hzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J3ZFdKc2FYTm9MQ0J3WVhKbGJuUXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pIQjFZbXhwYzJnb2NISnZiV2x6WlNrZ2UxeHVJQ0FnSUNBZ2RtRnlJSE4xWW5OamNtbGlaWEp6SUQwZ2NISnZiV2x6WlM1ZmMzVmljMk55YVdKbGNuTTdYRzRnSUNBZ0lDQjJZWElnYzJWMGRHeGxaQ0E5SUhCeWIyMXBjMlV1WDNOMFlYUmxPMXh1WEc0Z0lDQWdJQ0JwWmlBb2MzVmljMk55YVdKbGNuTXViR1Z1WjNSb0lEMDlQU0F3S1NCN0lISmxkSFZ5YmpzZ2ZWeHVYRzRnSUNBZ0lDQjJZWElnWTJocGJHUXNJR05oYkd4aVlXTnJMQ0JrWlhSaGFXd2dQU0J3Y205dGFYTmxMbDl5WlhOMWJIUTdYRzVjYmlBZ0lDQWdJR1p2Y2lBb2RtRnlJR2tnUFNBd095QnBJRHdnYzNWaWMyTnlhV0psY25NdWJHVnVaM1JvT3lCcElDczlJRE1wSUh0Y2JpQWdJQ0FnSUNBZ1kyaHBiR1FnUFNCemRXSnpZM0pwWW1WeWMxdHBYVHRjYmlBZ0lDQWdJQ0FnWTJGc2JHSmhZMnNnUFNCemRXSnpZM0pwWW1WeWMxdHBJQ3NnYzJWMGRHeGxaRjA3WEc1Y2JpQWdJQ0FnSUNBZ2FXWWdLR05vYVd4a0tTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrYVc1MmIydGxRMkZzYkdKaFkyc29jMlYwZEd4bFpDd2dZMmhwYkdRc0lHTmhiR3hpWVdOckxDQmtaWFJoYVd3cE8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJR05oYkd4aVlXTnJLR1JsZEdGcGJDazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnY0hKdmJXbHpaUzVmYzNWaWMyTnlhV0psY25NdWJHVnVaM1JvSUQwZ01EdGNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSRmNuSnZjazlpYW1WamRDZ3BJSHRjYmlBZ0lDQWdJSFJvYVhNdVpYSnliM0lnUFNCdWRXeHNPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIWmhjaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JVVWxsZlEwRlVRMGhmUlZKU1QxSWdQU0J1WlhjZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1JYSnliM0pQWW1wbFkzUW9LVHRjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSFJ5ZVVOaGRHTm9LR05oYkd4aVlXTnJMQ0JrWlhSaGFXd3BJSHRjYmlBZ0lDQWdJSFJ5ZVNCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCallXeHNZbUZqYXloa1pYUmhhV3dwTzF4dUlDQWdJQ0FnZlNCallYUmphQ2hsS1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pGUlNXVjlEUVZSRFNGOUZVbEpQVWk1bGNuSnZjaUE5SUdVN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSVVVsbGZRMEZVUTBoZlJWSlNUMUk3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWthVzUyYjJ0bFEyRnNiR0poWTJzb2MyVjBkR3hsWkN3Z2NISnZiV2x6WlN3Z1kyRnNiR0poWTJzc0lHUmxkR0ZwYkNrZ2UxeHVJQ0FnSUNBZ2RtRnlJR2hoYzBOaGJHeGlZV05ySUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1JwYzBaMWJtTjBhVzl1S0dOaGJHeGlZV05yS1N4Y2JpQWdJQ0FnSUNBZ0lDQjJZV3gxWlN3Z1pYSnliM0lzSUhOMVkyTmxaV1JsWkN3Z1ptRnBiR1ZrTzF4dVhHNGdJQ0FnSUNCcFppQW9hR0Z6UTJGc2JHSmhZMnNwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnNkV1VnUFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSMGNubERZWFJqYUNoallXeHNZbUZqYXl3Z1pHVjBZV2xzS1R0Y2JseHVJQ0FnSUNBZ0lDQnBaaUFvZG1Gc2RXVWdQVDA5SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkZSU1dWOURRVlJEU0Y5RlVsSlBVaWtnZTF4dUlDQWdJQ0FnSUNBZ0lHWmhhV3hsWkNBOUlIUnlkV1U3WEc0Z0lDQWdJQ0FnSUNBZ1pYSnliM0lnUFNCMllXeDFaUzVsY25KdmNqdGNiaUFnSUNBZ0lDQWdJQ0IyWVd4MVpTQTlJRzUxYkd3N1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdjM1ZqWTJWbFpHVmtJRDBnZEhKMVpUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHdjbTl0YVhObElEMDlQU0IyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhKbGFtVmpkQ2h3Y205dGFYTmxMQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JqWVc1dWIzUlNaWFIxY201UGQyNG9LU2s3WEc0Z0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lIWmhiSFZsSUQwZ1pHVjBZV2xzTzF4dUlDQWdJQ0FnSUNCemRXTmpaV1ZrWldRZ1BTQjBjblZsTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCcFppQW9jSEp2YldselpTNWZjM1JoZEdVZ0lUMDlJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRkJGVGtSSlRrY3BJSHRjYmlBZ0lDQWdJQ0FnTHk4Z2JtOXZjRnh1SUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hvWVhORFlXeHNZbUZqYXlBbUppQnpkV05qWldWa1pXUXBJSHRjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WemIyeDJaU2h3Y205dGFYTmxMQ0IyWVd4MVpTazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLR1poYVd4bFpDa2dlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J5WldwbFkzUW9jSEp2YldselpTd2daWEp5YjNJcE8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHpaWFIwYkdWa0lEMDlQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JHVlV4R1NVeE1SVVFwSUh0Y2JpQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1puVnNabWxzYkNod2NtOXRhWE5sTENCMllXeDFaU2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hObGRIUnNaV1FnUFQwOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pGSkZTa1ZEVkVWRUtTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEpsYW1WamRDaHdjbTl0YVhObExDQjJZV3gxWlNrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrYVc1cGRHbGhiR2w2WlZCeWIyMXBjMlVvY0hKdmJXbHpaU3dnY21WemIyeDJaWElwSUh0Y2JpQWdJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQWdJSEpsYzI5c2RtVnlLR1oxYm1OMGFXOXVJSEpsYzI5c2RtVlFjbTl0YVhObEtIWmhiSFZsS1h0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnlaWE52YkhabEtIQnliMjFwYzJVc0lIWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ2ZTd2dablZ1WTNScGIyNGdjbVZxWldOMFVISnZiV2x6WlNoeVpXRnpiMjRwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnlaV3BsWTNRb2NISnZiV2x6WlN3Z2NtVmhjMjl1S1R0Y2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQjlJR05oZEdOb0tHVXBJSHRjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WcVpXTjBLSEJ5YjIxcGMyVXNJR1VwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpHRnNiQ1FrWVd4c0tHVnVkSEpwWlhNcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCdVpYY2diR2xpSkdWek5pUndjbTl0YVhObEpHVnVkVzFsY21GMGIzSWtKR1JsWm1GMWJIUW9kR2hwY3l3Z1pXNTBjbWxsY3lrdWNISnZiV2x6WlR0Y2JpQWdJQ0I5WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKR0ZzYkNRa1pHVm1ZWFZzZENBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkdGc2JDUWtZV3hzTzF4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpISmhZMlVrSkhKaFkyVW9aVzUwY21sbGN5a2dlMXh1SUNBZ0lDQWdMeXBxYzJocGJuUWdkbUZzYVdSMGFHbHpPblJ5ZFdVZ0tpOWNiaUFnSUNBZ0lIWmhjaUJEYjI1emRISjFZM1J2Y2lBOUlIUm9hWE03WEc1Y2JpQWdJQ0FnSUhaaGNpQndjbTl0YVhObElEMGdibVYzSUVOdmJuTjBjblZqZEc5eUtHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHNXZiM0FwTzF4dVhHNGdJQ0FnSUNCcFppQW9JV3hwWWlSbGN6WWtjSEp2YldselpTUjFkR2xzY3lRa2FYTkJjbkpoZVNobGJuUnlhV1Z6S1NrZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnlaV3BsWTNRb2NISnZiV2x6WlN3Z2JtVjNJRlI1Y0dWRmNuSnZjaWduV1c5MUlHMTFjM1FnY0dGemN5QmhiaUJoY25KaGVTQjBieUJ5WVdObExpY3BLVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEJ5YjIxcGMyVTdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJSFpoY2lCc1pXNW5kR2dnUFNCbGJuUnlhV1Z6TG14bGJtZDBhRHRjYmx4dUlDQWdJQ0FnWm5WdVkzUnBiMjRnYjI1R2RXeG1hV3hzYldWdWRDaDJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnlaWE52YkhabEtIQnliMjFwYzJVc0lIWmhiSFZsS1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1puVnVZM1JwYjI0Z2IyNVNaV3BsWTNScGIyNG9jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEpsYW1WamRDaHdjbTl0YVhObExDQnlaV0Z6YjI0cE8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2NISnZiV2x6WlM1ZmMzUmhkR1VnUFQwOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pGQkZUa1JKVGtjZ0ppWWdhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSE4xWW5OamNtbGlaU2hEYjI1emRISjFZM1J2Y2k1eVpYTnZiSFpsS0dWdWRISnBaWE5iYVYwcExDQjFibVJsWm1sdVpXUXNJRzl1Um5Wc1ptbHNiRzFsYm5Rc0lHOXVVbVZxWldOMGFXOXVLVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnY21WMGRYSnVJSEJ5YjIxcGMyVTdYRzRnSUNBZ2ZWeHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNSeVlXTmxKQ1JrWldaaGRXeDBJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbUZqWlNRa2NtRmpaVHRjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNSeVpXcGxZM1FrSkhKbGFtVmpkQ2h5WldGemIyNHBJSHRjYmlBZ0lDQWdJQzhxYW5Ob2FXNTBJSFpoYkdsa2RHaHBjenAwY25WbElDb3ZYRzRnSUNBZ0lDQjJZWElnUTI5dWMzUnlkV04wYjNJZ1BTQjBhR2x6TzF4dUlDQWdJQ0FnZG1GeUlIQnliMjFwYzJVZ1BTQnVaWGNnUTI5dWMzUnlkV04wYjNJb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2JtOXZjQ2s3WEc0Z0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J5WldwbFkzUW9jSEp2YldselpTd2djbVZoYzI5dUtUdGNiaUFnSUNBZ0lISmxkSFZ5YmlCd2NtOXRhWE5sTzF4dUlDQWdJSDFjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbVZxWldOMEpDUmtaV1poZFd4MElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa2NtVnFaV04wSkNSeVpXcGxZM1E3WEc1Y2JpQWdJQ0IyWVhJZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrSkdOdmRXNTBaWElnUFNBd08xeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrSkc1bFpXUnpVbVZ6YjJ4MlpYSW9LU0I3WEc0Z0lDQWdJQ0IwYUhKdmR5QnVaWGNnVkhsd1pVVnljbTl5S0NkWmIzVWdiWFZ6ZENCd1lYTnpJR0VnY21WemIyeDJaWElnWm5WdVkzUnBiMjRnWVhNZ2RHaGxJR1pwY25OMElHRnlaM1Z0Wlc1MElIUnZJSFJvWlNCd2NtOXRhWE5sSUdOdmJuTjBjblZqZEc5eUp5azdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrSkc1bFpXUnpUbVYzS0NrZ2UxeHVJQ0FnSUNBZ2RHaHliM2NnYm1WM0lGUjVjR1ZGY25KdmNpaGNJa1poYVd4bFpDQjBieUJqYjI1emRISjFZM1FnSjFCeWIyMXBjMlVuT2lCUWJHVmhjMlVnZFhObElIUm9aU0FuYm1WM0p5QnZjR1Z5WVhSdmNpd2dkR2hwY3lCdlltcGxZM1FnWTI5dWMzUnlkV04wYjNJZ1kyRnVibTkwSUdKbElHTmhiR3hsWkNCaGN5QmhJR1oxYm1OMGFXOXVMbHdpS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0IyWVhJZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrSkdSbFptRjFiSFFnUFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0hKdmJXbHpaU1FrVUhKdmJXbHpaVHRjYmlBZ0lDQXZLaXBjYmlBZ0lDQWdJRkJ5YjIxcGMyVWdiMkpxWldOMGN5QnlaWEJ5WlhObGJuUWdkR2hsSUdWMlpXNTBkV0ZzSUhKbGMzVnNkQ0J2WmlCaGJpQmhjM2x1WTJoeWIyNXZkWE1nYjNCbGNtRjBhVzl1TGlCVWFHVmNiaUFnSUNBZ0lIQnlhVzFoY25rZ2QyRjVJRzltSUdsdWRHVnlZV04wYVc1bklIZHBkR2dnWVNCd2NtOXRhWE5sSUdseklIUm9jbTkxWjJnZ2FYUnpJR0IwYUdWdVlDQnRaWFJvYjJRc0lIZG9hV05vWEc0Z0lDQWdJQ0J5WldkcGMzUmxjbk1nWTJGc2JHSmhZMnR6SUhSdklISmxZMlZwZG1VZ1pXbDBhR1Z5SUdFZ2NISnZiV2x6WlNkeklHVjJaVzUwZFdGc0lIWmhiSFZsSUc5eUlIUm9aU0J5WldGemIyNWNiaUFnSUNBZ0lIZG9lU0IwYUdVZ2NISnZiV2x6WlNCallXNXViM1FnWW1VZ1puVnNabWxzYkdWa0xseHVYRzRnSUNBZ0lDQlVaWEp0YVc1dmJHOW5lVnh1SUNBZ0lDQWdMUzB0TFMwdExTMHRMUzFjYmx4dUlDQWdJQ0FnTFNCZ2NISnZiV2x6WldBZ2FYTWdZVzRnYjJKcVpXTjBJRzl5SUdaMWJtTjBhVzl1SUhkcGRHZ2dZU0JnZEdobGJtQWdiV1YwYUc5a0lIZG9iM05sSUdKbGFHRjJhVzl5SUdOdmJtWnZjbTF6SUhSdklIUm9hWE1nYzNCbFkybG1hV05oZEdsdmJpNWNiaUFnSUNBZ0lDMGdZSFJvWlc1aFlteGxZQ0JwY3lCaGJpQnZZbXBsWTNRZ2IzSWdablZ1WTNScGIyNGdkR2hoZENCa1pXWnBibVZ6SUdFZ1lIUm9aVzVnSUcxbGRHaHZaQzVjYmlBZ0lDQWdJQzBnWUhaaGJIVmxZQ0JwY3lCaGJua2diR1ZuWVd3Z1NtRjJZVk5qY21sd2RDQjJZV3gxWlNBb2FXNWpiSFZrYVc1bklIVnVaR1ZtYVc1bFpDd2dZU0IwYUdWdVlXSnNaU3dnYjNJZ1lTQndjbTl0YVhObEtTNWNiaUFnSUNBZ0lDMGdZR1Y0WTJWd2RHbHZibUFnYVhNZ1lTQjJZV3gxWlNCMGFHRjBJR2x6SUhSb2NtOTNiaUIxYzJsdVp5QjBhR1VnZEdoeWIzY2djM1JoZEdWdFpXNTBMbHh1SUNBZ0lDQWdMU0JnY21WaGMyOXVZQ0JwY3lCaElIWmhiSFZsSUhSb1lYUWdhVzVrYVdOaGRHVnpJSGRvZVNCaElIQnliMjFwYzJVZ2QyRnpJSEpsYW1WamRHVmtMbHh1SUNBZ0lDQWdMU0JnYzJWMGRHeGxaR0FnZEdobElHWnBibUZzSUhKbGMzUnBibWNnYzNSaGRHVWdiMllnWVNCd2NtOXRhWE5sTENCbWRXeG1hV3hzWldRZ2IzSWdjbVZxWldOMFpXUXVYRzVjYmlBZ0lDQWdJRUVnY0hKdmJXbHpaU0JqWVc0Z1ltVWdhVzRnYjI1bElHOW1JSFJvY21WbElITjBZWFJsY3pvZ2NHVnVaR2x1Wnl3Z1puVnNabWxzYkdWa0xDQnZjaUJ5WldwbFkzUmxaQzVjYmx4dUlDQWdJQ0FnVUhKdmJXbHpaWE1nZEdoaGRDQmhjbVVnWm5Wc1ptbHNiR1ZrSUdoaGRtVWdZU0JtZFd4bWFXeHNiV1Z1ZENCMllXeDFaU0JoYm1RZ1lYSmxJR2x1SUhSb1pTQm1kV3htYVd4c1pXUmNiaUFnSUNBZ0lITjBZWFJsTGlBZ1VISnZiV2x6WlhNZ2RHaGhkQ0JoY21VZ2NtVnFaV04wWldRZ2FHRjJaU0JoSUhKbGFtVmpkR2x2YmlCeVpXRnpiMjRnWVc1a0lHRnlaU0JwYmlCMGFHVmNiaUFnSUNBZ0lISmxhbVZqZEdWa0lITjBZWFJsTGlBZ1FTQm1kV3htYVd4c2JXVnVkQ0IyWVd4MVpTQnBjeUJ1WlhabGNpQmhJSFJvWlc1aFlteGxMbHh1WEc0Z0lDQWdJQ0JRY205dGFYTmxjeUJqWVc0Z1lXeHpieUJpWlNCellXbGtJSFJ2SUNweVpYTnZiSFpsS2lCaElIWmhiSFZsTGlBZ1NXWWdkR2hwY3lCMllXeDFaU0JwY3lCaGJITnZJR0ZjYmlBZ0lDQWdJSEJ5YjIxcGMyVXNJSFJvWlc0Z2RHaGxJRzl5YVdkcGJtRnNJSEJ5YjIxcGMyVW5jeUJ6WlhSMGJHVmtJSE4wWVhSbElIZHBiR3dnYldGMFkyZ2dkR2hsSUhaaGJIVmxKM05jYmlBZ0lDQWdJSE5sZEhSc1pXUWdjM1JoZEdVdUlDQlRieUJoSUhCeWIyMXBjMlVnZEdoaGRDQXFjbVZ6YjJ4MlpYTXFJR0VnY0hKdmJXbHpaU0IwYUdGMElISmxhbVZqZEhNZ2QybHNiRnh1SUNBZ0lDQWdhWFJ6Wld4bUlISmxhbVZqZEN3Z1lXNWtJR0VnY0hKdmJXbHpaU0IwYUdGMElDcHlaWE52YkhabGN5b2dZU0J3Y205dGFYTmxJSFJvWVhRZ1puVnNabWxzYkhNZ2QybHNiRnh1SUNBZ0lDQWdhWFJ6Wld4bUlHWjFiR1pwYkd3dVhHNWNibHh1SUNBZ0lDQWdRbUZ6YVdNZ1ZYTmhaMlU2WEc0Z0lDQWdJQ0F0TFMwdExTMHRMUzB0TFMxY2JseHVJQ0FnSUNBZ1lHQmdhbk5jYmlBZ0lDQWdJSFpoY2lCd2NtOXRhWE5sSUQwZ2JtVjNJRkJ5YjIxcGMyVW9ablZ1WTNScGIyNG9jbVZ6YjJ4MlpTd2djbVZxWldOMEtTQjdYRzRnSUNBZ0lDQWdJQzh2SUc5dUlITjFZMk5sYzNOY2JpQWdJQ0FnSUNBZ2NtVnpiMngyWlNoMllXeDFaU2s3WEc1Y2JpQWdJQ0FnSUNBZ0x5OGdiMjRnWm1GcGJIVnlaVnh1SUNBZ0lDQWdJQ0J5WldwbFkzUW9jbVZoYzI5dUtUdGNiaUFnSUNBZ0lIMHBPMXh1WEc0Z0lDQWdJQ0J3Y205dGFYTmxMblJvWlc0b1puVnVZM1JwYjI0b2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdiMjRnWm5Wc1ptbHNiRzFsYm5SY2JpQWdJQ0FnSUgwc0lHWjFibU4wYVc5dUtISmxZWE52YmlrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ2YmlCeVpXcGxZM1JwYjI1Y2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ1lHQmdYRzVjYmlBZ0lDQWdJRUZrZG1GdVkyVmtJRlZ6WVdkbE9seHVJQ0FnSUNBZ0xTMHRMUzB0TFMwdExTMHRMUzB0WEc1Y2JpQWdJQ0FnSUZCeWIyMXBjMlZ6SUhOb2FXNWxJSGRvWlc0Z1lXSnpkSEpoWTNScGJtY2dZWGRoZVNCaGMzbHVZMmh5YjI1dmRYTWdhVzUwWlhKaFkzUnBiMjV6SUhOMVkyZ2dZWE5jYmlBZ0lDQWdJR0JZVFV4SWRIUndVbVZ4ZFdWemRHQnpMbHh1WEc0Z0lDQWdJQ0JnWUdCcWMxeHVJQ0FnSUNBZ1puVnVZM1JwYjI0Z1oyVjBTbE5QVGloMWNtd3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzVsZHlCUWNtOXRhWE5sS0daMWJtTjBhVzl1S0hKbGMyOXNkbVVzSUhKbGFtVmpkQ2w3WEc0Z0lDQWdJQ0FnSUNBZ2RtRnlJSGhvY2lBOUlHNWxkeUJZVFV4SWRIUndVbVZ4ZFdWemRDZ3BPMXh1WEc0Z0lDQWdJQ0FnSUNBZ2VHaHlMbTl3Wlc0b0owZEZWQ2NzSUhWeWJDazdYRzRnSUNBZ0lDQWdJQ0FnZUdoeUxtOXVjbVZoWkhsemRHRjBaV05vWVc1blpTQTlJR2hoYm1Sc1pYSTdYRzRnSUNBZ0lDQWdJQ0FnZUdoeUxuSmxjM0J2Ym5ObFZIbHdaU0E5SUNkcWMyOXVKenRjYmlBZ0lDQWdJQ0FnSUNCNGFISXVjMlYwVW1WeGRXVnpkRWhsWVdSbGNpZ25RV05qWlhCMEp5d2dKMkZ3Y0d4cFkyRjBhVzl1TDJwemIyNG5LVHRjYmlBZ0lDQWdJQ0FnSUNCNGFISXVjMlZ1WkNncE8xeHVYRzRnSUNBZ0lDQWdJQ0FnWm5WdVkzUnBiMjRnYUdGdVpHeGxjaWdwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbkpsWVdSNVUzUmhkR1VnUFQwOUlIUm9hWE11UkU5T1JTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXpkR0YwZFhNZ1BUMDlJREl3TUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjMjlzZG1Vb2RHaHBjeTV5WlhOd2IyNXpaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZxWldOMEtHNWxkeUJGY25KdmNpZ25aMlYwU2xOUFRqb2dZQ2NnS3lCMWNtd2dLeUFuWUNCbVlXbHNaV1FnZDJsMGFDQnpkR0YwZFhNNklGc25JQ3NnZEdocGN5NXpkR0YwZFhNZ0t5QW5YU2NwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUgwN1hHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JuWlhSS1UwOU9LQ2N2Y0c5emRITXVhbk52YmljcExuUm9aVzRvWm5WdVkzUnBiMjRvYW5OdmJpa2dlMXh1SUNBZ0lDQWdJQ0F2THlCdmJpQm1kV3htYVd4c2JXVnVkRnh1SUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRvY21WaGMyOXVLU0I3WEc0Z0lDQWdJQ0FnSUM4dklHOXVJSEpsYW1WamRHbHZibHh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0JnWUdCY2JseHVJQ0FnSUNBZ1ZXNXNhV3RsSUdOaGJHeGlZV05yY3l3Z2NISnZiV2x6WlhNZ1lYSmxJR2R5WldGMElHTnZiWEJ2YzJGaWJHVWdjSEpwYldsMGFYWmxjeTVjYmx4dUlDQWdJQ0FnWUdCZ2FuTmNiaUFnSUNBZ0lGQnliMjFwYzJVdVlXeHNLRnRjYmlBZ0lDQWdJQ0FnWjJWMFNsTlBUaWduTDNCdmMzUnpKeWtzWEc0Z0lDQWdJQ0FnSUdkbGRFcFRUMDRvSnk5amIyMXRaVzUwY3ljcFhHNGdJQ0FnSUNCZEtTNTBhR1Z1S0daMWJtTjBhVzl1S0haaGJIVmxjeWw3WEc0Z0lDQWdJQ0FnSUhaaGJIVmxjMXN3WFNBdkx5QTlQaUJ3YjNOMGMwcFRUMDVjYmlBZ0lDQWdJQ0FnZG1Gc2RXVnpXekZkSUM4dklEMCtJR052YlcxbGJuUnpTbE5QVGx4dVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMllXeDFaWE03WEc0Z0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUdCZ1lGeHVYRzRnSUNBZ0lDQkFZMnhoYzNNZ1VISnZiV2x6WlZ4dUlDQWdJQ0FnUUhCaGNtRnRJSHRtZFc1amRHbHZibjBnY21WemIyeDJaWEpjYmlBZ0lDQWdJRlZ6WldaMWJDQm1iM0lnZEc5dmJHbHVaeTVjYmlBZ0lDQWdJRUJqYjI1emRISjFZM1J2Y2x4dUlDQWdJQ292WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pGQnliMjFwYzJVb2NtVnpiMngyWlhJcElIdGNiaUFnSUNBZ0lIUm9hWE11WDJsa0lEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pHTnZkVzUwWlhJckt6dGNiaUFnSUNBZ0lIUm9hWE11WDNOMFlYUmxJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnZEdocGN5NWZjbVZ6ZFd4MElEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdkR2hwY3k1ZmMzVmljMk55YVdKbGNuTWdQU0JiWFR0Y2JseHVJQ0FnSUNBZ2FXWWdLR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRzV2YjNBZ0lUMDlJSEpsYzI5c2RtVnlLU0I3WEc0Z0lDQWdJQ0FnSUhSNWNHVnZaaUJ5WlhOdmJIWmxjaUFoUFQwZ0oyWjFibU4wYVc5dUp5QW1KaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUWtibVZsWkhOU1pYTnZiSFpsY2lncE8xeHVJQ0FnSUNBZ0lDQjBhR2x6SUdsdWMzUmhibU5sYjJZZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrSkZCeWIyMXBjMlVnUHlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNScGJtbDBhV0ZzYVhwbFVISnZiV2x6WlNoMGFHbHpMQ0J5WlhOdmJIWmxjaWtnT2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0hKdmJXbHpaU1FrYm1WbFpITk9aWGNvS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUWtVSEp2YldselpTNWhiR3dnUFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0hKdmJXbHpaU1JoYkd3a0pHUmxabUYxYkhRN1hHNGdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtKRkJ5YjIxcGMyVXVjbUZqWlNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkhKaFkyVWtKR1JsWm1GMWJIUTdYRzRnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrSkZCeWIyMXBjMlV1Y21WemIyeDJaU0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKSEpsYzI5c2RtVWtKR1JsWm1GMWJIUTdYRzRnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrSkZCeWIyMXBjMlV1Y21WcVpXTjBJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbVZxWldOMEpDUmtaV1poZFd4ME8xeHVJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1JRY205dGFYTmxMbDl6WlhSVFkyaGxaSFZzWlhJZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYzJWMFUyTm9aV1IxYkdWeU8xeHVJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1JRY205dGFYTmxMbDl6WlhSQmMyRndJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pITmxkRUZ6WVhBN1hHNGdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtKRkJ5YjIxcGMyVXVYMkZ6WVhBZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWVhOaGNEdGNibHh1SUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSUWNtOXRhWE5sTG5CeWIzUnZkSGx3WlNBOUlIdGNiaUFnSUNBZ0lHTnZibk4wY25WamRHOXlPaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUWtVSEp2YldselpTeGNibHh1SUNBZ0lDOHFLbHh1SUNBZ0lDQWdWR2hsSUhCeWFXMWhjbmtnZDJGNUlHOW1JR2x1ZEdWeVlXTjBhVzVuSUhkcGRHZ2dZU0J3Y205dGFYTmxJR2x6SUhSb2NtOTFaMmdnYVhSeklHQjBhR1Z1WUNCdFpYUm9iMlFzWEc0Z0lDQWdJQ0IzYUdsamFDQnlaV2RwYzNSbGNuTWdZMkZzYkdKaFkydHpJSFJ2SUhKbFkyVnBkbVVnWldsMGFHVnlJR0VnY0hKdmJXbHpaU2R6SUdWMlpXNTBkV0ZzSUhaaGJIVmxJRzl5SUhSb1pWeHVJQ0FnSUNBZ2NtVmhjMjl1SUhkb2VTQjBhR1VnY0hKdmJXbHpaU0JqWVc1dWIzUWdZbVVnWm5Wc1ptbHNiR1ZrTGx4dVhHNGdJQ0FnSUNCZ1lHQnFjMXh1SUNBZ0lDQWdabWx1WkZWelpYSW9LUzUwYUdWdUtHWjFibU4wYVc5dUtIVnpaWElwZTF4dUlDQWdJQ0FnSUNBdkx5QjFjMlZ5SUdseklHRjJZV2xzWVdKc1pWeHVJQ0FnSUNBZ2ZTd2dablZ1WTNScGIyNG9jbVZoYzI5dUtYdGNiaUFnSUNBZ0lDQWdMeThnZFhObGNpQnBjeUIxYm1GMllXbHNZV0pzWlN3Z1lXNWtJSGx2ZFNCaGNtVWdaMmwyWlc0Z2RHaGxJSEpsWVhOdmJpQjNhSGxjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnWUdCZ1hHNWNiaUFnSUNBZ0lFTm9ZV2x1YVc1blhHNGdJQ0FnSUNBdExTMHRMUzB0TFZ4dVhHNGdJQ0FnSUNCVWFHVWdjbVYwZFhKdUlIWmhiSFZsSUc5bUlHQjBhR1Z1WUNCcGN5QnBkSE5sYkdZZ1lTQndjbTl0YVhObExpQWdWR2hwY3lCelpXTnZibVFzSUNka2IzZHVjM1J5WldGdEoxeHVJQ0FnSUNBZ2NISnZiV2x6WlNCcGN5QnlaWE52YkhabFpDQjNhWFJvSUhSb1pTQnlaWFIxY200Z2RtRnNkV1VnYjJZZ2RHaGxJR1pwY25OMElIQnliMjFwYzJVbmN5Qm1kV3htYVd4c2JXVnVkRnh1SUNBZ0lDQWdiM0lnY21WcVpXTjBhVzl1SUdoaGJtUnNaWElzSUc5eUlISmxhbVZqZEdWa0lHbG1JSFJvWlNCb1lXNWtiR1Z5SUhSb2NtOTNjeUJoYmlCbGVHTmxjSFJwYjI0dVhHNWNiaUFnSUNBZ0lHQmdZR3B6WEc0Z0lDQWdJQ0JtYVc1a1ZYTmxjaWdwTG5Sb1pXNG9ablZ1WTNScGIyNGdLSFZ6WlhJcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIVnpaWEl1Ym1GdFpUdGNiaUFnSUNBZ0lIMHNJR1oxYm1OMGFXOXVJQ2h5WldGemIyNHBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJQ2RrWldaaGRXeDBJRzVoYldVbk8xeHVJQ0FnSUNBZ2ZTa3VkR2hsYmlobWRXNWpkR2x2YmlBb2RYTmxjazVoYldVcElIdGNiaUFnSUNBZ0lDQWdMeThnU1dZZ1lHWnBibVJWYzJWeVlDQm1kV3htYVd4c1pXUXNJR0IxYzJWeVRtRnRaV0FnZDJsc2JDQmlaU0IwYUdVZ2RYTmxjaWR6SUc1aGJXVXNJRzkwYUdWeWQybHpaU0JwZEZ4dUlDQWdJQ0FnSUNBdkx5QjNhV3hzSUdKbElHQW5aR1ZtWVhWc2RDQnVZVzFsSjJCY2JpQWdJQ0FnSUgwcE8xeHVYRzRnSUNBZ0lDQm1hVzVrVlhObGNpZ3BMblJvWlc0b1puVnVZM1JwYjI0Z0tIVnpaWElwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkR2IzVnVaQ0IxYzJWeUxDQmlkWFFnYzNScGJHd2dkVzVvWVhCd2VTY3BPMXh1SUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRnS0hKbFlYTnZiaWtnZTF4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjJCbWFXNWtWWE5sY21BZ2NtVnFaV04wWldRZ1lXNWtJSGRsSjNKbElIVnVhR0Z3Y0hrbktUdGNiaUFnSUNBZ0lIMHBMblJvWlc0b1puVnVZM1JwYjI0Z0tIWmhiSFZsS1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRzVsZG1WeUlISmxZV05vWldSY2JpQWdJQ0FnSUgwc0lHWjFibU4wYVc5dUlDaHlaV0Z6YjI0cElIdGNiaUFnSUNBZ0lDQWdMeThnYVdZZ1lHWnBibVJWYzJWeVlDQm1kV3htYVd4c1pXUXNJR0J5WldGemIyNWdJSGRwYkd3Z1ltVWdKMFp2ZFc1a0lIVnpaWElzSUdKMWRDQnpkR2xzYkNCMWJtaGhjSEI1Snk1Y2JpQWdJQ0FnSUNBZ0x5OGdTV1lnWUdacGJtUlZjMlZ5WUNCeVpXcGxZM1JsWkN3Z1lISmxZWE52Ym1BZ2QybHNiQ0JpWlNBbllHWnBibVJWYzJWeVlDQnlaV3BsWTNSbFpDQmhibVFnZDJVbmNtVWdkVzVvWVhCd2VTY3VYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJR0JnWUZ4dUlDQWdJQ0FnU1dZZ2RHaGxJR1J2ZDI1emRISmxZVzBnY0hKdmJXbHpaU0JrYjJWeklHNXZkQ0J6Y0dWamFXWjVJR0VnY21WcVpXTjBhVzl1SUdoaGJtUnNaWElzSUhKbGFtVmpkR2x2YmlCeVpXRnpiMjV6SUhkcGJHd2dZbVVnY0hKdmNHRm5ZWFJsWkNCbWRYSjBhR1Z5SUdSdmQyNXpkSEpsWVcwdVhHNWNiaUFnSUNBZ0lHQmdZR3B6WEc0Z0lDQWdJQ0JtYVc1a1ZYTmxjaWdwTG5Sb1pXNG9ablZ1WTNScGIyNGdLSFZ6WlhJcElIdGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRkJsWkdGbmIyZHBZMkZzUlhoalpYQjBhVzl1S0NkVmNITjBjbVZoYlNCbGNuSnZjaWNwTzF4dUlDQWdJQ0FnZlNrdWRHaGxiaWhtZFc1amRHbHZiaUFvZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z2JtVjJaWElnY21WaFkyaGxaRnh1SUNBZ0lDQWdmU2t1ZEdobGJpaG1kVzVqZEdsdmJpQW9kbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdMeThnYm1WMlpYSWdjbVZoWTJobFpGeHVJQ0FnSUNBZ2ZTd2dablZ1WTNScGIyNGdLSEpsWVhOdmJpa2dlMXh1SUNBZ0lDQWdJQ0F2THlCVWFHVWdZRkJsWkdkaFoyOWphV0ZzUlhoalpYQjBhVzl1WUNCcGN5QndjbTl3WVdkaGRHVmtJR0ZzYkNCMGFHVWdkMkY1SUdSdmQyNGdkRzhnYUdWeVpWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnUVhOemFXMXBiR0YwYVc5dVhHNGdJQ0FnSUNBdExTMHRMUzB0TFMwdExTMWNibHh1SUNBZ0lDQWdVMjl0WlhScGJXVnpJSFJvWlNCMllXeDFaU0I1YjNVZ2QyRnVkQ0IwYnlCd2NtOXdZV2RoZEdVZ2RHOGdZU0JrYjNkdWMzUnlaV0Z0SUhCeWIyMXBjMlVnWTJGdUlHOXViSGtnWW1WY2JpQWdJQ0FnSUhKbGRISnBaWFpsWkNCaGMzbHVZMmh5YjI1dmRYTnNlUzRnVkdocGN5QmpZVzRnWW1VZ1lXTm9hV1YyWldRZ1lua2djbVYwZFhKdWFXNW5JR0VnY0hKdmJXbHpaU0JwYmlCMGFHVmNiaUFnSUNBZ0lHWjFiR1pwYkd4dFpXNTBJRzl5SUhKbGFtVmpkR2x2YmlCb1lXNWtiR1Z5TGlCVWFHVWdaRzkzYm5OMGNtVmhiU0J3Y205dGFYTmxJSGRwYkd3Z2RHaGxiaUJpWlNCd1pXNWthVzVuWEc0Z0lDQWdJQ0IxYm5ScGJDQjBhR1VnY21WMGRYSnVaV1FnY0hKdmJXbHpaU0JwY3lCelpYUjBiR1ZrTGlCVWFHbHpJR2x6SUdOaGJHeGxaQ0FxWVhOemFXMXBiR0YwYVc5dUtpNWNibHh1SUNBZ0lDQWdZR0JnYW5OY2JpQWdJQ0FnSUdacGJtUlZjMlZ5S0NrdWRHaGxiaWhtZFc1amRHbHZiaUFvZFhObGNpa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdabWx1WkVOdmJXMWxiblJ6UW5sQmRYUm9iM0lvZFhObGNpazdYRzRnSUNBZ0lDQjlLUzUwYUdWdUtHWjFibU4wYVc5dUlDaGpiMjF0Wlc1MGN5a2dlMXh1SUNBZ0lDQWdJQ0F2THlCVWFHVWdkWE5sY2lkeklHTnZiVzFsYm5SeklHRnlaU0J1YjNjZ1lYWmhhV3hoWW14bFhHNGdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lHQmdZRnh1WEc0Z0lDQWdJQ0JKWmlCMGFHVWdZWE56YVcxc2FXRjBaV1FnY0hKdmJXbHpaU0J5WldwbFkzUnpMQ0IwYUdWdUlIUm9aU0JrYjNkdWMzUnlaV0Z0SUhCeWIyMXBjMlVnZDJsc2JDQmhiSE52SUhKbGFtVmpkQzVjYmx4dUlDQWdJQ0FnWUdCZ2FuTmNiaUFnSUNBZ0lHWnBibVJWYzJWeUtDa3VkR2hsYmlobWRXNWpkR2x2YmlBb2RYTmxjaWtnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWm1sdVpFTnZiVzFsYm5SelFubEJkWFJvYjNJb2RYTmxjaWs3WEc0Z0lDQWdJQ0I5S1M1MGFHVnVLR1oxYm1OMGFXOXVJQ2hqYjIxdFpXNTBjeWtnZTF4dUlDQWdJQ0FnSUNBdkx5QkpaaUJnWm1sdVpFTnZiVzFsYm5SelFubEJkWFJvYjNKZ0lHWjFiR1pwYkd4ekxDQjNaU2RzYkNCb1lYWmxJSFJvWlNCMllXeDFaU0JvWlhKbFhHNGdJQ0FnSUNCOUxDQm1kVzVqZEdsdmJpQW9jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQWdJQzh2SUVsbUlHQm1hVzVrUTI5dGJXVnVkSE5DZVVGMWRHaHZjbUFnY21WcVpXTjBjeXdnZDJVbmJHd2dhR0YyWlNCMGFHVWdjbVZoYzI5dUlHaGxjbVZjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnWUdCZ1hHNWNiaUFnSUNBZ0lGTnBiWEJzWlNCRmVHRnRjR3hsWEc0Z0lDQWdJQ0F0TFMwdExTMHRMUzB0TFMwdExWeHVYRzRnSUNBZ0lDQlRlVzVqYUhKdmJtOTFjeUJGZUdGdGNHeGxYRzVjYmlBZ0lDQWdJR0JnWUdwaGRtRnpZM0pwY0hSY2JpQWdJQ0FnSUhaaGNpQnlaWE4xYkhRN1hHNWNiaUFnSUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0FnSUhKbGMzVnNkQ0E5SUdacGJtUlNaWE4xYkhRb0tUdGNiaUFnSUNBZ0lDQWdMeThnYzNWalkyVnpjMXh1SUNBZ0lDQWdmU0JqWVhSamFDaHlaV0Z6YjI0cElIdGNiaUFnSUNBZ0lDQWdMeThnWm1GcGJIVnlaVnh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdZR0JnWEc1Y2JpQWdJQ0FnSUVWeWNtSmhZMnNnUlhoaGJYQnNaVnh1WEc0Z0lDQWdJQ0JnWUdCcWMxeHVJQ0FnSUNBZ1ptbHVaRkpsYzNWc2RDaG1kVzVqZEdsdmJpaHlaWE4xYkhRc0lHVnljaWw3WEc0Z0lDQWdJQ0FnSUdsbUlDaGxjbklwSUh0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJtWVdsc2RYSmxYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnTHk4Z2MzVmpZMlZ6YzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lHQmdZRnh1WEc0Z0lDQWdJQ0JRY205dGFYTmxJRVY0WVcxd2JHVTdYRzVjYmlBZ0lDQWdJR0JnWUdwaGRtRnpZM0pwY0hSY2JpQWdJQ0FnSUdacGJtUlNaWE4xYkhRb0tTNTBhR1Z1S0daMWJtTjBhVzl1S0hKbGMzVnNkQ2w3WEc0Z0lDQWdJQ0FnSUM4dklITjFZMk5sYzNOY2JpQWdJQ0FnSUgwc0lHWjFibU4wYVc5dUtISmxZWE52YmlsN1hHNGdJQ0FnSUNBZ0lDOHZJR1poYVd4MWNtVmNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdZR0JnWEc1Y2JpQWdJQ0FnSUVGa2RtRnVZMlZrSUVWNFlXMXdiR1ZjYmlBZ0lDQWdJQzB0TFMwdExTMHRMUzB0TFMwdFhHNWNiaUFnSUNBZ0lGTjVibU5vY205dWIzVnpJRVY0WVcxd2JHVmNibHh1SUNBZ0lDQWdZR0JnYW1GMllYTmpjbWx3ZEZ4dUlDQWdJQ0FnZG1GeUlHRjFkR2h2Y2l3Z1ltOXZhM003WEc1Y2JpQWdJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQWdJR0YxZEdodmNpQTlJR1pwYm1SQmRYUm9iM0lvS1R0Y2JpQWdJQ0FnSUNBZ1ltOXZhM01nSUQwZ1ptbHVaRUp2YjJ0elFubEJkWFJvYjNJb1lYVjBhRzl5S1R0Y2JpQWdJQ0FnSUNBZ0x5OGdjM1ZqWTJWemMxeHVJQ0FnSUNBZ2ZTQmpZWFJqYUNoeVpXRnpiMjRwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdabUZwYkhWeVpWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ1lHQmdYRzVjYmlBZ0lDQWdJRVZ5Y21KaFkyc2dSWGhoYlhCc1pWeHVYRzRnSUNBZ0lDQmdZR0JxYzF4dVhHNGdJQ0FnSUNCbWRXNWpkR2x2YmlCbWIzVnVaRUp2YjJ0ektHSnZiMnR6S1NCN1hHNWNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdablZ1WTNScGIyNGdabUZwYkhWeVpTaHlaV0Z6YjI0cElIdGNibHh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JtYVc1a1FYVjBhRzl5S0daMWJtTjBhVzl1S0dGMWRHaHZjaXdnWlhKeUtYdGNiaUFnSUNBZ0lDQWdhV1lnS0dWeWNpa2dlMXh1SUNBZ0lDQWdJQ0FnSUdaaGFXeDFjbVVvWlhKeUtUdGNiaUFnSUNBZ0lDQWdJQ0F2THlCbVlXbHNkWEpsWEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHWnBibVJDYjI5dmEzTkNlVUYxZEdodmNpaGhkWFJvYjNJc0lHWjFibU4wYVc5dUtHSnZiMnR6TENCbGNuSXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dWeWNpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1poYVd4MWNtVW9aWEp5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTkxYm1SQ2IyOXJjeWhpYjI5cmN5azdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JqWVhSamFDaHlaV0Z6YjI0cElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1poYVd4MWNtVW9jbVZoYzI5dUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQWdJSDBnWTJGMFkyZ29aWEp5YjNJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdaaGFXeDFjbVVvWlhKeUtUdGNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdjM1ZqWTJWemMxeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJR0JnWUZ4dVhHNGdJQ0FnSUNCUWNtOXRhWE5sSUVWNFlXMXdiR1U3WEc1Y2JpQWdJQ0FnSUdCZ1lHcGhkbUZ6WTNKcGNIUmNiaUFnSUNBZ0lHWnBibVJCZFhSb2IzSW9LUzVjYmlBZ0lDQWdJQ0FnZEdobGJpaG1hVzVrUW05dmEzTkNlVUYxZEdodmNpa3VYRzRnSUNBZ0lDQWdJSFJvWlc0b1puVnVZM1JwYjI0b1ltOXZhM01wZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJR1p2ZFc1a0lHSnZiMnR6WEc0Z0lDQWdJQ0I5S1M1allYUmphQ2htZFc1amRHbHZiaWh5WldGemIyNHBlMXh1SUNBZ0lDQWdJQ0F2THlCemIyMWxkR2hwYm1jZ2QyVnVkQ0IzY205dVoxeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnUUcxbGRHaHZaQ0IwYUdWdVhHNGdJQ0FnSUNCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCdmJrWjFiR1pwYkd4bFpGeHVJQ0FnSUNBZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ2IyNVNaV3BsWTNSbFpGeHVJQ0FnSUNBZ1ZYTmxablZzSUdadmNpQjBiMjlzYVc1bkxseHVJQ0FnSUNBZ1FISmxkSFZ5YmlCN1VISnZiV2x6WlgxY2JpQWdJQ0FxTDF4dUlDQWdJQ0FnZEdobGJqb2diR2xpSkdWek5pUndjbTl0YVhObEpIUm9aVzRrSkdSbFptRjFiSFFzWEc1Y2JpQWdJQ0F2S2lwY2JpQWdJQ0FnSUdCallYUmphR0FnYVhNZ2MybHRjR3g1SUhOMVoyRnlJR1p2Y2lCZ2RHaGxiaWgxYm1SbFptbHVaV1FzSUc5dVVtVnFaV04wYVc5dUtXQWdkMmhwWTJnZ2JXRnJaWE1nYVhRZ2RHaGxJSE5oYldWY2JpQWdJQ0FnSUdGeklIUm9aU0JqWVhSamFDQmliRzlqYXlCdlppQmhJSFJ5ZVM5allYUmphQ0J6ZEdGMFpXMWxiblF1WEc1Y2JpQWdJQ0FnSUdCZ1lHcHpYRzRnSUNBZ0lDQm1kVzVqZEdsdmJpQm1hVzVrUVhWMGFHOXlLQ2w3WEc0Z0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWduWTI5MWJHUnVKM1FnWm1sdVpDQjBhR0YwSUdGMWRHaHZjaWNwTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBdkx5QnplVzVqYUhKdmJtOTFjMXh1SUNBZ0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUNBZ1ptbHVaRUYxZEdodmNpZ3BPMXh1SUNBZ0lDQWdmU0JqWVhSamFDaHlaV0Z6YjI0cElIdGNiaUFnSUNBZ0lDQWdMeThnYzI5dFpYUm9hVzVuSUhkbGJuUWdkM0p2Ym1kY2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0x5OGdZWE41Ym1NZ2QybDBhQ0J3Y205dGFYTmxjMXh1SUNBZ0lDQWdabWx1WkVGMWRHaHZjaWdwTG1OaGRHTm9LR1oxYm1OMGFXOXVLSEpsWVhOdmJpbDdYRzRnSUNBZ0lDQWdJQzh2SUhOdmJXVjBhR2x1WnlCM1pXNTBJSGR5YjI1blhHNGdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lHQmdZRnh1WEc0Z0lDQWdJQ0JBYldWMGFHOWtJR05oZEdOb1hHNGdJQ0FnSUNCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCdmJsSmxhbVZqZEdsdmJseHVJQ0FnSUNBZ1ZYTmxablZzSUdadmNpQjBiMjlzYVc1bkxseHVJQ0FnSUNBZ1FISmxkSFZ5YmlCN1VISnZiV2x6WlgxY2JpQWdJQ0FxTDF4dUlDQWdJQ0FnSjJOaGRHTm9Kem9nWm5WdVkzUnBiMjRvYjI1U1pXcGxZM1JwYjI0cElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11ZEdobGJpaHVkV3hzTENCdmJsSmxhbVZqZEdsdmJpazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZUdGNiaUFnSUNCMllYSWdiR2xpSkdWek5pUndjbTl0YVhObEpHVnVkVzFsY21GMGIzSWtKR1JsWm1GMWJIUWdQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtaVzUxYldWeVlYUnZjaVFrUlc1MWJXVnlZWFJ2Y2p0Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtaVzUxYldWeVlYUnZjaVFrUlc1MWJXVnlZWFJ2Y2loRGIyNXpkSEoxWTNSdmNpd2dhVzV3ZFhRcElIdGNiaUFnSUNBZ0lIUm9hWE11WDJsdWMzUmhibU5sUTI5dWMzUnlkV04wYjNJZ1BTQkRiMjV6ZEhKMVkzUnZjanRjYmlBZ0lDQWdJSFJvYVhNdWNISnZiV2x6WlNBOUlHNWxkeUJEYjI1emRISjFZM1J2Y2loc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSdWIyOXdLVHRjYmx4dUlDQWdJQ0FnYVdZZ0tFRnljbUY1TG1selFYSnlZWGtvYVc1d2RYUXBLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVYMmx1Y0hWMElDQWdJQ0E5SUdsdWNIVjBPMXh1SUNBZ0lDQWdJQ0IwYUdsekxteGxibWQwYUNBZ0lDQWdQU0JwYm5CMWRDNXNaVzVuZEdnN1hHNGdJQ0FnSUNBZ0lIUm9hWE11WDNKbGJXRnBibWx1WnlBOUlHbHVjSFYwTG14bGJtZDBhRHRjYmx4dUlDQWdJQ0FnSUNCMGFHbHpMbDl5WlhOMWJIUWdQU0J1WlhjZ1FYSnlZWGtvZEdocGN5NXNaVzVuZEdncE8xeHVYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbXhsYm1kMGFDQTlQVDBnTUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR1oxYkdacGJHd29kR2hwY3k1d2NtOXRhWE5sTENCMGFHbHpMbDl5WlhOMWJIUXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXViR1Z1WjNSb0lEMGdkR2hwY3k1c1pXNW5kR2dnZkh3Z01EdGNiaUFnSUNBZ0lDQWdJQ0IwYUdsekxsOWxiblZ0WlhKaGRHVW9LVHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1ZmNtVnRZV2x1YVc1bklEMDlQU0F3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JtZFd4bWFXeHNLSFJvYVhNdWNISnZiV2x6WlN3Z2RHaHBjeTVmY21WemRXeDBLVHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxhbVZqZENoMGFHbHpMbkJ5YjIxcGMyVXNJSFJvYVhNdVgzWmhiR2xrWVhScGIyNUZjbkp2Y2lncEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWlc1MWJXVnlZWFJ2Y2lRa1JXNTFiV1Z5WVhSdmNpNXdjbTkwYjNSNWNHVXVYM1poYkdsa1lYUnBiMjVGY25KdmNpQTlJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJRzVsZHlCRmNuSnZjaWduUVhKeVlYa2dUV1YwYUc5a2N5QnRkWE4wSUdKbElIQnliM1pwWkdWa0lHRnVJRUZ5Y21GNUp5azdYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSbGJuVnRaWEpoZEc5eUpDUkZiblZ0WlhKaGRHOXlMbkJ5YjNSdmRIbHdaUzVmWlc1MWJXVnlZWFJsSUQwZ1puVnVZM1JwYjI0b0tTQjdYRzRnSUNBZ0lDQjJZWElnYkdWdVozUm9JQ0E5SUhSb2FYTXViR1Z1WjNSb08xeHVJQ0FnSUNBZ2RtRnlJR2x1Y0hWMElDQWdQU0IwYUdsekxsOXBibkIxZER0Y2JseHVJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUhSb2FYTXVYM04wWVhSbElEMDlQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JRUlU1RVNVNUhJQ1ltSUdrZ1BDQnNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbDlsWVdOb1JXNTBjbmtvYVc1d2RYUmJhVjBzSUdrcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwN1hHNWNiaUFnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWlc1MWJXVnlZWFJ2Y2lRa1JXNTFiV1Z5WVhSdmNpNXdjbTkwYjNSNWNHVXVYMlZoWTJoRmJuUnllU0E5SUdaMWJtTjBhVzl1S0dWdWRISjVMQ0JwS1NCN1hHNGdJQ0FnSUNCMllYSWdZeUE5SUhSb2FYTXVYMmx1YzNSaGJtTmxRMjl1YzNSeWRXTjBiM0k3WEc0Z0lDQWdJQ0IyWVhJZ2NtVnpiMngyWlNBOUlHTXVjbVZ6YjJ4MlpUdGNibHh1SUNBZ0lDQWdhV1lnS0hKbGMyOXNkbVVnUFQwOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkhKbGMyOXNkbVVrSkdSbFptRjFiSFFwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJSFJvWlc0Z1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUm5aWFJVYUdWdUtHVnVkSEo1S1R0Y2JseHVJQ0FnSUNBZ0lDQnBaaUFvZEdobGJpQTlQVDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSFJvWlc0a0pHUmxabUYxYkhRZ0ppWmNiaUFnSUNBZ0lDQWdJQ0FnSUdWdWRISjVMbDl6ZEdGMFpTQWhQVDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVUVWT1JFbE9SeWtnZTF4dUlDQWdJQ0FnSUNBZ0lIUm9hWE11WDNObGRIUnNaV1JCZENobGJuUnllUzVmYzNSaGRHVXNJR2tzSUdWdWRISjVMbDl5WlhOMWJIUXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVnZaaUIwYUdWdUlDRTlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdkR2hwY3k1ZmNtVnRZV2x1YVc1bkxTMDdYRzRnSUNBZ0lDQWdJQ0FnZEdocGN5NWZjbVZ6ZFd4MFcybGRJRDBnWlc1MGNuazdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvWXlBOVBUMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pHUmxabUYxYkhRcElIdGNiaUFnSUNBZ0lDQWdJQ0IyWVhJZ2NISnZiV2x6WlNBOUlHNWxkeUJqS0d4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkc1dmIzQXBPMXh1SUNBZ0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdoaGJtUnNaVTFoZVdKbFZHaGxibUZpYkdVb2NISnZiV2x6WlN3Z1pXNTBjbmtzSUhSb1pXNHBPMXh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVYM2RwYkd4VFpYUjBiR1ZCZENod2NtOXRhWE5sTENCcEtUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0IwYUdsekxsOTNhV3hzVTJWMGRHeGxRWFFvYm1WM0lHTW9ablZ1WTNScGIyNG9jbVZ6YjJ4MlpTa2dleUJ5WlhOdmJIWmxLR1Z1ZEhKNUtUc2dmU2tzSUdrcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQjBhR2x6TGw5M2FXeHNVMlYwZEd4bFFYUW9jbVZ6YjJ4MlpTaGxiblJ5ZVNrc0lHa3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMDdYRzVjYmlBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1pXNTFiV1Z5WVhSdmNpUWtSVzUxYldWeVlYUnZjaTV3Y205MGIzUjVjR1V1WDNObGRIUnNaV1JCZENBOUlHWjFibU4wYVc5dUtITjBZWFJsTENCcExDQjJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ2RtRnlJSEJ5YjIxcGMyVWdQU0IwYUdsekxuQnliMjFwYzJVN1hHNWNiaUFnSUNBZ0lHbG1JQ2h3Y205dGFYTmxMbDl6ZEdGMFpTQTlQVDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVUVWT1JFbE9SeWtnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbDl5WlcxaGFXNXBibWN0TFR0Y2JseHVJQ0FnSUNBZ0lDQnBaaUFvYzNSaGRHVWdQVDA5SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkZKRlNrVkRWRVZFS1NCN1hHNGdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZxWldOMEtIQnliMjFwYzJVc0lIWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQjBhR2x6TGw5eVpYTjFiSFJiYVYwZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NWZjbVZ0WVdsdWFXNW5JRDA5UFNBd0tTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR1oxYkdacGJHd29jSEp2YldselpTd2dkR2hwY3k1ZmNtVnpkV3gwS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR1Z1ZFcxbGNtRjBiM0lrSkVWdWRXMWxjbUYwYjNJdWNISnZkRzkwZVhCbExsOTNhV3hzVTJWMGRHeGxRWFFnUFNCbWRXNWpkR2x2Ymlod2NtOXRhWE5sTENCcEtTQjdYRzRnSUNBZ0lDQjJZWElnWlc1MWJXVnlZWFJ2Y2lBOUlIUm9hWE03WEc1Y2JpQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhOMVluTmpjbWxpWlNod2NtOXRhWE5sTENCMWJtUmxabWx1WldRc0lHWjFibU4wYVc5dUtIWmhiSFZsS1NCN1hHNGdJQ0FnSUNBZ0lHVnVkVzFsY21GMGIzSXVYM05sZEhSc1pXUkJkQ2hzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JHVlV4R1NVeE1SVVFzSUdrc0lIWmhiSFZsS1R0Y2JpQWdJQ0FnSUgwc0lHWjFibU4wYVc5dUtISmxZWE52YmlrZ2UxeHVJQ0FnSUNBZ0lDQmxiblZ0WlhKaGRHOXlMbDl6WlhSMGJHVmtRWFFvYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVWtWS1JVTlVSVVFzSUdrc0lISmxZWE52YmlrN1hHNGdJQ0FnSUNCOUtUdGNiaUFnSUNCOU8xeHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3YjJ4NVptbHNiQ1FrY0c5c2VXWnBiR3dvS1NCN1hHNGdJQ0FnSUNCMllYSWdiRzlqWVd3N1hHNWNiaUFnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdaMnh2WW1Gc0lDRTlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJR3h2WTJGc0lEMGdaMnh2WW1Gc08xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaDBlWEJsYjJZZ2MyVnNaaUFoUFQwZ0ozVnVaR1ZtYVc1bFpDY3BJSHRjYmlBZ0lDQWdJQ0FnSUNCc2IyTmhiQ0E5SUhObGJHWTdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJSFJ5ZVNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dlkyRnNJRDBnUm5WdVkzUnBiMjRvSjNKbGRIVnliaUIwYUdsekp5a29LVHRjYmlBZ0lDQWdJQ0FnSUNCOUlHTmhkR05vSUNobEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnbmNHOXNlV1pwYkd3Z1ptRnBiR1ZrSUdKbFkyRjFjMlVnWjJ4dlltRnNJRzlpYW1WamRDQnBjeUIxYm1GMllXbHNZV0pzWlNCcGJpQjBhR2x6SUdWdWRtbHliMjV0Wlc1MEp5azdYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCMllYSWdVQ0E5SUd4dlkyRnNMbEJ5YjIxcGMyVTdYRzVjYmlBZ0lDQWdJR2xtSUNoUUlDWW1JRTlpYW1WamRDNXdjbTkwYjNSNWNHVXVkRzlUZEhKcGJtY3VZMkZzYkNoUUxuSmxjMjlzZG1Vb0tTa2dQVDA5SUNkYmIySnFaV04wSUZCeWIyMXBjMlZkSnlBbUppQWhVQzVqWVhOMEtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdiRzlqWVd3dVVISnZiV2x6WlNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSa1pXWmhkV3gwTzF4dUlDQWdJSDFjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ2YkhsbWFXeHNKQ1JrWldaaGRXeDBJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ2YkhsbWFXeHNKQ1J3YjJ4NVptbHNiRHRjYmx4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrZFcxa0pDUkZVelpRY205dGFYTmxJRDBnZTF4dUlDQWdJQ0FnSjFCeWIyMXBjMlVuT2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0hKdmJXbHpaU1FrWkdWbVlYVnNkQ3hjYmlBZ0lDQWdJQ2R3YjJ4NVptbHNiQ2M2SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3YjJ4NVptbHNiQ1FrWkdWbVlYVnNkRnh1SUNBZ0lIMDdYRzVjYmlBZ0lDQXZLaUJuYkc5aVlXd2daR1ZtYVc1bE9uUnlkV1VnYlc5a2RXeGxPblJ5ZFdVZ2QybHVaRzkzT2lCMGNuVmxJQ292WEc0Z0lDQWdhV1lnS0hSNWNHVnZaaUJrWldacGJtVWdQVDA5SUNkbWRXNWpkR2x2YmljZ0ppWWdaR1ZtYVc1bFd5ZGhiV1FuWFNrZ2UxeHVJQ0FnSUNBZ1pHVm1hVzVsS0daMWJtTjBhVzl1S0NrZ2V5QnlaWFIxY200Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWdFpDUWtSVk0yVUhKdmJXbHpaVHNnZlNrN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNoMGVYQmxiMllnYlc5a2RXeGxJQ0U5UFNBbmRXNWtaV1pwYm1Wa0p5QW1KaUJ0YjJSMWJHVmJKMlY0Y0c5eWRITW5YU2tnZTF4dUlDQWdJQ0FnYlc5a2RXeGxXeWRsZUhCdmNuUnpKMTBnUFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrZFcxa0pDUkZVelpRY205dGFYTmxPMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9kSGx3Wlc5bUlIUm9hWE1nSVQwOUlDZDFibVJsWm1sdVpXUW5LU0I3WEc0Z0lDQWdJQ0IwYUdseld5ZEZVelpRY205dGFYTmxKMTBnUFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrZFcxa0pDUkZVelpRY205dGFYTmxPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2IyeDVabWxzYkNRa1pHVm1ZWFZzZENncE8xeHVmU2t1WTJGc2JDaDBhR2x6S1R0Y2JseHVJbDE5IiwiKGZ1bmN0aW9uIChwcm9jZXNzLGdsb2JhbCl7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9saWIvY29uZmlnJyk7XG52YXIgdG9rZW4gPSByZXF1aXJlKCcuL2xpYi90b2tlbicpO1xudmFyIHRhZyA9IHJlcXVpcmUoJy4vbGliL3RhZycpO1xudmFyIGluZm8gPSByZXF1aXJlKCcuL2xpYi9pbmZvJyk7XG52YXIgbGFuZ3VhZ2VzID0gcmVxdWlyZSgnLi9saWIvbGFuZ3VhZ2VzJyk7XG52YXIgY2FsbGJhY2sgPSByZXF1aXJlKCcuL2xpYi9jYWxsYmFjaycpO1xudmFyIGNvbG9yID0gcmVxdWlyZSgnLi9saWIvY29sb3InKTtcbnZhciBmZWVkYmFjayA9IHJlcXVpcmUoJy4vbGliL2ZlZWRiYWNrJyk7XG52YXIgdXNhZ2UgPSByZXF1aXJlKCcuL2xpYi91c2FnZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5DbGFyaWZhaSA9IHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbmZpZy5zZXQoJ2FwaUVuZHBvaW50Jywgb3B0aW9ucy5hcGlFbmRwb2ludCB8fCBwcm9jZXNzLmVudi5BUElfRU5EUE9JTlQgfHwgJ2h0dHBzOi8vYXBpLmNsYXJpZmFpLmNvbScpO1xuICAgIGNvbmZpZy5zZXQoJ2NsaWVudElkJywgb3B0aW9ucy5jbGllbnRJZCB8fCBwcm9jZXNzLmVudi5DTElFTlRfSUQpO1xuICAgIGNvbmZpZy5zZXQoJ2NsaWVudFNlY3JldCcsIG9wdGlvbnMuY2xpZW50U2VjcmV0IHx8IHByb2Nlc3MuZW52LkNMSUVOVF9TRUNSRVQpO1xuICAgIHRva2VuLmRlbGV0ZSgpO1xuICB9LFxuICAvKipcbiAgKiBHZXRzIGEgdG9rZW4gZnJvbSB0aGUgQVBJIHVzaW5nIGNsaWVudCBjcmVkZW50aWFsc1xuICAqIEBtZXRob2QgZ2V0VG9rZW5cbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSAgICBjYWxsYmFjayAgICBBIG5vZGUtc3R5bGUgY2FsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgZXJyLCB0b2tlbiAob3B0aW9uYWwpXG4gICogQHJldHVybiB7UHJvbWlzZSh0b2tlbiwgZXJyb3J9IEEgUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB0b2tlbiBzdHJpbmcgb3IgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvclxuICAqL1xuICBnZXRUb2tlbjogZnVuY3Rpb24oX2NhbGxiYWNrKSB7XG4gICAgdmFyIHByb21pc2UgPSB0b2tlbi5nZXQoKTtcbiAgICBjYWxsYmFjay5oYW5kbGUocHJvbWlzZSwgX2NhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgLyoqXG4gICogU2V0cyB0aGUgdG9rZW4gdG8gdXNlIGZvciB0aGUgQVBJXG4gICogQG1ldGhvZCBzZXRUb2tlblxuICAqIEBwYXJhbSB7U3RyaW5nfSAgICBfdG9rZW4gICAgVGhlIHRva2VuIHlvdSBhcmUgc2V0dGluZ1xuICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdG9rZW4gaGFzIHZhbGlkIGZpZWxkcywgZmFsc2UgaWYgbm90XG4gICovXG4gIHNldFRva2VuOiBmdW5jdGlvbihfdG9rZW4pIHtcbiAgICByZXR1cm4gdG9rZW4uc2V0KF90b2tlbik7XG4gIH0sXG4gIC8qKlxuICAqIERlbGV0ZXMgdGhlIHRva2VuXG4gICogQG1ldGhvZCBkZWxldGVUb2tlblxuICAqL1xuICBkZWxldGVUb2tlbjogZnVuY3Rpb24oKSB7XG4gICAgdG9rZW4uZGVsZXRlKCk7XG4gIH0sXG4gIC8qKlxuICAqIEdldHMgdGFncyBnaXZlbiBhIHVybFxuICAqIEBtZXRob2QgZ2V0VGFnc0J5VXJsXG4gICogQHBhcmFtIHtTdHJpbmd9IG9yIHtBcnJheX0gICAgICB1cmwgICAgICAgICAgICAgQSBwdWJsaWNseSBhY2Nlc3NpYmxlIHVybCBvZiB0aGUgaW1hZ2UuXG4gICogQHBhcmFtIHtPYmplY3R9ICAgICAgICAgICAgICAgICBvcHRpb25zICAgICAgICAgT2JqZWN0IHdpdGgga2V5cyBleHBsYWluZWQgYmVsb3c6IChvcHRpb25hbClcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gICAgICAgICAgICAgIG1vZGVsICAgICAgICAgICBUaGUgbW9kZWwgdXNlZCB0byB0YWcgdGhlIGltYWdlIChvcHRpb25hbClcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gICAgICAgICAgICAgIGxhbmd1YWdlICAgICAgICBUaGUgbGFuZ3VhZ2UgdXNlZCB0byB0YWcgdGhlIGltYWdlIChvcHRpb25hbClcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gb3Ige0FycmF5fSAgIHNlbGVjdENsYXNzZXMgICBSZXN0cmljdCB0aGUgdGFncyByZXR1cm5lZFxuICAqICAgIEBwYXJhbSB7U3RyaW5nfSBvciB7QXJyYXl9ICAgbG9jYWxJZCAgICAgICAgIFByb3ZpZGUgYSBsb2NhbElkIGZvciBlYWNoIHVybCB0byBzaW1wbGlmeSB0cmFja2luZyByZXF1ZXN0cyAob3B0aW9uYWwpXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBub2RlLXN0eWxlIGNhbGJhY2sgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGVyciwgdG9rZW4gKG9wdGlvbmFsKVxuICAqIEByZXR1cm4ge1Byb21pc2UodG9rZW4sIGVycm9yfSAgICAgICAgICAgICAgICAgIEEgUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSBBUEkgcmVzcG9uc2Ugb3IgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvclxuICAqL1xuICBnZXRUYWdzQnlVcmw6IGZ1bmN0aW9uKHVybCwgb3B0aW9ucywgX2NhbGxiYWNrKSB7XG4gICAgdmFyIGNhbGxiYWNrRm4gPSBfY2FsbGJhY2s7XG4gICAgaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyApIHtcbiAgICAgIGNhbGxiYWNrRm4gPSBvcHRpb25zO1xuICAgIH07XG4gICAgdmFyIHByb21pc2UgPSB0YWcuZ2V0QnlVcmwodXJsLCBvcHRpb25zKTtcbiAgICBjYWxsYmFjay5oYW5kbGUocHJvbWlzZSwgY2FsbGJhY2tGbik7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH0sXG4gIC8qKlxuICAqIEdldHMgdGFncyBnaXZlbiBpbWFnZSBieXRlc1xuICAqIEBtZXRob2QgZ2V0VGFnc0J5SW1hZ2VCeXRlc1xuICAqIEBwYXJhbSB7U3RyaW5nfSAgICAgICAgICAgICAgICAgaW1hZ2UgYnl0ZXMgICAgIEJhc2U2NCBlbmNvZGVkIGltYWdlIGJ5dGVzLlxuICAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgICAgb3B0aW9ucyAgICAgICAgIE9iamVjdCB3aXRoIGtleXMgZXhwbGFpbmVkIGJlbG93OiAob3B0aW9uYWwpXG4gICogICAgQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICBtb2RlbCAgICAgICAgICAgVGhlIG1vZGVsIHVzZWQgdG8gdGFnIHRoZSBpbWFnZSAob3B0aW9uYWwpXG4gICogICAgQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICBsYW5ndWFnZSAgICAgICAgVGhlIGxhbmd1YWdlIHVzZWQgdG8gdGFnIHRoZSBpbWFnZSAob3B0aW9uYWwpXG4gICogICAgQHBhcmFtIHtTdHJpbmd9IG9yIHtBcnJheX0gICBzZWxlY3RDbGFzc2VzICAgUmVzdHJpY3QgdGhlIHRhZ3MgcmV0dXJuZWRcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gb3Ige0FycmF5fSAgIGxvY2FsSWQgICAgICAgICBQcm92aWRlIGEgbG9jYWxJZCBmb3IgZWFjaCB1cmwgdG8gc2ltcGxpZnkgdHJhY2tpbmcgcmVxdWVzdHMgKG9wdGlvbmFsKVxuICAqIEBwYXJhbSB7RnVuY3Rpb259ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgbm9kZS1zdHlsZSBjYWxiYWNrIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBlcnIsIHRva2VuIChvcHRpb25hbClcbiAgKiBAcmV0dXJuIHtQcm9taXNlKHRva2VuLCBlcnJvcn0gICAgICAgICAgICAgICAgICBBIFByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgQVBJIHJlc3BvbnNlIG9yIHJlamVjdGVkIHdpdGggYW4gZXJyb3JcbiAgKi9cbiAgZ2V0VGFnc0J5SW1hZ2VCeXRlczogZnVuY3Rpb24oaW1hZ2VCeXRlcywgb3B0aW9ucywgX2NhbGxiYWNrKSB7XG4gICAgdmFyIGNhbGxiYWNrRm4gPSBfY2FsbGJhY2s7XG4gICAgaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyApIHtcbiAgICAgIGNhbGxiYWNrRm4gPSBvcHRpb25zO1xuICAgIH07XG4gICAgdmFyIHByb21pc2UgPSB0YWcuZ2V0QnlJbWFnZUJ5dGVzKGltYWdlQnl0ZXMsIG9wdGlvbnMpO1xuICAgIGNhbGxiYWNrLmhhbmRsZShwcm9taXNlLCBjYWxsYmFja0ZuKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgLyoqXG4gICogR2V0cyBBUEkgaW5mb1xuICAqIEBtZXRob2QgZ2V0SW5mb1xuICAqIEBwYXJhbSB7RnVuY3Rpb259ICAgIGNhbGxiYWNrICAgIEEgbm9kZS1zdHlsZSBjYWxiYWNrIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBlcnIsIHRva2VuIChvcHRpb25hbClcbiAgKiBAcmV0dXJuIHtQcm9taXNlKHRva2VuLCBlcnJvcn0gQSBQcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIEFQSSByZXNwb25zZSBvciByZWplY3RlZCB3aXRoIGFuIGVycm9yXG4gICovXG4gIGdldEluZm86IGZ1bmN0aW9uKF9jYWxsYmFjaykge1xuICAgIHZhciBwcm9taXNlID0gaW5mby5nZXQoKTtcbiAgICBjYWxsYmFjay5oYW5kbGUocHJvbWlzZSwgX2NhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgLyoqXG4gICogR2V0cyBsYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IHRoZSBBUElcbiAgKiBAbWV0aG9kIGdldExhbmd1YWdlc1xuICAqIEBwYXJhbSB7RnVuY3Rpb259ICAgIGNhbGxiYWNrICAgIEEgbm9kZS1zdHlsZSBjYWxiYWNrIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBlcnIsIHRva2VuIChvcHRpb25hbClcbiAgKiBAcmV0dXJuIHtQcm9taXNlKHRva2VuLCBlcnJvcn0gQSBQcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIEFQSSByZXNwb25zZSBvciByZWplY3RlZCB3aXRoIGFuIGVycm9yXG4gICovXG4gIGdldExhbmd1YWdlczogZnVuY3Rpb24oX2NhbGxiYWNrKSB7XG4gICAgdmFyIHByb21pc2UgPSBsYW5ndWFnZXMuZ2V0KCk7XG4gICAgY2FsbGJhY2suaGFuZGxlKHByb21pc2UsIF9jYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH0sXG4gIC8qKlxuICAqIEdldHMgY29sb3JzIGdpdmVuIGEgdXJsXG4gICogQG1ldGhvZCBnZXRDb2xvckJ5VXJsXG4gICogQHBhcmFtIHtTdHJpbmd9IG9yIHtBcnJheX0gICB1cmwgICAgQSBwdWJsaWNseSBhY2Nlc3NpYmxlIHVybCBvZiB0aGUgaW1hZ2UuXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gQSBub2RlLXN0eWxlIGNhbGJhY2sgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGVyciwgdG9rZW4gKG9wdGlvbmFsKVxuICAqIEByZXR1cm4ge1Byb21pc2UodG9rZW4sIGVycm9yfSBBIFByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgQVBJIHJlc3BvbnNlIG9yIHJlamVjdGVkIHdpdGggYW4gZXJyb3JcbiAgKi9cbiAgZ2V0Q29sb3JzQnlVcmw6IGZ1bmN0aW9uKHVybCwgX2NhbGxiYWNrKSB7XG4gICAgdmFyIHByb21pc2UgPSBjb2xvci5nZXRCeVVybCh1cmwpO1xuICAgIGNhbGxiYWNrLmhhbmRsZShwcm9taXNlLCBfY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9LFxuICAvKipcbiAgKiBHZXRzIGNvbG9ycyBnaXZlbiBpbWFnZSBieXRlc1xuICAqIEBtZXRob2QgZ2V0Q29sb3JzQnlJbWFnZUJ5dGVzXG4gICogQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICAgICAgdXJsICAgIEEgcHVibGljbHkgYWNjZXNzaWJsZSB1cmwgb2YgdGhlIGltYWdlLlxuICAqIEBwYXJhbSB7RnVuY3Rpb259ICAgICAgICAgICAgICAgICAgICAgICBBIG5vZGUtc3R5bGUgY2FsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgZXJyLCB0b2tlbiAob3B0aW9uYWwpXG4gICogQHJldHVybiB7UHJvbWlzZSh0b2tlbiwgZXJyb3J9ICAgICAgICAgIEEgUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSBBUEkgcmVzcG9uc2Ugb3IgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvclxuICAqL1xuICBnZXRDb2xvcnNCeUltYWdlQnl0ZXM6IGZ1bmN0aW9uKGltYWdlQnl0ZXMsIF9jYWxsYmFjaykge1xuICAgIHZhciBwcm9taXNlID0gY29sb3IuZ2V0QnlJbWFnZUJ5dGVzKGltYWdlQnl0ZXMpO1xuICAgIGNhbGxiYWNrLmhhbmRsZShwcm9taXNlLCBfY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9LFxuICAvKipcbiAgKiBHZXRzIEFQSSB1c2FnZVxuICAqIEBtZXRob2QgZ2V0VXNhZ2VcbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSAgICBjYWxsYmFjayAgICBBIG5vZGUtc3R5bGUgY2FsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgZXJyLCB0b2tlbiAob3B0aW9uYWwpXG4gICogQHJldHVybiB7UHJvbWlzZSh0b2tlbiwgZXJyb3J9IEEgUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSBBUEkgcmVzcG9uc2Ugb3IgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvclxuICAqL1xuICBnZXRVc2FnZTogZnVuY3Rpb24oX2NhbGxiYWNrKSB7XG4gICAgdmFyIHByb21pc2UgPSB1c2FnZS5nZXQoKTtcbiAgICBjYWxsYmFjay5oYW5kbGUocHJvbWlzZSwgX2NhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgIC8qKlxuICAqIFByb3ZpZGUgZmVlZGJhY2sgZm9yIGEgdXJsIG9yIGxpc3Qgb2YgdXJsc1xuICAqIEBtZXRob2QgY3JlYXRlRmVlZGJhY2tcbiAgKiBAcGFyYW0ge1N0cmluZ30gb3Ige0FycmF5fSAgIHVybCAgICBBIHB1YmxpY2x5IGFjY2Vzc2libGUgdXJsIG9mIHRoZSBpbWFnZS5cbiAgKiBAcGFyYW0ge09iamVjdH0gICAgb3B0aW9ucyAgT2JqZWN0IHdpdGgga2V5cyBleHBsYWluZWQgYmVsb3c6IChvcHRpb25hbClcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gb3Ige0FycmF5fSAgICBhZGRUYWdzICBBZGQgYWRkaXRpb25hbCB0YWdzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBnaXZlbiBpbWFnZShzKSAob3B0aW9uYWwpXG4gICogICAgQHBhcmFtIHtTdHJpbmd9IG9yIHtBcnJheX0gICAgcmVtb3ZlVGFncyAgUmVtb3ZlIHRhZ3MgdGhhdCBhcmUgbm90IHJlbGV2YW50IHRvIHRoZSBnaXZlbiBpbWFnZShzKSAob3B0aW9uYWwpXG4gICogICAgQHBhcmFtIHtTdHJpbmd9IG9yIHtBcnJheX0gICAgc2ltaWxhclVybHMgIFRlbGwgdGhlIHN5c3RlbSB0d28gb3IgbW9yZSBpbWFnZXMgYXJlIHNpbWlsYXIgKG9wdGlvbmFsKVxuICAqICAgIEBwYXJhbSB7U3RyaW5nfSBvciB7QXJyYXl9ICAgIGRpc1NpbWlsYXJVcmxzICBUZWxsIHRoZSBzeXN0ZW0gdHdvIG9yIG1vcmUgaW1hZ2VzIGFyZSBkaXNzaW1pbGFyIChvcHRpb25hbClcbiAgKiAgICBAcGFyYW0ge1N0cmluZ30gb3Ige0FycmF5fSAgICBzZWFyY2hDbGljayAgICBUZWxsIHRoZSBzeXN0ZW0gdGhhdCB0aGUgc2VhcmNoIHJlc3VsdCB3YXMgcmVsZXZhbnQgdG8gdGhlIHF1ZXJ5IChvcHRpb25hbClcbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBBIG5vZGUtc3R5bGUgY2FsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgZXJyLCB0b2tlbiAob3B0aW9uYWwpXG4gICogQHJldHVybiB7UHJvbWlzZSh0b2tlbiwgZXJyb3J9IEEgUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSBBUEkgcmVzcG9uc2Ugb3IgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvclxuICAqL1xuICBjcmVhdGVGZWVkYmFjazogZnVuY3Rpb24odXJsLCBvcHRpb25zLCBfY2FsbGJhY2spIHtcbiAgICB2YXIgY2FsbGJhY2tGbiA9IF9jYWxsYmFjaztcbiAgICBpZiAoIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nICkge1xuICAgICAgY2FsbGJhY2tGbiA9IG9wdGlvbnM7XG4gICAgfTtcbiAgICB2YXIgcHJvbWlzZSA9IGZlZWRiYWNrLmNyZWF0ZSh1cmwsIG9wdGlvbnMpO1xuICAgIGNhbGxiYWNrLmhhbmRsZShwcm9taXNlLCBjYWxsYmFja0ZuKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxufTtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJyksdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltbHVaR1Y0TG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN1FVRkJRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SjJZWElnWTI5dVptbG5JRDBnY21WeGRXbHlaU2duTGk5c2FXSXZZMjl1Wm1sbkp5azdYRzUyWVhJZ2RHOXJaVzRnUFNCeVpYRjFhWEpsS0NjdUwyeHBZaTkwYjJ0bGJpY3BPMXh1ZG1GeUlIUmhaeUE5SUhKbGNYVnBjbVVvSnk0dmJHbGlMM1JoWnljcE8xeHVkbUZ5SUdsdVptOGdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOXBibVp2SnlrN1hHNTJZWElnYkdGdVozVmhaMlZ6SUQwZ2NtVnhkV2x5WlNnbkxpOXNhV0l2YkdGdVozVmhaMlZ6SnlrN1hHNTJZWElnWTJGc2JHSmhZMnNnUFNCeVpYRjFhWEpsS0NjdUwyeHBZaTlqWVd4c1ltRmpheWNwTzF4dWRtRnlJR052Ykc5eUlEMGdjbVZ4ZFdseVpTZ25MaTlzYVdJdlkyOXNiM0luS1R0Y2JuWmhjaUJtWldWa1ltRmpheUE5SUhKbGNYVnBjbVVvSnk0dmJHbGlMMlpsWldSaVlXTnJKeWs3WEc1MllYSWdkWE5oWjJVZ1BTQnlaWEYxYVhKbEtDY3VMMnhwWWk5MWMyRm5aU2NwTzF4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHZHNiMkpoYkM1RGJHRnlhV1poYVNBOUlIdGNiaUFnYVc1cGRHbGhiR2w2WlRvZ1puVnVZM1JwYjI0b2IzQjBhVzl1Y3lrZ2UxeHVJQ0FnSUdOdmJtWnBaeTV6WlhRb0oyRndhVVZ1WkhCdmFXNTBKeXdnYjNCMGFXOXVjeTVoY0dsRmJtUndiMmx1ZENCOGZDQndjbTlqWlhOekxtVnVkaTVCVUVsZlJVNUVVRTlKVGxRZ2ZId2dKMmgwZEhCek9pOHZZWEJwTG1Oc1lYSnBabUZwTG1OdmJTY3BPMXh1SUNBZ0lHTnZibVpwWnk1elpYUW9KMk5zYVdWdWRFbGtKeXdnYjNCMGFXOXVjeTVqYkdsbGJuUkpaQ0I4ZkNCd2NtOWpaWE56TG1WdWRpNURURWxGVGxSZlNVUXBPMXh1SUNBZ0lHTnZibVpwWnk1elpYUW9KMk5zYVdWdWRGTmxZM0psZENjc0lHOXdkR2x2Ym5NdVkyeHBaVzUwVTJWamNtVjBJSHg4SUhCeWIyTmxjM011Wlc1MkxrTk1TVVZPVkY5VFJVTlNSVlFwTzF4dUlDQWdJSFJ2YTJWdUxtUmxiR1YwWlNncE8xeHVJQ0I5TEZ4dUlDQXZLaXBjYmlBZ0tpQkhaWFJ6SUdFZ2RHOXJaVzRnWm5KdmJTQjBhR1VnUVZCSklIVnphVzVuSUdOc2FXVnVkQ0JqY21Wa1pXNTBhV0ZzYzF4dUlDQXFJRUJ0WlhSb2IyUWdaMlYwVkc5clpXNWNiaUFnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNBZ0lDQmpZV3hzWW1GamF5QWdJQ0JCSUc1dlpHVXRjM1I1YkdVZ1kyRnNZbUZqYXlCbWRXNWpkR2x2YmlCMGFHRjBJR0ZqWTJWd2RITWdaWEp5TENCMGIydGxiaUFvYjNCMGFXOXVZV3dwWEc0Z0lDb2dRSEpsZEhWeWJpQjdVSEp2YldselpTaDBiMnRsYml3Z1pYSnliM0o5SUVFZ1VISnZiV2x6WlNCMGFHRjBJR2x6SUdaMWJHWnBiR3hsWkNCM2FYUm9JSFJvWlNCMGIydGxiaUJ6ZEhKcGJtY2diM0lnY21WcVpXTjBaV1FnZDJsMGFDQmhiaUJsY25KdmNseHVJQ0FxTDF4dUlDQm5aWFJVYjJ0bGJqb2dablZ1WTNScGIyNG9YMk5oYkd4aVlXTnJLU0I3WEc0Z0lDQWdkbUZ5SUhCeWIyMXBjMlVnUFNCMGIydGxiaTVuWlhRb0tUdGNiaUFnSUNCallXeHNZbUZqYXk1b1lXNWtiR1VvY0hKdmJXbHpaU3dnWDJOaGJHeGlZV05yS1R0Y2JpQWdJQ0J5WlhSMWNtNGdjSEp2YldselpUdGNiaUFnZlN4Y2JpQWdMeW9xWEc0Z0lDb2dVMlYwY3lCMGFHVWdkRzlyWlc0Z2RHOGdkWE5sSUdadmNpQjBhR1VnUVZCSlhHNGdJQ29nUUcxbGRHaHZaQ0J6WlhSVWIydGxibHh1SUNBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNBZ0lDQmZkRzlyWlc0Z0lDQWdWR2hsSUhSdmEyVnVJSGx2ZFNCaGNtVWdjMlYwZEdsdVoxeHVJQ0FxSUVCeVpYUjFjbTRnZTBKdmIyeGxZVzU5SUhSeWRXVWdhV1lnZEc5clpXNGdhR0Z6SUhaaGJHbGtJR1pwWld4a2N5d2dabUZzYzJVZ2FXWWdibTkwWEc0Z0lDb3ZYRzRnSUhObGRGUnZhMlZ1T2lCbWRXNWpkR2x2YmloZmRHOXJaVzRwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkRzlyWlc0dWMyVjBLRjkwYjJ0bGJpazdYRzRnSUgwc1hHNGdJQzhxS2x4dUlDQXFJRVJsYkdWMFpYTWdkR2hsSUhSdmEyVnVYRzRnSUNvZ1FHMWxkR2h2WkNCa1pXeGxkR1ZVYjJ0bGJseHVJQ0FxTDF4dUlDQmtaV3hsZEdWVWIydGxiam9nWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnZEc5clpXNHVaR1ZzWlhSbEtDazdYRzRnSUgwc1hHNGdJQzhxS2x4dUlDQXFJRWRsZEhNZ2RHRm5jeUJuYVhabGJpQmhJSFZ5YkZ4dUlDQXFJRUJ0WlhSb2IyUWdaMlYwVkdGbmMwSjVWWEpzWEc0Z0lDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlHOXlJSHRCY25KaGVYMGdJQ0FnSUNCMWNtd2dJQ0FnSUNBZ0lDQWdJQ0FnUVNCd2RXSnNhV05zZVNCaFkyTmxjM05wWW14bElIVnliQ0J2WmlCMGFHVWdhVzFoWjJVdVhHNGdJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZjSFJwYjI1eklDQWdJQ0FnSUNBZ1QySnFaV04wSUhkcGRHZ2dhMlY1Y3lCbGVIQnNZV2x1WldRZ1ltVnNiM2M2SUNodmNIUnBiMjVoYkNsY2JpQWdLaUFnSUNCQWNHRnlZVzBnZTFOMGNtbHVaMzBnSUNBZ0lDQWdJQ0FnSUNBZ0lHMXZaR1ZzSUNBZ0lDQWdJQ0FnSUNCVWFHVWdiVzlrWld3Z2RYTmxaQ0IwYnlCMFlXY2dkR2hsSUdsdFlXZGxJQ2h2Y0hScGIyNWhiQ2xjYmlBZ0tpQWdJQ0JBY0dGeVlXMGdlMU4wY21sdVozMGdJQ0FnSUNBZ0lDQWdJQ0FnSUd4aGJtZDFZV2RsSUNBZ0lDQWdJQ0JVYUdVZ2JHRnVaM1ZoWjJVZ2RYTmxaQ0IwYnlCMFlXY2dkR2hsSUdsdFlXZGxJQ2h2Y0hScGIyNWhiQ2xjYmlBZ0tpQWdJQ0JBY0dGeVlXMGdlMU4wY21sdVozMGdiM0lnZTBGeWNtRjVmU0FnSUhObGJHVmpkRU5zWVhOelpYTWdJQ0JTWlhOMGNtbGpkQ0IwYUdVZ2RHRm5jeUJ5WlhSMWNtNWxaRnh1SUNBcUlDQWdJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQnZjaUI3UVhKeVlYbDlJQ0FnYkc5allXeEpaQ0FnSUNBZ0lDQWdJRkJ5YjNacFpHVWdZU0JzYjJOaGJFbGtJR1p2Y2lCbFlXTm9JSFZ5YkNCMGJ5QnphVzF3YkdsbWVTQjBjbUZqYTJsdVp5QnlaWEYxWlhOMGN5QW9iM0IwYVc5dVlXd3BYRzRnSUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdRU0J1YjJSbExYTjBlV3hsSUdOaGJHSmhZMnNnWm5WdVkzUnBiMjRnZEdoaGRDQmhZMk5sY0hSeklHVnljaXdnZEc5clpXNGdLRzl3ZEdsdmJtRnNLVnh1SUNBcUlFQnlaWFIxY200Z2UxQnliMjFwYzJVb2RHOXJaVzRzSUdWeWNtOXlmU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRUVnVUhKdmJXbHpaU0IwYUdGMElHbHpJR1oxYkdacGJHeGxaQ0IzYVhSb0lIUm9aU0JCVUVrZ2NtVnpjRzl1YzJVZ2IzSWdjbVZxWldOMFpXUWdkMmwwYUNCaGJpQmxjbkp2Y2x4dUlDQXFMMXh1SUNCblpYUlVZV2R6UW5sVmNtdzZJR1oxYm1OMGFXOXVLSFZ5YkN3Z2IzQjBhVzl1Y3l3Z1gyTmhiR3hpWVdOcktTQjdYRzRnSUNBZ2RtRnlJR05oYkd4aVlXTnJSbTRnUFNCZlkyRnNiR0poWTJzN1hHNGdJQ0FnYVdZZ0tDQjBlWEJsYjJZZ2IzQjBhVzl1Y3lBOVBUMGdKMloxYm1OMGFXOXVKeUFwSUh0Y2JpQWdJQ0FnSUdOaGJHeGlZV05yUm00Z1BTQnZjSFJwYjI1ek8xeHVJQ0FnSUgwN1hHNGdJQ0FnZG1GeUlIQnliMjFwYzJVZ1BTQjBZV2N1WjJWMFFubFZjbXdvZFhKc0xDQnZjSFJwYjI1ektUdGNiaUFnSUNCallXeHNZbUZqYXk1b1lXNWtiR1VvY0hKdmJXbHpaU3dnWTJGc2JHSmhZMnRHYmlrN1hHNGdJQ0FnY21WMGRYSnVJSEJ5YjIxcGMyVTdYRzRnSUgwc1hHNGdJQzhxS2x4dUlDQXFJRWRsZEhNZ2RHRm5jeUJuYVhabGJpQnBiV0ZuWlNCaWVYUmxjMXh1SUNBcUlFQnRaWFJvYjJRZ1oyVjBWR0ZuYzBKNVNXMWhaMlZDZVhSbGMxeHVJQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhVzFoWjJVZ1lubDBaWE1nSUNBZ0lFSmhjMlUyTkNCbGJtTnZaR1ZrSUdsdFlXZGxJR0o1ZEdWekxseHVJQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM0IwYVc5dWN5QWdJQ0FnSUNBZ0lFOWlhbVZqZENCM2FYUm9JR3RsZVhNZ1pYaHdiR0ZwYm1Wa0lHSmxiRzkzT2lBb2IzQjBhVzl1WVd3cFhHNGdJQ29nSUNBZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUNBZ0lDQWdJQ0FnSUNBZ0lDQnRiMlJsYkNBZ0lDQWdJQ0FnSUNBZ1ZHaGxJRzF2WkdWc0lIVnpaV1FnZEc4Z2RHRm5JSFJvWlNCcGJXRm5aU0FvYjNCMGFXOXVZV3dwWEc0Z0lDb2dJQ0FnUUhCaGNtRnRJSHRUZEhKcGJtZDlJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXNW5kV0ZuWlNBZ0lDQWdJQ0FnVkdobElHeGhibWQxWVdkbElIVnpaV1FnZEc4Z2RHRm5JSFJvWlNCcGJXRm5aU0FvYjNCMGFXOXVZV3dwWEc0Z0lDb2dJQ0FnUUhCaGNtRnRJSHRUZEhKcGJtZDlJRzl5SUh0QmNuSmhlWDBnSUNCelpXeGxZM1JEYkdGemMyVnpJQ0FnVW1WemRISnBZM1FnZEdobElIUmhaM01nY21WMGRYSnVaV1JjYmlBZ0tpQWdJQ0JBY0dGeVlXMGdlMU4wY21sdVozMGdiM0lnZTBGeWNtRjVmU0FnSUd4dlkyRnNTV1FnSUNBZ0lDQWdJQ0JRY205MmFXUmxJR0VnYkc5allXeEpaQ0JtYjNJZ1pXRmphQ0IxY213Z2RHOGdjMmx0Y0d4cFpua2dkSEpoWTJ0cGJtY2djbVZ4ZFdWemRITWdLRzl3ZEdsdmJtRnNLVnh1SUNBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRUVnYm05a1pTMXpkSGxzWlNCallXeGlZV05ySUdaMWJtTjBhVzl1SUhSb1lYUWdZV05qWlhCMGN5QmxjbklzSUhSdmEyVnVJQ2h2Y0hScGIyNWhiQ2xjYmlBZ0tpQkFjbVYwZFhKdUlIdFFjbTl0YVhObEtIUnZhMlZ1TENCbGNuSnZjbjBnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JCSUZCeWIyMXBjMlVnZEdoaGRDQnBjeUJtZFd4bWFXeHNaV1FnZDJsMGFDQjBhR1VnUVZCSklISmxjM0J2Ym5ObElHOXlJSEpsYW1WamRHVmtJSGRwZEdnZ1lXNGdaWEp5YjNKY2JpQWdLaTljYmlBZ1oyVjBWR0ZuYzBKNVNXMWhaMlZDZVhSbGN6b2dablZ1WTNScGIyNG9hVzFoWjJWQ2VYUmxjeXdnYjNCMGFXOXVjeXdnWDJOaGJHeGlZV05yS1NCN1hHNGdJQ0FnZG1GeUlHTmhiR3hpWVdOclJtNGdQU0JmWTJGc2JHSmhZMnM3WEc0Z0lDQWdhV1lnS0NCMGVYQmxiMllnYjNCMGFXOXVjeUE5UFQwZ0oyWjFibU4wYVc5dUp5QXBJSHRjYmlBZ0lDQWdJR05oYkd4aVlXTnJSbTRnUFNCdmNIUnBiMjV6TzF4dUlDQWdJSDA3WEc0Z0lDQWdkbUZ5SUhCeWIyMXBjMlVnUFNCMFlXY3VaMlYwUW5sSmJXRm5aVUo1ZEdWektHbHRZV2RsUW5sMFpYTXNJRzl3ZEdsdmJuTXBPMXh1SUNBZ0lHTmhiR3hpWVdOckxtaGhibVJzWlNod2NtOXRhWE5sTENCallXeHNZbUZqYTBadUtUdGNiaUFnSUNCeVpYUjFjbTRnY0hKdmJXbHpaVHRjYmlBZ2ZTeGNiaUFnTHlvcVhHNGdJQ29nUjJWMGN5QkJVRWtnYVc1bWIxeHVJQ0FxSUVCdFpYUm9iMlFnWjJWMFNXNW1iMXh1SUNBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlDQWdJR05oYkd4aVlXTnJJQ0FnSUVFZ2JtOWtaUzF6ZEhsc1pTQmpZV3hpWVdOcklHWjFibU4wYVc5dUlIUm9ZWFFnWVdOalpYQjBjeUJsY25Jc0lIUnZhMlZ1SUNodmNIUnBiMjVoYkNsY2JpQWdLaUJBY21WMGRYSnVJSHRRY205dGFYTmxLSFJ2YTJWdUxDQmxjbkp2Y24wZ1FTQlFjbTl0YVhObElIUm9ZWFFnYVhNZ1puVnNabWxzYkdWa0lIZHBkR2dnZEdobElFRlFTU0J5WlhOd2IyNXpaU0J2Y2lCeVpXcGxZM1JsWkNCM2FYUm9JR0Z1SUdWeWNtOXlYRzRnSUNvdlhHNGdJR2RsZEVsdVptODZJR1oxYm1OMGFXOXVLRjlqWVd4c1ltRmpheWtnZTF4dUlDQWdJSFpoY2lCd2NtOXRhWE5sSUQwZ2FXNW1ieTVuWlhRb0tUdGNiaUFnSUNCallXeHNZbUZqYXk1b1lXNWtiR1VvY0hKdmJXbHpaU3dnWDJOaGJHeGlZV05yS1R0Y2JpQWdJQ0J5WlhSMWNtNGdjSEp2YldselpUdGNiaUFnZlN4Y2JpQWdMeW9xWEc0Z0lDb2dSMlYwY3lCc1lXNW5kV0ZuWlhNZ2MzVndjRzl5ZEdWa0lHSjVJSFJvWlNCQlVFbGNiaUFnS2lCQWJXVjBhRzlrSUdkbGRFeGhibWQxWVdkbGMxeHVJQ0FxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUNBZ0lHTmhiR3hpWVdOcklDQWdJRUVnYm05a1pTMXpkSGxzWlNCallXeGlZV05ySUdaMWJtTjBhVzl1SUhSb1lYUWdZV05qWlhCMGN5QmxjbklzSUhSdmEyVnVJQ2h2Y0hScGIyNWhiQ2xjYmlBZ0tpQkFjbVYwZFhKdUlIdFFjbTl0YVhObEtIUnZhMlZ1TENCbGNuSnZjbjBnUVNCUWNtOXRhWE5sSUhSb1lYUWdhWE1nWm5Wc1ptbHNiR1ZrSUhkcGRHZ2dkR2hsSUVGUVNTQnlaWE53YjI1elpTQnZjaUJ5WldwbFkzUmxaQ0IzYVhSb0lHRnVJR1Z5Y205eVhHNGdJQ292WEc0Z0lHZGxkRXhoYm1kMVlXZGxjem9nWm5WdVkzUnBiMjRvWDJOaGJHeGlZV05yS1NCN1hHNGdJQ0FnZG1GeUlIQnliMjFwYzJVZ1BTQnNZVzVuZFdGblpYTXVaMlYwS0NrN1hHNGdJQ0FnWTJGc2JHSmhZMnN1YUdGdVpHeGxLSEJ5YjIxcGMyVXNJRjlqWVd4c1ltRmpheWs3WEc0Z0lDQWdjbVYwZFhKdUlIQnliMjFwYzJVN1hHNGdJSDBzWEc0Z0lDOHFLbHh1SUNBcUlFZGxkSE1nWTI5c2IzSnpJR2RwZG1WdUlHRWdkWEpzWEc0Z0lDb2dRRzFsZEdodlpDQm5aWFJEYjJ4dmNrSjVWWEpzWEc0Z0lDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlHOXlJSHRCY25KaGVYMGdJQ0IxY213Z0lDQWdRU0J3ZFdKc2FXTnNlU0JoWTJObGMzTnBZbXhsSUhWeWJDQnZaaUIwYUdVZ2FXMWhaMlV1WEc0Z0lDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdRU0J1YjJSbExYTjBlV3hsSUdOaGJHSmhZMnNnWm5WdVkzUnBiMjRnZEdoaGRDQmhZMk5sY0hSeklHVnljaXdnZEc5clpXNGdLRzl3ZEdsdmJtRnNLVnh1SUNBcUlFQnlaWFIxY200Z2UxQnliMjFwYzJVb2RHOXJaVzRzSUdWeWNtOXlmU0JCSUZCeWIyMXBjMlVnZEdoaGRDQnBjeUJtZFd4bWFXeHNaV1FnZDJsMGFDQjBhR1VnUVZCSklISmxjM0J2Ym5ObElHOXlJSEpsYW1WamRHVmtJSGRwZEdnZ1lXNGdaWEp5YjNKY2JpQWdLaTljYmlBZ1oyVjBRMjlzYjNKelFubFZjbXc2SUdaMWJtTjBhVzl1S0hWeWJDd2dYMk5oYkd4aVlXTnJLU0I3WEc0Z0lDQWdkbUZ5SUhCeWIyMXBjMlVnUFNCamIyeHZjaTVuWlhSQ2VWVnliQ2gxY213cE8xeHVJQ0FnSUdOaGJHeGlZV05yTG1oaGJtUnNaU2h3Y205dGFYTmxMQ0JmWTJGc2JHSmhZMnNwTzF4dUlDQWdJSEpsZEhWeWJpQndjbTl0YVhObE8xeHVJQ0I5TEZ4dUlDQXZLaXBjYmlBZ0tpQkhaWFJ6SUdOdmJHOXljeUJuYVhabGJpQnBiV0ZuWlNCaWVYUmxjMXh1SUNBcUlFQnRaWFJvYjJRZ1oyVjBRMjlzYjNKelFubEpiV0ZuWlVKNWRHVnpYRzRnSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZFhKc0lDQWdJRUVnY0hWaWJHbGpiSGtnWVdOalpYTnphV0pzWlNCMWNtd2diMllnZEdobElHbHRZV2RsTGx4dUlDQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCQklHNXZaR1V0YzNSNWJHVWdZMkZzWW1GamF5Qm1kVzVqZEdsdmJpQjBhR0YwSUdGalkyVndkSE1nWlhKeUxDQjBiMnRsYmlBb2IzQjBhVzl1WVd3cFhHNGdJQ29nUUhKbGRIVnliaUI3VUhKdmJXbHpaU2gwYjJ0bGJpd2daWEp5YjNKOUlDQWdJQ0FnSUNBZ0lFRWdVSEp2YldselpTQjBhR0YwSUdseklHWjFiR1pwYkd4bFpDQjNhWFJvSUhSb1pTQkJVRWtnY21WemNHOXVjMlVnYjNJZ2NtVnFaV04wWldRZ2QybDBhQ0JoYmlCbGNuSnZjbHh1SUNBcUwxeHVJQ0JuWlhSRGIyeHZjbk5DZVVsdFlXZGxRbmwwWlhNNklHWjFibU4wYVc5dUtHbHRZV2RsUW5sMFpYTXNJRjlqWVd4c1ltRmpheWtnZTF4dUlDQWdJSFpoY2lCd2NtOXRhWE5sSUQwZ1kyOXNiM0l1WjJWMFFubEpiV0ZuWlVKNWRHVnpLR2x0WVdkbFFubDBaWE1wTzF4dUlDQWdJR05oYkd4aVlXTnJMbWhoYm1Sc1pTaHdjbTl0YVhObExDQmZZMkZzYkdKaFkyc3BPMXh1SUNBZ0lISmxkSFZ5YmlCd2NtOXRhWE5sTzF4dUlDQjlMRnh1SUNBdktpcGNiaUFnS2lCSFpYUnpJRUZRU1NCMWMyRm5aVnh1SUNBcUlFQnRaWFJvYjJRZ1oyVjBWWE5oWjJWY2JpQWdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0FnSUNCallXeHNZbUZqYXlBZ0lDQkJJRzV2WkdVdGMzUjViR1VnWTJGc1ltRmpheUJtZFc1amRHbHZiaUIwYUdGMElHRmpZMlZ3ZEhNZ1pYSnlMQ0IwYjJ0bGJpQW9iM0IwYVc5dVlXd3BYRzRnSUNvZ1FISmxkSFZ5YmlCN1VISnZiV2x6WlNoMGIydGxiaXdnWlhKeWIzSjlJRUVnVUhKdmJXbHpaU0IwYUdGMElHbHpJR1oxYkdacGJHeGxaQ0IzYVhSb0lIUm9aU0JCVUVrZ2NtVnpjRzl1YzJVZ2IzSWdjbVZxWldOMFpXUWdkMmwwYUNCaGJpQmxjbkp2Y2x4dUlDQXFMMXh1SUNCblpYUlZjMkZuWlRvZ1puVnVZM1JwYjI0b1gyTmhiR3hpWVdOcktTQjdYRzRnSUNBZ2RtRnlJSEJ5YjIxcGMyVWdQU0IxYzJGblpTNW5aWFFvS1R0Y2JpQWdJQ0JqWVd4c1ltRmpheTVvWVc1a2JHVW9jSEp2YldselpTd2dYMk5oYkd4aVlXTnJLVHRjYmlBZ0lDQnlaWFIxY200Z2NISnZiV2x6WlR0Y2JpQWdmU3hjYmlBZ0lDOHFLbHh1SUNBcUlGQnliM1pwWkdVZ1ptVmxaR0poWTJzZ1ptOXlJR0VnZFhKc0lHOXlJR3hwYzNRZ2IyWWdkWEpzYzF4dUlDQXFJRUJ0WlhSb2IyUWdZM0psWVhSbFJtVmxaR0poWTJ0Y2JpQWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdiM0lnZTBGeWNtRjVmU0FnSUhWeWJDQWdJQ0JCSUhCMVlteHBZMng1SUdGalkyVnpjMmxpYkdVZ2RYSnNJRzltSUhSb1pTQnBiV0ZuWlM1Y2JpQWdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdJQ0FnYjNCMGFXOXVjeUFnVDJKcVpXTjBJSGRwZEdnZ2EyVjVjeUJsZUhCc1lXbHVaV1FnWW1Wc2IzYzZJQ2h2Y0hScGIyNWhiQ2xjYmlBZ0tpQWdJQ0JBY0dGeVlXMGdlMU4wY21sdVozMGdiM0lnZTBGeWNtRjVmU0FnSUNCaFpHUlVZV2R6SUNCQlpHUWdZV1JrYVhScGIyNWhiQ0IwWVdkeklIUm9ZWFFnWVhKbElISmxiR1YyWVc1MElIUnZJSFJvWlNCbmFYWmxiaUJwYldGblpTaHpLU0FvYjNCMGFXOXVZV3dwWEc0Z0lDb2dJQ0FnUUhCaGNtRnRJSHRUZEhKcGJtZDlJRzl5SUh0QmNuSmhlWDBnSUNBZ2NtVnRiM1psVkdGbmN5QWdVbVZ0YjNabElIUmhaM01nZEdoaGRDQmhjbVVnYm05MElISmxiR1YyWVc1MElIUnZJSFJvWlNCbmFYWmxiaUJwYldGblpTaHpLU0FvYjNCMGFXOXVZV3dwWEc0Z0lDb2dJQ0FnUUhCaGNtRnRJSHRUZEhKcGJtZDlJRzl5SUh0QmNuSmhlWDBnSUNBZ2MybHRhV3hoY2xWeWJITWdJRlJsYkd3Z2RHaGxJSE41YzNSbGJTQjBkMjhnYjNJZ2JXOXlaU0JwYldGblpYTWdZWEpsSUhOcGJXbHNZWElnS0c5d2RHbHZibUZzS1Z4dUlDQXFJQ0FnSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0J2Y2lCN1FYSnlZWGw5SUNBZ0lHUnBjMU5wYldsc1lYSlZjbXh6SUNCVVpXeHNJSFJvWlNCemVYTjBaVzBnZEhkdklHOXlJRzF2Y21VZ2FXMWhaMlZ6SUdGeVpTQmthWE56YVcxcGJHRnlJQ2h2Y0hScGIyNWhiQ2xjYmlBZ0tpQWdJQ0JBY0dGeVlXMGdlMU4wY21sdVozMGdiM0lnZTBGeWNtRjVmU0FnSUNCelpXRnlZMmhEYkdsamF5QWdJQ0JVWld4c0lIUm9aU0J6ZVhOMFpXMGdkR2hoZENCMGFHVWdjMlZoY21Ob0lISmxjM1ZzZENCM1lYTWdjbVZzWlhaaGJuUWdkRzhnZEdobElIRjFaWEo1SUNodmNIUnBiMjVoYkNsY2JpQWdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JCSUc1dlpHVXRjM1I1YkdVZ1kyRnNZbUZqYXlCbWRXNWpkR2x2YmlCMGFHRjBJR0ZqWTJWd2RITWdaWEp5TENCMGIydGxiaUFvYjNCMGFXOXVZV3dwWEc0Z0lDb2dRSEpsZEhWeWJpQjdVSEp2YldselpTaDBiMnRsYml3Z1pYSnliM0o5SUVFZ1VISnZiV2x6WlNCMGFHRjBJR2x6SUdaMWJHWnBiR3hsWkNCM2FYUm9JSFJvWlNCQlVFa2djbVZ6Y0c5dWMyVWdiM0lnY21WcVpXTjBaV1FnZDJsMGFDQmhiaUJsY25KdmNseHVJQ0FxTDF4dUlDQmpjbVZoZEdWR1pXVmtZbUZqYXpvZ1puVnVZM1JwYjI0b2RYSnNMQ0J2Y0hScGIyNXpMQ0JmWTJGc2JHSmhZMnNwSUh0Y2JpQWdJQ0IyWVhJZ1kyRnNiR0poWTJ0R2JpQTlJRjlqWVd4c1ltRmphenRjYmlBZ0lDQnBaaUFvSUhSNWNHVnZaaUJ2Y0hScGIyNXpJRDA5UFNBblpuVnVZM1JwYjI0bklDa2dlMXh1SUNBZ0lDQWdZMkZzYkdKaFkydEdiaUE5SUc5d2RHbHZibk03WEc0Z0lDQWdmVHRjYmlBZ0lDQjJZWElnY0hKdmJXbHpaU0E5SUdabFpXUmlZV05yTG1OeVpXRjBaU2gxY213c0lHOXdkR2x2Ym5NcE8xeHVJQ0FnSUdOaGJHeGlZV05yTG1oaGJtUnNaU2h3Y205dGFYTmxMQ0JqWVd4c1ltRmphMFp1S1R0Y2JpQWdJQ0J5WlhSMWNtNGdjSEp2YldselpUdGNiaUFnZlZ4dWZUdGNiaUpkZlE9PSJdfQ== | |
var Clarifai = require('clarifai'); | |
Clarifai.initialize({ | |
'clientId': {clientId}, | |
'clientSecret': {clientSecret} | |
}); | |
function imageToDataUrl(url){ | |
return new Promise(function(resolve, reject) { | |
var img = new Image(); | |
img.crossOrigin = 'Anonymous'; | |
img.onload = function() { | |
var canvas = document.createElement('canvas'); | |
var ctx = canvas.getContext('2d'); | |
canvas.height = this.height; | |
canvas.width = this.width; | |
ctx.drawImage(this, 0, 0); | |
var dataURL = canvas.toDataURL("image/jpeg", 0.9); | |
resolve(dataURL); | |
}; | |
img.src = url; | |
}); | |
} | |
imageToDataUrl('http://i.imgur.com/CC8EqQh.jpg').then( | |
function(dataURL){ | |
var b64 = dataURL.split('base64,')[1]; | |
Clarifai.getTagsByImageBytes(b64).then( | |
function(resp){ | |
console.log('success', resp); | |
}, | |
function(resp){ | |
console.log('error', resp); | |
}); | |
} | |
); | |
;}, 0) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "requirebin-sketch", | |
"version": "1.0.0", | |
"dependencies": { | |
"clarifai": "1.2.1" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <body> --> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <head> --> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment