@anansi/webpack-config
Version:
Production ready webpack for React
289 lines (265 loc) • 34.2 kB
JavaScript
;
/* global __react_refresh_socket__, __resourceQuery */
/**
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of https://github.com/facebook/create-react-app/blob/master/packages/react-dev-utils/webpackHotDevClient.js
*/
// This is adapted to hook create-react-app directly into react-refresh's existing socket connections
var runWithPatchedUrl = require('@pmmmwh/react-refresh-webpack-plugin/client/utils/patchUrl');
var formatWebpackMessages = require('react-dev-utils/formatWebpackMessages');
var launchEditorEndpoint = require('react-dev-utils/launchEditorEndpoint');
var ErrorOverlay = require('react-error-overlay');
var stripAnsi = require('strip-ansi');
ErrorOverlay.setEditorHandler(function editorHandler(errorLocation) {
// Keep this sync with errorOverlayMiddleware.js
fetch(launchEditorEndpoint + '?fileName=' + window.encodeURIComponent(errorLocation.fileName) + '&lineNumber=' + window.encodeURIComponent(errorLocation.lineNumber || 1) + '&colNumber=' + window.encodeURIComponent(errorLocation.colNumber || 1));
});
// Don't show overlay for certain errors as they are disruptive
if (typeof window !== 'undefined') {
window.addEventListener('error', e => {
if (e.message.includes('The server could not finish this Suspense boundary') || e.status) {
e.stopImmediatePropagation();
}
});
}
// We need to keep track of if there has been a runtime error.
// Essentially, we cannot guarantee application state was not corrupted by the
// runtime error. To prevent confusing behavior, we forcibly reload the entire
// application. This is handled below when we are notified of a compile (code
// change).
// See https://github.com/facebook/create-react-app/issues/3096
var hadRuntimeError = false;
ErrorOverlay.startReportingRuntimeErrors({
onError: function () {
hadRuntimeError = true;
},
filename: '/App.js'
});
if (module.hot && typeof module.hot.dispose === 'function') {
module.hot.dispose(function () {
// TODO: why do we need this?
ErrorOverlay.stopReportingRuntimeErrors();
});
}
// Remember some state related to hot module replacement.
var isFirstCompilation = true;
var mostRecentCompilationHash = null;
var hasCompileErrors = false;
function clearOutdatedErrors() {
// Clean up outdated compile errors, if any.
if (typeof console !== 'undefined' && typeof console.clear === 'function') {
if (hasCompileErrors) {
console.clear();
}
}
}
// Successful compilation.
function handleSuccess() {
clearOutdatedErrors();
var isHotUpdate = !isFirstCompilation;
isFirstCompilation = false;
hasCompileErrors = false;
// Attempt to apply hot updates or reload.
if (isHotUpdate) {
tryApplyUpdates(function onHotUpdateSuccess() {
// Only dismiss it when we're sure it's a hot update.
// Otherwise it would flicker right before the reload.
tryDismissErrorOverlay();
});
}
}
// Compilation with warnings (e.g. ESLint).
function handleWarnings(warnings) {
clearOutdatedErrors();
var isHotUpdate = !isFirstCompilation;
isFirstCompilation = false;
hasCompileErrors = false;
function printWarnings() {
// Print warnings to the console.
var formatted = formatWebpackMessages({
warnings: warnings.map(errorObjOrMessage => [errorObjOrMessage.moduleName, errorObjOrMessage.message].join('\n')),
errors: []
});
if (typeof console !== 'undefined' && typeof console.warn === 'function') {
for (var i = 0; i < formatted.warnings.length; i++) {
if (i === 5) {
console.warn('There were more warnings in other files.\n' + 'You can find a complete log in the terminal.');
break;
}
console.warn(stripAnsi(formatted.warnings[i]));
}
}
}
printWarnings();
// Attempt to apply hot updates or reload.
if (isHotUpdate) {
tryApplyUpdates(function onSuccessfulHotUpdate() {
// Only dismiss it when we're sure it's a hot update.
// Otherwise it would flicker right before the reload.
tryDismissErrorOverlay();
});
}
}
// Compilation with errors (e.g. syntax error or missing modules).
function handleErrors(errors) {
clearOutdatedErrors();
isFirstCompilation = false;
hasCompileErrors = true;
// "Massage" webpack messages.
var formatted = formatWebpackMessages({
errors: errors.map(errorObjOrMessage => [errorObjOrMessage.moduleName, errorObjOrMessage.message].join('\n')),
warnings: []
});
// Only show the first error.
ErrorOverlay.reportBuildError(formatted.errors[0]);
// Also log them to the console.
if (typeof console !== 'undefined' && typeof console.error === 'function') {
for (var i = 0; i < formatted.errors.length; i++) {
console.error(stripAnsi(formatted.errors[i]));
}
}
// Do not attempt to reload now.
// We will reload on next success instead.
}
function tryDismissErrorOverlay() {
if (!hasCompileErrors) {
ErrorOverlay.dismissBuildError();
}
}
// There is a newer version of the code available.
function handleAvailableHash(hash) {
// Update last known compilation hash.
mostRecentCompilationHash = hash;
}
// Handle messages from the server.
function compileMessageHandler(message) {
switch (message.type) {
case 'hash':
handleAvailableHash(message.data);
break;
case 'still-ok':
case 'ok':
handleSuccess();
break;
case 'content-changed':
// Triggered when a file from `contentBase` changed.
window.location.reload();
break;
case 'warnings':
handleWarnings(message.data);
break;
case 'errors':
handleErrors(message.data);
break;
default:
// Do nothing.
}
}
// Is there a newer version of this code available?
function isUpdateAvailable() {
/* globals __webpack_hash__ */
// __webpack_hash__ is the hash of the current compilation.
// It's a global variable injected by webpack.
return mostRecentCompilationHash !== __webpack_hash__;
}
// webpack disallows updates in other states.
function canApplyUpdates() {
return module.hot.status() === 'idle';
}
function canAcceptErrors() {
// NOTE: This var is injected by Webpack's DefinePlugin, and is a boolean instead of string.
const hasReactRefresh = process.env.FAST_REFRESH;
const status = module.hot.status();
// React refresh can handle hot-reloading over errors.
// However, when hot-reload status is abort or fail,
// it indicates the current update cannot be applied safely,
// and thus we should bail out to a forced reload for consistency.
return hasReactRefresh && ['abort', 'fail'].indexOf(status) === -1;
}
// Attempt to update code on the fly, fall back to a hard reload.
function tryApplyUpdates(onHotUpdateSuccess) {
if (!module.hot) {
// HotModuleReplacementPlugin is not in webpack configuration.
window.location.reload();
return;
}
// we know it's hot, so dismiss error
if (typeof onHotUpdateSuccess === 'function') {
onHotUpdateSuccess();
}
if (!isUpdateAvailable() || !canApplyUpdates()) {
return;
}
function handleApplyUpdates(err, updatedModules) {
const haveErrors = err || hadRuntimeError;
// When there is no error but updatedModules is unavailable,
// it indicates a critical failure in hot-reloading,
// e.g. server is not ready to serve new bundle,
// and hence we need to do a forced reload.
const needsForcedReload = !err && !updatedModules;
if (haveErrors && !canAcceptErrors() || needsForcedReload) {
window.location.reload();
return;
}
if (typeof onHotUpdateSuccess === 'function') {
// Maybe we want to do something.
onHotUpdateSuccess();
}
if (isUpdateAvailable()) {
// While we were updating, there was a new update! Do it again.
tryApplyUpdates();
}
}
// https://webpack.github.io/docs/hot-module-replacement.html#check
var result = module.hot.check(/* autoApply */true, handleApplyUpdates);
// // webpack 2 returns a Promise instead of invoking a callback
if (result && result.then) {
result.then(function (updatedModules) {
handleApplyUpdates(null, updatedModules);
}, function (err) {
handleApplyUpdates(err, null);
});
}
}
if (process.env.NODE_ENV !== 'production' && typeof window !== 'undefined') {
runWithPatchedUrl(function setupOverlay() {
// Only register if no other overlay have been registered
if (!window.__reactRefreshOverlayInjected && __react_refresh_socket__) {
// Registers handlers for compile errors with retry -
// This is to prevent mismatching injection order causing errors to be thrown
runWithRetry(function initSocket() {
__react_refresh_socket__.init(compileMessageHandler, __resourceQuery);
}, 3);
// Registers handlers for runtime errors
/*handleError(function handleError(error) {
hasRuntimeErrors = true;
__react_refresh_error_overlay__.handleRuntimeError(error);
});
handleUnhandledRejection(function handleUnhandledPromiseRejection(error) {
hasRuntimeErrors = true;
__react_refresh_error_overlay__.handleRuntimeError(error);
});*/
// Mark overlay as injected to prevent double-injection
window.__reactRefreshOverlayInjected = true;
}
});
}
function runWithRetry(callback, maxRetries) {
function executeWithRetryAndTimeout(currentCount) {
try {
if (currentCount > maxRetries - 1) {
console.warn('[React Refresh] Failed set up the socket connection.');
return;
}
callback();
} catch (err) {
setTimeout(function () {
executeWithRetryAndTimeout(currentCount + 1);
}, Math.pow(10, currentCount));
}
}
executeWithRetryAndTimeout(0);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJydW5XaXRoUGF0Y2hlZFVybCIsInJlcXVpcmUiLCJmb3JtYXRXZWJwYWNrTWVzc2FnZXMiLCJsYXVuY2hFZGl0b3JFbmRwb2ludCIsIkVycm9yT3ZlcmxheSIsInN0cmlwQW5zaSIsInNldEVkaXRvckhhbmRsZXIiLCJlZGl0b3JIYW5kbGVyIiwiZXJyb3JMb2NhdGlvbiIsImZldGNoIiwid2luZG93IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZmlsZU5hbWUiLCJsaW5lTnVtYmVyIiwiY29sTnVtYmVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJtZXNzYWdlIiwiaW5jbHVkZXMiLCJzdGF0dXMiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJoYWRSdW50aW1lRXJyb3IiLCJzdGFydFJlcG9ydGluZ1J1bnRpbWVFcnJvcnMiLCJvbkVycm9yIiwiZmlsZW5hbWUiLCJtb2R1bGUiLCJob3QiLCJkaXNwb3NlIiwic3RvcFJlcG9ydGluZ1J1bnRpbWVFcnJvcnMiLCJpc0ZpcnN0Q29tcGlsYXRpb24iLCJtb3N0UmVjZW50Q29tcGlsYXRpb25IYXNoIiwiaGFzQ29tcGlsZUVycm9ycyIsImNsZWFyT3V0ZGF0ZWRFcnJvcnMiLCJjb25zb2xlIiwiY2xlYXIiLCJoYW5kbGVTdWNjZXNzIiwiaXNIb3RVcGRhdGUiLCJ0cnlBcHBseVVwZGF0ZXMiLCJvbkhvdFVwZGF0ZVN1Y2Nlc3MiLCJ0cnlEaXNtaXNzRXJyb3JPdmVybGF5IiwiaGFuZGxlV2FybmluZ3MiLCJ3YXJuaW5ncyIsInByaW50V2FybmluZ3MiLCJmb3JtYXR0ZWQiLCJtYXAiLCJlcnJvck9iak9yTWVzc2FnZSIsIm1vZHVsZU5hbWUiLCJqb2luIiwiZXJyb3JzIiwid2FybiIsImkiLCJsZW5ndGgiLCJvblN1Y2Nlc3NmdWxIb3RVcGRhdGUiLCJoYW5kbGVFcnJvcnMiLCJyZXBvcnRCdWlsZEVycm9yIiwiZXJyb3IiLCJkaXNtaXNzQnVpbGRFcnJvciIsImhhbmRsZUF2YWlsYWJsZUhhc2giLCJoYXNoIiwiY29tcGlsZU1lc3NhZ2VIYW5kbGVyIiwidHlwZSIsImRhdGEiLCJsb2NhdGlvbiIsInJlbG9hZCIsImlzVXBkYXRlQXZhaWxhYmxlIiwiX193ZWJwYWNrX2hhc2hfXyIsImNhbkFwcGx5VXBkYXRlcyIsImNhbkFjY2VwdEVycm9ycyIsImhhc1JlYWN0UmVmcmVzaCIsInByb2Nlc3MiLCJlbnYiLCJGQVNUX1JFRlJFU0giLCJpbmRleE9mIiwiaGFuZGxlQXBwbHlVcGRhdGVzIiwiZXJyIiwidXBkYXRlZE1vZHVsZXMiLCJoYXZlRXJyb3JzIiwibmVlZHNGb3JjZWRSZWxvYWQiLCJyZXN1bHQiLCJjaGVjayIsInRoZW4iLCJOT0RFX0VOViIsInNldHVwT3ZlcmxheSIsIl9fcmVhY3RSZWZyZXNoT3ZlcmxheUluamVjdGVkIiwiX19yZWFjdF9yZWZyZXNoX3NvY2tldF9fIiwicnVuV2l0aFJldHJ5IiwiaW5pdFNvY2tldCIsImluaXQiLCJfX3Jlc291cmNlUXVlcnkiLCJjYWxsYmFjayIsIm1heFJldHJpZXMiLCJleGVjdXRlV2l0aFJldHJ5QW5kVGltZW91dCIsImN1cnJlbnRDb3VudCIsInNldFRpbWVvdXQiLCJNYXRoIiwicG93Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbnMvRXJyb3JPdmVybGF5RW50cnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIF9fcmVhY3RfcmVmcmVzaF9zb2NrZXRfXywgX19yZXNvdXJjZVF1ZXJ5ICovXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svY3JlYXRlLXJlYWN0LWFwcC9ibG9iL21hc3Rlci9wYWNrYWdlcy9yZWFjdC1kZXYtdXRpbHMvd2VicGFja0hvdERldkNsaWVudC5qc1xuICovXG5cbi8vIFRoaXMgaXMgYWRhcHRlZCB0byBob29rIGNyZWF0ZS1yZWFjdC1hcHAgZGlyZWN0bHkgaW50byByZWFjdC1yZWZyZXNoJ3MgZXhpc3Rpbmcgc29ja2V0IGNvbm5lY3Rpb25zXG5cbnZhciBydW5XaXRoUGF0Y2hlZFVybCA9IHJlcXVpcmUoJ0BwbW1td2gvcmVhY3QtcmVmcmVzaC13ZWJwYWNrLXBsdWdpbi9jbGllbnQvdXRpbHMvcGF0Y2hVcmwnKTtcbnZhciBmb3JtYXRXZWJwYWNrTWVzc2FnZXMgPSByZXF1aXJlKCdyZWFjdC1kZXYtdXRpbHMvZm9ybWF0V2VicGFja01lc3NhZ2VzJyk7XG52YXIgbGF1bmNoRWRpdG9yRW5kcG9pbnQgPSByZXF1aXJlKCdyZWFjdC1kZXYtdXRpbHMvbGF1bmNoRWRpdG9yRW5kcG9pbnQnKTtcbnZhciBFcnJvck92ZXJsYXkgPSByZXF1aXJlKCdyZWFjdC1lcnJvci1vdmVybGF5Jyk7XG52YXIgc3RyaXBBbnNpID0gcmVxdWlyZSgnc3RyaXAtYW5zaScpO1xuXG5FcnJvck92ZXJsYXkuc2V0RWRpdG9ySGFuZGxlcihmdW5jdGlvbiBlZGl0b3JIYW5kbGVyKGVycm9yTG9jYXRpb24pIHtcbiAgLy8gS2VlcCB0aGlzIHN5bmMgd2l0aCBlcnJvck92ZXJsYXlNaWRkbGV3YXJlLmpzXG4gIGZldGNoKFxuICAgIGxhdW5jaEVkaXRvckVuZHBvaW50ICtcbiAgICAgICc/ZmlsZU5hbWU9JyArXG4gICAgICB3aW5kb3cuZW5jb2RlVVJJQ29tcG9uZW50KGVycm9yTG9jYXRpb24uZmlsZU5hbWUpICtcbiAgICAgICcmbGluZU51bWJlcj0nICtcbiAgICAgIHdpbmRvdy5lbmNvZGVVUklDb21wb25lbnQoZXJyb3JMb2NhdGlvbi5saW5lTnVtYmVyIHx8IDEpICtcbiAgICAgICcmY29sTnVtYmVyPScgK1xuICAgICAgd2luZG93LmVuY29kZVVSSUNvbXBvbmVudChlcnJvckxvY2F0aW9uLmNvbE51bWJlciB8fCAxKSxcbiAgKTtcbn0pO1xuXG4vLyBEb24ndCBzaG93IG92ZXJsYXkgZm9yIGNlcnRhaW4gZXJyb3JzIGFzIHRoZXkgYXJlIGRpc3J1cHRpdmVcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlID0+IHtcbiAgICBpZiAoXG4gICAgICBlLm1lc3NhZ2UuaW5jbHVkZXMoXG4gICAgICAgICdUaGUgc2VydmVyIGNvdWxkIG5vdCBmaW5pc2ggdGhpcyBTdXNwZW5zZSBib3VuZGFyeScsXG4gICAgICApIHx8XG4gICAgICBlLnN0YXR1c1xuICAgICkge1xuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaWYgdGhlcmUgaGFzIGJlZW4gYSBydW50aW1lIGVycm9yLlxuLy8gRXNzZW50aWFsbHksIHdlIGNhbm5vdCBndWFyYW50ZWUgYXBwbGljYXRpb24gc3RhdGUgd2FzIG5vdCBjb3JydXB0ZWQgYnkgdGhlXG4vLyBydW50aW1lIGVycm9yLiBUbyBwcmV2ZW50IGNvbmZ1c2luZyBiZWhhdmlvciwgd2UgZm9yY2libHkgcmVsb2FkIHRoZSBlbnRpcmVcbi8vIGFwcGxpY2F0aW9uLiBUaGlzIGlzIGhhbmRsZWQgYmVsb3cgd2hlbiB3ZSBhcmUgbm90aWZpZWQgb2YgYSBjb21waWxlIChjb2RlXG4vLyBjaGFuZ2UpLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9jcmVhdGUtcmVhY3QtYXBwL2lzc3Vlcy8zMDk2XG52YXIgaGFkUnVudGltZUVycm9yID0gZmFsc2U7XG5FcnJvck92ZXJsYXkuc3RhcnRSZXBvcnRpbmdSdW50aW1lRXJyb3JzKHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKCkge1xuICAgIGhhZFJ1bnRpbWVFcnJvciA9IHRydWU7XG4gIH0sXG4gIGZpbGVuYW1lOiAnL0FwcC5qcycsXG59KTtcblxuaWYgKG1vZHVsZS5ob3QgJiYgdHlwZW9mIG1vZHVsZS5ob3QuZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24gKCkge1xuICAgIC8vIFRPRE86IHdoeSBkbyB3ZSBuZWVkIHRoaXM/XG4gICAgRXJyb3JPdmVybGF5LnN0b3BSZXBvcnRpbmdSdW50aW1lRXJyb3JzKCk7XG4gIH0pO1xufVxuXG4vLyBSZW1lbWJlciBzb21lIHN0YXRlIHJlbGF0ZWQgdG8gaG90IG1vZHVsZSByZXBsYWNlbWVudC5cbnZhciBpc0ZpcnN0Q29tcGlsYXRpb24gPSB0cnVlO1xudmFyIG1vc3RSZWNlbnRDb21waWxhdGlvbkhhc2ggPSBudWxsO1xudmFyIGhhc0NvbXBpbGVFcnJvcnMgPSBmYWxzZTtcblxuZnVuY3Rpb24gY2xlYXJPdXRkYXRlZEVycm9ycygpIHtcbiAgLy8gQ2xlYW4gdXAgb3V0ZGF0ZWQgY29tcGlsZSBlcnJvcnMsIGlmIGFueS5cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5jbGVhciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChoYXNDb21waWxlRXJyb3JzKSB7XG4gICAgICBjb25zb2xlLmNsZWFyKCk7XG4gICAgfVxuICB9XG59XG5cbi8vIFN1Y2Nlc3NmdWwgY29tcGlsYXRpb24uXG5mdW5jdGlvbiBoYW5kbGVTdWNjZXNzKCkge1xuICBjbGVhck91dGRhdGVkRXJyb3JzKCk7XG5cbiAgdmFyIGlzSG90VXBkYXRlID0gIWlzRmlyc3RDb21waWxhdGlvbjtcbiAgaXNGaXJzdENvbXBpbGF0aW9uID0gZmFsc2U7XG4gIGhhc0NvbXBpbGVFcnJvcnMgPSBmYWxzZTtcblxuICAvLyBBdHRlbXB0IHRvIGFwcGx5IGhvdCB1cGRhdGVzIG9yIHJlbG9hZC5cbiAgaWYgKGlzSG90VXBkYXRlKSB7XG4gICAgdHJ5QXBwbHlVcGRhdGVzKGZ1bmN0aW9uIG9uSG90VXBkYXRlU3VjY2VzcygpIHtcbiAgICAgIC8vIE9ubHkgZGlzbWlzcyBpdCB3aGVuIHdlJ3JlIHN1cmUgaXQncyBhIGhvdCB1cGRhdGUuXG4gICAgICAvLyBPdGhlcndpc2UgaXQgd291bGQgZmxpY2tlciByaWdodCBiZWZvcmUgdGhlIHJlbG9hZC5cbiAgICAgIHRyeURpc21pc3NFcnJvck92ZXJsYXkoKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBDb21waWxhdGlvbiB3aXRoIHdhcm5pbmdzIChlLmcuIEVTTGludCkuXG5mdW5jdGlvbiBoYW5kbGVXYXJuaW5ncyh3YXJuaW5ncykge1xuICBjbGVhck91dGRhdGVkRXJyb3JzKCk7XG5cbiAgdmFyIGlzSG90VXBkYXRlID0gIWlzRmlyc3RDb21waWxhdGlvbjtcbiAgaXNGaXJzdENvbXBpbGF0aW9uID0gZmFsc2U7XG4gIGhhc0NvbXBpbGVFcnJvcnMgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBwcmludFdhcm5pbmdzKCkge1xuICAgIC8vIFByaW50IHdhcm5pbmdzIHRvIHRoZSBjb25zb2xlLlxuICAgIHZhciBmb3JtYXR0ZWQgPSBmb3JtYXRXZWJwYWNrTWVzc2FnZXMoe1xuICAgICAgd2FybmluZ3M6IHdhcm5pbmdzLm1hcChlcnJvck9iak9yTWVzc2FnZSA9PlxuICAgICAgICBbZXJyb3JPYmpPck1lc3NhZ2UubW9kdWxlTmFtZSwgZXJyb3JPYmpPck1lc3NhZ2UubWVzc2FnZV0uam9pbignXFxuJyksXG4gICAgICApLFxuICAgICAgZXJyb3JzOiBbXSxcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtYXR0ZWQud2FybmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT09IDUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnVGhlcmUgd2VyZSBtb3JlIHdhcm5pbmdzIGluIG90aGVyIGZpbGVzLlxcbicgK1xuICAgICAgICAgICAgICAnWW91IGNhbiBmaW5kIGEgY29tcGxldGUgbG9nIGluIHRoZSB0ZXJtaW5hbC4nLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKHN0cmlwQW5zaShmb3JtYXR0ZWQud2FybmluZ3NbaV0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcmludFdhcm5pbmdzKCk7XG5cbiAgLy8gQXR0ZW1wdCB0byBhcHBseSBob3QgdXBkYXRlcyBvciByZWxvYWQuXG4gIGlmIChpc0hvdFVwZGF0ZSkge1xuICAgIHRyeUFwcGx5VXBkYXRlcyhmdW5jdGlvbiBvblN1Y2Nlc3NmdWxIb3RVcGRhdGUoKSB7XG4gICAgICAvLyBPbmx5IGRpc21pc3MgaXQgd2hlbiB3ZSdyZSBzdXJlIGl0J3MgYSBob3QgdXBkYXRlLlxuICAgICAgLy8gT3RoZXJ3aXNlIGl0IHdvdWxkIGZsaWNrZXIgcmlnaHQgYmVmb3JlIHRoZSByZWxvYWQuXG4gICAgICB0cnlEaXNtaXNzRXJyb3JPdmVybGF5KCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLy8gQ29tcGlsYXRpb24gd2l0aCBlcnJvcnMgKGUuZy4gc3ludGF4IGVycm9yIG9yIG1pc3NpbmcgbW9kdWxlcykuXG5mdW5jdGlvbiBoYW5kbGVFcnJvcnMoZXJyb3JzKSB7XG4gIGNsZWFyT3V0ZGF0ZWRFcnJvcnMoKTtcblxuICBpc0ZpcnN0Q29tcGlsYXRpb24gPSBmYWxzZTtcbiAgaGFzQ29tcGlsZUVycm9ycyA9IHRydWU7XG5cbiAgLy8gXCJNYXNzYWdlXCIgd2VicGFjayBtZXNzYWdlcy5cbiAgdmFyIGZvcm1hdHRlZCA9IGZvcm1hdFdlYnBhY2tNZXNzYWdlcyh7XG4gICAgZXJyb3JzOiBlcnJvcnMubWFwKGVycm9yT2JqT3JNZXNzYWdlID0+XG4gICAgICBbZXJyb3JPYmpPck1lc3NhZ2UubW9kdWxlTmFtZSwgZXJyb3JPYmpPck1lc3NhZ2UubWVzc2FnZV0uam9pbignXFxuJyksXG4gICAgKSxcbiAgICB3YXJuaW5nczogW10sXG4gIH0pO1xuXG4gIC8vIE9ubHkgc2hvdyB0aGUgZmlyc3QgZXJyb3IuXG4gIEVycm9yT3ZlcmxheS5yZXBvcnRCdWlsZEVycm9yKGZvcm1hdHRlZC5lcnJvcnNbMF0pO1xuXG4gIC8vIEFsc28gbG9nIHRoZW0gdG8gdGhlIGNvbnNvbGUuXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hdHRlZC5lcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnNvbGUuZXJyb3Ioc3RyaXBBbnNpKGZvcm1hdHRlZC5lcnJvcnNbaV0pKTtcbiAgICB9XG4gIH1cblxuICAvLyBEbyBub3QgYXR0ZW1wdCB0byByZWxvYWQgbm93LlxuICAvLyBXZSB3aWxsIHJlbG9hZCBvbiBuZXh0IHN1Y2Nlc3MgaW5zdGVhZC5cbn1cblxuZnVuY3Rpb24gdHJ5RGlzbWlzc0Vycm9yT3ZlcmxheSgpIHtcbiAgaWYgKCFoYXNDb21waWxlRXJyb3JzKSB7XG4gICAgRXJyb3JPdmVybGF5LmRpc21pc3NCdWlsZEVycm9yKCk7XG4gIH1cbn1cblxuLy8gVGhlcmUgaXMgYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBjb2RlIGF2YWlsYWJsZS5cbmZ1bmN0aW9uIGhhbmRsZUF2YWlsYWJsZUhhc2goaGFzaCkge1xuICAvLyBVcGRhdGUgbGFzdCBrbm93biBjb21waWxhdGlvbiBoYXNoLlxuICBtb3N0UmVjZW50Q29tcGlsYXRpb25IYXNoID0gaGFzaDtcbn1cblxuLy8gSGFuZGxlIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci5cbmZ1bmN0aW9uIGNvbXBpbGVNZXNzYWdlSGFuZGxlcihtZXNzYWdlKSB7XG4gIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgY2FzZSAnaGFzaCc6XG4gICAgICBoYW5kbGVBdmFpbGFibGVIYXNoKG1lc3NhZ2UuZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzdGlsbC1vayc6XG4gICAgY2FzZSAnb2snOlxuICAgICAgaGFuZGxlU3VjY2VzcygpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY29udGVudC1jaGFuZ2VkJzpcbiAgICAgIC8vIFRyaWdnZXJlZCB3aGVuIGEgZmlsZSBmcm9tIGBjb250ZW50QmFzZWAgY2hhbmdlZC5cbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3dhcm5pbmdzJzpcbiAgICAgIGhhbmRsZVdhcm5pbmdzKG1lc3NhZ2UuZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlcnJvcnMnOlxuICAgICAgaGFuZGxlRXJyb3JzKG1lc3NhZ2UuZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgIC8vIERvIG5vdGhpbmcuXG4gIH1cbn1cblxuLy8gSXMgdGhlcmUgYSBuZXdlciB2ZXJzaW9uIG9mIHRoaXMgY29kZSBhdmFpbGFibGU/XG5mdW5jdGlvbiBpc1VwZGF0ZUF2YWlsYWJsZSgpIHtcbiAgLyogZ2xvYmFscyBfX3dlYnBhY2tfaGFzaF9fICovXG4gIC8vIF9fd2VicGFja19oYXNoX18gaXMgdGhlIGhhc2ggb2YgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24uXG4gIC8vIEl0J3MgYSBnbG9iYWwgdmFyaWFibGUgaW5qZWN0ZWQgYnkgd2VicGFjay5cbiAgcmV0dXJuIG1vc3RSZWNlbnRDb21waWxhdGlvbkhhc2ggIT09IF9fd2VicGFja19oYXNoX187XG59XG5cbi8vIHdlYnBhY2sgZGlzYWxsb3dzIHVwZGF0ZXMgaW4gb3RoZXIgc3RhdGVzLlxuZnVuY3Rpb24gY2FuQXBwbHlVcGRhdGVzKCkge1xuICByZXR1cm4gbW9kdWxlLmhvdC5zdGF0dXMoKSA9PT0gJ2lkbGUnO1xufVxuXG5mdW5jdGlvbiBjYW5BY2NlcHRFcnJvcnMoKSB7XG4gIC8vIE5PVEU6IFRoaXMgdmFyIGlzIGluamVjdGVkIGJ5IFdlYnBhY2sncyBEZWZpbmVQbHVnaW4sIGFuZCBpcyBhIGJvb2xlYW4gaW5zdGVhZCBvZiBzdHJpbmcuXG4gIGNvbnN0IGhhc1JlYWN0UmVmcmVzaCA9IHByb2Nlc3MuZW52LkZBU1RfUkVGUkVTSDtcblxuICBjb25zdCBzdGF0dXMgPSBtb2R1bGUuaG90LnN0YXR1cygpO1xuICAvLyBSZWFjdCByZWZyZXNoIGNhbiBoYW5kbGUgaG90LXJlbG9hZGluZyBvdmVyIGVycm9ycy5cbiAgLy8gSG93ZXZlciwgd2hlbiBob3QtcmVsb2FkIHN0YXR1cyBpcyBhYm9ydCBvciBmYWlsLFxuICAvLyBpdCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgdXBkYXRlIGNhbm5vdCBiZSBhcHBsaWVkIHNhZmVseSxcbiAgLy8gYW5kIHRodXMgd2Ugc2hvdWxkIGJhaWwgb3V0IHRvIGEgZm9yY2VkIHJlbG9hZCBmb3IgY29uc2lzdGVuY3kuXG4gIHJldHVybiBoYXNSZWFjdFJlZnJlc2ggJiYgWydhYm9ydCcsICdmYWlsJ10uaW5kZXhPZihzdGF0dXMpID09PSAtMTtcbn1cblxuLy8gQXR0ZW1wdCB0byB1cGRhdGUgY29kZSBvbiB0aGUgZmx5LCBmYWxsIGJhY2sgdG8gYSBoYXJkIHJlbG9hZC5cbmZ1bmN0aW9uIHRyeUFwcGx5VXBkYXRlcyhvbkhvdFVwZGF0ZVN1Y2Nlc3MpIHtcbiAgaWYgKCFtb2R1bGUuaG90KSB7XG4gICAgLy8gSG90TW9kdWxlUmVwbGFjZW1lbnRQbHVnaW4gaXMgbm90IGluIHdlYnBhY2sgY29uZmlndXJhdGlvbi5cbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gd2Uga25vdyBpdCdzIGhvdCwgc28gZGlzbWlzcyBlcnJvclxuICBpZiAodHlwZW9mIG9uSG90VXBkYXRlU3VjY2VzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9uSG90VXBkYXRlU3VjY2VzcygpO1xuICB9XG5cbiAgaWYgKCFpc1VwZGF0ZUF2YWlsYWJsZSgpIHx8ICFjYW5BcHBseVVwZGF0ZXMoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUFwcGx5VXBkYXRlcyhlcnIsIHVwZGF0ZWRNb2R1bGVzKSB7XG4gICAgY29uc3QgaGF2ZUVycm9ycyA9IGVyciB8fCBoYWRSdW50aW1lRXJyb3I7XG4gICAgLy8gV2hlbiB0aGVyZSBpcyBubyBlcnJvciBidXQgdXBkYXRlZE1vZHVsZXMgaXMgdW5hdmFpbGFibGUsXG4gICAgLy8gaXQgaW5kaWNhdGVzIGEgY3JpdGljYWwgZmFpbHVyZSBpbiBob3QtcmVsb2FkaW5nLFxuICAgIC8vIGUuZy4gc2VydmVyIGlzIG5vdCByZWFkeSB0byBzZXJ2ZSBuZXcgYnVuZGxlLFxuICAgIC8vIGFuZCBoZW5jZSB3ZSBuZWVkIHRvIGRvIGEgZm9yY2VkIHJlbG9hZC5cbiAgICBjb25zdCBuZWVkc0ZvcmNlZFJlbG9hZCA9ICFlcnIgJiYgIXVwZGF0ZWRNb2R1bGVzO1xuICAgIGlmICgoaGF2ZUVycm9ycyAmJiAhY2FuQWNjZXB0RXJyb3JzKCkpIHx8IG5lZWRzRm9yY2VkUmVsb2FkKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvbkhvdFVwZGF0ZVN1Y2Nlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIE1heWJlIHdlIHdhbnQgdG8gZG8gc29tZXRoaW5nLlxuICAgICAgb25Ib3RVcGRhdGVTdWNjZXNzKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzVXBkYXRlQXZhaWxhYmxlKCkpIHtcbiAgICAgIC8vIFdoaWxlIHdlIHdlcmUgdXBkYXRpbmcsIHRoZXJlIHdhcyBhIG5ldyB1cGRhdGUhIERvIGl0IGFnYWluLlxuICAgICAgdHJ5QXBwbHlVcGRhdGVzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly93ZWJwYWNrLmdpdGh1Yi5pby9kb2NzL2hvdC1tb2R1bGUtcmVwbGFjZW1lbnQuaHRtbCNjaGVja1xuICB2YXIgcmVzdWx0ID0gbW9kdWxlLmhvdC5jaGVjaygvKiBhdXRvQXBwbHkgKi8gdHJ1ZSwgaGFuZGxlQXBwbHlVcGRhdGVzKTtcblxuICAvLyAvLyB3ZWJwYWNrIDIgcmV0dXJucyBhIFByb21pc2UgaW5zdGVhZCBvZiBpbnZva2luZyBhIGNhbGxiYWNrXG4gIGlmIChyZXN1bHQgJiYgcmVzdWx0LnRoZW4pIHtcbiAgICByZXN1bHQudGhlbihcbiAgICAgIGZ1bmN0aW9uICh1cGRhdGVkTW9kdWxlcykge1xuICAgICAgICBoYW5kbGVBcHBseVVwZGF0ZXMobnVsbCwgdXBkYXRlZE1vZHVsZXMpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaGFuZGxlQXBwbHlVcGRhdGVzKGVyciwgbnVsbCk7XG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcnVuV2l0aFBhdGNoZWRVcmwoZnVuY3Rpb24gc2V0dXBPdmVybGF5KCkge1xuICAgIC8vIE9ubHkgcmVnaXN0ZXIgaWYgbm8gb3RoZXIgb3ZlcmxheSBoYXZlIGJlZW4gcmVnaXN0ZXJlZFxuICAgIGlmICghd2luZG93Ll9fcmVhY3RSZWZyZXNoT3ZlcmxheUluamVjdGVkICYmIF9fcmVhY3RfcmVmcmVzaF9zb2NrZXRfXykge1xuICAgICAgLy8gUmVnaXN0ZXJzIGhhbmRsZXJzIGZvciBjb21waWxlIGVycm9ycyB3aXRoIHJldHJ5IC1cbiAgICAgIC8vIFRoaXMgaXMgdG8gcHJldmVudCBtaXNtYXRjaGluZyBpbmplY3Rpb24gb3JkZXIgY2F1c2luZyBlcnJvcnMgdG8gYmUgdGhyb3duXG4gICAgICBydW5XaXRoUmV0cnkoZnVuY3Rpb24gaW5pdFNvY2tldCgpIHtcbiAgICAgICAgX19yZWFjdF9yZWZyZXNoX3NvY2tldF9fLmluaXQoY29tcGlsZU1lc3NhZ2VIYW5kbGVyLCBfX3Jlc291cmNlUXVlcnkpO1xuICAgICAgfSwgMyk7XG4gICAgICAvLyBSZWdpc3RlcnMgaGFuZGxlcnMgZm9yIHJ1bnRpbWUgZXJyb3JzXG4gICAgICAvKmhhbmRsZUVycm9yKGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgICAgIGhhc1J1bnRpbWVFcnJvcnMgPSB0cnVlO1xuICAgICAgICBfX3JlYWN0X3JlZnJlc2hfZXJyb3Jfb3ZlcmxheV9fLmhhbmRsZVJ1bnRpbWVFcnJvcihlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihmdW5jdGlvbiBoYW5kbGVVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uKGVycm9yKSB7XG4gICAgICAgIGhhc1J1bnRpbWVFcnJvcnMgPSB0cnVlO1xuICAgICAgICBfX3JlYWN0X3JlZnJlc2hfZXJyb3Jfb3ZlcmxheV9fLmhhbmRsZVJ1bnRpbWVFcnJvcihlcnJvcik7XG4gICAgICB9KTsqL1xuXG4gICAgICAvLyBNYXJrIG92ZXJsYXkgYXMgaW5qZWN0ZWQgdG8gcHJldmVudCBkb3VibGUtaW5qZWN0aW9uXG4gICAgICB3aW5kb3cuX19yZWFjdFJlZnJlc2hPdmVybGF5SW5qZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBydW5XaXRoUmV0cnkoY2FsbGJhY2ssIG1heFJldHJpZXMpIHtcbiAgZnVuY3Rpb24gZXhlY3V0ZVdpdGhSZXRyeUFuZFRpbWVvdXQoY3VycmVudENvdW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjdXJyZW50Q291bnQgPiBtYXhSZXRyaWVzIC0gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tSZWFjdCBSZWZyZXNoXSBGYWlsZWQgc2V0IHVwIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2V0VGltZW91dChcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGV4ZWN1dGVXaXRoUmV0cnlBbmRUaW1lb3V0KGN1cnJlbnRDb3VudCArIDEpO1xuICAgICAgICB9LFxuICAgICAgICBNYXRoLnBvdygxMCwgY3VycmVudENvdW50KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZXhlY3V0ZVdpdGhSZXRyeUFuZFRpbWVvdXQoMCk7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsSUFBSUEsaUJBQWlCLEdBQUdDLE9BQU8sQ0FBQyw0REFBNEQsQ0FBQztBQUM3RixJQUFJQyxxQkFBcUIsR0FBR0QsT0FBTyxDQUFDLHVDQUF1QyxDQUFDO0FBQzVFLElBQUlFLG9CQUFvQixHQUFHRixPQUFPLENBQUMsc0NBQXNDLENBQUM7QUFDMUUsSUFBSUcsWUFBWSxHQUFHSCxPQUFPLENBQUMscUJBQXFCLENBQUM7QUFDakQsSUFBSUksU0FBUyxHQUFHSixPQUFPLENBQUMsWUFBWSxDQUFDO0FBRXJDRyxZQUFZLENBQUNFLGdCQUFnQixDQUFDLFNBQVNDLGFBQWFBLENBQUNDLGFBQWEsRUFBRTtFQUNsRTtFQUNBQyxLQUFLLENBQ0hOLG9CQUFvQixHQUNsQixZQUFZLEdBQ1pPLE1BQU0sQ0FBQ0Msa0JBQWtCLENBQUNILGFBQWEsQ0FBQ0ksUUFBUSxDQUFDLEdBQ2pELGNBQWMsR0FDZEYsTUFBTSxDQUFDQyxrQkFBa0IsQ0FBQ0gsYUFBYSxDQUFDSyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQ3hELGFBQWEsR0FDYkgsTUFBTSxDQUFDQyxrQkFBa0IsQ0FBQ0gsYUFBYSxDQUFDTSxTQUFTLElBQUksQ0FBQyxDQUMxRCxDQUFDO0FBQ0gsQ0FBQyxDQUFDOztBQUVGO0FBQ0EsSUFBSSxPQUFPSixNQUFNLEtBQUssV0FBVyxFQUFFO0VBQ2pDQSxNQUFNLENBQUNLLGdCQUFnQixDQUFDLE9BQU8sRUFBRUMsQ0FB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QWtCLENBQUM7O0VBRXZFO0VBQ0EsSUFBSUssTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQUksRUFBRTtJQUN6QkYsTUFBTSxDQUFDRSxJQUFJLENBQ1QsVUFBVUwsY0FBYyxFQUFFO01BQ3hCRixrQkFBa0IsQ0FBQyxJQUFJLEVBQUVFLGNBQWMsQ0FBQztJQUMxQyxDQUFDLEVBQ0QsVUFBVUQsR0FBRyxFQUFFO01BQ2JELGtCQUFrQixDQUFDQyxHQUFHLEVBQUUsSUFBSSxDQUFDO0lBQy9CLENBQ0YsQ0FBQztFQUNIO0FBQ0Y7QUFFQSxJQUFJTCxPQUFPLENBQUNDLEdBQUcsQ0FBQ1csUUFBUSxLQUFLLFlBQVksSUFBSSxPQUFPdkUsTUFBTSxLQUFLLFdBQVcsRUFBRTtFQUMxRVYsaUJBQWlCLENBQUMsU0FBU2tGLFlBQVlBLENBQUEsRUFBRztJQUN4QztJQUNBLElBQUksQ0FBQ3hFLE1BQU0sQ0FBQ3lFLDZCQUE2QixJQUFJQyx3QkFBd0IsRUFBRTtNQUNyRTtNQUNBO01BQ0FDLFlBQVksQ0FBQyxTQUFTQyxVQUFVQSxDQUFBLEVBQUc7UUFDakNGLHdCQUF3QixDQUFDRyxJQUFJLENBQUM1QixxQkFBcUIsRUFBRTZCLGVBQWUsQ0FBQztNQUN2RSxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ0w7TUFDQTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztNQUVNO01BQ0E5RSxNQUFNLENBQUN5RSw2QkFBNkIsR0FBRyxJQUFJO0lBQzdDO0VBQ0YsQ0FBQyxDQUFDO0FBQ0o7QUFDQSxTQUFTRSxZQUFZQSxDQUFDSSxRQUFRLEVBQUVDLFVBQVUsRUFBRTtFQUMxQyxTQUFTQywwQkFBMEJBLENBQUNDLFlBQVksRUFBRTtJQUNoRCxJQUFJO01BQ0YsSUFBSUEsWUFBWSxHQUFHRixVQUFVLEdBQUcsQ0FBQyxFQUFFO1FBQ2pDekQsT0FBTyxDQUFDZ0IsSUFBSSxDQUFDLHNEQUFzRCxDQUFDO1FBQ3BFO01BQ0Y7TUFFQXdDLFFBQVEsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE9BQU9mLEdBQUcsRUFBRTtNQUNabUIsVUFBVSxDQUNSLFlBQVk7UUFDVkYsMEJBQTBCLENBQUNDLFlBQVksR0FBRyxDQUFDLENBQUM7TUFDOUMsQ0FBQyxFQUNERSxJQUFJLENBQUNDLEdBQUcsQ0FBQyxFQUFFLEVBQUVILFlBQVksQ0FDM0IsQ0FBQztJQUNIO0VBQ0Y7RUFFQUQsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0FBQy9CIiwiaWdub3JlTGlzdCI6W119