Files
portal-api/public/js/service/vminfo.min.js
T
2025-08-10 20:24:23 +07:00

32 lines
57 KiB
JavaScript

/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./resources/js/service/vminfo.js":
/*!****************************************!*\
!*** ./resources/js/service/vminfo.js ***!
\****************************************/
/***/ (() => {
eval("$(document).ready(function () {\n // Initialize dropdown functionality\n function initializeDropdown() {\n // Toggle dropdown on click\n $(document).on(\"click\", \".dropdown-selected\", function (e) {\n e.stopPropagation();\n var $dropdown = $(this).closest(\".custom-dropdown\");\n var $options = $dropdown.find(\".dropdown-options\");\n var $selected = $(this);\n\n // Close other dropdowns\n $(\".custom-dropdown\").not($dropdown).find(\".dropdown-options\").removeClass(\"show\");\n $(\".custom-dropdown\").not($dropdown).find(\".dropdown-selected\").removeClass(\"active\");\n\n // Toggle current dropdown\n $options.toggleClass(\"show\");\n $selected.toggleClass(\"active\");\n });\n\n // Handle option selection\n $(document).on(\"click\", \".dropdown-option\", function (e) {\n e.stopPropagation();\n var $option = $(this);\n var $dropdown = $option.closest(\".custom-dropdown\");\n var $selected = $dropdown.find(\".dropdown-selected\");\n var $options = $dropdown.find(\".dropdown-options\");\n var $selectedText = $selected.find(\".selected-text\");\n\n // Get data from selected option\n var value = $option.data(\"value\");\n var months = $option.data(\"months\");\n var price = $option.data(\"price\");\n // Get text from the first span element to avoid getting badge text\n var text = $option.find('span').first().text();\n\n // Update selected text\n $selectedText.text(text);\n\n // Update hidden inputs\n $dropdown.closest(\"form\").find(\".hiddenMonths\").val(months);\n $dropdown.closest(\"form\").find(\".hiddenTotalPrice\").val(price);\n\n // Update selected state\n $options.find(\".dropdown-option\").removeClass(\"selected\");\n $option.addClass(\"selected\");\n\n // Close dropdown\n $options.removeClass(\"show\");\n $selected.removeClass(\"active\");\n\n // Trigger custom event for other components\n $dropdown.trigger(\"dropdown:changed\", {\n value: value,\n months: months,\n price: price,\n text: text\n });\n\n // Update price display using jQuery\n var $productContainer = $dropdown.closest('[data-product-id]');\n var basePrice = parseFloat($productContainer.data('base-price'));\n var selectedMonths = parseInt(months);\n\n // Calculate prices\n var originalPrice = basePrice * selectedMonths;\n var savings = selectedMonths >= 12 ? Math.round(originalPrice * 0.1) : 0;\n var finalPrice = originalPrice - savings;\n\n // Update display\n $productContainer.find('.total-price-display').text('₫' + finalPrice.toLocaleString());\n $productContainer.find('.months-display').text(selectedMonths + ' tháng');\n $productContainer.find('.price-per-month').text('₫' + basePrice.toLocaleString() + '/tháng');\n $productContainer.find('.original-price').text('₫' + originalPrice.toLocaleString());\n $productContainer.find('.savings-amount').text('₫' + savings.toLocaleString());\n\n // Show/hide savings info\n if (savings > 0) {\n $productContainer.find('.savings-info').show();\n } else {\n $productContainer.find('.savings-info').hide();\n }\n });\n\n // Close dropdown when clicking outside\n $(document).on(\"click\", function (e) {\n if (!$(e.target).closest(\".custom-dropdown\").length) {\n $(\".dropdown-options\").removeClass(\"show\");\n $(\".dropdown-selected\").removeClass(\"active\");\n }\n });\n\n // Close dropdown on escape key\n $(document).on(\"keydown\", function (e) {\n if (e.key === \"Escape\") {\n $(\".dropdown-options\").removeClass(\"show\");\n $(\".dropdown-selected\").removeClass(\"active\");\n }\n });\n }\n\n // Initialize on page load\n initializeDropdown();\n\n // Optimize form submission to prevent blocking\n $(document).on('submit', 'form[action*=\"them-gio-hang\"]', function (e) {\n var $form = $(this);\n var $submitBtn = $form.find('button[type=\"submit\"]');\n\n // Disable submit button to prevent double submission\n $submitBtn.prop('disabled', true).text('Đang xử lý...');\n\n // Add loading state\n $form.addClass('submitting');\n\n // Re-enable button after 5 seconds as fallback\n setTimeout(function () {\n $submitBtn.prop('disabled', false).text('Đăng ký ngay');\n $form.removeClass('submitting');\n }, 5000);\n });\n\n // Cache utility functions - Single JSON approach\n var VM_INFO_CACHE_KEY = \"vm_info_cache\";\n function saveVMInfoToCache(templateId, data) {\n var ttl = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 30 * 60 * 1000;\n try {\n var now = new Date().getTime();\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n vmInfoCache = {\n lastUpdated: now,\n data: {}\n };\n }\n vmInfoCache.data[templateId] = {\n value: data,\n expiry: now + ttl\n };\n vmInfoCache.lastUpdated = now;\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n } catch (e) {\n console.warn(\"VM Info cache save failed:\", e);\n }\n }\n function getVMInfoFromCache(templateId) {\n try {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache || !vmInfoCache.data[templateId]) {\n return null;\n }\n var item = vmInfoCache.data[templateId];\n var now = new Date().getTime();\n\n // Check if expired\n if (now > item.expiry) {\n removeVMInfoFromCache(templateId);\n return null;\n }\n return item.value;\n } catch (e) {\n console.warn(\"VM Info cache get failed:\", e);\n return null;\n }\n }\n function getVMInfoCache() {\n try {\n var cacheStr = localStorage.getItem(VM_INFO_CACHE_KEY);\n return cacheStr ? JSON.parse(cacheStr) : null;\n } catch (e) {\n console.warn(\"VM Info cache parse failed:\", e);\n return null;\n }\n }\n function removeVMInfoFromCache(templateId) {\n try {\n var vmInfoCache = getVMInfoCache();\n if (vmInfoCache && vmInfoCache.data[templateId]) {\n delete vmInfoCache.data[templateId];\n vmInfoCache.lastUpdated = new Date().getTime();\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n }\n } catch (e) {\n console.warn(\"VM Info cache remove failed:\", e);\n }\n }\n function clearExpiredVMInfoCache() {\n try {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n return;\n }\n var now = new Date().getTime();\n var hasExpired = false;\n Object.keys(vmInfoCache.data).forEach(function (templateId) {\n var item = vmInfoCache.data[templateId];\n if (now > item.expiry) {\n delete vmInfoCache.data[templateId];\n hasExpired = true;\n }\n });\n if (hasExpired) {\n vmInfoCache.lastUpdated = now;\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n }\n } catch (e) {\n console.warn(\"VM Info cache cleanup failed:\", e);\n }\n }\n\n // Re-initialize if content is dynamically loaded\n $(document).on(\"DOMContentLoaded\", initializeDropdown);\n\n // Load VM information for each product with caching (OS, CPU, RAM, Disk) - NON-BLOCKING\n function loadGuestOSInfo() {\n // Get unique template IDs to avoid duplicate API calls\n var templateIds = [];\n $(\".guest-os\").each(function () {\n var templateId = $(this).data(\"template-id\");\n if (templateId && !templateIds.includes(templateId)) {\n templateIds.push(templateId);\n }\n });\n\n // Load VM info in background without blocking form submission\n templateIds.forEach(function (templateId) {\n // Check cache first\n var cachedData = getVMInfoFromCache(templateId);\n if (cachedData) {\n // Use cached data\n updateVMInfoUI(templateId, cachedData);\n return;\n }\n\n // Add loading indicators\n addLoadingIndicators(templateId);\n\n // Call API to get complete VM info - with shorter timeout\n $.ajax({\n url: \"/api/v1/get-vm-info/\".concat(templateId, \"/guest_os,cpu_count,memory_size,disk_capacity\"),\n method: \"GET\",\n timeout: 5000,\n // Reduced timeout to 5 seconds\n headers: {\n \"X-CSRF-TOKEN\": $('meta[name=\"csrf-token\"]').attr(\"content\"),\n Accept: \"application/json\"\n },\n success: function success(response) {\n if (response.error === false && response.data) {\n var vmData = response.data;\n var processedData = processVMData(vmData);\n\n // Cache the result for 30 minutes\n saveVMInfoToCache(templateId, processedData);\n\n // Update UI\n updateVMInfoUI(templateId, processedData);\n } else {\n setFallbackValues(templateId);\n }\n },\n error: function error(xhr, status, _error) {\n console.warn(\"Failed to load VM info for template:\", templateId, _error);\n setFallbackValues(templateId);\n }\n });\n });\n }\n\n // Load VM info after a short delay to not block page load\n setTimeout(loadGuestOSInfo, 1000);\n\n // Process VM data from API response\n function processVMData(vmData) {\n var guestOS = vmData.guest_os || \"UNKNOWN\";\n var cpuCount = vmData.cpu_count || 0;\n var memoryMB = vmData.memory_size || 0;\n var diskBytes = vmData.disk_capacity || 0;\n return {\n guestOS: guestOS,\n formattedOS: formatOSName(guestOS),\n cpu: cpuCount,\n formattedCPU: \"\".concat(cpuCount, \" vCore\").concat(cpuCount > 1 ? \"s\" : \"\"),\n ram: Math.round(memoryMB / 1024 * 100) / 100,\n // Convert MB to GB, 2 decimal places\n formattedRAM: \"\".concat(Math.round(memoryMB / 1024 * 100) / 100, \" GB\"),\n disk: Math.round(diskBytes / (1024 * 1024 * 1024) * 100) / 100,\n // Convert bytes to GB\n formattedDisk: \"\".concat(Math.round(diskBytes / (1024 * 1024 * 1024) * 100) / 100, \" GB\")\n };\n }\n\n // Add loading indicators to all VM info elements\n function addLoadingIndicators(templateId) {\n var loadingIcon = '<i class=\"fas fa-spinner fa-spin text-orange-500 mr-1\"></i>Đang tải...';\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n }\n\n // Update all VM info UI elements\n function updateVMInfoUI(templateId, data) {\n // Update OS\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedOS);\n updateOSIcon(templateId, data.guestOS);\n\n // Update hardware specs\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedCPU);\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedRAM);\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedDisk);\n }\n\n // Set fallback values when API fails\n function setFallbackValues(templateId) {\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"Linux\");\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n }\n\n // Update OS icon based on detected OS\n function updateOSIcon(templateId, osName) {\n var $iconElement = $(\".os-icon[data-template-id=\\\"\".concat(templateId, \"\\\"]\"));\n if (osName && osName.toLowerCase().includes(\"windows\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-windows\");\n } else if (osName && osName.toLowerCase().includes(\"ubuntu\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-ubuntu\");\n } else if (osName && osName.toLowerCase().includes(\"centos\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-centos\");\n } else if (osName && osName.toLowerCase().includes(\"debian\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-debian\");\n } else {\n // Keep linux icon as default\n $iconElement.removeClass().addClass(\"fab fa-linux text-orange-600\");\n }\n }\n\n // Format OS name for better display\n function formatOSName(osName) {\n var osMap = {\n UBUNTU_64: \"Ubuntu 64-bit\",\n CENTOS_64: \"CentOS 64-bit\",\n CENTOS_7_64: \"CentOS 7 64-bit\",\n CENTOS_8_64: \"CentOS 8 64-bit\",\n ROCKY_LINUX_64: \"Rocky Linux 64-bit\",\n WINDOWS_10_64: \"Windows 10 64-bit\",\n WINDOWS_9_SERVER_64: \"Windows Server 2019\",\n WINDOWS_SERVER_2019: \"Windows Server 2019\",\n WINDOWS_SERVER_2022: \"Windows Server 2022\",\n WINDOWS_2019: \"Windows Server 2019\",\n WINDOWS_2022: \"Windows Server 2022\",\n DEBIAN_10_64: \"Debian 10 64-bit\",\n DEBIAN_11_64: \"Debian 11 64-bit\",\n OTHER_LINUX_64: \"Linux 64-bit\",\n OTHER_64: \"Other 64-bit\"\n };\n return osMap[osName] || osName || \"Linux\";\n }\n\n // Clean up expired cache entries\n clearExpiredVMInfoCache();\n\n // Load Guest OS info when page loads\n loadGuestOSInfo();\n\n // Expose cache management to global scope for debugging\n window.vmInfoCache = {\n clear: function clear() {\n localStorage.removeItem(VM_INFO_CACHE_KEY);\n },\n refresh: function refresh() {\n this.clear();\n loadGuestOSInfo();\n },\n info: function info() {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n return;\n }\n var templateIds = Object.keys(vmInfoCache.data);\n templateIds.forEach(function (templateId) {\n var data = getVMInfoFromCache(templateId);\n });\n },\n get: function get(templateId) {\n return getVMInfoFromCache(templateId);\n },\n remove: function remove(templateId) {\n removeVMInfoFromCache(templateId);\n },\n raw: function raw() {\n return getVMInfoCache();\n }\n };\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyIkIiwiZG9jdW1lbnQiLCJyZWFkeSIsImluaXRpYWxpemVEcm9wZG93biIsIm9uIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsIiRkcm9wZG93biIsImNsb3Nlc3QiLCIkb3B0aW9ucyIsImZpbmQiLCIkc2VsZWN0ZWQiLCJub3QiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwiJG9wdGlvbiIsIiRzZWxlY3RlZFRleHQiLCJ2YWx1ZSIsImRhdGEiLCJtb250aHMiLCJwcmljZSIsInRleHQiLCJmaXJzdCIsInZhbCIsImFkZENsYXNzIiwidHJpZ2dlciIsIiRwcm9kdWN0Q29udGFpbmVyIiwiYmFzZVByaWNlIiwicGFyc2VGbG9hdCIsInNlbGVjdGVkTW9udGhzIiwicGFyc2VJbnQiLCJvcmlnaW5hbFByaWNlIiwic2F2aW5ncyIsIk1hdGgiLCJyb3VuZCIsImZpbmFsUHJpY2UiLCJ0b0xvY2FsZVN0cmluZyIsInNob3ciLCJoaWRlIiwidGFyZ2V0IiwibGVuZ3RoIiwia2V5IiwiJGZvcm0iLCIkc3VibWl0QnRuIiwicHJvcCIsInNldFRpbWVvdXQiLCJWTV9JTkZPX0NBQ0hFX0tFWSIsInNhdmVWTUluZm9Ub0NhY2hlIiwidGVtcGxhdGVJZCIsInR0bCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsIm5vdyIsIkRhdGUiLCJnZXRUaW1lIiwidm1JbmZvQ2FjaGUiLCJnZXRWTUluZm9DYWNoZSIsImxhc3RVcGRhdGVkIiwiZXhwaXJ5IiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb25zb2xlIiwid2FybiIsImdldFZNSW5mb0Zyb21DYWNoZSIsIml0ZW0iLCJyZW1vdmVWTUluZm9Gcm9tQ2FjaGUiLCJjYWNoZVN0ciIsImdldEl0ZW0iLCJwYXJzZSIsImNsZWFyRXhwaXJlZFZNSW5mb0NhY2hlIiwiaGFzRXhwaXJlZCIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwibG9hZEd1ZXN0T1NJbmZvIiwidGVtcGxhdGVJZHMiLCJlYWNoIiwiaW5jbHVkZXMiLCJwdXNoIiwiY2FjaGVkRGF0YSIsInVwZGF0ZVZNSW5mb1VJIiwiYWRkTG9hZGluZ0luZGljYXRvcnMiLCJhamF4IiwidXJsIiwiY29uY2F0IiwibWV0aG9kIiwidGltZW91dCIsImhlYWRlcnMiLCJhdHRyIiwiQWNjZXB0Iiwic3VjY2VzcyIsInJlc3BvbnNlIiwiZXJyb3IiLCJ2bURhdGEiLCJwcm9jZXNzZWREYXRhIiwicHJvY2Vzc1ZNRGF0YSIsInNldEZhbGxiYWNrVmFsdWVzIiwieGhyIiwic3RhdHVzIiwiZ3Vlc3RPUyIsImd1ZXN0X29zIiwiY3B1Q291bnQiLCJjcHVfY291bnQiLCJtZW1vcnlNQiIsIm1lbW9yeV9zaXplIiwiZGlza0J5dGVzIiwiZGlza19jYXBhY2l0eSIsImZvcm1hdHRlZE9TIiwiZm9ybWF0T1NOYW1lIiwiY3B1IiwiZm9ybWF0dGVkQ1BVIiwicmFtIiwiZm9ybWF0dGVkUkFNIiwiZGlzayIsImZvcm1hdHRlZERpc2siLCJsb2FkaW5nSWNvbiIsImh0bWwiLCJ1cGRhdGVPU0ljb24iLCJvc05hbWUiLCIkaWNvbkVsZW1lbnQiLCJ0b0xvd2VyQ2FzZSIsIm9zTWFwIiwiVUJVTlRVXzY0IiwiQ0VOVE9TXzY0IiwiQ0VOVE9TXzdfNjQiLCJDRU5UT1NfOF82NCIsIlJPQ0tZX0xJTlVYXzY0IiwiV0lORE9XU18xMF82NCIsIldJTkRPV1NfOV9TRVJWRVJfNjQiLCJXSU5ET1dTX1NFUlZFUl8yMDE5IiwiV0lORE9XU19TRVJWRVJfMjAyMiIsIldJTkRPV1NfMjAxOSIsIldJTkRPV1NfMjAyMiIsIkRFQklBTl8xMF82NCIsIkRFQklBTl8xMV82NCIsIk9USEVSX0xJTlVYXzY0IiwiT1RIRVJfNjQiLCJ3aW5kb3ciLCJjbGVhciIsInJlbW92ZUl0ZW0iLCJyZWZyZXNoIiwiaW5mbyIsImdldCIsInJlbW92ZSIsInJhdyJdLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2VydmljZS92bWluZm8uanM/YzdlMyJdLCJzb3VyY2VzQ29udGVudCI6WyIkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XHJcbiAgICAvLyBJbml0aWFsaXplIGRyb3Bkb3duIGZ1bmN0aW9uYWxpdHlcclxuICAgIGZ1bmN0aW9uIGluaXRpYWxpemVEcm9wZG93bigpIHtcclxuICAgICAgICAvLyBUb2dnbGUgZHJvcGRvd24gb24gY2xpY2tcclxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLmRyb3Bkb3duLXNlbGVjdGVkXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRkcm9wZG93biA9ICQodGhpcykuY2xvc2VzdChcIi5jdXN0b20tZHJvcGRvd25cIik7XHJcbiAgICAgICAgICAgIGNvbnN0ICRvcHRpb25zID0gJGRyb3Bkb3duLmZpbmQoXCIuZHJvcGRvd24tb3B0aW9uc1wiKTtcclxuICAgICAgICAgICAgY29uc3QgJHNlbGVjdGVkID0gJCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENsb3NlIG90aGVyIGRyb3Bkb3duc1xyXG4gICAgICAgICAgICAkKFwiLmN1c3RvbS1kcm9wZG93blwiKVxyXG4gICAgICAgICAgICAgICAgLm5vdCgkZHJvcGRvd24pXHJcbiAgICAgICAgICAgICAgICAuZmluZChcIi5kcm9wZG93bi1vcHRpb25zXCIpXHJcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAkKFwiLmN1c3RvbS1kcm9wZG93blwiKVxyXG4gICAgICAgICAgICAgICAgLm5vdCgkZHJvcGRvd24pXHJcbiAgICAgICAgICAgICAgICAuZmluZChcIi5kcm9wZG93bi1zZWxlY3RlZFwiKVxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gVG9nZ2xlIGN1cnJlbnQgZHJvcGRvd25cclxuICAgICAgICAgICAgJG9wdGlvbnMudG9nZ2xlQ2xhc3MoXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAkc2VsZWN0ZWQudG9nZ2xlQ2xhc3MoXCJhY3RpdmVcIik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBvcHRpb24gc2VsZWN0aW9uXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5kcm9wZG93bi1vcHRpb25cIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgY29uc3QgJG9wdGlvbiA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRkcm9wZG93biA9ICRvcHRpb24uY2xvc2VzdChcIi5jdXN0b20tZHJvcGRvd25cIik7XHJcbiAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RlZCA9ICRkcm9wZG93bi5maW5kKFwiLmRyb3Bkb3duLXNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCAkb3B0aW9ucyA9ICRkcm9wZG93bi5maW5kKFwiLmRyb3Bkb3duLW9wdGlvbnNcIik7XHJcbiAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RlZFRleHQgPSAkc2VsZWN0ZWQuZmluZChcIi5zZWxlY3RlZC10ZXh0XCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gR2V0IGRhdGEgZnJvbSBzZWxlY3RlZCBvcHRpb25cclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAkb3B0aW9uLmRhdGEoXCJ2YWx1ZVwiKTtcclxuICAgICAgICAgICAgY29uc3QgbW9udGhzID0gJG9wdGlvbi5kYXRhKFwibW9udGhzXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBwcmljZSA9ICRvcHRpb24uZGF0YShcInByaWNlXCIpO1xyXG4gICAgICAgICAgICAvLyBHZXQgdGV4dCBmcm9tIHRoZSBmaXJzdCBzcGFuIGVsZW1lbnQgdG8gYXZvaWQgZ2V0dGluZyBiYWRnZSB0ZXh0XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAkb3B0aW9uLmZpbmQoJ3NwYW4nKS5maXJzdCgpLnRleHQoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCB0ZXh0XHJcbiAgICAgICAgICAgICRzZWxlY3RlZFRleHQudGV4dCh0ZXh0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBoaWRkZW4gaW5wdXRzXHJcbiAgICAgICAgICAgICRkcm9wZG93bi5jbG9zZXN0KFwiZm9ybVwiKS5maW5kKFwiLmhpZGRlbk1vbnRoc1wiKS52YWwobW9udGhzKTtcclxuICAgICAgICAgICAgJGRyb3Bkb3duLmNsb3Nlc3QoXCJmb3JtXCIpLmZpbmQoXCIuaGlkZGVuVG90YWxQcmljZVwiKS52YWwocHJpY2UpO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIHN0YXRlXHJcbiAgICAgICAgICAgICRvcHRpb25zLmZpbmQoXCIuZHJvcGRvd24tb3B0aW9uXCIpLnJlbW92ZUNsYXNzKFwic2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgICRvcHRpb24uYWRkQ2xhc3MoXCJzZWxlY3RlZFwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENsb3NlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgICRvcHRpb25zLnJlbW92ZUNsYXNzKFwic2hvd1wiKTtcclxuICAgICAgICAgICAgJHNlbGVjdGVkLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gVHJpZ2dlciBjdXN0b20gZXZlbnQgZm9yIG90aGVyIGNvbXBvbmVudHNcclxuICAgICAgICAgICAgJGRyb3Bkb3duLnRyaWdnZXIoXCJkcm9wZG93bjpjaGFuZ2VkXCIsIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICAgICAgICAgIG1vbnRoczogbW9udGhzLFxyXG4gICAgICAgICAgICAgICAgcHJpY2U6IHByaWNlLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dCxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgcHJpY2UgZGlzcGxheSB1c2luZyBqUXVlcnlcclxuICAgICAgICAgICAgY29uc3QgJHByb2R1Y3RDb250YWluZXIgPSAkZHJvcGRvd24uY2xvc2VzdCgnW2RhdGEtcHJvZHVjdC1pZF0nKTtcclxuICAgICAgICAgICAgY29uc3QgYmFzZVByaWNlID0gcGFyc2VGbG9hdCgkcHJvZHVjdENvbnRhaW5lci5kYXRhKCdiYXNlLXByaWNlJykpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZE1vbnRocyA9IHBhcnNlSW50KG1vbnRocyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgcHJpY2VzXHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUHJpY2UgPSBiYXNlUHJpY2UgKiBzZWxlY3RlZE1vbnRocztcclxuICAgICAgICAgICAgY29uc3Qgc2F2aW5ncyA9IHNlbGVjdGVkTW9udGhzID49IDEyID8gTWF0aC5yb3VuZChvcmlnaW5hbFByaWNlICogMC4xKSA6IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsUHJpY2UgPSBvcmlnaW5hbFByaWNlIC0gc2F2aW5ncztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBkaXNwbGF5XHJcbiAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmZpbmQoJy50b3RhbC1wcmljZS1kaXNwbGF5JykudGV4dCgn4oKrJyArIGZpbmFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmZpbmQoJy5tb250aHMtZGlzcGxheScpLnRleHQoc2VsZWN0ZWRNb250aHMgKyAnIHRow6FuZycpO1xyXG4gICAgICAgICAgICAkcHJvZHVjdENvbnRhaW5lci5maW5kKCcucHJpY2UtcGVyLW1vbnRoJykudGV4dCgn4oKrJyArIGJhc2VQcmljZS50b0xvY2FsZVN0cmluZygpICsgJy90aMOhbmcnKTtcclxuICAgICAgICAgICAgJHByb2R1Y3RDb250YWluZXIuZmluZCgnLm9yaWdpbmFsLXByaWNlJykudGV4dCgn4oKrJyArIG9yaWdpbmFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmZpbmQoJy5zYXZpbmdzLWFtb3VudCcpLnRleHQoJ+KCqycgKyBzYXZpbmdzLnRvTG9jYWxlU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gU2hvdy9oaWRlIHNhdmluZ3MgaW5mb1xyXG4gICAgICAgICAgICBpZiAoc2F2aW5ncyA+IDApIHtcclxuICAgICAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmZpbmQoJy5zYXZpbmdzLWluZm8nKS5zaG93KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkcHJvZHVjdENvbnRhaW5lci5maW5kKCcuc2F2aW5ncy1pbmZvJykuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENsb3NlIGRyb3Bkb3duIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKCEkKGUudGFyZ2V0KS5jbG9zZXN0KFwiLmN1c3RvbS1kcm9wZG93blwiKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICQoXCIuZHJvcGRvd24tb3B0aW9uc1wiKS5yZW1vdmVDbGFzcyhcInNob3dcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiLmRyb3Bkb3duLXNlbGVjdGVkXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENsb3NlIGRyb3Bkb3duIG9uIGVzY2FwZSBrZXlcclxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImtleWRvd25cIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiLmRyb3Bkb3duLW9wdGlvbnNcIikucmVtb3ZlQ2xhc3MoXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIi5kcm9wZG93bi1zZWxlY3RlZFwiKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluaXRpYWxpemUgb24gcGFnZSBsb2FkXHJcbiAgICBpbml0aWFsaXplRHJvcGRvd24oKTtcclxuXHJcbiAgICAvLyBPcHRpbWl6ZSBmb3JtIHN1Ym1pc3Npb24gdG8gcHJldmVudCBibG9ja2luZ1xyXG4gICAgJChkb2N1bWVudCkub24oJ3N1Ym1pdCcsICdmb3JtW2FjdGlvbio9XCJ0aGVtLWdpby1oYW5nXCJdJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGNvbnN0ICRmb3JtID0gJCh0aGlzKTtcclxuICAgICAgICBjb25zdCAkc3VibWl0QnRuID0gJGZvcm0uZmluZCgnYnV0dG9uW3R5cGU9XCJzdWJtaXRcIl0nKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBEaXNhYmxlIHN1Ym1pdCBidXR0b24gdG8gcHJldmVudCBkb3VibGUgc3VibWlzc2lvblxyXG4gICAgICAgICRzdWJtaXRCdG4ucHJvcCgnZGlzYWJsZWQnLCB0cnVlKS50ZXh0KCfEkGFuZyB44butIGzDvS4uLicpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFkZCBsb2FkaW5nIHN0YXRlXHJcbiAgICAgICAgJGZvcm0uYWRkQ2xhc3MoJ3N1Ym1pdHRpbmcnKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBSZS1lbmFibGUgYnV0dG9uIGFmdGVyIDUgc2Vjb25kcyBhcyBmYWxsYmFja1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAkc3VibWl0QnRuLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpLnRleHQoJ8SQxINuZyBrw70gbmdheScpO1xyXG4gICAgICAgICAgICAkZm9ybS5yZW1vdmVDbGFzcygnc3VibWl0dGluZycpO1xyXG4gICAgICAgIH0sIDUwMDApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQ2FjaGUgdXRpbGl0eSBmdW5jdGlvbnMgLSBTaW5nbGUgSlNPTiBhcHByb2FjaFxyXG4gICAgY29uc3QgVk1fSU5GT19DQUNIRV9LRVkgPSBcInZtX2luZm9fY2FjaGVcIjtcclxuXHJcbiAgICBmdW5jdGlvbiBzYXZlVk1JbmZvVG9DYWNoZSh0ZW1wbGF0ZUlkLCBkYXRhLCB0dGwgPSAzMCAqIDYwICogMTAwMCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBsZXQgdm1JbmZvQ2FjaGUgPSBnZXRWTUluZm9DYWNoZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF2bUluZm9DYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgdm1JbmZvQ2FjaGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZWQ6IG5vdyxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7fSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF0gPSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YSxcclxuICAgICAgICAgICAgICAgIGV4cGlyeTogbm93ICsgdHRsLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB2bUluZm9DYWNoZS5sYXN0VXBkYXRlZCA9IG5vdztcclxuXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICAgICAgVk1fSU5GT19DQUNIRV9LRVksXHJcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh2bUluZm9DYWNoZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlZNIEluZm8gY2FjaGUgc2F2ZSBmYWlsZWQ6XCIsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRWTUluZm9Gcm9tQ2FjaGUodGVtcGxhdGVJZCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZtSW5mb0NhY2hlID0gZ2V0Vk1JbmZvQ2FjaGUoKTtcclxuICAgICAgICAgICAgaWYgKCF2bUluZm9DYWNoZSB8fCAhdm1JbmZvQ2FjaGUuZGF0YVt0ZW1wbGF0ZUlkXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2bUluZm9DYWNoZS5kYXRhW3RlbXBsYXRlSWRdO1xyXG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGV4cGlyZWRcclxuICAgICAgICAgICAgaWYgKG5vdyA+IGl0ZW0uZXhwaXJ5KSB7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVWTUluZm9Gcm9tQ2FjaGUodGVtcGxhdGVJZCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJWTSBJbmZvIGNhY2hlIGdldCBmYWlsZWQ6XCIsIGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Vk1JbmZvQ2FjaGUoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgY2FjaGVTdHIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShWTV9JTkZPX0NBQ0hFX0tFWSk7XHJcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVN0ciA/IEpTT04ucGFyc2UoY2FjaGVTdHIpIDogbnVsbDtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlZNIEluZm8gY2FjaGUgcGFyc2UgZmFpbGVkOlwiLCBlKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlbW92ZVZNSW5mb0Zyb21DYWNoZSh0ZW1wbGF0ZUlkKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3Qgdm1JbmZvQ2FjaGUgPSBnZXRWTUluZm9DYWNoZSgpO1xyXG4gICAgICAgICAgICBpZiAodm1JbmZvQ2FjaGUgJiYgdm1JbmZvQ2FjaGUuZGF0YVt0ZW1wbGF0ZUlkXSkge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF07XHJcbiAgICAgICAgICAgICAgICB2bUluZm9DYWNoZS5sYXN0VXBkYXRlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgICAgICAgICAgVk1fSU5GT19DQUNIRV9LRVksXHJcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodm1JbmZvQ2FjaGUpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJWTSBJbmZvIGNhY2hlIHJlbW92ZSBmYWlsZWQ6XCIsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhckV4cGlyZWRWTUluZm9DYWNoZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB2bUluZm9DYWNoZSA9IGdldFZNSW5mb0NhY2hlKCk7XHJcbiAgICAgICAgICAgIGlmICghdm1JbmZvQ2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGxldCBoYXNFeHBpcmVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2bUluZm9DYWNoZS5kYXRhKS5mb3JFYWNoKCh0ZW1wbGF0ZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdm1JbmZvQ2FjaGUuZGF0YVt0ZW1wbGF0ZUlkXTtcclxuICAgICAgICAgICAgICAgIGlmIChub3cgPiBpdGVtLmV4cGlyeSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2bUluZm9DYWNoZS5kYXRhW3RlbXBsYXRlSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIGhhc0V4cGlyZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChoYXNFeHBpcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB2bUluZm9DYWNoZS5sYXN0VXBkYXRlZCA9IG5vdztcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICAgICAgICAgIFZNX0lORk9fQ0FDSEVfS0VZLFxyXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZtSW5mb0NhY2hlKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVk0gSW5mbyBjYWNoZSBjbGVhbnVwIGZhaWxlZDpcIiwgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlLWluaXRpYWxpemUgaWYgY29udGVudCBpcyBkeW5hbWljYWxseSBsb2FkZWRcclxuICAgICQoZG9jdW1lbnQpLm9uKFwiRE9NQ29udGVudExvYWRlZFwiLCBpbml0aWFsaXplRHJvcGRvd24pO1xyXG5cclxuICAgIC8vIExvYWQgVk0gaW5mb3JtYXRpb24gZm9yIGVhY2ggcHJvZHVjdCB3aXRoIGNhY2hpbmcgKE9TLCBDUFUsIFJBTSwgRGlzaykgLSBOT04tQkxPQ0tJTkdcclxuICAgIGZ1bmN0aW9uIGxvYWRHdWVzdE9TSW5mbygpIHtcclxuICAgICAgICAvLyBHZXQgdW5pcXVlIHRlbXBsYXRlIElEcyB0byBhdm9pZCBkdXBsaWNhdGUgQVBJIGNhbGxzXHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVJZHMgPSBbXTtcclxuICAgICAgICAkKFwiLmd1ZXN0LW9zXCIpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUlkID0gJCh0aGlzKS5kYXRhKFwidGVtcGxhdGUtaWRcIik7XHJcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkICYmICF0ZW1wbGF0ZUlkcy5pbmNsdWRlcyh0ZW1wbGF0ZUlkKSkge1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVJZHMucHVzaCh0ZW1wbGF0ZUlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBMb2FkIFZNIGluZm8gaW4gYmFja2dyb3VuZCB3aXRob3V0IGJsb2NraW5nIGZvcm0gc3VibWlzc2lvblxyXG4gICAgICAgIHRlbXBsYXRlSWRzLmZvckVhY2goKHRlbXBsYXRlSWQpID0+IHtcclxuICAgICAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcclxuICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IGdldFZNSW5mb0Zyb21DYWNoZSh0ZW1wbGF0ZUlkKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjYWNoZWREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBVc2UgY2FjaGVkIGRhdGFcclxuICAgICAgICAgICAgICAgIHVwZGF0ZVZNSW5mb1VJKHRlbXBsYXRlSWQsIGNhY2hlZERhdGEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBBZGQgbG9hZGluZyBpbmRpY2F0b3JzXHJcbiAgICAgICAgICAgIGFkZExvYWRpbmdJbmRpY2F0b3JzKHRlbXBsYXRlSWQpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsbCBBUEkgdG8gZ2V0IGNvbXBsZXRlIFZNIGluZm8gLSB3aXRoIHNob3J0ZXIgdGltZW91dFxyXG4gICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiBgL2FwaS92MS9nZXQtdm0taW5mby8ke3RlbXBsYXRlSWR9L2d1ZXN0X29zLGNwdV9jb3VudCxtZW1vcnlfc2l6ZSxkaXNrX2NhcGFjaXR5YCxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDUwMDAsIC8vIFJlZHVjZWQgdGltZW91dCB0byA1IHNlY29uZHNcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIlgtQ1NSRi1UT0tFTlwiOiAkKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuYXR0cihcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb250ZW50XCJcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yID09PSBmYWxzZSAmJiByZXNwb25zZS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZtRGF0YSA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZERhdGEgPSBwcm9jZXNzVk1EYXRhKHZtRGF0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IGZvciAzMCBtaW51dGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVWTUluZm9Ub0NhY2hlKHRlbXBsYXRlSWQsIHByb2Nlc3NlZERhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFVJXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZNSW5mb1VJKHRlbXBsYXRlSWQsIHByb2Nlc3NlZERhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEZhbGxiYWNrVmFsdWVzKHRlbXBsYXRlSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhociwgc3RhdHVzLCBlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJGYWlsZWQgdG8gbG9hZCBWTSBpbmZvIGZvciB0ZW1wbGF0ZTpcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEZhbGxiYWNrVmFsdWVzKHRlbXBsYXRlSWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBMb2FkIFZNIGluZm8gYWZ0ZXIgYSBzaG9ydCBkZWxheSB0byBub3QgYmxvY2sgcGFnZSBsb2FkXHJcbiAgICBzZXRUaW1lb3V0KGxvYWRHdWVzdE9TSW5mbywgMTAwMCk7XHJcblxyXG4gICAgLy8gUHJvY2VzcyBWTSBkYXRhIGZyb20gQVBJIHJlc3BvbnNlXHJcbiAgICBmdW5jdGlvbiBwcm9jZXNzVk1EYXRhKHZtRGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGd1ZXN0T1MgPSB2bURhdGEuZ3Vlc3Rfb3MgfHwgXCJVTktOT1dOXCI7XHJcbiAgICAgICAgY29uc3QgY3B1Q291bnQgPSB2bURhdGEuY3B1X2NvdW50IHx8IDA7XHJcbiAgICAgICAgY29uc3QgbWVtb3J5TUIgPSB2bURhdGEubWVtb3J5X3NpemUgfHwgMDtcclxuICAgICAgICBjb25zdCBkaXNrQnl0ZXMgPSB2bURhdGEuZGlza19jYXBhY2l0eSB8fCAwO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBndWVzdE9TOiBndWVzdE9TLFxyXG4gICAgICAgICAgICBmb3JtYXR0ZWRPUzogZm9ybWF0T1NOYW1lKGd1ZXN0T1MpLFxyXG4gICAgICAgICAgICBjcHU6IGNwdUNvdW50LFxyXG4gICAgICAgICAgICBmb3JtYXR0ZWRDUFU6IGAke2NwdUNvdW50fSB2Q29yZSR7Y3B1Q291bnQgPiAxID8gXCJzXCIgOiBcIlwifWAsXHJcbiAgICAgICAgICAgIHJhbTogTWF0aC5yb3VuZCgobWVtb3J5TUIgLyAxMDI0KSAqIDEwMCkgLyAxMDAsIC8vIENvbnZlcnQgTUIgdG8gR0IsIDIgZGVjaW1hbCBwbGFjZXNcclxuICAgICAgICAgICAgZm9ybWF0dGVkUkFNOiBgJHtNYXRoLnJvdW5kKChtZW1vcnlNQiAvIDEwMjQpICogMTAwKSAvIDEwMH0gR0JgLFxyXG4gICAgICAgICAgICBkaXNrOiBNYXRoLnJvdW5kKChkaXNrQnl0ZXMgLyAoMTAyNCAqIDEwMjQgKiAxMDI0KSkgKiAxMDApIC8gMTAwLCAvLyBDb252ZXJ0IGJ5dGVzIHRvIEdCXHJcbiAgICAgICAgICAgIGZvcm1hdHRlZERpc2s6IGAke1xyXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoZGlza0J5dGVzIC8gKDEwMjQgKiAxMDI0ICogMTAyNCkpICogMTAwKSAvIDEwMFxyXG4gICAgICAgICAgICB9IEdCYCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCBsb2FkaW5nIGluZGljYXRvcnMgdG8gYWxsIFZNIGluZm8gZWxlbWVudHNcclxuICAgIGZ1bmN0aW9uIGFkZExvYWRpbmdJbmRpY2F0b3JzKHRlbXBsYXRlSWQpIHtcclxuICAgICAgICBjb25zdCBsb2FkaW5nSWNvbiA9XHJcbiAgICAgICAgICAgICc8aSBjbGFzcz1cImZhcyBmYS1zcGlubmVyIGZhLXNwaW4gdGV4dC1vcmFuZ2UtNTAwIG1yLTFcIj48L2k+xJBhbmcgdOG6o2kuLi4nO1xyXG4gICAgICAgICQoYC5ndWVzdC1vc1tkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwobG9hZGluZ0ljb24pO1xyXG4gICAgICAgICQoYC52bS1jcHVbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKGxvYWRpbmdJY29uKTtcclxuICAgICAgICAkKGAudm0tcmFtW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChsb2FkaW5nSWNvbik7XHJcbiAgICAgICAgJChgLnZtLWRpc2tbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKGxvYWRpbmdJY29uKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVcGRhdGUgYWxsIFZNIGluZm8gVUkgZWxlbWVudHNcclxuICAgIGZ1bmN0aW9uIHVwZGF0ZVZNSW5mb1VJKHRlbXBsYXRlSWQsIGRhdGEpIHtcclxuICAgICAgICAvLyBVcGRhdGUgT1NcclxuICAgICAgICAkKGAuZ3Vlc3Qtb3NbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKGRhdGEuZm9ybWF0dGVkT1MpO1xyXG4gICAgICAgIHVwZGF0ZU9TSWNvbih0ZW1wbGF0ZUlkLCBkYXRhLmd1ZXN0T1MpO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgaGFyZHdhcmUgc3BlY3NcclxuICAgICAgICAkKGAudm0tY3B1W2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChkYXRhLmZvcm1hdHRlZENQVSk7XHJcbiAgICAgICAgJChgLnZtLXJhbVtkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwoZGF0YS5mb3JtYXR0ZWRSQU0pO1xyXG4gICAgICAgICQoYC52bS1kaXNrW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChcclxuICAgICAgICAgICAgZGF0YS5mb3JtYXR0ZWREaXNrXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgZmFsbGJhY2sgdmFsdWVzIHdoZW4gQVBJIGZhaWxzXHJcbiAgICBmdW5jdGlvbiBzZXRGYWxsYmFja1ZhbHVlcyh0ZW1wbGF0ZUlkKSB7XHJcbiAgICAgICAgJChgLmd1ZXN0LW9zW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChcIkxpbnV4XCIpO1xyXG4gICAgICAgICQoYC52bS1jcHVbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKFwiTi9BXCIpO1xyXG4gICAgICAgICQoYC52bS1yYW1bZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKFwiTi9BXCIpO1xyXG4gICAgICAgICQoYC52bS1kaXNrW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChcIk4vQVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVcGRhdGUgT1MgaWNvbiBiYXNlZCBvbiBkZXRlY3RlZCBPU1xyXG4gICAgZnVuY3Rpb24gdXBkYXRlT1NJY29uKHRlbXBsYXRlSWQsIG9zTmFtZSkge1xyXG4gICAgICAgIGNvbnN0ICRpY29uRWxlbWVudCA9ICQoYC5vcy1pY29uW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCk7XHJcblxyXG4gICAgICAgIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJ3aW5kb3dzXCIpKSB7XHJcbiAgICAgICAgICAgICRpY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcImZhYiBmYS1saW51eFwiKS5hZGRDbGFzcyhcImZhYiBmYS13aW5kb3dzXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob3NOYW1lICYmIG9zTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwidWJ1bnR1XCIpKSB7XHJcbiAgICAgICAgICAgICRpY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcImZhYiBmYS1saW51eFwiKS5hZGRDbGFzcyhcImZhYiBmYS11YnVudHVcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJjZW50b3NcIikpIHtcclxuICAgICAgICAgICAgJGljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwiZmFiIGZhLWxpbnV4XCIpLmFkZENsYXNzKFwiZmFiIGZhLWNlbnRvc1wiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9zTmFtZSAmJiBvc05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImRlYmlhblwiKSkge1xyXG4gICAgICAgICAgICAkaWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJmYWIgZmEtbGludXhcIikuYWRkQ2xhc3MoXCJmYWIgZmEtZGViaWFuXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEtlZXAgbGludXggaWNvbiBhcyBkZWZhdWx0XHJcbiAgICAgICAgICAgICRpY29uRWxlbWVudC5yZW1vdmVDbGFzcygpLmFkZENsYXNzKFwiZmFiIGZhLWxpbnV4IHRleHQtb3JhbmdlLTYwMFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9ybWF0IE9TIG5hbWUgZm9yIGJldHRlciBkaXNwbGF5XHJcbiAgICBmdW5jdGlvbiBmb3JtYXRPU05hbWUob3NOYW1lKSB7XHJcbiAgICAgICAgY29uc3Qgb3NNYXAgPSB7XHJcbiAgICAgICAgICAgIFVCVU5UVV82NDogXCJVYnVudHUgNjQtYml0XCIsXHJcbiAgICAgICAgICAgIENFTlRPU182NDogXCJDZW50T1MgNjQtYml0XCIsXHJcbiAgICAgICAgICAgIENFTlRPU183XzY0OiBcIkNlbnRPUyA3IDY0LWJpdFwiLFxyXG4gICAgICAgICAgICBDRU5UT1NfOF82NDogXCJDZW50T1MgOCA2NC1iaXRcIixcclxuICAgICAgICAgICAgUk9DS1lfTElOVVhfNjQ6IFwiUm9ja3kgTGludXggNjQtYml0XCIsXHJcbiAgICAgICAgICAgIFdJTkRPV1NfMTBfNjQ6IFwiV2luZG93cyAxMCA2NC1iaXRcIixcclxuICAgICAgICAgICAgV0lORE9XU185X1NFUlZFUl82NDogXCJXaW5kb3dzIFNlcnZlciAyMDE5XCIsXHJcbiAgICAgICAgICAgIFdJTkRPV1NfU0VSVkVSXzIwMTk6IFwiV2luZG93cyBTZXJ2ZXIgMjAxOVwiLFxyXG4gICAgICAgICAgICBXSU5ET1dTX1NFUlZFUl8yMDIyOiBcIldpbmRvd3MgU2VydmVyIDIwMjJcIixcclxuICAgICAgICAgICAgV0lORE9XU18yMDE5OiBcIldpbmRvd3MgU2VydmVyIDIwMTlcIixcclxuICAgICAgICAgICAgV0lORE9XU18yMDIyOiBcIldpbmRvd3MgU2VydmVyIDIwMjJcIixcclxuICAgICAgICAgICAgREVCSUFOXzEwXzY0OiBcIkRlYmlhbiAxMCA2NC1iaXRcIixcclxuICAgICAgICAgICAgREVCSUFOXzExXzY0OiBcIkRlYmlhbiAxMSA2NC1iaXRcIixcclxuICAgICAgICAgICAgT1RIRVJfTElOVVhfNjQ6IFwiTGludXggNjQtYml0XCIsXHJcbiAgICAgICAgICAgIE9USEVSXzY0OiBcIk90aGVyIDY0LWJpdFwiLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBvc01hcFtvc05hbWVdIHx8IG9zTmFtZSB8fCBcIkxpbnV4XCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYW4gdXAgZXhwaXJlZCBjYWNoZSBlbnRyaWVzXHJcbiAgICBjbGVhckV4cGlyZWRWTUluZm9DYWNoZSgpO1xyXG5cclxuICAgIC8vIExvYWQgR3Vlc3QgT1MgaW5mbyB3aGVuIHBhZ2UgbG9hZHNcclxuICAgIGxvYWRHdWVzdE9TSW5mbygpO1xyXG5cclxuICAgIC8vIEV4cG9zZSBjYWNoZSBtYW5hZ2VtZW50IHRvIGdsb2JhbCBzY29wZSBmb3IgZGVidWdnaW5nXHJcbiAgICB3aW5kb3cudm1JbmZvQ2FjaGUgPSB7XHJcbiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oVk1fSU5GT19DQUNIRV9LRVkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGxvYWRHdWVzdE9TSW5mbygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaW5mbzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCB2bUluZm9DYWNoZSA9IGdldFZNSW5mb0NhY2hlKCk7XHJcbiAgICAgICAgICAgIGlmICghdm1JbmZvQ2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVJZHMgPSBPYmplY3Qua2V5cyh2bUluZm9DYWNoZS5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIHRlbXBsYXRlSWRzLmZvckVhY2goKHRlbXBsYXRlSWQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBnZXRWTUluZm9Gcm9tQ2FjaGUodGVtcGxhdGVJZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAodGVtcGxhdGVJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0Vk1JbmZvRnJvbUNhY2hlKHRlbXBsYXRlSWQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAodGVtcGxhdGVJZCkge1xyXG4gICAgICAgICAgICByZW1vdmVWTUluZm9Gcm9tQ2FjaGUodGVtcGxhdGVJZCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICByYXc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdldFZNSW5mb0NhY2hlKCk7XHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbn0pO1xyXG4iXSwibWFwcGluZ3MiOiJBQUFBQSxDQUFDLENBQUNDLFFBQVEsQ0FBQyxDQUFDQyxLQUFLLENBQUMsWUFBWTtFQUMxQjtFQUNBLFNBQVNDLGtCQUFrQkEsQ0FBQSxFQUFHO0lBQzFCO0lBQ0FILENBQUMsQ0FBQ0MsUUFBUSxDQUFDLENBQUNHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsVUFBVUMsQ0FBQyxFQUFFO01BQ3ZEQSxDQUFDLENBQUNDLGVBQWUsQ0FBQyxDQUFDO01BQ25CLElBQU1DLFNBQVMsR0FBR1AsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDUSxPQUFPLENBQUMsa0JBQWtCLENBQUM7TUFDckQsSUFBTUMsUUFBUSxHQUFHRixTQUFTLENBQUNHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztNQUNwRCxJQUFNQyxT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QUVBLElBQU1zQixXQUFXLEdBQUdKLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDbkIsV0FBVyxDQUFDckMsSUFBSSxDQUFDO01BRWpEMkQsV0FBVyxDQUFDRixPQUFPLENBQUMsVUFBQzNCLFVBQVUsRUFBSztRQUNoQyxJQUFNOUIsSUFBSSxHQUFHK0Msa0JBQWtCLENBQUNqQixVQUFVLENBQUM7TUFDL0MsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNEZ0csR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQVloRyxVQUFVLEVBQUU7TUFDdkIsT0FBT2lCLGtCQUFrQixDQUFDakIsVUFBVSxDQUFDO0lBQ3pDLENBQUM7SUFDRGlHLE1BQU0sRUFBRSxTQUFSQSxNQUFNQSxDQUFZakcsVUFBVSxFQUFFO01BQzFCbUIscUJBQXFCLENBQUNuQixVQUFVLENBQUM7SUFDckMsQ0FBQztJQUNEa0csR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQUEsRUFBYztNQUNiLE9BQU8xRixjQUFjLENBQUMsQ0FBQztJQUMzQjtFQUNKLENBQUM7QUFDTCxDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXSwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL3NlcnZpY2Uvdm1pbmZvLmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/service/vminfo.js\n");
/***/ })
/******/ });
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module can't be inlined because the eval-source-map devtool is used.
/******/ var __webpack_exports__ = {};
/******/ __webpack_modules__["./resources/js/service/vminfo.js"]();
/******/
/******/ })()
;