[ Avaa Bypassed ]




Upload:

Command:

hmhc3928@18.118.184.25: ~ $
/*! elementor-pro - v3.26.0 - 22-12-2024 */
/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/*!**************************************************************!*\
  !*** ../modules/screenshots/assets/js/preview/screenshot.js ***!
  \**************************************************************/


/* global ElementorScreenshotConfig */
class Screenshot extends elementorModules.ViewModule {
  getDefaultSettings() {
    return {
      empty_content_headline: 'Empty Content.',
      crop: {
        width: 1200,
        height: 1500
      },
      excluded_external_css_urls: ['https://kit-pro.fontawesome.com'],
      external_images_urls: ['https://i.ytimg.com' // Youtube images domain.
      ],
      timeout: 15000,
      // Wait until screenshot taken or fail in 15 secs.
      render_timeout: 5000,
      // Wait until all the element will be loaded or 5 sec and then take screenshot.
      timerLabel: null,
      timer_label: `${ElementorScreenshotConfig.post_id} - timer`,
      image_placeholder: 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=',
      isDebug: elementorCommonConfig.isElementorDebug,
      isDebugSvg: false,
      ...ElementorScreenshotConfig
    };
  }
  getDefaultElements() {
    const $elementor = jQuery(ElementorScreenshotConfig.selector);
    const $sections = $elementor.find('.elementor-section-wrap > .elementor-section, .elementor > .elementor-section');
    return {
      $elementor,
      $sections,
      $firstSection: $sections.first(),
      $notElementorElements: elementorCommon.elements.$body.find('> *:not(style, link)').not($elementor),
      $head: jQuery('head')
    };
  }
  onInit() {
    super.onInit();
    this.log('Screenshot init', 'time');

    /**
     * Hold the timeout timer
     *
     * @type {number|null}
     */
    this.timeoutTimer = setTimeout(this.screenshotFailed.bind(this), this.getSettings('timeout'));
    return this.captureScreenshot();
  }

  /**
   * The main method for this class.
   */
  captureScreenshot() {
    if (!this.elements.$elementor.length) {
      elementorCommon.helpers.consoleWarn('Screenshots: The content of this page is empty, the module will create a fake conent just for this screenshot.');
      this.createFakeContent();
    }
    this.removeUnnecessaryElements();
    this.handleIFrames();
    this.removeFirstSectionMargin();
    this.handleLinks();
    this.loadExternalCss();
    this.loadExternalImages();
    return Promise.resolve().then(this.createImage.bind(this)).then(this.createImageElement.bind(this)).then(this.cropCanvas.bind(this)).then(this.save.bind(this)).then(this.screenshotSucceed.bind(this)).catch(this.screenshotFailed.bind(this));
  }

  /**
   * Fake content for documents that dont have any content.
   */
  createFakeContent() {
    this.elements.$elementor = jQuery('<div>').css({
      height: this.getSettings('crop.height'),
      width: this.getSettings('crop.width'),
      display: 'flex',
      alignItems: 'center',
      justifyContent: 'center'
    });
    this.elements.$elementor.append(jQuery('<h1>').css({
      fontSize: '85px'
    }).html(this.getSettings('empty_content_headline')));
    document.body.prepend(this.elements.$elementor);
  }

  /**
   * CSS from another server cannot be loaded with the current dom to image library.
   * this method take all the links from another domain and proxy them.
   */
  loadExternalCss() {
    const excludedUrls = [this.getSettings('home_url'), ...this.getSettings('excluded_external_css_urls')];
    const notSelector = excludedUrls.map(url => `[href^="${url}"]`).join(', ');
    jQuery('link').not(notSelector).each((index, el) => {
      const $link = jQuery(el),
        $newLink = $link.clone();
      $newLink.attr('href', this.getScreenshotProxyUrl($link.attr('href')));
      this.elements.$head.append($newLink);
      $link.remove();
    });
  }

  /**
   * Make a proxy to images urls that has some problems with cross origin (like youtube).
   */
  loadExternalImages() {
    const selector = this.getSettings('external_images_urls').map(url => `img[src^="${url}"]`).join(', ');
    jQuery(selector).each((index, el) => {
      const $img = jQuery(el);
      $img.attr('src', this.getScreenshotProxyUrl($img.attr('src')));
    });
  }

  /**
   * Html to images libraries can not snapshot IFrames
   * this method convert all the IFrames to some other elements.
   */
  handleIFrames() {
    this.elements.$elementor.find('iframe').each((index, el) => {
      const $iframe = jQuery(el),
        $iframeMask = jQuery('<div />', {
          css: {
            background: 'gray',
            width: $iframe.width(),
            height: $iframe.height()
          }
        });
      $iframe.before($iframeMask);
      $iframe.remove();
    });
  }

  /**
   * Remove all the sections that should not be in the screenshot.
   */
  removeUnnecessaryElements() {
    let currentHeight = 0;
    this.elements.$sections.filter((index, el) => {
      let shouldBeRemoved = false;
      if (currentHeight >= this.getSettings('crop.height')) {
        shouldBeRemoved = true;
      }
      currentHeight += jQuery(el).outerHeight();
      return shouldBeRemoved;
    }).each((index, el) => {
      el.remove();
    });

    // Some 3rd party plugins inject elements into the dom, so this method removes all
    // the elements that was injected, to make sure that it capture a screenshot only of the post itself.
    this.elements.$notElementorElements.remove();
  }

  /**
   * Some urls make some problems to the svg parser.
   * this method convert all the urls to just '/'.
   */
  handleLinks() {
    elementorCommon.elements.$body.find('a').attr('href', '/');
  }

  /**
   * Remove unnecessary margin from the first element of the post (singles and footers).
   */
  removeFirstSectionMargin() {
    this.elements.$firstSection.css({
      marginTop: 0
    });
  }

  /**
   * Creates a png image.
   *
   * @return {Promise<unknown>} URI containing image data
   */
  createImage() {
    const pageLoadedPromise = new Promise(resolve => {
      window.addEventListener('load', () => {
        resolve();
      });
    });
    const timeOutPromise = new Promise(resolve => {
      setTimeout(() => {
        resolve();
      }, this.getSettings('render_timeout'));
    });
    return Promise.race([pageLoadedPromise, timeOutPromise]).then(() => {
      this.log('Start creating screenshot.');
      if (this.getSettings('isDebugSvg')) {
        domtoimage.toSvg(document.body, {
          imagePlaceholder: this.getSettings('image_placeholder')
        }).then(svg => this.download(svg));
        return Promise.reject('Debug SVG.');
      }

      // TODO: Extract to util function.
      const isSafari = /^((?!chrome|android).)*safari/i.test(window.userAgent);

      // Safari browser has some problems with the images that dom-to-images
      // library creates, so in this specific case the screenshot uses html2canvas.
      // Note that dom-to-image creates more accurate screenshot in "not safari" browsers.
      if (isSafari) {
        this.log('Creating screenshot with "html2canvas"');
        return html2canvas(document.body).then(canvas => {
          return canvas.toDataURL('image/png');
        });
      }
      this.log('Creating screenshot with "dom-to-image"');
      return domtoimage.toPng(document.body, {
        imagePlaceholder: this.getSettings('image_placeholder')
      });
    });
  }

  /**
   * Download a uri, use for debugging the svg that created from dom to image libraries.
   *
   * @param {string} uri
   */
  download(uri) {
    const $link = jQuery('<a/>', {
      href: uri,
      download: 'debugSvg.svg',
      html: 'Download SVG'
    });
    elementorCommon.elements.$body.append($link);
    $link.trigger('click');
  }

  /**
   * Creates fake image element to get the size of the image later on.
   *
   * @param {string} dataUrl
   * @return {Promise<HTMLImageElement>} Image Element
   */
  createImageElement(dataUrl) {
    const image = new Image();
    image.src = dataUrl;
    return new Promise(resolve => {
      image.onload = () => resolve(image);
    });
  }

  /**
   * Crop the image to requested sizes.
   *
   * @param {HTMLImageElement} image
   * @return {Promise<unknown>} Canvas
   */
  cropCanvas(image) {
    const width = this.getSettings('crop.width');
    const height = this.getSettings('crop.height');
    const cropCanvas = document.createElement('canvas'),
      cropContext = cropCanvas.getContext('2d'),
      ratio = width / image.width;
    cropCanvas.width = width;
    cropCanvas.height = height > image.height ? image.height : height;
    cropContext.drawImage(image, 0, 0, image.width, image.height, 0, 0, image.width * ratio, image.height * ratio);
    return Promise.resolve(cropCanvas);
  }

  /**
   * Send the image to the server.
   *
   * @param {HTMLCanvasElement} canvas
   * @return {Promise<unknown>} Screenshot URL
   */
  save(canvas) {
    return new Promise((resolve, reject) => {
      elementorCommon.ajax.addRequest('screenshot_save', {
        data: {
          post_id: this.getSettings('post_id'),
          screenshot: canvas.toDataURL('image/png')
        },
        success: url => {
          this.log(`Screenshot created: ${encodeURI(url)}`);
          resolve(url);
        },
        error: () => {
          this.log('Failed to create screenshot.');
          reject();
        }
      });
    });
  }

  /**
   * Mark this post screenshot as failed.
   */
  markAsFailed() {
    return new Promise((resolve, reject) => {
      elementorCommon.ajax.addRequest('screenshot_failed', {
        data: {
          post_id: this.getSettings('post_id')
        },
        success: () => {
          this.log(`Marked as failed.`);
          resolve();
        },
        error: () => {
          this.log('Failed to mark this screenshot as failed.');
          reject();
        }
      });
    });
  }

  /**
   * @param {string} url
   * @return {string} Screenshot Proxy URL
   */
  getScreenshotProxyUrl(url) {
    return `${this.getSettings('home_url')}?screenshot_proxy&nonce=${this.getSettings('nonce')}&href=${url}`;
  }

  /**
   * Notify that the screenshot has been succeed.
   *
   * @param {string} imageUrl
   */
  screenshotSucceed(imageUrl) {
    this.screenshotDone(true, imageUrl);
  }

  /**
   * Notify that the screenshot has been failed.
   *
   * @param {Error} e
   */
  screenshotFailed(e) {
    this.log(e, null);
    this.markAsFailed().then(() => this.screenshotDone(false));
  }

  /**
   * Final method of the screenshot.
   *
   * @param {boolean} success
   * @param {string}  imageUrl
   */
  screenshotDone(success) {
    let imageUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    clearTimeout(this.timeoutTimer);
    this.timeoutTimer = null;

    // Send the message to the parent window and not to the top.
    // e.g: The `Theme builder` is loaded into an iFrame so the message of the screenshot
    // should be sent to the `Theme builder` window and not to the top window.
    window.parent.postMessage({
      name: 'capture-screenshot-done',
      success,
      id: this.getSettings('post_id'),
      imageUrl
    }, '*');
    this.log(`Screenshot ${success ? 'Succeed' : 'Failed'}.`, 'timeEnd');
  }

  /**
   * Log messages for debugging.
   *
   * @param {any}     message
   * @param {string?} timerMethod
   */
  log(message) {
    let timerMethod = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'timeLog';
    if (!this.getSettings('isDebug')) {
      return;
    }

    // eslint-disable-next-line no-console
    console.log('string' === typeof message ? `${this.getSettings('post_id')} - ${message}` : message);
    if (timerMethod) {
      // eslint-disable-next-line no-console
      console[timerMethod](this.getSettings('timer_label'));
    }
  }
}
jQuery(() => {
  new Screenshot();
});
/******/ })()
;
//# sourceMappingURL=screenshot.js.map

Filemanager

Name Type Size Permission Actions
notes Folder 0755
packages Folder 0755
1644e3d37816d939acca.bundle.js File 6.22 KB 0644
admin.js File 56.25 KB 0644
admin.min.js File 27.74 KB 0644
ajax-pagination.2090b5f4906bcda1dcc2.bundle.min.js File 2.75 KB 0644
ajax-pagination.2390838f542f1a8d5ed4.bundle.js File 5.06 KB 0644
animated-headline.3eca5f2deb261b97d554.bundle.js File 12.51 KB 0644
animated-headline.73c41dd605898fe2d075.bundle.min.js File 7.68 KB 0644
app.js File 311.76 KB 0644
app.min.js File 88.83 KB 0644
archive-posts.16a93245d08246e5e540.bundle.min.js File 7.92 KB 0644
archive-posts.6e398ddd4a81a78bcea3.bundle.js File 15.52 KB 0644
cafdcd40a3ed0f7a7a4a.bundle.js File 65.87 KB 0644
carousel.298f1fc9c115422aad0e.bundle.js File 9.93 KB 0644
carousel.3620fca501cb18163600.bundle.min.js File 4.9 KB 0644
code-highlight.d4867c919d0858f748df.bundle.js File 1022 B 0644
code-highlight.d86022c8668c4b072592.bundle.min.js File 472 B 0644
contact-buttons-var-10.0dc9f4c9e85e7c4baa3a.bundle.min.js File 7.68 KB 0644
contact-buttons-var-10.49a45dadc9c2facb4972.bundle.js File 14.19 KB 0644
contact-buttons.33ec3b540b7caec4d0f5.bundle.min.js File 13.52 KB 0644
contact-buttons.6f0dc663eb685c187fea.bundle.js File 22.99 KB 0644
countdown.0e9e688751d29d07a8d3.bundle.min.js File 2.63 KB 0644
countdown.6e87ca40d36793d92aea.bundle.js File 4.83 KB 0644
custom-code.js File 176.02 KB 0644
custom-code.min.js File 41.67 KB 0644
display-conditions.js File 246.12 KB 0644
display-conditions.min.js File 77.49 KB 0644
e3f4acef69f217322320.bundle.min.js File 3.24 KB 0644
e8eba20060a4b0fa29dc.bundle.js File 12.11 KB 0644
editor.js File 379.13 KB 0644
editor.min.js File 149.88 KB 0644
elements-handlers.js File 113.48 KB 0644
elements-handlers.min.js File 43.58 KB 0644
f6214a79e4b78ec016e6.bundle.min.js File 22.07 KB 0644
f6214a79e4b78ec016e6.bundle.min.js.LICENSE.txt File 188 B 0644
floating-bars-var-2.1a487dc027431fb485cd.bundle.min.js File 14.21 KB 0644
floating-bars-var-2.c6f25c32db86d04f5e8b.bundle.js File 12.8 KB 0644
floating-bars-var-3.6cef001471f04cdb931e.bundle.js File 12.7 KB 0644
floating-bars-var-3.acd1ad79ebb515e353c9.bundle.min.js File 13.7 KB 0644
form-submission-admin.js File 348.98 KB 0644
form-submission-admin.min.js File 102.25 KB 0644
form.16e51aca8a5ca0d38ae6.bundle.js File 33.78 KB 0644
form.ae7f04a9f3cbc167835c.bundle.min.js File 19.2 KB 0644
frontend.js File 53.23 KB 0644
frontend.min.js File 23.64 KB 0644
gallery.1628df47530ab42dafba.bundle.min.js File 5.84 KB 0644
gallery.b7d55bc976e04f751975.bundle.js File 9.49 KB 0644
gutenberg-woocommerce-notice.js File 88.11 KB 0644
gutenberg-woocommerce-notice.min.js File 17.68 KB 0644
hotspot.d513dd152bf605a2ffbf.bundle.js File 4.89 KB 0644
hotspot.fa04300164c35a866a51.bundle.min.js File 2.75 KB 0644
jszip.vendor.a3c65615c1de5560962d.bundle.js File 95.64 KB 0644
jszip.vendor.eba4ace24dcc63eadac0.bundle.min.js File 95.88 KB 0644
jszip.vendor.eba4ace24dcc63eadac0.bundle.min.js.LICENSE.txt File 383 B 0644
load-more.8b46f464e573feab5dd7.bundle.min.js File 5.22 KB 0644
load-more.f5ecc1c66872d0bd2d17.bundle.js File 9.44 KB 0644
loop-carousel.5108cb72ebb124297adb.bundle.js File 2.77 KB 0644
loop-carousel.f8067ec0c24b628c786e.bundle.min.js File 1.33 KB 0644
loop-filter-editor.46a4c013b80a381a50c9.bundle.js File 7.02 KB 0644
loop-filter-editor.67dfa5d044d7bd86bd6f.bundle.min.js File 3.27 KB 0644
loop.4a16d82b8b5e3e00f25e.bundle.min.js File 9.15 KB 0644
loop.da94e53412e56933f721.bundle.js File 17.28 KB 0644
lottie.a02a01f29c0733918ac7.bundle.js File 24.41 KB 0644
lottie.e74a53bfa4c0bd939250.bundle.min.js File 14.07 KB 0644
media-carousel.04412cb9b4479aa37408.bundle.js File 13.04 KB 0644
media-carousel.afbaabb756a7c18ddb09.bundle.min.js File 6.84 KB 0644
mega-menu-editor.a0c405b93f24b0011f86.bundle.js File 19.44 KB 0644
mega-menu-editor.d6c0f51481d860b12bb7.bundle.min.js File 8.47 KB 0644
mega-menu-stretch-content.0d76e4a3b7bf65ff6f9b.bundle.js File 1.82 KB 0644
mega-menu-stretch-content.480e081cebe071d683e8.bundle.min.js File 1.1 KB 0644
mega-menu.4a05edbefebc8de41e36.bundle.js File 50.26 KB 0644
mega-menu.8008698e9df584aa4337.bundle.min.js File 27.38 KB 0644
menu-title-keyboard-handler.070cb9cb3c4f1f016388.bundle.min.js File 7.43 KB 0644
menu-title-keyboard-handler.ad6efd6a78bf25450d5a.bundle.js File 11.93 KB 0644
nav-menu.a23fbd67486c5bedf26c.bundle.min.js File 5.16 KB 0644
nav-menu.e135a0d0f766c7f455ff.bundle.js File 9.08 KB 0644
nested-carousel-editor.0df35e0e1a284d4bd18b.bundle.js File 1.84 KB 0644
nested-carousel-editor.6d7500036d0766bbe2fc.bundle.min.js File 623 B 0644
nested-carousel.adf1d39e8be72ec094f0.bundle.js File 7.46 KB 0644
nested-carousel.d08a5094d95215833b5c.bundle.min.js File 3.75 KB 0644
off-canvas-editor.3bc6e394bd20d4fd64dc.bundle.min.js File 2.63 KB 0644
off-canvas-editor.d20b8e528d36b21a024c.bundle.js File 6.43 KB 0644
off-canvas.02e30e192bc782084e8a.bundle.js File 10.76 KB 0644
off-canvas.41d355285c19e4440547.bundle.min.js File 6.78 KB 0644
page-transitions.js File 115.05 KB 0644
page-transitions.min.js File 31.94 KB 0644
paypal-button.55ffb013a3fe565f55a5.bundle.js File 1.54 KB 0644
paypal-button.f4f64e46173f50701949.bundle.min.js File 871 B 0644
popup.996738ad83c089bcc0b9.bundle.js File 1.51 KB 0644
popup.f7b15b2ca565b152bf98.bundle.min.js File 752 B 0644
portfolio.4cd5da34009c30cb5d70.bundle.min.js File 7.1 KB 0644
portfolio.5727b56368be256d0893.bundle.js File 12.69 KB 0644
posts.aec59265318492b89cb5.bundle.min.js File 3.24 KB 0644
posts.e99f84b83c36d4568ffe.bundle.js File 5.8 KB 0644
preview.js File 91.18 KB 0644
preview.min.js File 19.05 KB 0644
product-add-to-cart.51a22e1fbd8f914ab3d5.bundle.min.js File 3.42 KB 0644
product-add-to-cart.d5883897e035f9c53c5e.bundle.js File 7.17 KB 0644
progress-tracker.8cccdda9737c272489fc.bundle.min.js File 5.11 KB 0644
progress-tracker.fd1d31a26340ed74e10a.bundle.js File 9.21 KB 0644
qunit-tests.js File 2.78 KB 0644
qunit-tests.min.js File 283 B 0644
screenshot.js File 11.73 KB 0644
screenshot.min.js File 5.76 KB 0644
search-form.8941aba5c12cdb05fb7c.bundle.js File 4.4 KB 0644
search-form.b7065999d77832a1b764.bundle.min.js File 2.07 KB 0644
search.3db30c59360e14bb4448.bundle.min.js File 13.21 KB 0644
search.5c7852be6fc67209b3a8.bundle.js File 20.6 KB 0644
share-buttons.63d984f8c96d1e053bc0.bundle.min.js File 1.54 KB 0644
share-buttons.fda49c1691f4a352c7ef.bundle.js File 4.27 KB 0644
slides.bcd16bbde90338846bd7.bundle.js File 7.39 KB 0644
slides.c0029640cbdb48199471.bundle.min.js File 3.83 KB 0644
social.ac16c075939dcb93f70c.bundle.js File 1.94 KB 0644
social.f215e8a3efafbdbeb7ef.bundle.min.js File 1022 B 0644
stripe-button.61d93594d6b7865f8b3f.bundle.min.js File 1.97 KB 0644
stripe-button.cf3f67d6b95e0138bb6b.bundle.js File 4.18 KB 0644
table-of-contents.8d46d3a531c49309b7eb.bundle.js File 15.74 KB 0644
table-of-contents.99a74eec7252759bebdb.bundle.min.js File 8.17 KB 0644
taxonomy-filter.ce05524d53c2d4c5aa24.bundle.js File 15.78 KB 0644
taxonomy-filter.e839f2be32b7ea832b34.bundle.min.js File 7.49 KB 0644
video-playlist.9e1bbc4fcb37864c89d6.bundle.js File 49 KB 0644
video-playlist.af20fd9fd8778929829e.bundle.min.js File 22.15 KB 0644
webpack-pro.runtime.js File 16.38 KB 0644
webpack-pro.runtime.min.js File 6.12 KB 0644
woocommerce-cart.79b5dc500681930471c6.bundle.js File 10.51 KB 0644
woocommerce-cart.d0d01530f5be6736b5d2.bundle.min.js File 5.08 KB 0644
woocommerce-checkout-page.10d97c3a8cb77aebc1bf.bundle.js File 11.7 KB 0644
woocommerce-checkout-page.776b4cec45070fe32636.bundle.min.js File 6.36 KB 0644
woocommerce-menu-cart.81f5bafc26b94cc86238.bundle.js File 8.71 KB 0644
woocommerce-menu-cart.eb61fe086245485310a4.bundle.min.js File 4.62 KB 0644
woocommerce-my-account.4e940a8b4a52d1c98c5c.bundle.min.js File 6.08 KB 0644
woocommerce-my-account.7a9d36b2c12b970c6616.bundle.js File 11.36 KB 0644
woocommerce-notices.bcee9b5e1c8f65ac7927.bundle.min.js File 1.89 KB 0644
woocommerce-notices.ee407e8319d2ee060119.bundle.js File 3.04 KB 0644
woocommerce-purchase-summary.3676ccd8c29ef0924b84.bundle.min.js File 3.42 KB 0644
woocommerce-purchase-summary.c8767542fa302a7f351f.bundle.js File 7.33 KB 0644