Файловый менеджер - Редактировать - /home/avadvi5/public_html/fcolliver.com/wp-content/plugins/wpforms/assets/pro/js/frontend/fields/file-upload.es5.js
Ðазад
(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);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.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){ /* global WPFormsUtils */ 'use strict'; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } (function ($) { /** * All connections are slow by default. * * @since 1.6.2 * * @type {boolean|null} */ var isSlow = null; /** * Previously submitted data. * * @since 1.7.1 * * @type {Array} */ var submittedValues = []; /** * Default settings for our speed test. * * @since 1.6.2 * * @type {{maxTime: number, payloadSize: number}} */ var speedTestSettings = { maxTime: 3000, // Max time (ms) it should take to be considered a 'fast connection'. payloadSize: 100 * 1024 // Payload size. }; /** * Create a random payload for the speed test. * * @since 1.6.2 * * @returns {string} Random payload. */ function getPayload() { var data = ''; for (var i = 0; i < speedTestSettings.payloadSize; ++i) { data += String.fromCharCode(Math.round(Math.random() * 36 + 64)); } return data; } /** * Run speed tests and flag the clients as slow or not. If a connection * is slow it would let the backend know and the backend most likely * would disable parallel uploads and would set smaller chunk sizes. * * @since 1.6.2 * * @param {Function} next Function to call when the speed detection is done. */ function speedTest(next) { if (null !== isSlow) { setTimeout(next); return; } var data = getPayload(); var start = new Date(); wp.ajax.post({ action: 'wpforms_file_upload_speed_test', data: data }).then(function () { var delta = new Date() - start; isSlow = delta >= speedTestSettings.maxTime; next(); }).fail(function () { isSlow = true; next(); }); } /** * Toggle loading message above submit button. * * @since 1.5.6 * * @param {object} $form jQuery form element. * * @returns {Function} event handler function. */ function toggleLoadingMessage($form) { return function () { if ($form.find('.wpforms-uploading-in-progress-alert').length) { return; } $form.find('.wpforms-submit-container').before("<div class=\"wpforms-error-alert wpforms-uploading-in-progress-alert\">\n\t\t\t\t\t\t".concat(window.wpforms_file_upload.loading_message, "\n\t\t\t\t\t</div>")); }; } /** * Is a field loading? * * @since 1.7.6 * * @param {object} dz Dropzone object. * * @returns {boolean} true if the field is loading. */ function uploadInProgress(dz) { return dz.loading > 0 || dz.getFilesWithStatus('error').length > 0; } /** * Is at least one field loading? * * @since 1.7.6 * * @returns {boolean} true if at least one field is loading. */ function anyUploadsInProgress() { var anyUploadsInProgress = false; window.wpforms.dropzones.some(function (dz) { if (uploadInProgress(dz)) { anyUploadsInProgress = true; return true; } }); return anyUploadsInProgress; } /** * Disable submit button and add overlay. * * @param {object} $form jQuery form element. */ function disableSubmitButton($form) { // Find the primary submit button and the "Next" button for multi-page forms. var $btn = $form.find('.wpforms-submit'); var $btnNext = $form.find('.wpforms-page-next:visible'); var handler = toggleLoadingMessage($form); // Get the handler function for loading message toggle. // For multi-pages layout, use the "Next" button instead of the primary submit button. if ($form.find('.wpforms-page-indicator').length !== 0 && $btnNext.length !== 0) { $btn = $btnNext; } // Disable the submit button. $btn.prop('disabled', true); WPFormsUtils.triggerEvent($form, 'wpformsFormSubmitButtonDisable', [$form, $btn]); // If the overlay is not already added and the button is of type "submit", add an overlay. if (!$form.find('.wpforms-submit-overlay').length && $btn.attr('type') === 'submit') { // Add a container for the overlay and append the overlay element to it. $btn.parent().addClass('wpforms-submit-overlay-container'); $btn.parent().append('<div class="wpforms-submit-overlay"></div>'); // Set the overlay dimensions to match the submit button's size. $form.find('.wpforms-submit-overlay').css({ width: "".concat($btn.outerWidth(), "px"), height: "".concat($btn.parent().outerHeight(), "px") }); // Attach the click event to the overlay so that it triggers the handler function. $form.find('.wpforms-submit-overlay').on('click', handler); } } /** * Disable submit button when we are sending files to the server. * * @since 1.5.6 * * @param {object} dz Dropzone object. */ function toggleSubmit(dz) { // eslint-disable-line complexity var $form = jQuery(dz.element).closest('form'), $btn = $form.find('.wpforms-submit'), $btnNext = $form.find('.wpforms-page-next:visible'), handler = toggleLoadingMessage($form), disabled = uploadInProgress(dz); // For multi-pages layout. if ($form.find('.wpforms-page-indicator').length !== 0 && $btnNext.length !== 0) { $btn = $btnNext; } var isButtonDisabled = Boolean($btn.prop('disabled')) || $btn.hasClass('wpforms-disabled'); if (disabled === isButtonDisabled) { return; } if (disabled) { disableSubmitButton($form); return; } if (anyUploadsInProgress()) { return; } $btn.prop('disabled', false); WPFormsUtils.triggerEvent($form, 'wpformsFormSubmitButtonRestore', [$form, $btn]); $form.find('.wpforms-submit-overlay').off('click', handler); $form.find('.wpforms-submit-overlay').remove(); $btn.parent().removeClass('wpforms-submit-overlay-container'); if ($form.find('.wpforms-uploading-in-progress-alert').length) { $form.find('.wpforms-uploading-in-progress-alert').remove(); } } /** * Try to parse JSON or return false. * * @since 1.5.6 * * @param {string} str JSON string candidate. * * @returns {*} Parse object or false. */ function parseJSON(str) { try { return JSON.parse(str); } catch (e) { return false; } } /** * Leave only objects with length. * * @since 1.5.6 * * @param {object} el Any array. * * @returns {bool} Has length more than 0 or no. */ function onlyWithLength(el) { return el.length > 0; } /** * Leave only positive elements. * * @since 1.5.6 * * @param {*} el Any element. * * @returns {*} Filter only positive. */ function onlyPositive(el) { return el; } /** * Get xhr. * * @since 1.5.6 * * @param {object} el Object with xhr property. * * @returns {*} Get XHR. */ function getXHR(el) { return el.chunkResponse || el.xhr; } /** * Get response text. * * @since 1.5.6 * * @param {object} el Xhr object. * * @returns {object} Response text. */ function getResponseText(el) { return typeof el === 'string' ? el : el.responseText; } /** * Get data. * * @since 1.5.6 * * @param {object} el Object with data property. * * @returns {object} Data. */ function getData(el) { return el.data; } /** * Get value from files. * * @since 1.5.6 * * @param {object} files Dropzone files. * * @returns {object} Prepared value. */ function getValue(files) { return files.map(getXHR).filter(onlyPositive).map(getResponseText).filter(onlyWithLength).map(parseJSON).filter(onlyPositive).map(getData); } /** * Sending event higher order function. * * @since 1.5.6 * @since 1.5.6.1 Added special processing of a file that is larger than server's post_max_size. * * @param {object} dz Dropzone object. * @param {object} data Adding data to request. * * @returns {Function} Handler function. */ function sending(dz, data) { return function (file, xhr, formData) { /* * We should not allow sending a file, that exceeds server post_max_size. * With this "hack" we redefine the default send functionality * to prevent only this object from sending a request at all. * The file that generated that error should be marked as rejected, * so Dropzone will silently ignore it. * * If Chunks are enabled the file size will never exceed (by a PHP constraint) the * postMaxSize. This block shouldn't be removed nonetheless until the "modern" upload is completely * deprecated and removed. */ if (file.size > this.dataTransfer.postMaxSize) { xhr.send = function () {}; file.accepted = false; file.processing = false; file.status = 'rejected'; file.previewElement.classList.add('dz-error'); file.previewElement.classList.add('dz-complete'); return; } Object.keys(data).forEach(function (key) { formData.append(key, data[key]); }); }; } /** * Convert files to input value. * * @since 1.5.6 * @since 1.7.1 Added the dz argument. * * @param {object} files Files list. * @param {object} dz Dropzone object. * * @returns {string} Converted value. */ function convertFilesToValue(files, dz) { if (!submittedValues[dz.dataTransfer.formId] || !submittedValues[dz.dataTransfer.formId][dz.dataTransfer.fieldId]) { return files.length ? JSON.stringify(files) : ''; } files.push.apply(files, submittedValues[dz.dataTransfer.formId][dz.dataTransfer.fieldId]); return JSON.stringify(files); } /** * Get input element. * * @since 1.7.1 * * @param {object} dz Dropzone object. * * @returns {jQuery} Hidden input element. */ function getInput(dz) { return jQuery(dz.element).parents('.wpforms-field-file-upload').find('input[name=' + dz.dataTransfer.name + ']'); } /** * Update value in input. * * @since 1.5.6 * * @param {object} dz Dropzone object. */ function updateInputValue(dz) { var $input = getInput(dz); $input.val(convertFilesToValue(getValue(dz.files), dz)).trigger('input'); if (typeof jQuery.fn.valid !== 'undefined') { $input.valid(); } } /** * Complete event higher order function. * * @deprecated 1.6.2 * * @since 1.5.6 * * @param {object} dz Dropzone object. * * @returns {Function} Handler function. */ function complete(dz) { return function () { dz.loading = dz.loading || 0; dz.loading--; dz.loading = Math.max(dz.loading - 1, 0); toggleSubmit(dz); updateInputValue(dz); }; } /** * Add an error message to the current file. * * @since 1.6.2 * * @param {object} file File object. * @param {string} errorMessage Error message */ function addErrorMessage(file, errorMessage) { if (file.isErrorNotUploadedDisplayed) { return; } var span = document.createElement('span'); span.innerText = errorMessage.toString(); span.setAttribute('data-dz-errormessage', ''); file.previewElement.querySelector('.dz-error-message').appendChild(span); } /** * Confirm the upload to the server. * * The confirmation is needed in order to let PHP know * that all the chunks have been uploaded. * * @since 1.6.2 * * @param {object} dz Dropzone object. * * @returns {Function} Handler function. */ function confirmChunksFinishUpload(dz) { return function confirm(file) { if (!file.retries) { file.retries = 0; } if ('error' === file.status) { return; } /** * Retry finalize function. * * @since 1.6.2 */ function retry() { file.retries++; if (file.retries === 3) { addErrorMessage(file, window.wpforms_file_upload.errors.file_not_uploaded); return; } setTimeout(function () { confirm(file); }, 5000 * file.retries); } /** * Fail handler for ajax request. * * @since 1.6.2 * * @param {object} response Response from the server */ function fail(response) { var hasSpecificError = response.responseJSON && response.responseJSON.success === false && response.responseJSON.data; if (hasSpecificError) { addErrorMessage(file, response.responseJSON.data); } else { retry(); } } /** * Handler for ajax request. * * @since 1.6.2 * * @param {object} response Response from the server */ function complete(response) { file.chunkResponse = JSON.stringify({ data: response }); dz.loading = dz.loading || 0; dz.loading--; dz.loading = Math.max(dz.loading, 0); toggleSubmit(dz); updateInputValue(dz); } wp.ajax.post(jQuery.extend({ action: 'wpforms_file_chunks_uploaded', form_id: dz.dataTransfer.formId, field_id: dz.dataTransfer.fieldId, name: file.name }, dz.options.params.call(dz, null, null, { file: file, index: 0 }))).then(complete).fail(fail); // Move to upload the next file, if any. dz.processQueue(); }; } /** * Toggle showing empty message. * * @since 1.5.6 * * @param {object} dz Dropzone object. */ function toggleMessage(dz) { setTimeout(function () { var validFiles = dz.files.filter(function (file) { return file.accepted; }); if (validFiles.length >= dz.options.maxFiles) { dz.element.querySelector('.dz-message').classList.add('hide'); } else { dz.element.querySelector('.dz-message').classList.remove('hide'); } }, 0); } /** * Toggle error message if total size more than limit. * Runs for each file. * * @since 1.5.6 * * @param {object} file Current file. * @param {object} dz Dropzone object. */ function validatePostMaxSizeError(file, dz) { setTimeout(function () { if (file.size >= dz.dataTransfer.postMaxSize) { var errorMessage = window.wpforms_file_upload.errors.post_max_size; if (!file.isErrorNotUploadedDisplayed) { file.isErrorNotUploadedDisplayed = true; errorMessage = window.wpforms_file_upload.errors.file_not_uploaded + ' ' + errorMessage; addErrorMessage(file, errorMessage); } } }, 1); } /** * Start File Upload. * * This would do the initial request to start a file upload. No chunk * is uploaded at this stage, instead all the information related to the * file are send to the server waiting for an authorization. * * If the server authorizes the client would start uploading the chunks. * * @since 1.6.2 * * @param {object} dz Dropzone object. * @param {object} file Current file. */ function initFileUpload(dz, file) { wp.ajax.post(jQuery.extend({ action: 'wpforms_upload_chunk_init', form_id: dz.dataTransfer.formId, field_id: dz.dataTransfer.fieldId, name: file.name, slow: isSlow }, dz.options.params.call(dz, null, null, { file: file, index: 0 }))).then(function (response) { // File upload has been authorized. for (var key in response) { dz.options[key] = response[key]; } if (response.dzchunksize) { dz.options.chunkSize = parseInt(response.dzchunksize, 10); file.upload.totalChunkCount = Math.ceil(file.size / dz.options.chunkSize); } dz.processQueue(); }).fail(function (response) { file.status = 'error'; if (!file.xhr) { var field = dz.element.closest('.wpforms-field'); var hiddenInput = field.querySelector('.dropzone-input'); var errorMessage = window.wpforms_file_upload.errors.file_not_uploaded + ' ' + window.wpforms_file_upload.errors.default_error; file.previewElement.classList.add('dz-processing', 'dz-error', 'dz-complete'); hiddenInput.classList.add('wpforms-error'); field.classList.add('wpforms-has-error'); addErrorMessage(file, errorMessage); } dz.processQueue(); }); } /** * Validate the file when it was added in the dropzone. * * @since 1.5.6 * * @param {object} dz Dropzone object. * * @returns {Function} Handler function. */ function addedFile(dz) { return function (file) { if (file.size >= dz.dataTransfer.postMaxSize) { validatePostMaxSizeError(file, dz); } else { speedTest(function () { initFileUpload(dz, file); }); } dz.loading = dz.loading || 0; dz.loading++; toggleSubmit(dz); toggleMessage(dz); }; } /** * Send an AJAX request to remove file from the server. * * @since 1.5.6 * * @param {string} file File name. * @param {object} dz Dropzone object. */ function removeFromServer(file, dz) { wp.ajax.post({ action: 'wpforms_remove_file', file: file, form_id: dz.dataTransfer.formId, field_id: dz.dataTransfer.fieldId }); } /** * Init the file removal on server when user removed it on front-end. * * @since 1.5.6 * * @param {object} dz Dropzone object. * * @returns {Function} Handler function. */ function removedFile(dz) { return function (file) { toggleMessage(dz); var json = file.chunkResponse || (file.xhr || {}).responseText; if (json) { var object = parseJSON(json); if (object && object.data && object.data.file) { removeFromServer(object.data.file, dz); } } // Remove submitted value. if (Object.prototype.hasOwnProperty.call(file, 'isDefault') && file.isDefault) { submittedValues[dz.dataTransfer.formId][dz.dataTransfer.fieldId].splice(file.index, 1); dz.options.maxFiles++; removeFromServer(file.file, dz); } updateInputValue(dz); dz.loading = dz.loading || 0; dz.loading--; dz.loading = Math.max(dz.loading, 0); toggleSubmit(dz); var numErrors = dz.element.querySelectorAll('.dz-preview.dz-error').length; if (numErrors === 0) { dz.element.classList.remove('wpforms-error'); dz.element.closest('.wpforms-field').classList.remove('wpforms-has-error'); } }; } /** * Process any error that was fired per each file. * There might be several errors per file, in that case - display "not uploaded" text only once. * * @since 1.5.6.1 * * @param {object} dz Dropzone object. * * @returns {Function} Handler function. */ function error(dz) { return function (file, errorMessage) { if (file.isErrorNotUploadedDisplayed) { return; } if (_typeof(errorMessage) === 'object') { errorMessage = Object.prototype.hasOwnProperty.call(errorMessage, 'data') && typeof errorMessage.data === 'string' ? errorMessage.data : ''; } errorMessage = errorMessage !== '0' ? errorMessage : ''; file.isErrorNotUploadedDisplayed = true; file.previewElement.querySelectorAll('[data-dz-errormessage]')[0].textContent = window.wpforms_file_upload.errors.file_not_uploaded + ' ' + errorMessage; dz.element.classList.add('wpforms-error'); dz.element.closest('.wpforms-field').classList.add('wpforms-has-error'); }; } /** * Preset previously submitted files to the dropzone. * * @since 1.7.1 * * @param {object} dz Dropzone object. */ function presetSubmittedData(dz) { var files = parseJSON(getInput(dz).val()); if (!files || !files.length) { return; } submittedValues[dz.dataTransfer.formId] = []; // We do deep cloning an object to be sure that data is passed without links. submittedValues[dz.dataTransfer.formId][dz.dataTransfer.fieldId] = JSON.parse(JSON.stringify(files)); files.forEach(function (file, index) { file.isDefault = true; file.index = index; if (file.type.match(/image.*/)) { dz.displayExistingFile(file, file.url); return; } dz.emit('addedfile', file); dz.emit('complete', file); }); dz.options.maxFiles = dz.options.maxFiles - files.length; } /** * Dropzone.js init for each field. * * @since 1.5.6 * * @param {object} $el WPForms uploader DOM element. * * @returns {object} Dropzone object. */ function dropZoneInit($el) { if ($el.dropzone) { return $el.dropzone; } var formId = parseInt($el.dataset.formId, 10); var fieldId = parseInt($el.dataset.fieldId, 10) || 0; var maxFiles = parseInt($el.dataset.maxFileNumber, 10); var acceptedFiles = $el.dataset.extensions.split(',').map(function (el) { return '.' + el; }).join(','); // Configure and modify Dropzone library. var dz = new window.Dropzone($el, { url: window.wpforms_file_upload.url, addRemoveLinks: true, chunking: true, forceChunking: true, retryChunks: true, chunkSize: parseInt($el.dataset.fileChunkSize, 10), paramName: $el.dataset.inputName, parallelChunkUploads: !!($el.dataset.parallelUploads || '').match(/^true$/i), parallelUploads: parseInt($el.dataset.maxParallelUploads, 10), autoProcessQueue: false, maxFilesize: (parseInt($el.dataset.maxSize, 10) / (1024 * 1024)).toFixed(2), maxFiles: maxFiles, acceptedFiles: acceptedFiles, dictMaxFilesExceeded: window.wpforms_file_upload.errors.file_limit.replace('{fileLimit}', maxFiles), dictInvalidFileType: window.wpforms_file_upload.errors.file_extension, dictFileTooBig: window.wpforms_file_upload.errors.file_size }); // Custom variables. dz.dataTransfer = { postMaxSize: $el.dataset.maxSize, name: $el.dataset.inputName, formId: formId, fieldId: fieldId }; presetSubmittedData(dz); // Process events. dz.on('sending', sending(dz, { action: 'wpforms_upload_chunk', form_id: formId, field_id: fieldId })); dz.on('addedfile', addedFile(dz)); dz.on('removedfile', removedFile(dz)); dz.on('complete', confirmChunksFinishUpload(dz)); dz.on('error', error(dz)); return dz; } /** * Hidden Dropzone input focus event handler. * * @since 1.8.1 */ function dropzoneInputFocus() { $(this).prev('.wpforms-uploader').addClass('wpforms-focus'); } /** * Hidden Dropzone input blur event handler. * * @since 1.8.1 */ function dropzoneInputBlur() { $(this).prev('.wpforms-uploader').removeClass('wpforms-focus'); } /** * Hidden Dropzone input blur event handler. * * @since 1.8.1 * * @param {object} e Event object. */ function dropzoneInputKeypress(e) { e.preventDefault(); if (e.keyCode !== 13) { return; } $(this).prev('.wpforms-uploader').trigger('click'); } /** * Hidden Dropzone input blur event handler. * * @since 1.8.1 */ function dropzoneClick() { $(this).next('.dropzone-input').trigger('focus'); } /** * Classic File upload success callback to determine if all files are uploaded. * * @since 1.8.3 * * @param {Event} e Event. * @param {jQuery} $form Form. */ function combinedUploadsSizeOk(e, $form) { if (anyUploadsInProgress()) { disableSubmitButton($form); } } /** * Events. * * @since 1.8.1 */ function events() { $('.dropzone-input').on('focus', dropzoneInputFocus).on('blur', dropzoneInputBlur).on('keypress', dropzoneInputKeypress); $('.wpforms-uploader').on('click', dropzoneClick); $('form.wpforms-form').on('wpformsCombinedUploadsSizeOk', combinedUploadsSizeOk); } /** * DOMContentLoaded handler. * * @since 1.5.6 */ function ready() { window.wpforms = window.wpforms || {}; window.wpforms.dropzones = [].slice.call(document.querySelectorAll('.wpforms-uploader')).map(dropZoneInit); events(); } /** * Modern File Upload engine. * * @since 1.6.0 */ var wpformsModernFileUpload = { /** * Start the initialization. * * @since 1.6.0 */ init: function init() { $(document).on('wpformsReady', ready); } }; // Call init and save in global variable. wpformsModernFileUpload.init(); window.wpformsModernFileUpload = wpformsModernFileUpload; })(jQuery); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZW9mIiwibyIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCIkIiwiaXNTbG93Iiwic3VibWl0dGVkVmFsdWVzIiwic3BlZWRUZXN0U2V0dGluZ3MiLCJtYXhUaW1lIiwicGF5bG9hZFNpemUiLCJnZXRQYXlsb2FkIiwiZGF0YSIsImkiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJNYXRoIiwicm91bmQiLCJyYW5kb20iLCJzcGVlZFRlc3QiLCJuZXh0Iiwic2V0VGltZW91dCIsInN0YXJ0IiwiRGF0ZSIsIndwIiwiYWpheCIsInBvc3QiLCJhY3Rpb24iLCJ0aGVuIiwiZGVsdGEiLCJmYWlsIiwidG9nZ2xlTG9hZGluZ01lc3NhZ2UiLCIkZm9ybSIsImZpbmQiLCJsZW5ndGgiLCJiZWZvcmUiLCJjb25jYXQiLCJ3aW5kb3ciLCJ3cGZvcm1zX2ZpbGVfdXBsb2FkIiwibG9hZGluZ19tZXNzYWdlIiwidXBsb2FkSW5Qcm9ncmVzcyIsImR6IiwibG9hZGluZyIsImdldEZpbGVzV2l0aFN0YXR1cyIsImFueVVwbG9hZHNJblByb2dyZXNzIiwid3Bmb3JtcyIsImRyb3B6b25lcyIsInNvbWUiLCJkaXNhYmxlU3VibWl0QnV0dG9uIiwiJGJ0biIsIiRidG5OZXh0IiwiaGFuZGxlciIsInByb3AiLCJXUEZvcm1zVXRpbHMiLCJ0cmlnZ2VyRXZlbnQiLCJhdHRyIiwicGFyZW50IiwiYWRkQ2xhc3MiLCJhcHBlbmQiLCJjc3MiLCJ3aWR0aCIsIm91dGVyV2lkdGgiLCJoZWlnaHQiLCJvdXRlckhlaWdodCIsIm9uIiwidG9nZ2xlU3VibWl0IiwialF1ZXJ5IiwiZWxlbWVudCIsImNsb3Nlc3QiLCJkaXNhYmxlZCIsImlzQnV0dG9uRGlzYWJsZWQiLCJCb29sZWFuIiwiaGFzQ2xhc3MiLCJvZmYiLCJyZW1vdmUiLCJyZW1vdmVDbGFzcyIsInBhcnNlSlNPTiIsInN0ciIsIkpTT04iLCJwYXJzZSIsImUiLCJvbmx5V2l0aExlbmd0aCIsImVsIiwib25seVBvc2l0aXZlIiwiZ2V0WEhSIiwiY2h1bmtSZXNwb25zZSIsInhociIsImdldFJlc3BvbnNlVGV4dCIsInJlc3BvbnNlVGV4dCIsImdldERhdGEiLCJnZXRWYWx1ZSIsImZpbGVzIiwibWFwIiwiZmlsdGVyIiwic2VuZGluZyIsImZpbGUiLCJmb3JtRGF0YSIsInNpemUiLCJkYXRhVHJhbnNmZXIiLCJwb3N0TWF4U2l6ZSIsInNlbmQiLCJhY2NlcHRlZCIsInByb2Nlc3NpbmciLCJzdGF0dXMiLCJwcmV2aWV3RWxlbWVudCIsImNsYXNzTGlzdCIsImFkZCIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwiY29udmVydEZpbGVzVG9WYWx1ZSIsImZvcm1JZCIsImZpZWxkSWQiLCJzdHJpbmdpZnkiLCJwdXNoIiwiYXBwbHkiLCJnZXRJbnB1dCIsInBhcmVudHMiLCJuYW1lIiwidXBkYXRlSW5wdXRWYWx1ZSIsIiRpbnB1dCIsInZhbCIsInRyaWdnZXIiLCJmbiIsInZhbGlkIiwiY29tcGxldGUiLCJtYXgiLCJhZGRFcnJvck1lc3NhZ2UiLCJlcnJvck1lc3NhZ2UiLCJpc0Vycm9yTm90VXBsb2FkZWREaXNwbGF5ZWQiLCJzcGFuIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJUZXh0IiwidG9TdHJpbmciLCJzZXRBdHRyaWJ1dGUiLCJxdWVyeVNlbGVjdG9yIiwiYXBwZW5kQ2hpbGQiLCJjb25maXJtQ2h1bmtzRmluaXNoVXBsb2FkIiwiY29uZmlybSIsInJldHJpZXMiLCJyZXRyeSIsImVycm9ycyIsImZpbGVfbm90X3VwbG9hZGVkIiwicmVzcG9uc2UiLCJoYXNTcGVjaWZpY0Vycm9yIiwicmVzcG9uc2VKU09OIiwic3VjY2VzcyIsImV4dGVuZCIsImZvcm1faWQiLCJmaWVsZF9pZCIsIm9wdGlvbnMiLCJwYXJhbXMiLCJjYWxsIiwiaW5kZXgiLCJwcm9jZXNzUXVldWUiLCJ0b2dnbGVNZXNzYWdlIiwidmFsaWRGaWxlcyIsIm1heEZpbGVzIiwidmFsaWRhdGVQb3N0TWF4U2l6ZUVycm9yIiwicG9zdF9tYXhfc2l6ZSIsImluaXRGaWxlVXBsb2FkIiwic2xvdyIsImR6Y2h1bmtzaXplIiwiY2h1bmtTaXplIiwicGFyc2VJbnQiLCJ1cGxvYWQiLCJ0b3RhbENodW5rQ291bnQiLCJjZWlsIiwiZmllbGQiLCJoaWRkZW5JbnB1dCIsImRlZmF1bHRfZXJyb3IiLCJhZGRlZEZpbGUiLCJyZW1vdmVGcm9tU2VydmVyIiwicmVtb3ZlZEZpbGUiLCJqc29uIiwib2JqZWN0IiwiaGFzT3duUHJvcGVydHkiLCJpc0RlZmF1bHQiLCJzcGxpY2UiLCJudW1FcnJvcnMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZXJyb3IiLCJ0ZXh0Q29udGVudCIsInByZXNldFN1Ym1pdHRlZERhdGEiLCJ0eXBlIiwibWF0Y2giLCJkaXNwbGF5RXhpc3RpbmdGaWxlIiwidXJsIiwiZW1pdCIsImRyb3Bab25lSW5pdCIsIiRlbCIsImRyb3B6b25lIiwiZGF0YXNldCIsIm1heEZpbGVOdW1iZXIiLCJhY2NlcHRlZEZpbGVzIiwiZXh0ZW5zaW9ucyIsInNwbGl0Iiwiam9pbiIsIkRyb3B6b25lIiwiYWRkUmVtb3ZlTGlua3MiLCJjaHVua2luZyIsImZvcmNlQ2h1bmtpbmciLCJyZXRyeUNodW5rcyIsImZpbGVDaHVua1NpemUiLCJwYXJhbU5hbWUiLCJpbnB1dE5hbWUiLCJwYXJhbGxlbENodW5rVXBsb2FkcyIsInBhcmFsbGVsVXBsb2FkcyIsIm1heFBhcmFsbGVsVXBsb2FkcyIsImF1dG9Qcm9jZXNzUXVldWUiLCJtYXhGaWxlc2l6ZSIsIm1heFNpemUiLCJ0b0ZpeGVkIiwiZGljdE1heEZpbGVzRXhjZWVkZWQiLCJmaWxlX2xpbWl0IiwicmVwbGFjZSIsImRpY3RJbnZhbGlkRmlsZVR5cGUiLCJmaWxlX2V4dGVuc2lvbiIsImRpY3RGaWxlVG9vQmlnIiwiZmlsZV9zaXplIiwiZHJvcHpvbmVJbnB1dEZvY3VzIiwicHJldiIsImRyb3B6b25lSW5wdXRCbHVyIiwiZHJvcHpvbmVJbnB1dEtleXByZXNzIiwicHJldmVudERlZmF1bHQiLCJrZXlDb2RlIiwiZHJvcHpvbmVDbGljayIsImNvbWJpbmVkVXBsb2Fkc1NpemVPayIsImV2ZW50cyIsInJlYWR5Iiwic2xpY2UiLCJ3cGZvcm1zTW9kZXJuRmlsZVVwbG9hZCIsImluaXQiXSwic291cmNlcyI6WyJmYWtlXzkyZTMwMDliLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCBXUEZvcm1zVXRpbHMgKi9cbid1c2Ugc3RyaWN0JztcblxuKCBmdW5jdGlvbiggJCApIHtcblxuXHQvKipcblx0ICogQWxsIGNvbm5lY3Rpb25zIGFyZSBzbG93IGJ5IGRlZmF1bHQuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjYuMlxuXHQgKlxuXHQgKiBAdHlwZSB7Ym9vbGVhbnxudWxsfVxuXHQgKi9cblx0dmFyIGlzU2xvdyA9IG51bGw7XG5cblx0LyoqXG5cdCAqIFByZXZpb3VzbHkgc3VibWl0dGVkIGRhdGEuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjcuMVxuXHQgKlxuXHQgKiBAdHlwZSB7QXJyYXl9XG5cdCAqL1xuXHR2YXIgc3VibWl0dGVkVmFsdWVzID0gW107XG5cblx0LyoqXG5cdCAqIERlZmF1bHQgc2V0dGluZ3MgZm9yIG91ciBzcGVlZCB0ZXN0LlxuXHQgKlxuXHQgKiBAc2luY2UgMS42LjJcblx0ICpcblx0ICogQHR5cGUge3ttYXhUaW1lOiBudW1iZXIsIHBheWxvYWRTaXplOiBudW1iZXJ9fVxuXHQgKi9cblx0dmFyIHNwZWVkVGVzdFNldHRpbmdzID0ge1xuXHRcdG1heFRpbWU6IDMwMDAsIC8vIE1heCB0aW1lIChtcykgaXQgc2hvdWxkIHRha2UgdG8gYmUgY29uc2lkZXJlZCBhICdmYXN0IGNvbm5lY3Rpb24nLlxuXHRcdHBheWxvYWRTaXplOiAxMDAgKiAxMDI0LCAvLyBQYXlsb2FkIHNpemUuXG5cdH07XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHJhbmRvbSBwYXlsb2FkIGZvciB0aGUgc3BlZWQgdGVzdC5cblx0ICpcblx0ICogQHNpbmNlIDEuNi4yXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJhbmRvbSBwYXlsb2FkLlxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0UGF5bG9hZCgpIHtcblxuXHRcdHZhciBkYXRhID0gJyc7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzcGVlZFRlc3RTZXR0aW5ncy5wYXlsb2FkU2l6ZTsgKytpICkge1xuXHRcdFx0ZGF0YSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBNYXRoLnJvdW5kKCBNYXRoLnJhbmRvbSgpICogMzYgKyA2NCApICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXHQvKipcblx0ICogUnVuIHNwZWVkIHRlc3RzIGFuZCBmbGFnIHRoZSBjbGllbnRzIGFzIHNsb3cgb3Igbm90LiBJZiBhIGNvbm5lY3Rpb25cblx0ICogaXMgc2xvdyBpdCB3b3VsZCBsZXQgdGhlIGJhY2tlbmQga25vdyBhbmQgdGhlIGJhY2tlbmQgbW9zdCBsaWtlbHlcblx0ICogd291bGQgZGlzYWJsZSBwYXJhbGxlbCB1cGxvYWRzIGFuZCB3b3VsZCBzZXQgc21hbGxlciBjaHVuayBzaXplcy5cblx0ICpcblx0ICogQHNpbmNlIDEuNi4yXG5cdCAqXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHQgRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBzcGVlZCBkZXRlY3Rpb24gaXMgZG9uZS5cblx0ICovXG5cdGZ1bmN0aW9uIHNwZWVkVGVzdCggbmV4dCApIHtcblxuXHRcdGlmICggbnVsbCAhPT0gaXNTbG93ICkge1xuXHRcdFx0c2V0VGltZW91dCggbmV4dCApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBkYXRhICA9IGdldFBheWxvYWQoKTtcblx0XHR2YXIgc3RhcnQgPSBuZXcgRGF0ZTtcblxuXHRcdHdwLmFqYXgucG9zdCgge1xuXHRcdFx0YWN0aW9uOiAnd3Bmb3Jtc19maWxlX3VwbG9hZF9zcGVlZF90ZXN0Jyxcblx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0fSApLnRoZW4oIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHR2YXIgZGVsdGEgPSBuZXcgRGF0ZSAtIHN0YXJ0O1xuXG5cdFx0XHRpc1Nsb3cgPSBkZWx0YSA+PSBzcGVlZFRlc3RTZXR0aW5ncy5tYXhUaW1lO1xuXG5cdFx0XHRuZXh0KCk7XG5cdFx0fSApLmZhaWwoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRpc1Nsb3cgPSB0cnVlO1xuXG5cdFx0XHRuZXh0KCk7XG5cdFx0fSApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRvZ2dsZSBsb2FkaW5nIG1lc3NhZ2UgYWJvdmUgc3VibWl0IGJ1dHRvbi5cblx0ICpcblx0ICogQHNpbmNlIDEuNS42XG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSAkZm9ybSBqUXVlcnkgZm9ybSBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiB0b2dnbGVMb2FkaW5nTWVzc2FnZSggJGZvcm0gKSB7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cblx0XHRcdGlmICggJGZvcm0uZmluZCggJy53cGZvcm1zLXVwbG9hZGluZy1pbi1wcm9ncmVzcy1hbGVydCcgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0JGZvcm0uZmluZCggJy53cGZvcm1zLXN1Ym1pdC1jb250YWluZXInIClcblx0XHRcdFx0LmJlZm9yZShcblx0XHRcdFx0XHRgPGRpdiBjbGFzcz1cIndwZm9ybXMtZXJyb3ItYWxlcnQgd3Bmb3Jtcy11cGxvYWRpbmctaW4tcHJvZ3Jlc3MtYWxlcnRcIj5cblx0XHRcdFx0XHRcdCR7d2luZG93LndwZm9ybXNfZmlsZV91cGxvYWQubG9hZGluZ19tZXNzYWdlfVxuXHRcdFx0XHRcdDwvZGl2PmBcblx0XHRcdFx0KTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIElzIGEgZmllbGQgbG9hZGluZz9cblx0ICpcblx0ICogQHNpbmNlIDEuNy42XG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBkeiBEcm9wem9uZSBvYmplY3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBmaWVsZCBpcyBsb2FkaW5nLlxuXHQgKi9cblx0ZnVuY3Rpb24gdXBsb2FkSW5Qcm9ncmVzcyggZHogKSB7XG5cblx0XHRyZXR1cm4gZHoubG9hZGluZyA+IDAgfHwgZHouZ2V0RmlsZXNXaXRoU3RhdHVzKCAnZXJyb3InICkubGVuZ3RoID4gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBJcyBhdCBsZWFzdCBvbmUgZmllbGQgbG9hZGluZz9cblx0ICpcblx0ICogQHNpbmNlIDEuNy42XG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGF0IGxlYXN0IG9uZSBmaWVsZCBpcyBsb2FkaW5nLlxuXHQgKi9cblx0ZnVuY3Rpb24gYW55VXBsb2Fkc0luUHJvZ3Jlc3MoKSB7XG5cblx0XHR2YXIgYW55VXBsb2Fkc0luUHJvZ3Jlc3MgPSBmYWxzZTtcblxuXHRcdHdpbmRvdy53cGZvcm1zLmRyb3B6b25lcy5zb21lKCBmdW5jdGlvbiggZHogKSB7XG5cblx0XHRcdGlmICggdXBsb2FkSW5Qcm9ncmVzcyggZHogKSApIHtcblx0XHRcdFx0YW55VXBsb2Fkc0luUHJvZ3Jlc3MgPSB0cnVlO1xuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHRcdHJldHVybiBhbnlVcGxvYWRzSW5Qcm9ncmVzcztcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlIHN1Ym1pdCBidXR0b24gYW5kIGFkZCBvdmVybGF5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gJGZvcm0galF1ZXJ5IGZvcm0gZWxlbWVudC5cblx0ICovXG5cdGZ1bmN0aW9uIGRpc2FibGVTdWJtaXRCdXR0b24oICRmb3JtICkge1xuXG5cdFx0Ly8gRmluZCB0aGUgcHJpbWFyeSBzdWJtaXQgYnV0dG9uIGFuZCB0aGUgXCJOZXh0XCIgYnV0dG9uIGZvciBtdWx0aS1wYWdlIGZvcm1zLlxuXHRcdGxldCAkYnRuID0gJGZvcm0uZmluZCggJy53cGZvcm1zLXN1Ym1pdCcgKTtcblx0XHRjb25zdCAkYnRuTmV4dCA9ICRmb3JtLmZpbmQoICcud3Bmb3Jtcy1wYWdlLW5leHQ6dmlzaWJsZScgKTtcblx0XHRjb25zdCBoYW5kbGVyID0gdG9nZ2xlTG9hZGluZ01lc3NhZ2UoICRmb3JtICk7IC8vIEdldCB0aGUgaGFuZGxlciBmdW5jdGlvbiBmb3IgbG9hZGluZyBtZXNzYWdlIHRvZ2dsZS5cblxuXHRcdC8vIEZvciBtdWx0aS1wYWdlcyBsYXlvdXQsIHVzZSB0aGUgXCJOZXh0XCIgYnV0dG9uIGluc3RlYWQgb2YgdGhlIHByaW1hcnkgc3VibWl0IGJ1dHRvbi5cblx0XHRpZiAoICRmb3JtLmZpbmQoICcud3Bmb3Jtcy1wYWdlLWluZGljYXRvcicgKS5sZW5ndGggIT09IDAgJiYgJGJ0bk5leHQubGVuZ3RoICE9PSAwICkge1xuXHRcdFx0JGJ0biA9ICRidG5OZXh0O1xuXHRcdH1cblxuXHRcdC8vIERpc2FibGUgdGhlIHN1Ym1pdCBidXR0b24uXG5cdFx0JGJ0bi5wcm9wKCAnZGlzYWJsZWQnLCB0cnVlICk7XG5cdFx0V1BGb3Jtc1V0aWxzLnRyaWdnZXJFdmVudCggJGZvcm0sICd3cGZvcm1zRm9ybVN1Ym1pdEJ1dHRvbkRpc2FibGUnLCBbICRmb3JtLCAkYnRuIF0gKTtcblxuXHRcdC8vIElmIHRoZSBvdmVybGF5IGlzIG5vdCBhbHJlYWR5IGFkZGVkIGFuZCB0aGUgYnV0dG9uIGlzIG9mIHR5cGUgXCJzdWJtaXRcIiwgYWRkIGFuIG92ZXJsYXkuXG5cdFx0aWYgKCAhICRmb3JtLmZpbmQoICcud3Bmb3Jtcy1zdWJtaXQtb3ZlcmxheScgKS5sZW5ndGggJiYgJGJ0bi5hdHRyKCAndHlwZScgKSA9PT0gJ3N1Ym1pdCcgKSB7XG5cblx0XHRcdC8vIEFkZCBhIGNvbnRhaW5lciBmb3IgdGhlIG92ZXJsYXkgYW5kIGFwcGVuZCB0aGUgb3ZlcmxheSBlbGVtZW50IHRvIGl0LlxuXHRcdFx0JGJ0bi5wYXJlbnQoKS5hZGRDbGFzcyggJ3dwZm9ybXMtc3VibWl0LW92ZXJsYXktY29udGFpbmVyJyApO1xuXHRcdFx0JGJ0bi5wYXJlbnQoKS5hcHBlbmQoICc8ZGl2IGNsYXNzPVwid3Bmb3Jtcy1zdWJtaXQtb3ZlcmxheVwiPjwvZGl2PicgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBvdmVybGF5IGRpbWVuc2lvbnMgdG8gbWF0Y2ggdGhlIHN1Ym1pdCBidXR0b24ncyBzaXplLlxuXHRcdFx0JGZvcm0uZmluZCggJy53cGZvcm1zLXN1Ym1pdC1vdmVybGF5JyApLmNzcygge1xuXHRcdFx0XHR3aWR0aDogYCR7JGJ0bi5vdXRlcldpZHRoKCl9cHhgLFxuXHRcdFx0XHRoZWlnaHQ6IGAkeyRidG4ucGFyZW50KCkub3V0ZXJIZWlnaHQoKX1weGAsXG5cdFx0XHR9ICk7XG5cblx0XHRcdC8vIEF0dGFjaCB0aGUgY2xpY2sgZXZlbnQgdG8gdGhlIG92ZXJsYXkgc28gdGhhdCBpdCB0cmlnZ2VycyB0aGUgaGFuZGxlciBmdW5jdGlvbi5cblx0XHRcdCRmb3JtLmZpbmQoICcud3Bmb3Jtcy1zdWJtaXQtb3ZlcmxheScgKS5vbiggJ2NsaWNrJywgaGFuZGxlciApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlIHN1Ym1pdCBidXR0b24gd2hlbiB3ZSBhcmUgc2VuZGluZyBmaWxlcyB0byB0aGUgc2VydmVyLlxuXHQgKlxuXHQgKiBAc2luY2UgMS41LjZcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IGR6IERyb3B6b25lIG9iamVjdC5cblx0ICovXG5cdGZ1bmN0aW9uIHRvZ2dsZVN1Ym1pdCggZHogKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29tcGxleGl0eVxuXG5cdFx0dmFyICRmb3JtID0galF1ZXJ5KCBkei5lbGVtZW50ICkuY2xvc2VzdCggJ2Zvcm0nICksXG5cdFx0XHQkYnRuID0gJGZvcm0uZmluZCggJy53cGZvcm1zLXN1Ym1pdCcgKSxcblx0XHRcdCRidG5OZXh0ID0gJGZvcm0uZmluZCggJy53cGZvcm1zLXBhZ2UtbmV4dDp2aXNpYmxlJyApLFxuXHRcdFx0aGFuZGxlciA9IHRvZ2dsZUxvYWRpbmdNZXNzYWdlKCAkZm9ybSApLFxuXHRcdFx0ZGlzYWJsZWQgPSB1cGxvYWRJblByb2dyZXNzKCBkeiApO1xuXG5cdFx0Ly8gRm9yIG11bHRpLXBhZ2VzIGxheW91dC5cblx0XHRpZiAoICRmb3JtLmZpbmQoICcud3Bmb3Jtcy1wYWdlLWluZGljYXRvcicgKS5sZW5ndGggIT09IDAgJiYgJGJ0bk5leHQubGVuZ3RoICE9PSAwICkge1xuXHRcdFx0JGJ0biA9ICRidG5OZXh0O1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzQnV0dG9uRGlzYWJsZWQgPSBCb29sZWFuKCAkYnRuLnByb3AoICdkaXNhYmxlZCcgKSApIHx8ICRidG4uaGFzQ2xhc3MoICd3cGZvcm1zLWRpc2FibGVkJyApO1xuXG5cdFx0aWYgKCBkaXNhYmxlZCA9PT0gaXNCdXR0b25EaXNhYmxlZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIGRpc2FibGVkICkge1xuXHRcdFx0ZGlzYWJsZVN1Ym1pdEJ1dHRvbiggJGZvcm0gKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIGFueVVwbG9hZHNJblByb2dyZXNzKCkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0JGJ0bi5wcm9wKCAnZGlzYWJsZWQnLCBmYWxzZSApO1xuXHRcdFdQRm9ybXNVdGlscy50cmlnZ2VyRXZlbnQoICRmb3JtLCAnd3Bmb3Jtc0Zvcm1TdWJtaXRCdXR0b25SZXN0b3JlJywgWyAkZm9ybSwgJGJ0biBdICk7XG5cdFx0JGZvcm0uZmluZCggJy53cGZvcm1zLXN1Ym1pdC1vdmVybGF5JyApLm9mZiggJ2NsaWNrJywgaGFuZGxlciApO1xuXHRcdCRmb3JtLmZpbmQoICcud3Bmb3Jtcy1zdWJtaXQtb3ZlcmxheScgKS5yZW1vdmUoKTtcblx0XHQkYnRuLnBhcmVudCgpLnJlbW92ZUNsYXNzKCAnd3Bmb3Jtcy1zdWJtaXQtb3ZlcmxheS1jb250YWluZXInICk7XG5cdFx0aWYgKCAkZm9ybS5maW5kKCAnLndwZm9ybXMtdXBsb2FkaW5nLWluLXByb2dyZXNzLWFsZXJ0JyApLmxlbmd0aCApIHtcblx0XHRcdCRmb3JtLmZpbmQoICcud3Bmb3Jtcy11cGxvYWRpbmctaW4tcHJvZ3Jlc3MtYWxlcnQnICkucmVtb3ZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRyeSB0byBwYXJzZSBKU09OIG9yIHJldHVybiBmYWxzZS5cblx0ICpcblx0ICogQHNpbmNlIDEuNS42XG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgSlNPTiBzdHJpbmcgY2FuZGlkYXRlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Kn0gUGFyc2Ugb2JqZWN0IG9yIGZhbHNlLlxuXHQgKi9cblx0ZnVuY3Rpb24gcGFyc2VKU09OKCBzdHIgKSB7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBKU09OLnBhcnNlKCBzdHIgKTtcblx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTGVhdmUgb25seSBvYmplY3RzIHdpdGggbGVuZ3RoLlxuXHQgKlxuXHQgKiBAc2luY2UgMS41LjZcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IGVsIEFueSBhcnJheS5cblx0ICpcblx0ICogQHJldHVybnMge2Jvb2x9IEhhcyBsZW5ndGggbW9yZSB0aGFuIDAgb3Igbm8uXG5cdCAqL1xuXHRmdW5jdGlvbiBvbmx5V2l0aExlbmd0aCggZWwgKSB7XG5cdFx0cmV0dXJuIGVsLmxlbmd0aCA+IDA7XG5cdH1cblxuXHQvKipcblx0ICogTGVhdmUgb25seSBwb3NpdGl2ZSBlbGVtZW50cy5cblx0ICpcblx0ICogQHNpbmNlIDEuNS42XG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gZWwgQW55IGVsZW1lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHsqfSBGaWx0ZXIgb25seSBwb3NpdGl2ZS5cblx0ICovXG5cdGZ1bmN0aW9uIG9ubHlQb3NpdGl2ZSggZWwgKSB7XG5cdFx0cmV0dXJuIGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB4aHIuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjUuNlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZWwgT2JqZWN0IHdpdGggeGhyIHByb3BlcnR5LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Kn0gR2V0IFhIUi5cblx0ICovXG5cdGZ1bmN0aW9uIGdldFhIUiggZWwgKSB7XG5cdFx0cmV0dXJuIGVsLmNodW5rUmVzcG9uc2UgfHwgZWwueGhyO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCByZXNwb25zZSB0ZXh0LlxuXHQgKlxuXHQgKiBAc2luY2UgMS41LjZcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IGVsIFhociBvYmplY3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFJlc3BvbnNlIHRleHQuXG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRSZXNwb25zZVRleHQoIGVsICkge1xuXHRcdHJldHVybiB0eXBlb2YgZWwgPT09ICdzdHJpbmcnID8gZWwgOiBlbC5yZXNwb25zZVRleHQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGRhdGEuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjUuNlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZWwgT2JqZWN0IHdpdGggZGF0YSBwcm9wZXJ0eS5cblx0ICpcblx0ICogQHJldHVybnMge29iamVjdH0gRGF0YS5cblx0ICovXG5cdGZ1bmN0aW9uIGdldERhdGEoIGVsICkge1xuXHRcdHJldHVybiBlbC5kYXRhO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB2YWx1ZSBmcm9tIGZpbGVzLlxuXHQgKlxuXHQgKiBAc2luY2UgMS41LjZcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IGZpbGVzIERyb3B6b25lIGZpbGVzLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBQcmVwYXJlZCB2YWx1ZS5cblx0ICovXG5cdGZ1bmN0aW9uIGdldFZhbHVlKCBmaWxlcyApIHtcblx0XHRyZXR1cm4gZmlsZXNcblx0XHRcdC5tYXAoIGdldFhIUiApXG5cdFx0XHQuZmlsdGVyKCBvbmx5UG9zaXRpdmUgKVxuXHRcdFx0Lm1hcCggZ2V0UmVzcG9uc2VUZXh0IClcblx0XHRcdC5maWx0ZXIoIG9ubHlXaXRoTGVuZ3RoIClcblx0XHRcdC5tYXAoIHBhcnNlSlNPTiApXG5cdFx0XHQuZmlsdGVyKCBvbmx5UG9zaXRpdmUgKVxuXHRcdFx0Lm1hcCggZ2V0RGF0YSApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlbmRpbmcgZXZlbnQgaGlnaGVyIG9yZGVyIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBAc2luY2UgMS41LjZcblx0ICogQHNpbmNlIDEuNS42LjEgQWRkZWQgc3BlY2lhbCBwcm9jZXNzaW5nIG9mIGEgZmlsZSB0aGF0IGlzIGxhcmdlciB0aGFuIHNlcnZlcidzIHBvc3RfbWF4X3NpemUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBkeiBEcm9wem9uZSBvYmplY3QuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIEFkZGluZyBkYXRhIHRvIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gSGFuZGxlciBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIHNlbmRpbmcoIGR6LCBkYXRhICkge1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCBmaWxlLCB4aHIsIGZvcm1EYXRhICkge1xuXG5cdFx0XHQvKlxuXHRcdFx0ICogV2Ugc2hvdWxkIG5vdCBhbGxvdyBzZW5kaW5nIGEgZmlsZSwgdGhhdCBleGNlZWRzIHNlcnZlciBwb3N0X21heF9zaXplLlxuXHRcdFx0ICogV2l0aCB0aGlzIFwiaGFja1wiIHdlIHJlZGVmaW5lIHRoZSBkZWZhdWx0IHNlbmQgZnVuY3Rpb25hbGl0eVxuXHRcdFx0ICogdG8gcHJldmVudCBvbmx5IHRoaXMgb2JqZWN0IGZyb20gc2VuZGluZyBhIHJlcXVlc3QgYXQgYWxsLlxuXHRcdFx0ICogVGhlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhhdCBlcnJvciBzaG91bGQgYmUgbWFya2VkIGFzIHJlamVjdGVkLFxuXHRcdFx0ICogc28gRHJvcHpvbmUgd2lsbCBzaWxlbnRseSBpZ25vcmUgaXQuXG5cdFx0XHQgKlxuXHRcdFx0ICogSWYgQ2h1bmtzIGFyZSBlbmFibGVkIHRoZSBmaWxlIHNpemUgd2lsbCBuZXZlciBleGNlZWQgKGJ5IGEgUEhQIGNvbnN0cmFpbnQpIHRoZVxuXHRcdFx0ICogcG9zdE1heFNpemUuIFRoaXMgYmxvY2sgc2hvdWxkbid0IGJlIHJlbW92ZWQgbm9uZXRoZWxlc3MgdW50aWwgdGhlIFwibW9kZXJuXCIgdXBsb2FkIGlzIGNvbXBsZXRlbHlcblx0XHRcdCAqIGRlcHJlY2F0ZWQgYW5kIHJlbW92ZWQuXG5cdFx0XHQgKi9cblx0XHRcdGlmICggZmlsZS5zaXplID4gdGhpcy5kYXRhVHJhbnNmZXIucG9zdE1heFNpemUgKSB7XG5cdFx0XHRcdHhoci5zZW5kID0gZnVuY3Rpb24oKSB7fTtcblxuXHRcdFx0XHRmaWxlLmFjY2VwdGVkID0gZmFsc2U7XG5cdFx0XHRcdGZpbGUucHJvY2Vzc2luZyA9IGZhbHNlO1xuXHRcdFx0XHRmaWxlLnN0YXR1cyA9ICdyZWplY3RlZCc7XG5cdFx0XHRcdGZpbGUucHJldmlld0VsZW1lbnQuY2xhc3NMaXN0LmFkZCggJ2R6LWVycm9yJyApO1xuXHRcdFx0XHRmaWxlLnByZXZpZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoICdkei1jb21wbGV0ZScgKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdE9iamVjdC5rZXlzKCBkYXRhICkuZm9yRWFjaCggZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdFx0Zm9ybURhdGEuYXBwZW5kKCBrZXksIGRhdGFba2V5XSApO1xuXHRcdFx0fSApO1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydCBmaWxlcyB0byBpbnB1dCB2YWx1ZS5cblx0ICpcblx0ICogQHNpbmNlIDEuNS42XG5cdCAqIEBzaW5jZSAxLjcuMSBBZGRlZCB0aGUgZHogYXJndW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBmaWxlcyBGaWxlcyBsaXN0LlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZHogRHJvcHpvbmUgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBDb252ZXJ0ZWQgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBjb252ZXJ0RmlsZXNUb1ZhbHVlKCBmaWxlcywgZHogKSB7XG5cblx0XHRpZiAoICEgc3VibWl0dGVkVmFsdWVzWyBkei5kYXRhVHJhbnNmZXIuZm9ybUlkIF0gfHwgISBzdWJtaXR0ZWRWYWx1ZXNbIGR6LmRhdGFUcmFuc2Zlci5mb3JtSWQgXVsgZHouZGF0YVRyYW5zZmVyLmZpZWxkSWQgXSApIHtcblx0XHRcdHJldHVybiBmaWxlcy5sZW5ndGggPyBKU09OLnN0cmluZ2lmeSggZmlsZXMgKSA6ICcnO1xuXHRcdH1cblxuXHRcdGZpbGVzLnB1c2guYXBwbHkoIGZpbGVzLCBzdWJtaXR0ZWRWYWx1ZXNbIGR6LmRhdGFUcmFuc2Zlci5mb3JtSWQgXVsgZHouZGF0YVRyYW5zZmVyLmZpZWxkSWQgXSApO1xuXG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KCBmaWxlcyApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBpbnB1dCBlbGVtZW50LlxuXHQgKlxuXHQgKiBAc2luY2UgMS43LjFcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IGR6IERyb3B6b25lIG9iamVjdC5cblx0ICpcblx0ICogQHJldHVybnMge2pRdWVyeX0gSGlkZGVuIGlucHV0IGVsZW1lbnQuXG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRJbnB1dCggZHogKSB7XG5cblx0XHRyZXR1cm4galF1ZXJ5KCBkei5lbGVtZW50ICkucGFyZW50cyggJy53cGZvcm1zLWZpZWxkLWZpbGUtdXBsb2FkJyApLmZpbmQoICdpbnB1dFtuYW1lPScgKyBkei5kYXRhVHJhbnNmZXIubmFtZSArICddJyApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB2YWx1ZSBpbiBpbnB1dC5cblx0ICpcblx0ICogQHNpbmNlIDEuNS42XG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBkeiBEcm9wem9uZSBvYmplY3QuXG5cdCAqL1xuXHRmdW5jdGlvbiB1cGRhdGVJbnB1dFZhbHVlKCBkeiApIHtcblxuXHRcdHZhciAkaW5wdXQgPSBnZXRJbnB1dCggZHogKTtcblxuXHRcdCRpbnB1dC52YWwoIGNvbnZlcnRGaWxlc1RvVmFsdWUoIGdldFZhbHVlKCBkei5maWxlcyApLCBkeiApICkudHJpZ2dlciggJ2lucHV0JyApO1xuXG5cdFx0aWYgKCB0eXBlb2YgalF1ZXJ5LmZuLnZhbGlkICE9PSAndW5kZWZpbmVkJyApIHtcblx0XHRcdCRpbnB1dC52YWxpZCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wbGV0ZSBldmVudCBoaWdoZXIgb3JkZXIgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIEBkZXByZWNhdGVkIDEuNi4yXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjUuNlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZHogRHJvcHpvbmUgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IEhhbmRsZXIgZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBjb21wbGV0ZSggZHogKSB7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRkei5sb2FkaW5nID0gZHoubG9hZGluZyB8fCAwO1xuXHRcdFx0ZHoubG9hZGluZy0tO1xuXHRcdFx0ZHoubG9hZGluZyA9IE1hdGgubWF4KCBkei5sb2FkaW5nIC0gMSwgMCApO1xuXHRcdFx0dG9nZ2xlU3VibWl0KCBkeiApO1xuXHRcdFx0dXBkYXRlSW5wdXRWYWx1ZSggZHogKTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSBjdXJyZW50IGZpbGUuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjYuMlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZmlsZSAgICAgICAgIEZpbGUgb2JqZWN0LlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNZXNzYWdlIEVycm9yIG1lc3NhZ2Vcblx0ICovXG5cdGZ1bmN0aW9uIGFkZEVycm9yTWVzc2FnZSggZmlsZSwgZXJyb3JNZXNzYWdlICkge1xuXG5cdFx0aWYgKCBmaWxlLmlzRXJyb3JOb3RVcGxvYWRlZERpc3BsYXllZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdzcGFuJyApO1xuXHRcdHNwYW4uaW5uZXJUZXh0ID0gZXJyb3JNZXNzYWdlLnRvU3RyaW5nKCk7XG5cdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoICdkYXRhLWR6LWVycm9ybWVzc2FnZScsICcnICk7XG5cblx0XHRmaWxlLnByZXZpZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoICcuZHotZXJyb3ItbWVzc2FnZScgKS5hcHBlbmRDaGlsZCggc3BhbiApO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpcm0gdGhlIHVwbG9hZCB0byB0aGUgc2VydmVyLlxuXHQgKlxuXHQgKiBUaGUgY29uZmlybWF0aW9uIGlzIG5lZWRlZCBpbiBvcmRlciB0byBsZXQgUEhQIGtub3dcblx0ICogdGhhdCBhbGwgdGhlIGNodW5rcyBoYXZlIGJlZW4gdXBsb2FkZWQuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjYuMlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZHogRHJvcHpvbmUgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IEhhbmRsZXIgZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBjb25maXJtQ2h1bmtzRmluaXNoVXBsb2FkKCBkeiApIHtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb25maXJtKCBmaWxlICkge1xuXG5cdFx0XHRpZiAoICEgZmlsZS5yZXRyaWVzICkge1xuXHRcdFx0XHRmaWxlLnJldHJpZXMgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICdlcnJvcicgPT09IGZpbGUuc3RhdHVzICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogUmV0cnkgZmluYWxpemUgZnVuY3Rpb24uXG5cdFx0XHQgKlxuXHRcdFx0ICogQHNpbmNlIDEuNi4yXG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uIHJldHJ5KCkge1xuXHRcdFx0XHRmaWxlLnJldHJpZXMrKztcblxuXHRcdFx0XHRpZiAoIGZpbGUucmV0cmllcyA9PT0gMyApIHtcblx0XHRcdFx0XHRhZGRFcnJvck1lc3NhZ2UoIGZpbGUsIHdpbmRvdy53cGZvcm1zX2ZpbGVfdXBsb2FkLmVycm9ycy5maWxlX25vdF91cGxvYWRlZCApO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGNvbmZpcm0oIGZpbGUgKTtcblx0XHRcdFx0fSwgNTAwMCAqIGZpbGUucmV0cmllcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEZhaWwgaGFuZGxlciBmb3IgYWpheCByZXF1ZXN0LlxuXHRcdFx0ICpcblx0XHRcdCAqIEBzaW5jZSAxLjYuMlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZSBSZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcblx0XHRcdCAqL1xuXHRcdFx0ZnVuY3Rpb24gZmFpbCggcmVzcG9uc2UgKSB7XG5cblx0XHRcdFx0dmFyIGhhc1NwZWNpZmljRXJyb3IgPVx0cmVzcG9uc2UucmVzcG9uc2VKU09OICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlLnJlc3BvbnNlSlNPTi5zdWNjZXNzID09PSBmYWxzZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZS5yZXNwb25zZUpTT04uZGF0YTtcblxuXHRcdFx0XHRpZiAoIGhhc1NwZWNpZmljRXJyb3IgKSB7XG5cdFx0XHRcdFx0YWRkRXJyb3JNZXNzYWdlKCBmaWxlLCByZXNwb25zZS5yZXNwb25zZUpTT04uZGF0YSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHJ5KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBIYW5kbGVyIGZvciBhamF4IHJlcXVlc3QuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHNpbmNlIDEuNi4yXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFJlc3BvbnNlIGZyb20gdGhlIHNlcnZlclxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbiBjb21wbGV0ZSggcmVzcG9uc2UgKSB7XG5cblx0XHRcdFx0ZmlsZS5jaHVua1Jlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkoIHsgZGF0YTogcmVzcG9uc2UgfSApO1xuXHRcdFx0XHRkei5sb2FkaW5nID0gZHoubG9hZGluZyB8fCAwO1xuXHRcdFx0XHRkei5sb2FkaW5nLS07XG5cdFx0XHRcdGR6LmxvYWRpbmcgPSBNYXRoLm1heCggZHoubG9hZGluZywgMCApO1xuXG5cdFx0XHRcdHRvZ2dsZVN1Ym1pdCggZHogKTtcblx0XHRcdFx0dXBkYXRlSW5wdXRWYWx1ZSggZHogKTtcblx0XHRcdH1cblxuXHRcdFx0d3AuYWpheC5wb3N0KCBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YWN0aW9uOiAnd3Bmb3Jtc19maWxlX2NodW5rc191cGxvYWRlZCcsXG5cdFx0XHRcdFx0Zm9ybV9pZDogZHouZGF0YVRyYW5zZmVyLmZvcm1JZCxcblx0XHRcdFx0XHRmaWVsZF9pZDogZHouZGF0YVRyYW5zZmVyLmZpZWxkSWQsXG5cdFx0XHRcdFx0bmFtZTogZmlsZS5uYW1lLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRkei5vcHRpb25zLnBhcmFtcy5jYWxsKCBkeiwgbnVsbCwgbnVsbCwge2ZpbGU6IGZpbGUsIGluZGV4OiAwfSApXG5cdFx0XHQpICkudGhlbiggY29tcGxldGUgKS5mYWlsKCBmYWlsICk7XG5cblx0XHRcdC8vIE1vdmUgdG8gdXBsb2FkIHRoZSBuZXh0IGZpbGUsIGlmIGFueS5cblx0XHRcdGR6LnByb2Nlc3NRdWV1ZSgpO1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogVG9nZ2xlIHNob3dpbmcgZW1wdHkgbWVzc2FnZS5cblx0ICpcblx0ICogQHNpbmNlIDEuNS42XG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBkeiBEcm9wem9uZSBvYmplY3QuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b2dnbGVNZXNzYWdlKCBkeiApIHtcblxuXHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHZhbGlkRmlsZXMgPSBkei5maWxlcy5maWx0ZXIoIGZ1bmN0aW9uKCBmaWxlICkge1xuXHRcdFx0XHRyZXR1cm4gZmlsZS5hY2NlcHRlZDtcblx0XHRcdH0gKTtcblxuXHRcdFx0aWYgKCB2YWxpZEZpbGVzLmxlbmd0aCA+PSBkei5vcHRpb25zLm1heEZpbGVzICkge1xuXHRcdFx0XHRkei5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoICcuZHotbWVzc2FnZScgKS5jbGFzc0xpc3QuYWRkKCAnaGlkZScgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGR6LmVsZW1lbnQucXVlcnlTZWxlY3RvciggJy5kei1tZXNzYWdlJyApLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRlJyApO1xuXHRcdFx0fVxuXHRcdH0sIDAgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUb2dnbGUgZXJyb3IgbWVzc2FnZSBpZiB0b3RhbCBzaXplIG1vcmUgdGhhbiBsaW1pdC5cblx0ICogUnVucyBmb3IgZWFjaCBmaWxlLlxuXHQgKlxuXHQgKiBAc2luY2UgMS41LjZcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IGZpbGUgQ3VycmVudCBmaWxlLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZHogICBEcm9wem9uZSBvYmplY3QuXG5cdCAqL1xuXHRmdW5jdGlvbiB2YWxpZGF0ZVBvc3RNYXhTaXplRXJyb3IoIGZpbGUsIGR6ICkge1xuXG5cdFx0c2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGZpbGUuc2l6ZSA+PSBkei5kYXRhVHJhbnNmZXIucG9zdE1heFNpemUgKSB7XG5cdFx0XHRcdHZhciBlcnJvck1lc3NhZ2UgPSB3aW5kb3cud3Bmb3Jtc19maWxlX3VwbG9hZC5lcnJvcnMucG9zdF9tYXhfc2l6ZTtcblx0XHRcdFx0aWYgKCAhIGZpbGUuaXNFcnJvck5vdFVwbG9hZGVkRGlzcGxheWVkICkge1xuXHRcdFx0XHRcdGZpbGUuaXNFcnJvck5vdFVwbG9hZGVkRGlzcGxheWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRlcnJvck1lc3NhZ2UgPSB3aW5kb3cud3Bmb3Jtc19maWxlX3VwbG9hZC5lcnJvcnMuZmlsZV9ub3RfdXBsb2FkZWQgKyAnICcgKyBlcnJvck1lc3NhZ2U7XG5cdFx0XHRcdFx0YWRkRXJyb3JNZXNzYWdlKCBmaWxlLCBlcnJvck1lc3NhZ2UgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sIDEgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCBGaWxlIFVwbG9hZC5cblx0ICpcblx0ICogVGhpcyB3b3VsZCBkbyB0aGUgaW5pdGlhbCByZXF1ZXN0IHRvIHN0YXJ0IGEgZmlsZSB1cGxvYWQuIE5vIGNodW5rXG5cdCAqIGlzIHVwbG9hZGVkIGF0IHRoaXMgc3RhZ2UsIGluc3RlYWQgYWxsIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZVxuXHQgKiBmaWxlIGFyZSBzZW5kIHRvIHRoZSBzZXJ2ZXIgd2FpdGluZyBmb3IgYW4gYXV0aG9yaXphdGlvbi5cblx0ICpcblx0ICogSWYgdGhlIHNlcnZlciBhdXRob3JpemVzIHRoZSBjbGllbnQgd291bGQgc3RhcnQgdXBsb2FkaW5nIHRoZSBjaHVua3MuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjYuMlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZHogICBEcm9wem9uZSBvYmplY3QuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBmaWxlIEN1cnJlbnQgZmlsZS5cblx0ICovXG5cdGZ1bmN0aW9uIGluaXRGaWxlVXBsb2FkKCBkeiwgZmlsZSApIHtcblxuXHRcdHdwLmFqYXgucG9zdCggalF1ZXJ5LmV4dGVuZChcblx0XHRcdHtcblx0XHRcdFx0YWN0aW9uIDogJ3dwZm9ybXNfdXBsb2FkX2NodW5rX2luaXQnLFxuXHRcdFx0XHRmb3JtX2lkOiBkei5kYXRhVHJhbnNmZXIuZm9ybUlkLFxuXHRcdFx0XHRmaWVsZF9pZDogZHouZGF0YVRyYW5zZmVyLmZpZWxkSWQsXG5cdFx0XHRcdG5hbWU6IGZpbGUubmFtZSxcblx0XHRcdFx0c2xvdzogaXNTbG93LFxuXHRcdFx0fSxcblx0XHRcdGR6Lm9wdGlvbnMucGFyYW1zLmNhbGwoIGR6LCBudWxsLCBudWxsLCB7ZmlsZTogZmlsZSwgaW5kZXg6IDB9IClcblx0XHQpICkudGhlbiggZnVuY3Rpb24oIHJlc3BvbnNlICkge1xuXG5cdFx0XHQvLyBGaWxlIHVwbG9hZCBoYXMgYmVlbiBhdXRob3JpemVkLlxuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHJlc3BvbnNlICkge1xuXHRcdFx0XHRkei5vcHRpb25zWyBrZXkgXSA9IHJlc3BvbnNlWyBrZXkgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCByZXNwb25zZS5kemNodW5rc2l6ZSApIHtcblx0XHRcdFx0ZHoub3B0aW9ucy5jaHVua1NpemUgPSBwYXJzZUludCggcmVzcG9uc2UuZHpjaHVua3NpemUsIDEwICk7XG5cdFx0XHRcdGZpbGUudXBsb2FkLnRvdGFsQ2h1bmtDb3VudCA9IE1hdGguY2VpbCggZmlsZS5zaXplIC8gZHoub3B0aW9ucy5jaHVua1NpemUgKTtcblx0XHRcdH1cblxuXHRcdFx0ZHoucHJvY2Vzc1F1ZXVlKCk7XG5cdFx0fSApLmZhaWwoIGZ1bmN0aW9uKCByZXNwb25zZSApIHtcblxuXHRcdFx0ZmlsZS5zdGF0dXMgPSAnZXJyb3InO1xuXG5cdFx0XHRpZiAoICEgZmlsZS54aHIgKSB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkID0gZHouZWxlbWVudC5jbG9zZXN0KCAnLndwZm9ybXMtZmllbGQnICk7XG5cdFx0XHRcdGNvbnN0IGhpZGRlbklucHV0ID0gZmllbGQucXVlcnlTZWxlY3RvciggJy5kcm9wem9uZS1pbnB1dCcgKTtcblx0XHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gd2luZG93LndwZm9ybXNfZmlsZV91cGxvYWQuZXJyb3JzLmZpbGVfbm90X3VwbG9hZGVkICsgJyAnICsgd2luZG93LndwZm9ybXNfZmlsZV91cGxvYWQuZXJyb3JzLmRlZmF1bHRfZXJyb3I7XG5cblx0XHRcdFx0ZmlsZS5wcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnZHotcHJvY2Vzc2luZycsICdkei1lcnJvcicsICdkei1jb21wbGV0ZScgKTtcblx0XHRcdFx0aGlkZGVuSW5wdXQuY2xhc3NMaXN0LmFkZCggJ3dwZm9ybXMtZXJyb3InICk7XG5cdFx0XHRcdGZpZWxkLmNsYXNzTGlzdC5hZGQoICd3cGZvcm1zLWhhcy1lcnJvcicgKTtcblx0XHRcdFx0YWRkRXJyb3JNZXNzYWdlKCBmaWxlLCBlcnJvck1lc3NhZ2UgKTtcblx0XHRcdH1cblxuXHRcdFx0ZHoucHJvY2Vzc1F1ZXVlKCk7XG5cdFx0fSApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlIHRoZSBmaWxlIHdoZW4gaXQgd2FzIGFkZGVkIGluIHRoZSBkcm9wem9uZS5cblx0ICpcblx0ICogQHNpbmNlIDEuNS42XG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBkeiBEcm9wem9uZSBvYmplY3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gSGFuZGxlciBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIGFkZGVkRmlsZSggZHogKSB7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24oIGZpbGUgKSB7XG5cblx0XHRcdGlmICggZmlsZS5zaXplID49IGR6LmRhdGFUcmFuc2Zlci5wb3N0TWF4U2l6ZSApIHtcblx0XHRcdFx0dmFsaWRhdGVQb3N0TWF4U2l6ZUVycm9yKCBmaWxlLCBkeiApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3BlZWRUZXN0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpbml0RmlsZVVwbG9hZCggZHosIGZpbGUgKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRkei5sb2FkaW5nID0gZHoubG9hZGluZyB8fCAwO1xuXHRcdFx0ZHoubG9hZGluZysrO1xuXHRcdFx0dG9nZ2xlU3VibWl0KCBkeiApO1xuXG5cdFx0XHR0b2dnbGVNZXNzYWdlKCBkeiApO1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogU2VuZCBhbiBBSkFYIHJlcXVlc3QgdG8gcmVtb3ZlIGZpbGUgZnJvbSB0aGUgc2VydmVyLlxuXHQgKlxuXHQgKiBAc2luY2UgMS41LjZcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZpbGUgRmlsZSBuYW1lLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZHogRHJvcHpvbmUgb2JqZWN0LlxuXHQgKi9cblx0ZnVuY3Rpb24gcmVtb3ZlRnJvbVNlcnZlciggZmlsZSwgZHogKSB7XG5cblx0XHR3cC5hamF4LnBvc3QoIHtcblx0XHRcdGFjdGlvbjogJ3dwZm9ybXNfcmVtb3ZlX2ZpbGUnLFxuXHRcdFx0ZmlsZTogZmlsZSxcblx0XHRcdGZvcm1faWQ6IGR6LmRhdGFUcmFuc2Zlci5mb3JtSWQsXG5cdFx0XHRmaWVsZF9pZDogZHouZGF0YVRyYW5zZmVyLmZpZWxkSWQsXG5cdFx0fSApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXQgdGhlIGZpbGUgcmVtb3ZhbCBvbiBzZXJ2ZXIgd2hlbiB1c2VyIHJlbW92ZWQgaXQgb24gZnJvbnQtZW5kLlxuXHQgKlxuXHQgKiBAc2luY2UgMS41LjZcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IGR6IERyb3B6b25lIG9iamVjdC5cblx0ICpcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBIYW5kbGVyIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gcmVtb3ZlZEZpbGUoIGR6ICkge1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCBmaWxlICkge1xuXHRcdFx0dG9nZ2xlTWVzc2FnZSggZHogKTtcblxuXHRcdFx0dmFyIGpzb24gPSBmaWxlLmNodW5rUmVzcG9uc2UgfHwgKCBmaWxlLnhociB8fCB7fSApLnJlc3BvbnNlVGV4dDtcblxuXHRcdFx0aWYgKCBqc29uICkge1xuXHRcdFx0XHR2YXIgb2JqZWN0ID0gcGFyc2VKU09OKCBqc29uICk7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QgJiYgb2JqZWN0LmRhdGEgJiYgb2JqZWN0LmRhdGEuZmlsZSApIHtcblx0XHRcdFx0XHRyZW1vdmVGcm9tU2VydmVyKCBvYmplY3QuZGF0YS5maWxlLCBkeiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBzdWJtaXR0ZWQgdmFsdWUuXG5cdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggZmlsZSwgJ2lzRGVmYXVsdCcgKSAmJiBmaWxlLmlzRGVmYXVsdCApIHtcblx0XHRcdFx0c3VibWl0dGVkVmFsdWVzWyBkei5kYXRhVHJhbnNmZXIuZm9ybUlkIF1bIGR6LmRhdGFUcmFuc2Zlci5maWVsZElkIF0uc3BsaWNlKCBmaWxlLmluZGV4LCAxICk7XG5cdFx0XHRcdGR6Lm9wdGlvbnMubWF4RmlsZXMrKztcblx0XHRcdFx0cmVtb3ZlRnJvbVNlcnZlciggZmlsZS5maWxlLCBkeiApO1xuXHRcdFx0fVxuXG5cdFx0XHR1cGRhdGVJbnB1dFZhbHVlKCBkeiApO1xuXG5cdFx0XHRkei5sb2FkaW5nID0gZHoubG9hZGluZyB8fCAwO1xuXHRcdFx0ZHoubG9hZGluZy0tO1xuXHRcdFx0ZHoubG9hZGluZyA9IE1hdGgubWF4KCBkei5sb2FkaW5nLCAwICk7XG5cblx0XHRcdHRvZ2dsZVN1Ym1pdCggZHogKTtcblxuXHRcdFx0Y29uc3QgbnVtRXJyb3JzID0gZHouZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLmR6LXByZXZpZXcuZHotZXJyb3InICkubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIG51bUVycm9ycyA9PT0gMCApIHtcblx0XHRcdFx0ZHouZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAnd3Bmb3Jtcy1lcnJvcicgKTtcblx0XHRcdFx0ZHouZWxlbWVudC5jbG9zZXN0KCAnLndwZm9ybXMtZmllbGQnICkuY2xhc3NMaXN0LnJlbW92ZSggJ3dwZm9ybXMtaGFzLWVycm9yJyApO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhbnkgZXJyb3IgdGhhdCB3YXMgZmlyZWQgcGVyIGVhY2ggZmlsZS5cblx0ICogVGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCBlcnJvcnMgcGVyIGZpbGUsIGluIHRoYXQgY2FzZSAtIGRpc3BsYXkgXCJub3QgdXBsb2FkZWRcIiB0ZXh0IG9ubHkgb25jZS5cblx0ICpcblx0ICogQHNpbmNlIDEuNS42LjFcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IGR6IERyb3B6b25lIG9iamVjdC5cblx0ICpcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBIYW5kbGVyIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gZXJyb3IoIGR6ICkge1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCBmaWxlLCBlcnJvck1lc3NhZ2UgKSB7XG5cblx0XHRcdGlmICggZmlsZS5pc0Vycm9yTm90VXBsb2FkZWREaXNwbGF5ZWQgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0eXBlb2YgZXJyb3JNZXNzYWdlID09PSAnb2JqZWN0JyApIHtcblx0XHRcdFx0ZXJyb3JNZXNzYWdlID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBlcnJvck1lc3NhZ2UsICdkYXRhJyApICYmIHR5cGVvZiBlcnJvck1lc3NhZ2UuZGF0YSA9PT0gJ3N0cmluZycgPyBlcnJvck1lc3NhZ2UuZGF0YSA6ICcnO1xuXHRcdFx0fVxuXG5cdFx0XHRlcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgIT09ICcwJyA/IGVycm9yTWVzc2FnZSA6ICcnO1xuXG5cdFx0XHRmaWxlLmlzRXJyb3JOb3RVcGxvYWRlZERpc3BsYXllZCA9IHRydWU7XG5cdFx0XHRmaWxlLnByZXZpZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS1kei1lcnJvcm1lc3NhZ2VdJyApWzBdLnRleHRDb250ZW50ID0gd2luZG93LndwZm9ybXNfZmlsZV91cGxvYWQuZXJyb3JzLmZpbGVfbm90X3VwbG9hZGVkICsgJyAnICsgZXJyb3JNZXNzYWdlO1xuXHRcdFx0ZHouZWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnd3Bmb3Jtcy1lcnJvcicgKTtcblx0XHRcdGR6LmVsZW1lbnQuY2xvc2VzdCggJy53cGZvcm1zLWZpZWxkJyApLmNsYXNzTGlzdC5hZGQoICd3cGZvcm1zLWhhcy1lcnJvcicgKTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFByZXNldCBwcmV2aW91c2x5IHN1Ym1pdHRlZCBmaWxlcyB0byB0aGUgZHJvcHpvbmUuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjcuMVxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZHogRHJvcHpvbmUgb2JqZWN0LlxuXHQgKi9cblx0ZnVuY3Rpb24gcHJlc2V0U3VibWl0dGVkRGF0YSggZHogKSB7XG5cblx0XHR2YXIgZmlsZXMgPSBwYXJzZUpTT04oIGdldElucHV0KCBkeiApLnZhbCgpICk7XG5cblx0XHRpZiAoICEgZmlsZXMgfHwgISBmaWxlcy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0c3VibWl0dGVkVmFsdWVzW2R6LmRhdGFUcmFuc2Zlci5mb3JtSWRdID0gW107XG5cblx0XHQvLyBXZSBkbyBkZWVwIGNsb25pbmcgYW4gb2JqZWN0IHRvIGJlIHN1cmUgdGhhdCBkYXRhIGlzIHBhc3NlZCB3aXRob3V0IGxpbmtzLlxuXHRcdHN1Ym1pdHRlZFZhbHVlc1tkei5kYXRhVHJhbnNmZXIuZm9ybUlkXVtkei5kYXRhVHJhbnNmZXIuZmllbGRJZF0gPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggZmlsZXMgKSApO1xuXG5cdFx0ZmlsZXMuZm9yRWFjaCggZnVuY3Rpb24oIGZpbGUsIGluZGV4ICkge1xuXG5cdFx0XHRmaWxlLmlzRGVmYXVsdCA9IHRydWU7XG5cdFx0XHRmaWxlLmluZGV4ID0gaW5kZXg7XG5cblx0XHRcdGlmICggZmlsZS50eXBlLm1hdGNoKCAvaW1hZ2UuKi8gKSApIHtcblx0XHRcdFx0ZHouZGlzcGxheUV4aXN0aW5nRmlsZSggZmlsZSwgZmlsZS51cmwgKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGR6LmVtaXQoICdhZGRlZGZpbGUnLCBmaWxlICk7XG5cdFx0XHRkei5lbWl0KCAnY29tcGxldGUnLCBmaWxlICk7XG5cdFx0fSApO1xuXG5cdFx0ZHoub3B0aW9ucy5tYXhGaWxlcyA9IGR6Lm9wdGlvbnMubWF4RmlsZXMgLSBmaWxlcy5sZW5ndGg7XG5cdH1cblxuXHQvKipcblx0ICogRHJvcHpvbmUuanMgaW5pdCBmb3IgZWFjaCBmaWVsZC5cblx0ICpcblx0ICogQHNpbmNlIDEuNS42XG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSAkZWwgV1BGb3JtcyB1cGxvYWRlciBET00gZWxlbWVudC5cblx0ICpcblx0ICogQHJldHVybnMge29iamVjdH0gRHJvcHpvbmUgb2JqZWN0LlxuXHQgKi9cblx0ZnVuY3Rpb24gZHJvcFpvbmVJbml0KCAkZWwgKSB7XG5cblx0XHRpZiAoICRlbC5kcm9wem9uZSApIHtcblx0XHRcdHJldHVybiAkZWwuZHJvcHpvbmU7XG5cdFx0fVxuXG5cdFx0dmFyIGZvcm1JZCA9IHBhcnNlSW50KCAkZWwuZGF0YXNldC5mb3JtSWQsIDEwICk7XG5cdFx0dmFyIGZpZWxkSWQgPSBwYXJzZUludCggJGVsLmRhdGFzZXQuZmllbGRJZCwgMTAgKSB8fCAwO1xuXHRcdHZhciBtYXhGaWxlcyA9IHBhcnNlSW50KCAkZWwuZGF0YXNldC5tYXhGaWxlTnVtYmVyLCAxMCApO1xuXG5cdFx0dmFyIGFjY2VwdGVkRmlsZXMgPSAkZWwuZGF0YXNldC5leHRlbnNpb25zLnNwbGl0KCAnLCcgKS5tYXAoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdHJldHVybiAnLicgKyBlbDtcblx0XHR9ICkuam9pbiggJywnICk7XG5cblx0XHQvLyBDb25maWd1cmUgYW5kIG1vZGlmeSBEcm9wem9uZSBsaWJyYXJ5LlxuXHRcdHZhciBkeiA9IG5ldyB3aW5kb3cuRHJvcHpvbmUoICRlbCwge1xuXHRcdFx0dXJsOiB3aW5kb3cud3Bmb3Jtc19maWxlX3VwbG9hZC51cmwsXG5cdFx0XHRhZGRSZW1vdmVMaW5rczogdHJ1ZSxcblx0XHRcdGNodW5raW5nOiB0cnVlLFxuXHRcdFx0Zm9yY2VDaHVua2luZzogdHJ1ZSxcblx0XHRcdHJldHJ5Q2h1bmtzOiB0cnVlLFxuXHRcdFx0Y2h1bmtTaXplOiBwYXJzZUludCggJGVsLmRhdGFzZXQuZmlsZUNodW5rU2l6ZSwgMTAgKSxcblx0XHRcdHBhcmFtTmFtZTogJGVsLmRhdGFzZXQuaW5wdXROYW1lLFxuXHRcdFx0cGFyYWxsZWxDaHVua1VwbG9hZHM6ICEhICggJGVsLmRhdGFzZXQucGFyYWxsZWxVcGxvYWRzIHx8ICcnICkubWF0Y2goIC9edHJ1ZSQvaSApLFxuXHRcdFx0cGFyYWxsZWxVcGxvYWRzOiBwYXJzZUludCggJGVsLmRhdGFzZXQubWF4UGFyYWxsZWxVcGxvYWRzLCAxMCApLFxuXHRcdFx0YXV0b1Byb2Nlc3NRdWV1ZTogZmFsc2UsXG5cdFx0XHRtYXhGaWxlc2l6ZTogKCBwYXJzZUludCggJGVsLmRhdGFzZXQubWF4U2l6ZSwgMTAgKSAvICggMTAyNCAqIDEwMjQgKSApLnRvRml4ZWQoIDIgKSxcblx0XHRcdG1heEZpbGVzOiBtYXhGaWxlcyxcblx0XHRcdGFjY2VwdGVkRmlsZXM6IGFjY2VwdGVkRmlsZXMsXG5cdFx0XHRkaWN0TWF4RmlsZXNFeGNlZWRlZDogd2luZG93LndwZm9ybXNfZmlsZV91cGxvYWQuZXJyb3JzLmZpbGVfbGltaXQucmVwbGFjZSggJ3tmaWxlTGltaXR9JywgbWF4RmlsZXMgKSxcblx0XHRcdGRpY3RJbnZhbGlkRmlsZVR5cGU6IHdpbmRvdy53cGZvcm1zX2ZpbGVfdXBsb2FkLmVycm9ycy5maWxlX2V4dGVuc2lvbixcblx0XHRcdGRpY3RGaWxlVG9vQmlnOiB3aW5kb3cud3Bmb3Jtc19maWxlX3VwbG9hZC5lcnJvcnMuZmlsZV9zaXplLFxuXHRcdH0gKTtcblxuXHRcdC8vIEN1c3RvbSB2YXJpYWJsZXMuXG5cdFx0ZHouZGF0YVRyYW5zZmVyID0ge1xuXHRcdFx0cG9zdE1heFNpemU6ICRlbC5kYXRhc2V0Lm1heFNpemUsXG5cdFx0XHRuYW1lOiAkZWwuZGF0YXNldC5pbnB1dE5hbWUsXG5cdFx0XHRmb3JtSWQ6IGZvcm1JZCxcblx0XHRcdGZpZWxkSWQ6IGZpZWxkSWQsXG5cdFx0fTtcblxuXHRcdHByZXNldFN1Ym1pdHRlZERhdGEoIGR6ICk7XG5cblx0XHQvLyBQcm9jZXNzIGV2ZW50cy5cblx0XHRkei5vbiggJ3NlbmRpbmcnLCBzZW5kaW5nKCBkeiwge1xuXHRcdFx0YWN0aW9uOiAnd3Bmb3Jtc191cGxvYWRfY2h1bmsnLFxuXHRcdFx0Zm9ybV9pZDogZm9ybUlkLFxuXHRcdFx0ZmllbGRfaWQ6IGZpZWxkSWQsXG5cdFx0fSApICk7XG5cdFx0ZHoub24oICdhZGRlZGZpbGUnLCBhZGRlZEZpbGUoIGR6ICkgKTtcblx0XHRkei5vbiggJ3JlbW92ZWRmaWxlJywgcmVtb3ZlZEZpbGUoIGR6ICkgKTtcblx0XHRkei5vbiggJ2NvbXBsZXRlJywgY29uZmlybUNodW5rc0ZpbmlzaFVwbG9hZCggZHogKSApO1xuXHRcdGR6Lm9uKCAnZXJyb3InLCBlcnJvciggZHogKSApO1xuXG5cdFx0cmV0dXJuIGR6O1xuXHR9XG5cblx0LyoqXG5cdCAqIEhpZGRlbiBEcm9wem9uZSBpbnB1dCBmb2N1cyBldmVudCBoYW5kbGVyLlxuXHQgKlxuXHQgKiBAc2luY2UgMS44LjFcblx0ICovXG5cdGZ1bmN0aW9uIGRyb3B6b25lSW5wdXRGb2N1cygpIHtcblxuXHRcdCQoIHRoaXMgKS5wcmV2KCAnLndwZm9ybXMtdXBsb2FkZXInICkuYWRkQ2xhc3MoICd3cGZvcm1zLWZvY3VzJyApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhpZGRlbiBEcm9wem9uZSBpbnB1dCBibHVyIGV2ZW50IGhhbmRsZXIuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjguMVxuXHQgKi9cblx0ZnVuY3Rpb24gZHJvcHpvbmVJbnB1dEJsdXIoKSB7XG5cblx0XHQkKCB0aGlzICkucHJldiggJy53cGZvcm1zLXVwbG9hZGVyJyApLnJlbW92ZUNsYXNzKCAnd3Bmb3Jtcy1mb2N1cycgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIaWRkZW4gRHJvcHpvbmUgaW5wdXQgYmx1ciBldmVudCBoYW5kbGVyLlxuXHQgKlxuXHQgKiBAc2luY2UgMS44LjFcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IGUgRXZlbnQgb2JqZWN0LlxuXHQgKi9cblx0ZnVuY3Rpb24gZHJvcHpvbmVJbnB1dEtleXByZXNzKCBlICkge1xuXG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYgKCBlLmtleUNvZGUgIT09IDEzICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCQoIHRoaXMgKS5wcmV2KCAnLndwZm9ybXMtdXBsb2FkZXInICkudHJpZ2dlciggJ2NsaWNrJyApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhpZGRlbiBEcm9wem9uZSBpbnB1dCBibHVyIGV2ZW50IGhhbmRsZXIuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjguMVxuXHQgKi9cblx0ZnVuY3Rpb24gZHJvcHpvbmVDbGljaygpIHtcblxuXHRcdCQoIHRoaXMgKS5uZXh0KCAnLmRyb3B6b25lLWlucHV0JyApLnRyaWdnZXIoICdmb2N1cycgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGFzc2ljIEZpbGUgdXBsb2FkIHN1Y2Nlc3MgY2FsbGJhY2sgdG8gZGV0ZXJtaW5lIGlmIGFsbCBmaWxlcyBhcmUgdXBsb2FkZWQuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjguM1xuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBlIEV2ZW50LlxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gJGZvcm0gRm9ybS5cblx0ICovXG5cdGZ1bmN0aW9uIGNvbWJpbmVkVXBsb2Fkc1NpemVPayggZSwgJGZvcm0gKSB7XG5cblx0XHRpZiAoIGFueVVwbG9hZHNJblByb2dyZXNzKCkgKSB7XG5cdFx0XHRkaXNhYmxlU3VibWl0QnV0dG9uKCAkZm9ybSApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFdmVudHMuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjguMVxuXHQgKi9cblx0ZnVuY3Rpb24gZXZlbnRzKCkge1xuXG5cdFx0JCggJy5kcm9wem9uZS1pbnB1dCcgKVxuXHRcdFx0Lm9uKCAnZm9jdXMnLCBkcm9wem9uZUlucHV0Rm9jdXMgKVxuXHRcdFx0Lm9uKCAnYmx1cicsIGRyb3B6b25lSW5wdXRCbHVyIClcblx0XHRcdC5vbiggJ2tleXByZXNzJywgZHJvcHpvbmVJbnB1dEtleXByZXNzICk7XG5cblx0XHQkKCAnLndwZm9ybXMtdXBsb2FkZXInIClcblx0XHRcdC5vbiggJ2NsaWNrJywgZHJvcHpvbmVDbGljayApO1xuXG5cdFx0JCggJ2Zvcm0ud3Bmb3Jtcy1mb3JtJyApXG5cdFx0XHQub24oICd3cGZvcm1zQ29tYmluZWRVcGxvYWRzU2l6ZU9rJywgY29tYmluZWRVcGxvYWRzU2l6ZU9rICk7XG5cdH1cblxuXHQvKipcblx0ICogRE9NQ29udGVudExvYWRlZCBoYW5kbGVyLlxuXHQgKlxuXHQgKiBAc2luY2UgMS41LjZcblx0ICovXG5cdGZ1bmN0aW9uIHJlYWR5KCkge1xuXG5cdFx0d2luZG93LndwZm9ybXMgPSB3aW5kb3cud3Bmb3JtcyB8fCB7fTtcblx0XHR3aW5kb3cud3Bmb3Jtcy5kcm9wem9uZXMgPSBbXS5zbGljZS5jYWxsKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLndwZm9ybXMtdXBsb2FkZXInICkgKS5tYXAoIGRyb3Bab25lSW5pdCApO1xuXG5cdFx0ZXZlbnRzKCk7XG5cdH1cblxuXHQvKipcblx0ICogTW9kZXJuIEZpbGUgVXBsb2FkIGVuZ2luZS5cblx0ICpcblx0ICogQHNpbmNlIDEuNi4wXG5cdCAqL1xuXHR2YXIgd3Bmb3Jtc01vZGVybkZpbGVVcGxvYWQgPSB7XG5cblx0XHQvKipcblx0XHQgKiBTdGFydCB0aGUgaW5pdGlhbGl6YXRpb24uXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS42LjBcblx0XHQgKi9cblx0XHRpbml0KCkge1xuXHRcdFx0JCggZG9jdW1lbnQgKS5vbiggJ3dwZm9ybXNSZWFkeScsIHJlYWR5ICk7XG5cdFx0fSxcblx0fTtcblxuXHQvLyBDYWxsIGluaXQgYW5kIHNhdmUgaW4gZ2xvYmFsIHZhcmlhYmxlLlxuXHR3cGZvcm1zTW9kZXJuRmlsZVVwbG9hZC5pbml0KCk7XG5cdHdpbmRvdy53cGZvcm1zTW9kZXJuRmlsZVVwbG9hZCA9IHdwZm9ybXNNb2Rlcm5GaWxlVXBsb2FkO1xuXG59KCBqUXVlcnkgKSApO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLFlBQVk7O0FBQUMsU0FBQUEsUUFBQUMsQ0FBQSxzQ0FBQUQsT0FBQSx3QkFBQUUsTUFBQSx1QkFBQUEsTUFBQSxDQUFBQyxRQUFBLGFBQUFGLENBQUEsa0JBQUFBLENBQUEsZ0JBQUFBLENBQUEsV0FBQUEsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBRCxDQUFBLENBQUFHLFdBQUEsS0FBQUYsTUFBQSxJQUFBRCxDQUFBLEtBQUFDLE1BQUEsQ0FBQUcsU0FBQSxxQkFBQUosQ0FBQSxLQUFBRCxPQUFBLENBQUFDLENBQUE7QUFFWCxXQUFVSyxDQUFDLEVBQUc7RUFFZjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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 },{}]},{},[1])
| ver. 1.1 | |
.
| PHP 8.3.30 | Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñтраницы: 0 |
proxy
|
phpinfo
|
ÐаÑтройка