Plugin Directory

Changeset 1995612


Ignore:
Timestamp:
12/15/2018 08:58:40 PM (7 years ago)
Author:
LeoPeo
Message:

Version 1.1.4

Location:
easy-panorama/trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • easy-panorama/trunk/.travis.yml

    r1496004 r1995612  
     1language: php
    12sudo: false
    2 language: php
     3dist: trusty
    34php:
     5  - 5.6
     6  - 7.0
     7  - 7.1
    48  - nightly
    5   - 5.6
    6   - 5.5
    7   - 5.4
    8   - 7.0
    9   - hhvm
    10 
    11 # Declare which versions of WordPress to test against.
    12 # Also declare whether or not to test in Multisite.
    13 env:
    14   # Trunk
    15   # @link https://github.com/WordPress/WordPress
    16   - WP_VERSION=master WP_MULTISITE=0
    17   - WP_VERSION=master WP_MULTISITE=1
    18   # WordPress 4.5
    19   # @link https://github.com/WordPress/WordPress/tree/4.5-branch
    20   - WP_VERSION=4.5 WP_MULTISITE=0
    21   - WP_VERSION=4.5 WP_MULTISITE=1
    229
    2310matrix:
     
    2512    - php: nightly
    2613
     14before_install:
     15  - composer self-update
     16
    2717install:
    2818  - composer self-update && composer --version
    2919  - export PATH="$HOME/.composer/vendor/bin:$PATH"
    30   - composer global require squizlabs/php_codesniffer
     20  - composer global require "squizlabs/php_codesniffer=*"
     21
     22before_script:
     23  - phpcs --version
    3124
    3225script:
  • easy-panorama/trunk/README.md

    r1864376 r1995612  
    88Easy Panorama plugin for WordPress websites allows you to display wide/panoramic images in a more accessible way: enjoy your panoramic photos scrolling them on the x-axis or moving your mobile device.
    99
    10 You can start embedding your panoramic images using the handy **shortcode** (TinyMCE editor) or the new **Gutenberg Block**.
     10You can start embedding your panoramic images using the handy **shortcode** (TinyMCE editor) or the new **Block**.
    1111
    1212Easy Panorama uses the packed [Paver](http://terrymun.github.io/paver/?source=easy-panorama-wp-plugin) :smile:.
     
    18183. Other geek settings in the Advanced Settings page.
    19194. [easy_panorama] shortcode to embed panoramic images with no hassle.
    20 5. Custom Gutenberg block for a better editing experience 🎉.
     205. Custom Panorama Block for a better editing experience 🎉.
    2121
    2222## Shortcode (Classic WordPress editor)
     
    4747Include your favourite panoramic images in posts and pages using the **built-in block functionality**.
    4848
    49 If you are using the Gutenberg editor, you find the **Panorama** block ready to be embedded in your post.
     49If you are using the Gutenberg editor (WordPress >= 5.0), you find the **Panorama** block ready to be embedded in your post.
    5050Search for "Panorama" within the blocks list, select it and choose the image you want to include.
    51 You can customize the appearance and behaviour of each panoramic viewer thanks to the Gutenberg Inspector Control.
     51You can customize the appearance and behaviour of each panoramic viewer thanks to the Inspector Control.
    5252
    53 ### Gutenberg Block features
    54 * Embed your panoramic/wide images in the new Gutenberg editor with no hassle.
    55 * Preview your panorama within the Gutenberg editor.
    56 * Customize the appearance and behaviour of each panoramic viewer thanks to the Gutenberg Inspector Control.
     53### Block features
     54* Embed your panoramic/wide images in the new editor with no hassle.
     55* Preview your panorama within the editor.
     56* Customize the appearance and behaviour of each panoramic viewer thanks to the Inspector Control.
    5757* Transform "Image" blocks into "Panorama" blocks with one click.
    5858* Transform "Panorama" blocks into "Image" blocks with one click.
     
    6363# Requirements
    6464Easy Panorama requires:
    65 * [WordPress](https://wordpress.org/) >= 4.9
     65* [WordPress](https://wordpress.org/) >= 4.5 (Required for TinyMCE shortcode)
     66* [WordPress](https://wordpress.org/) >= 5.0 (Required for the new custom Panorama Block feature)
    6667* [PHP](https://secure.php.net/manual/en/install.php) >= 5.6
    67 * [Gutenberg](https://wordpress.org/plugins/gutenberg/) >= 2.7 (Required for the new Gutenberg block feature)
    68 * [Node](https://nodejs.org/en/) >= 8.9.X (Required for Gutenberg block development)
    69 * [Yarn](https://yarnpkg.com/en/docs/install) (Required for Gutenberg block development)
     68* [Node](https://nodejs.org/en/) >= 8.9.X (Required for Block feature development)
     69* [Yarn](https://yarnpkg.com/en/docs/install) (Required for Block feature development)
    7070
    7171# Contribution
  • easy-panorama/trunk/block/dist/block.js

    r1936503 r1995612  
    8888
    8989"use strict";
    90 eval("var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar __ = wp.i18n.__;\nvar Component = wp.element.Component;\nvar _wp$editor = wp.editor,\n    MediaPlaceholder = _wp$editor.MediaPlaceholder,\n    MediaUpload = _wp$editor.MediaUpload,\n    BlockControls = _wp$editor.BlockControls,\n    InspectorControls = _wp$editor.InspectorControls;\nvar _wp$components = wp.components,\n    Toolbar = _wp$components.Toolbar,\n    IconButton = _wp$components.IconButton,\n    RangeControl = _wp$components.RangeControl,\n    ToggleControl = _wp$components.ToggleControl,\n    TextControl = _wp$components.TextControl,\n    SelectControl = _wp$components.SelectControl,\n    PanelBody = _wp$components.PanelBody,\n    Dashicon = _wp$components.Dashicon,\n    Tooltip = _wp$components.Tooltip,\n    Placeholder = _wp$components.Placeholder;\nvar withSelect = wp.data.withSelect;\n\nvar PanoramaBlock = function (_Component) {\n  _inherits(PanoramaBlock, _Component);\n\n  function PanoramaBlock() {\n    _classCallCheck(this, PanoramaBlock);\n\n    var _this = _possibleConstructorReturn(this, (PanoramaBlock.__proto__ || Object.getPrototypeOf(PanoramaBlock)).apply(this, arguments));\n\n    _this.setImageData = _this.setImageData.bind(_this);\n    _this.onSelectImage = _this.onSelectImage.bind(_this);\n    _this.onChangeMediaAlt = _this.onChangeMediaAlt.bind(_this);\n    _this.onChangeMediaTitle = _this.onChangeMediaTitle.bind(_this);\n    _this.onChangeContainerHeight = _this.onChangeContainerHeight.bind(_this);\n    _this.onChangeStartPosition = _this.onChangeStartPosition.bind(_this);\n    _this.onChangeGracefulFailure = _this.onChangeGracefulFailure.bind(_this);\n    _this.onChangeFailureMessage = _this.onChangeFailureMessage.bind(_this);\n    _this.onChangeFailureMessageInsert = _this.onChangeFailureMessageInsert.bind(_this);\n    _this.onChangeMinimumOverflow = _this.onChangeMinimumOverflow.bind(_this);\n    _this.onChangeDisplayMeta = _this.onChangeDisplayMeta.bind(_this);\n    return _this;\n  }\n\n  _createClass(PanoramaBlock, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      var _props = this.props,\n          url = _props.attributes.url,\n          image = _props.image;\n\n      if (!url && image && image.data !== undefined) {\n        this.setImageData(image.data);\n      }\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      var _props2 = this.props,\n          url = _props2.attributes.url,\n          image = _props2.image;\n\n      if (!url && image) {\n        this.setImageData(image);\n      }\n    }\n\n    /**\n     * @description Set component data from received params\n     * @param {object} Image data\n     * @return {array} Errors\n     */\n\n  }, {\n    key: \"setImageData\",\n    value: function setImageData(data) {\n      var _props3 = this.props,\n          _props3$attributes = _props3.attributes,\n          url = _props3$attributes.url,\n          alt = _props3$attributes.alt,\n          title = _props3$attributes.title,\n          setAttributes = _props3.setAttributes;\n\n      if (!url) {\n        setAttributes({\n          url: data.source_url\n        });\n      }\n      if (!alt) {\n        setAttributes({\n          alt: data.alt_text\n        });\n      }\n      if (!title) {\n        setAttributes({\n          title: data.title.rendered\n        });\n      }\n    }\n\n    /**\n     * @description Handle component image selection\n     * @param {object} Component media data\n     */\n\n  }, {\n    key: \"onSelectImage\",\n    value: function onSelectImage(media) {\n      this.props.setAttributes({\n        url: media.url,\n        id: media.id,\n        alt: media.alt,\n        title: media.title\n      });\n    }\n  }, {\n    key: \"onChangeMediaAlt\",\n\n\n    /**\n     * @description Handle component image alt update\n     * @param {string} Image alt\n     */\n    value: function onChangeMediaAlt(alt) {\n      this.props.setAttributes({\n        alt: alt\n      });\n    }\n  }, {\n    key: \"onChangeMediaTitle\",\n\n\n    /**\n     * @description Handle component image title update\n     * @param {string} Image title\n     */\n    value: function onChangeMediaTitle(title) {\n      this.props.setAttributes({\n        title: title\n      });\n    }\n  }, {\n    key: \"onChangeContainerHeight\",\n\n\n    /**\n     * @description Handle component container height update\n     * @param {string} Container height\n     */\n    value: function onChangeContainerHeight(height) {\n      this.props.setAttributes({\n        containerHeight: Number(height)\n      });\n    }\n  }, {\n    key: \"onChangeStartPosition\",\n\n\n    /**\n     * @description Handle component startPosition update\n     * @param {string} startPosition\n     */\n    value: function onChangeStartPosition(position) {\n      this.props.setAttributes({\n        startPosition: position\n      });\n    }\n  }, {\n    key: \"onChangeGracefulFailure\",\n\n\n    /**\n     * @description Handle component gracefulFailure update\n     * @param none\n     */\n    value: function onChangeGracefulFailure() {\n      var _props4 = this.props,\n          gracefulFailure = _props4.attributes.gracefulFailure,\n          setAttributes = _props4.setAttributes;\n\n      setAttributes({\n        gracefulFailure: !gracefulFailure\n      });\n    }\n  }, {\n    key: \"onChangeFailureMessage\",\n\n\n    /**\n     * @description Handle component failureMessage update\n     * @param {string} failureMessage\n     */\n    value: function onChangeFailureMessage(message) {\n      this.props.setAttributes({\n        failureMessage: message\n      });\n    }\n\n    /**\n     * @description Handle component failureMessageInsert update\n     * @param {string} failureMessageInsert\n     */\n\n  }, {\n    key: \"onChangeFailureMessageInsert\",\n    value: function onChangeFailureMessageInsert(position) {\n      this.props.setAttributes({\n        failureMessageInsert: position\n      });\n    }\n\n    /**\n     * @description Handle component minimumOverflow update\n     * @param {string} minimumOverflow\n     */\n\n  }, {\n    key: \"onChangeMinimumOverflow\",\n    value: function onChangeMinimumOverflow(value) {\n      this.props.setAttributes({\n        minimumOverflow: value\n      });\n    }\n\n    /**\n     * @description Handle component displayMeta update\n     * @param none\n     */\n\n  }, {\n    key: \"onChangeDisplayMeta\",\n    value: function onChangeDisplayMeta() {\n      var _props5 = this.props,\n          displayMeta = _props5.attributes.displayMeta,\n          setAttributes = _props5.setAttributes;\n\n      setAttributes({\n        displayMeta: !displayMeta\n      });\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _props6 = this.props,\n          isSelected = _props6.isSelected,\n          className = _props6.className,\n          image = _props6.image,\n          _props6$attributes = _props6.attributes,\n          url = _props6$attributes.url,\n          id = _props6$attributes.id,\n          alt = _props6$attributes.alt,\n          title = _props6$attributes.title,\n          containerHeight = _props6$attributes.containerHeight,\n          startPosition = _props6$attributes.startPosition,\n          gracefulFailure = _props6$attributes.gracefulFailure,\n          failureMessage = _props6$attributes.failureMessage,\n          failureMessageInsert = _props6$attributes.failureMessageInsert,\n          minimumOverflow = _props6$attributes.minimumOverflow,\n          displayMeta = _props6$attributes.displayMeta;\n\n\n      var panoramaStyle = {\n        height: containerHeight + 'px'\n      };\n\n      if (!url && image) {\n        return [wp.element.createElement(\n          Placeholder,\n          {\n            key: \"easypanorama-loading\",\n            icon: \"cover-image\",\n            label: __('Panorama'),\n            className: \"easypanorama-loading\"\n          },\n          wp.element.createElement(\n            \"span\",\n            null,\n            __('Loading...')\n          )\n        )];\n      }\n\n      if (!url && !image) {\n        return [wp.element.createElement(MediaPlaceholder, {\n          key: \"easypanorama-placeholder\",\n          icon: \"cover-image\",\n          labels: {\n            title: __('Panorama'),\n            name: __('images')\n          },\n          className: className,\n          onSelect: this.onSelectImage,\n          accept: \"image/*\",\n          type: \"image\"\n        })];\n      };\n\n      var controls = isSelected && wp.element.createElement(\n        BlockControls,\n        { key: \"easypanorama-controls\" },\n        wp.element.createElement(\n          Toolbar,\n          { key: \"easypanorama-toolbar\" },\n          wp.element.createElement(MediaUpload, {\n            key: \"easypanorama-mediaupload\",\n            onSelect: this.onSelectImage,\n            type: \"image\",\n            value: this.id,\n            render: function render(_ref) {\n              var open = _ref.open;\n              return wp.element.createElement(IconButton, {\n                key: \"easypanorama-openmedia\",\n                className: \"components-toolbar__control\",\n                label: __('Edit image'),\n                icon: \"edit\",\n                onClick: open\n              });\n            }\n          })\n        )\n      );\n\n      return [controls, isSelected && wp.element.createElement(\n        InspectorControls,\n        { key: \"easypanorama-inspector\" },\n        wp.element.createElement(\n          PanelBody,\n          { title: __('Panorama settings'), key: \"easypanorama-inspector-settings\" },\n          wp.element.createElement(TextControl, {\n            key: \"easypanorama-control-containerHeight\",\n            label: __('Container height'),\n            help: __('Insert the height for this panoramic image container.'),\n            type: 'number',\n            value: containerHeight,\n            onChange: this.onChangeContainerHeight\n          }),\n          wp.element.createElement(RangeControl, {\n            key: \"easypanorama-control-startPosition\",\n            label: __('Start position'),\n            help: __('Determines the start position of the panorama: insert a value from 0 (left) to 10 (right).'),\n            value: startPosition,\n            onChange: this.onChangeStartPosition,\n            min: 0,\n            max: 10\n          }),\n          wp.element.createElement(ToggleControl, {\n            key: \"easypanorama-control-displayMeta\",\n            label: __('Show meta on overlay'),\n            checked: displayMeta,\n            onChange: this.onChangeDisplayMeta\n          }),\n          displayMeta && wp.element.createElement(TextControl, {\n            key: \"easypanorama-control-title\",\n            label: __('Title'),\n            value: title,\n            onChange: this.onChangeMediaTitle\n          }),\n          displayMeta && wp.element.createElement(TextControl, {\n            key: \"easypanorama-control-alt\",\n            label: __('Description'),\n            value: alt,\n            onChange: this.onChangeMediaAlt\n          })\n        ),\n        wp.element.createElement(\n          PanelBody,\n          { title: __('Advanced settings'), key: \"easypanorama-inspector-advanced\" },\n          wp.element.createElement(TextControl, {\n            key: \"easypanorama-control-minimumOverflow\",\n            label: __('Minimum overflow'),\n            help: __('The excess width in pixels the container must have before panorama kicks in.'),\n            type: 'number',\n            value: minimumOverflow,\n            onChange: this.onChangeMinimumOverflow\n          }),\n          wp.element.createElement(ToggleControl, {\n            key: \"easypanorama-control-gracefulFailure\",\n            label: __('Insert failure message'),\n            checked: gracefulFailure,\n            onChange: this.onChangeGracefulFailure\n          }),\n          gracefulFailure && wp.element.createElement(SelectControl, {\n            key: \"easypanorama-control-failureMessageInsert\",\n            label: __('Position'),\n            value: failureMessageInsert,\n            options: [{ value: 'after', label: 'After the panorama container' }, { value: 'before', label: 'Before the panorama container' }],\n            onChange: this.onChangeFailureMessageInsert\n          }),\n          gracefulFailure && wp.element.createElement(TextControl, {\n            key: \"easypanorama-control-failureMessage\",\n            label: __('Message'),\n            help: __('This message will appear in mobile devices with no gyroscopic data or no physical orientation support.'),\n            value: failureMessage,\n            onChange: this.onChangeFailureMessage\n          })\n        )\n      ), wp.element.createElement(\n        \"div\",\n        { className: className, key: \"easypanorama-block-editor\" },\n        wp.element.createElement(\n          \"div\",\n          { style: panoramaStyle, className: \"panorama--image\", key: \"easypanorama-panorama-container\" },\n          wp.element.createElement(\"img\", { src: url, alt: alt, title: title, className: \"wp-image-\" + id, key: \"easypanorama-panorama-image\" })\n        ),\n        wp.element.createElement(\n          \"span\",\n          { className: \"panorama--help-text\", key: \"easypanorama-block-help\" },\n          wp.element.createElement(\n            Tooltip,\n            { text: __('This is a preview, some features are not available.'), key: \"easypanorama-block-help-tooltip\" },\n            wp.element.createElement(\n              \"span\",\n              { className: \"panorama--help-icon\", key: \"easypanorama-block-help-icon-container\" },\n              wp.element.createElement(Dashicon, { size: \"25\", icon: \"info\", key: \"easypanorama-block-help-icon\" })\n            )\n          )\n        )\n      )];\n    }\n  }]);\n\n  return PanoramaBlock;\n}(Component);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (withSelect(function (select, ownProps) {\n  var _select = select('core'),\n      getMedia = _select.getMedia;\n\n  var id = ownProps.attributes.id;\n\n  return {\n    image: id ? getMedia(id) : null\n  };\n})(PanoramaBlock));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2Jsb2NrLmpzPzM4OTciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX18gPSB3cC5pMThuLl9fO1xudmFyIENvbXBvbmVudCA9IHdwLmVsZW1lbnQuQ29tcG9uZW50O1xudmFyIF93cCRlZGl0b3IgPSB3cC5lZGl0b3IsXG4gICAgTWVkaWFQbGFjZWhvbGRlciA9IF93cCRlZGl0b3IuTWVkaWFQbGFjZWhvbGRlcixcbiAgICBNZWRpYVVwbG9hZCA9IF93cCRlZGl0b3IuTWVkaWFVcGxvYWQsXG4gICAgQmxvY2tDb250cm9scyA9IF93cCRlZGl0b3IuQmxvY2tDb250cm9scyxcbiAgICBJbnNwZWN0b3JDb250cm9scyA9IF93cCRlZGl0b3IuSW5zcGVjdG9yQ29udHJvbHM7XG52YXIgX3dwJGNvbXBvbmVudHMgPSB3cC5jb21wb25lbnRzLFxuICAgIFRvb2xiYXIgPSBfd3AkY29tcG9uZW50cy5Ub29sYmFyLFxuICAgIEljb25CdXR0b24gPSBfd3AkY29tcG9uZW50cy5JY29uQnV0dG9uLFxuICAgIFJhbmdlQ29udHJvbCA9IF93cCRjb21wb25lbnRzLlJhbmdlQ29udHJvbCxcbiAgICBUb2dnbGVDb250cm9sID0gX3dwJGNvbXBvbmVudHMuVG9nZ2xlQ29udHJvbCxcbiAgICBUZXh0Q29udHJvbCA9IF93cCRjb21wb25lbnRzLlRleHRDb250cm9sLFxuICAgIFNlbGVjdENvbnRyb2wgPSBfd3AkY29tcG9uZW50cy5TZWxlY3RDb250cm9sLFxuICAgIFBhbmVsQm9keSA9IF93cCRjb21wb25lbnRzLlBhbmVsQm9keSxcbiAgICBEYXNoaWNvbiA9IF93cCRjb21wb25lbnRzLkRhc2hpY29uLFxuICAgIFRvb2x0aXAgPSBfd3AkY29tcG9uZW50cy5Ub29sdGlwLFxuICAgIFBsYWNlaG9sZGVyID0gX3dwJGNvbXBvbmVudHMuUGxhY2Vob2xkZXI7XG52YXIgd2l0aFNlbGVjdCA9IHdwLmRhdGEud2l0aFNlbGVjdDtcblxudmFyIFBhbm9yYW1hQmxvY2sgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUGFub3JhbWFCbG9jaywgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUGFub3JhbWFCbG9jaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGFub3JhbWFCbG9jayk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoUGFub3JhbWFCbG9jay5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFBhbm9yYW1hQmxvY2spKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcblxuICAgIF90aGlzLnNldEltYWdlRGF0YSA9IF90aGlzLnNldEltYWdlRGF0YS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vblNlbGVjdEltYWdlID0gX3RoaXMub25TZWxlY3RJbWFnZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkNoYW5nZU1lZGlhQWx0ID0gX3RoaXMub25DaGFuZ2VNZWRpYUFsdC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkNoYW5nZU1lZGlhVGl0bGUgPSBfdGhpcy5vbkNoYW5nZU1lZGlhVGl0bGUuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25DaGFuZ2VDb250YWluZXJIZWlnaHQgPSBfdGhpcy5vbkNoYW5nZUNvbnRhaW5lckhlaWdodC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkNoYW5nZVN0YXJ0UG9zaXRpb24gPSBfdGhpcy5vbkNoYW5nZVN0YXJ0UG9zaXRpb24uYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25DaGFuZ2VHcmFjZWZ1bEZhaWx1cmUgPSBfdGhpcy5vbkNoYW5nZUdyYWNlZnVsRmFpbHVyZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkNoYW5nZUZhaWx1cmVNZXNzYWdlID0gX3RoaXMub25DaGFuZ2VGYWlsdXJlTWVzc2FnZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkNoYW5nZUZhaWx1cmVNZXNzYWdlSW5zZXJ0ID0gX3RoaXMub25DaGFuZ2VGYWlsdXJlTWVzc2FnZUluc2VydC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkNoYW5nZU1pbmltdW1PdmVyZmxvdyA9IF90aGlzLm9uQ2hhbmdlTWluaW11bU92ZXJmbG93LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uQ2hhbmdlRGlzcGxheU1ldGEgPSBfdGhpcy5vbkNoYW5nZURpc3BsYXlNZXRhLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQYW5vcmFtYUJsb2NrLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHVybCA9IF9wcm9wcy5hdHRyaWJ1dGVzLnVybCxcbiAgICAgICAgICBpbWFnZSA9IF9wcm9wcy5pbWFnZTtcblxuICAgICAgaWYgKCF1cmwgJiYgaW1hZ2UgJiYgaW1hZ2UuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0SW1hZ2VEYXRhKGltYWdlLmRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHVybCA9IF9wcm9wczIuYXR0cmlidXRlcy51cmwsXG4gICAgICAgICAgaW1hZ2UgPSBfcHJvcHMyLmltYWdlO1xuXG4gICAgICBpZiAoIXVybCAmJiBpbWFnZSkge1xuICAgICAgICB0aGlzLnNldEltYWdlRGF0YShpbWFnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFNldCBjb21wb25lbnQgZGF0YSBmcm9tIHJlY2VpdmVkIHBhcmFtc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBJbWFnZSBkYXRhXG4gICAgICogQHJldHVybiB7YXJyYXl9IEVycm9yc1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0SW1hZ2VEYXRhXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlRGF0YShkYXRhKSB7XG4gICAgICB2YXIgX3Byb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgX3Byb3BzMyRhdHRyaWJ1dGVzID0gX3Byb3BzMy5hdHRyaWJ1dGVzLFxuICAgICAgICAgIHVybCA9IF9wcm9wczMkYXR0cmlidXRlcy51cmwsXG4gICAgICAgICAgYWx0ID0gX3Byb3BzMyRhdHRyaWJ1dGVzLmFsdCxcbiAgICAgICAgICB0aXRsZSA9IF9wcm9wczMkYXR0cmlidXRlcy50aXRsZSxcbiAgICAgICAgICBzZXRBdHRyaWJ1dGVzID0gX3Byb3BzMy5zZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICBzZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICB1cmw6IGRhdGEuc291cmNlX3VybFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghYWx0KSB7XG4gICAgICAgIHNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIGFsdDogZGF0YS5hbHRfdGV4dFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghdGl0bGUpIHtcbiAgICAgICAgc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUucmVuZGVyZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEhhbmRsZSBjb21wb25lbnQgaW1hZ2Ugc2VsZWN0aW9uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IENvbXBvbmVudCBtZWRpYSBkYXRhXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvblNlbGVjdEltYWdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uU2VsZWN0SW1hZ2UobWVkaWEpIHtcbiAgICAgIHRoaXMucHJvcHMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIHVybDogbWVkaWEudXJsLFxuICAgICAgICBpZDogbWVkaWEuaWQsXG4gICAgICAgIGFsdDogbWVkaWEuYWx0LFxuICAgICAgICB0aXRsZTogbWVkaWEudGl0bGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbkNoYW5nZU1lZGlhQWx0XCIsXG5cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBIYW5kbGUgY29tcG9uZW50IGltYWdlIGFsdCB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gSW1hZ2UgYWx0XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlTWVkaWFBbHQoYWx0KSB7XG4gICAgICB0aGlzLnByb3BzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBhbHQ6IGFsdFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uQ2hhbmdlTWVkaWFUaXRsZVwiLFxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlIGNvbXBvbmVudCBpbWFnZSB0aXRsZSB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gSW1hZ2UgdGl0bGVcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VNZWRpYVRpdGxlKHRpdGxlKSB7XG4gICAgICB0aGlzLnByb3BzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICB0aXRsZTogdGl0bGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbkNoYW5nZUNvbnRhaW5lckhlaWdodFwiLFxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlIGNvbXBvbmVudCBjb250YWluZXIgaGVpZ2h0IHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBDb250YWluZXIgaGVpZ2h0XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlQ29udGFpbmVySGVpZ2h0KGhlaWdodCkge1xuICAgICAgdGhpcy5wcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgY29udGFpbmVySGVpZ2h0OiBOdW1iZXIoaGVpZ2h0KVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uQ2hhbmdlU3RhcnRQb3NpdGlvblwiLFxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlIGNvbXBvbmVudCBzdGFydFBvc2l0aW9uIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdGFydFBvc2l0aW9uXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlU3RhcnRQb3NpdGlvbihwb3NpdGlvbikge1xuICAgICAgdGhpcy5wcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgc3RhcnRQb3NpdGlvbjogcG9zaXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbkNoYW5nZUdyYWNlZnVsRmFpbHVyZVwiLFxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlIGNvbXBvbmVudCBncmFjZWZ1bEZhaWx1cmUgdXBkYXRlXG4gICAgICogQHBhcmFtIG5vbmVcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VHcmFjZWZ1bEZhaWx1cmUoKSB7XG4gICAgICB2YXIgX3Byb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgZ3JhY2VmdWxGYWlsdXJlID0gX3Byb3BzNC5hdHRyaWJ1dGVzLmdyYWNlZnVsRmFpbHVyZSxcbiAgICAgICAgICBzZXRBdHRyaWJ1dGVzID0gX3Byb3BzNC5zZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBzZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgZ3JhY2VmdWxGYWlsdXJlOiAhZ3JhY2VmdWxGYWlsdXJlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25DaGFuZ2VGYWlsdXJlTWVzc2FnZVwiLFxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlIGNvbXBvbmVudCBmYWlsdXJlTWVzc2FnZSB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmFpbHVyZU1lc3NhZ2VcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VGYWlsdXJlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICB0aGlzLnByb3BzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBmYWlsdXJlTWVzc2FnZTogbWVzc2FnZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEhhbmRsZSBjb21wb25lbnQgZmFpbHVyZU1lc3NhZ2VJbnNlcnQgdXBkYXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZhaWx1cmVNZXNzYWdlSW5zZXJ0XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvbkNoYW5nZUZhaWx1cmVNZXNzYWdlSW5zZXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlRmFpbHVyZU1lc3NhZ2VJbnNlcnQocG9zaXRpb24pIHtcbiAgICAgIHRoaXMucHJvcHMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIGZhaWx1cmVNZXNzYWdlSW5zZXJ0OiBwb3NpdGlvblxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEhhbmRsZSBjb21wb25lbnQgbWluaW11bU92ZXJmbG93IHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtaW5pbXVtT3ZlcmZsb3dcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9uQ2hhbmdlTWluaW11bU92ZXJmbG93XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlTWluaW11bU92ZXJmbG93KHZhbHVlKSB7XG4gICAgICB0aGlzLnByb3BzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBtaW5pbXVtT3ZlcmZsb3c6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlIGNvbXBvbmVudCBkaXNwbGF5TWV0YSB1cGRhdGVcbiAgICAgKiBAcGFyYW0gbm9uZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib25DaGFuZ2VEaXNwbGF5TWV0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZURpc3BsYXlNZXRhKCkge1xuICAgICAgdmFyIF9wcm9wczUgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGRpc3BsYXlNZXRhID0gX3Byb3BzNS5hdHRyaWJ1dGVzLmRpc3BsYXlNZXRhLFxuICAgICAgICAgIHNldEF0dHJpYnV0ZXMgPSBfcHJvcHM1LnNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIHNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBkaXNwbGF5TWV0YTogIWRpc3BsYXlNZXRhXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfcHJvcHM2ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBpc1NlbGVjdGVkID0gX3Byb3BzNi5pc1NlbGVjdGVkLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wczYuY2xhc3NOYW1lLFxuICAgICAgICAgIGltYWdlID0gX3Byb3BzNi5pbWFnZSxcbiAgICAgICAgICBfcHJvcHM2JGF0dHJpYnV0ZXMgPSBfcHJvcHM2LmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdXJsID0gX3Byb3BzNiRhdHRyaWJ1dGVzLnVybCxcbiAgICAgICAgICBpZCA9IF9wcm9wczYkYXR0cmlidXRlcy5pZCxcbiAgICAgICAgICBhbHQgPSBfcHJvcHM2JGF0dHJpYnV0ZXMuYWx0LFxuICAgICAgICAgIHRpdGxlID0gX3Byb3BzNiRhdHRyaWJ1dGVzLnRpdGxlLFxuICAgICAgICAgIGNvbnRhaW5lckhlaWdodCA9IF9wcm9wczYkYXR0cmlidXRlcy5jb250YWluZXJIZWlnaHQsXG4gICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IF9wcm9wczYkYXR0cmlidXRlcy5zdGFydFBvc2l0aW9uLFxuICAgICAgICAgIGdyYWNlZnVsRmFpbHVyZSA9IF9wcm9wczYkYXR0cmlidXRlcy5ncmFjZWZ1bEZhaWx1cmUsXG4gICAgICAgICAgZmFpbHVyZU1lc3NhZ2UgPSBfcHJvcHM2JGF0dHJpYnV0ZXMuZmFpbHVyZU1lc3NhZ2UsXG4gICAgICAgICAgZmFpbHVyZU1lc3NhZ2VJbnNlcnQgPSBfcHJvcHM2JGF0dHJpYnV0ZXMuZmFpbHVyZU1lc3NhZ2VJbnNlcnQsXG4gICAgICAgICAgbWluaW11bU92ZXJmbG93ID0gX3Byb3BzNiRhdHRyaWJ1dGVzLm1pbmltdW1PdmVyZmxvdyxcbiAgICAgICAgICBkaXNwbGF5TWV0YSA9IF9wcm9wczYkYXR0cmlidXRlcy5kaXNwbGF5TWV0YTtcblxuXG4gICAgICB2YXIgcGFub3JhbWFTdHlsZSA9IHtcbiAgICAgICAgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQgKyAncHgnXG4gICAgICB9O1xuXG4gICAgICBpZiAoIXVybCAmJiBpbWFnZSkge1xuICAgICAgICByZXR1cm4gW3dwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBQbGFjZWhvbGRlcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IFwiZWFzeXBhbm9yYW1hLWxvYWRpbmdcIixcbiAgICAgICAgICAgIGljb246IFwiY292ZXItaW1hZ2VcIixcbiAgICAgICAgICAgIGxhYmVsOiBfXygnUGFub3JhbWEnKSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJlYXN5cGFub3JhbWEtbG9hZGluZ1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBfXygnTG9hZGluZy4uLicpXG4gICAgICAgICAgKVxuICAgICAgICApXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1cmwgJiYgIWltYWdlKSB7XG4gICAgICAgIHJldHVybiBbd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KE1lZGlhUGxhY2Vob2xkZXIsIHtcbiAgICAgICAgICBrZXk6IFwiZWFzeXBhbm9yYW1hLXBsYWNlaG9sZGVyXCIsXG4gICAgICAgICAgaWNvbjogXCJjb3Zlci1pbWFnZVwiLFxuICAgICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICAgdGl0bGU6IF9fKCdQYW5vcmFtYScpLFxuICAgICAgICAgICAgbmFtZTogX18oJ2ltYWdlcycpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgICBvblNlbGVjdDogdGhpcy5vblNlbGVjdEltYWdlLFxuICAgICAgICAgIGFjY2VwdDogXCJpbWFnZS8qXCIsXG4gICAgICAgICAgdHlwZTogXCJpbWFnZVwiXG4gICAgICAgIH0pXTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBjb250cm9scyA9IGlzU2VsZWN0ZWQgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBCbG9ja0NvbnRyb2xzLFxuICAgICAgICB7IGtleTogXCJlYXN5cGFub3JhbWEtY29udHJvbHNcIiB9LFxuICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgVG9vbGJhcixcbiAgICAgICAgICB7IGtleTogXCJlYXN5cGFub3JhbWEtdG9vbGJhclwiIH0sXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KE1lZGlhVXBsb2FkLCB7XG4gICAgICAgICAgICBrZXk6IFwiZWFzeXBhbm9yYW1hLW1lZGlhdXBsb2FkXCIsXG4gICAgICAgICAgICBvblNlbGVjdDogdGhpcy5vblNlbGVjdEltYWdlLFxuICAgICAgICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuaWQsXG4gICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihfcmVmKSB7XG4gICAgICAgICAgICAgIHZhciBvcGVuID0gX3JlZi5vcGVuO1xuICAgICAgICAgICAgICByZXR1cm4gd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KEljb25CdXR0b24sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiZWFzeXBhbm9yYW1hLW9wZW5tZWRpYVwiLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJjb21wb25lbnRzLXRvb2xiYXJfX2NvbnRyb2xcIixcbiAgICAgICAgICAgICAgICBsYWJlbDogX18oJ0VkaXQgaW1hZ2UnKSxcbiAgICAgICAgICAgICAgICBpY29uOiBcImVkaXRcIixcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiBvcGVuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBbY29udHJvbHMsIGlzU2VsZWN0ZWQgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBJbnNwZWN0b3JDb250cm9scyxcbiAgICAgICAgeyBrZXk6IFwiZWFzeXBhbm9yYW1hLWluc3BlY3RvclwiIH0sXG4gICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBQYW5lbEJvZHksXG4gICAgICAgICAgeyB0aXRsZTogX18oJ1Bhbm9yYW1hIHNldHRpbmdzJyksIGtleTogXCJlYXN5cGFub3JhbWEtaW5zcGVjdG9yLXNldHRpbmdzXCIgfSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVGV4dENvbnRyb2wsIHtcbiAgICAgICAgICAgIGtleTogXCJlYXN5cGFub3JhbWEtY29udHJvbC1jb250YWluZXJIZWlnaHRcIixcbiAgICAgICAgICAgIGxhYmVsOiBfXygnQ29udGFpbmVyIGhlaWdodCcpLFxuICAgICAgICAgICAgaGVscDogX18oJ0luc2VydCB0aGUgaGVpZ2h0IGZvciB0aGlzIHBhbm9yYW1pYyBpbWFnZSBjb250YWluZXIuJyksXG4gICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgIHZhbHVlOiBjb250YWluZXJIZWlnaHQsXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZUNvbnRhaW5lckhlaWdodFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChSYW5nZUNvbnRyb2wsIHtcbiAgICAgICAgICAgIGtleTogXCJlYXN5cGFub3JhbWEtY29udHJvbC1zdGFydFBvc2l0aW9uXCIsXG4gICAgICAgICAgICBsYWJlbDogX18oJ1N0YXJ0IHBvc2l0aW9uJyksXG4gICAgICAgICAgICBoZWxwOiBfXygnRGV0ZXJtaW5lcyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHBhbm9yYW1hOiBpbnNlcnQgYSB2YWx1ZSBmcm9tIDAgKGxlZnQpIHRvIDEwIChyaWdodCkuJyksXG4gICAgICAgICAgICB2YWx1ZTogc3RhcnRQb3NpdGlvbixcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlU3RhcnRQb3NpdGlvbixcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTBcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVG9nZ2xlQ29udHJvbCwge1xuICAgICAgICAgICAga2V5OiBcImVhc3lwYW5vcmFtYS1jb250cm9sLWRpc3BsYXlNZXRhXCIsXG4gICAgICAgICAgICBsYWJlbDogX18oJ1Nob3cgbWV0YSBvbiBvdmVybGF5JyksXG4gICAgICAgICAgICBjaGVja2VkOiBkaXNwbGF5TWV0YSxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlRGlzcGxheU1ldGFcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkaXNwbGF5TWV0YSAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVGV4dENvbnRyb2wsIHtcbiAgICAgICAgICAgIGtleTogXCJlYXN5cGFub3JhbWEtY29udHJvbC10aXRsZVwiLFxuICAgICAgICAgICAgbGFiZWw6IF9fKCdUaXRsZScpLFxuICAgICAgICAgICAgdmFsdWU6IHRpdGxlLFxuICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2VNZWRpYVRpdGxlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZGlzcGxheU1ldGEgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFRleHRDb250cm9sLCB7XG4gICAgICAgICAgICBrZXk6IFwiZWFzeXBhbm9yYW1hLWNvbnRyb2wtYWx0XCIsXG4gICAgICAgICAgICBsYWJlbDogX18oJ0Rlc2NyaXB0aW9uJyksXG4gICAgICAgICAgICB2YWx1ZTogYWx0LFxuICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2VNZWRpYUFsdFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBQYW5lbEJvZHksXG4gICAgICAgICAgeyB0aXRsZTogX18oJ0FkdmFuY2VkIHNldHRpbmdzJyksIGtleTogXCJlYXN5cGFub3JhbWEtaW5zcGVjdG9yLWFkdmFuY2VkXCIgfSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVGV4dENvbnRyb2wsIHtcbiAgICAgICAgICAgIGtleTogXCJlYXN5cGFub3JhbWEtY29udHJvbC1taW5pbXVtT3ZlcmZsb3dcIixcbiAgICAgICAgICAgIGxhYmVsOiBfXygnTWluaW11bSBvdmVyZmxvdycpLFxuICAgICAgICAgICAgaGVscDogX18oJ1RoZSBleGNlc3Mgd2lkdGggaW4gcGl4ZWxzIHRoZSBjb250YWluZXIgbXVzdCBoYXZlIGJlZm9yZSBwYW5vcmFtYSBraWNrcyBpbi4nKSxcbiAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgdmFsdWU6IG1pbmltdW1PdmVyZmxvdyxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlTWluaW11bU92ZXJmbG93XG4gICAgICAgICAgfSksXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFRvZ2dsZUNvbnRyb2wsIHtcbiAgICAgICAgICAgIGtleTogXCJlYXN5cGFub3JhbWEtY29udHJvbC1ncmFjZWZ1bEZhaWx1cmVcIixcbiAgICAgICAgICAgIGxhYmVsOiBfXygnSW5zZXJ0IGZhaWx1cmUgbWVzc2FnZScpLFxuICAgICAgICAgICAgY2hlY2tlZDogZ3JhY2VmdWxGYWlsdXJlLFxuICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2VHcmFjZWZ1bEZhaWx1cmVcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBncmFjZWZ1bEZhaWx1cmUgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFNlbGVjdENvbnRyb2wsIHtcbiAgICAgICAgICAgIGtleTogXCJlYXN5cGFub3JhbWEtY29udHJvbC1mYWlsdXJlTWVzc2FnZUluc2VydFwiLFxuICAgICAgICAgICAgbGFiZWw6IF9fKCdQb3NpdGlvbicpLFxuICAgICAgICAgICAgdmFsdWU6IGZhaWx1cmVNZXNzYWdlSW5zZXJ0LFxuICAgICAgICAgICAgb3B0aW9uczogW3sgdmFsdWU6ICdhZnRlcicsIGxhYmVsOiAnQWZ0ZXIgdGhlIHBhbm9yYW1hIGNvbnRhaW5lcicgfSwgeyB2YWx1ZTogJ2JlZm9yZScsIGxhYmVsOiAnQmVmb3JlIHRoZSBwYW5vcmFtYSBjb250YWluZXInIH1dLFxuICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2VGYWlsdXJlTWVzc2FnZUluc2VydFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGdyYWNlZnVsRmFpbHVyZSAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVGV4dENvbnRyb2wsIHtcbiAgICAgICAgICAgIGtleTogXCJlYXN5cGFub3JhbWEtY29udHJvbC1mYWlsdXJlTWVzc2FnZVwiLFxuICAgICAgICAgICAgbGFiZWw6IF9fKCdNZXNzYWdlJyksXG4gICAgICAgICAgICBoZWxwOiBfXygnVGhpcyBtZXNzYWdlIHdpbGwgYXBwZWFyIGluIG1vYmlsZSBkZXZpY2VzIHdpdGggbm8gZ3lyb3Njb3BpYyBkYXRhIG9yIG5vIHBoeXNpY2FsIG9yaWVudGF0aW9uIHN1cHBvcnQuJyksXG4gICAgICAgICAgICB2YWx1ZTogZmFpbHVyZU1lc3NhZ2UsXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZUZhaWx1cmVNZXNzYWdlXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKSwgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7IGNsYXNzTmFtZTogY2xhc3NOYW1lLCBrZXk6IFwiZWFzeXBhbm9yYW1hLWJsb2NrLWVkaXRvclwiIH0sXG4gICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHsgc3R5bGU6IHBhbm9yYW1hU3R5bGUsIGNsYXNzTmFtZTogXCJwYW5vcmFtYS0taW1hZ2VcIiwga2V5OiBcImVhc3lwYW5vcmFtYS1wYW5vcmFtYS1jb250YWluZXJcIiB9LFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7IHNyYzogdXJsLCBhbHQ6IGFsdCwgdGl0bGU6IHRpdGxlLCBjbGFzc05hbWU6IFwid3AtaW1hZ2UtXCIgKyBpZCwga2V5OiBcImVhc3lwYW5vcmFtYS1wYW5vcmFtYS1pbWFnZVwiIH0pXG4gICAgICAgICksXG4gICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICB7IGNsYXNzTmFtZTogXCJwYW5vcmFtYS0taGVscC10ZXh0XCIsIGtleTogXCJlYXN5cGFub3JhbWEtYmxvY2staGVscFwiIH0sXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgVG9vbHRpcCxcbiAgICAgICAgICAgIHsgdGV4dDogX18oJ1RoaXMgaXMgYSBwcmV2aWV3LCBzb21lIGZlYXR1cmVzIGFyZSBub3QgYXZhaWxhYmxlLicpLCBrZXk6IFwiZWFzeXBhbm9yYW1hLWJsb2NrLWhlbHAtdG9vbHRpcFwiIH0sXG4gICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJwYW5vcmFtYS0taGVscC1pY29uXCIsIGtleTogXCJlYXN5cGFub3JhbWEtYmxvY2staGVscC1pY29uLWNvbnRhaW5lclwiIH0sXG4gICAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChEYXNoaWNvbiwgeyBzaXplOiBcIjI1XCIsIGljb246IFwiaW5mb1wiLCBrZXk6IFwiZWFzeXBhbm9yYW1hLWJsb2NrLWhlbHAtaWNvblwiIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGFub3JhbWFCbG9jaztcbn0oQ29tcG9uZW50KTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aFNlbGVjdChmdW5jdGlvbiAoc2VsZWN0LCBvd25Qcm9wcykge1xuICB2YXIgX3NlbGVjdCA9IHNlbGVjdCgnY29yZScpLFxuICAgICAgZ2V0TWVkaWEgPSBfc2VsZWN0LmdldE1lZGlhO1xuXG4gIHZhciBpZCA9IG93blByb3BzLmF0dHJpYnV0ZXMuaWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBpbWFnZTogaWQgPyBnZXRNZWRpYShpZCkgOiBudWxsXG4gIH07XG59KShQYW5vcmFtYUJsb2NrKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2Jsb2NrLmpzXG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3\n");
     90eval("var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar __ = wp.i18n.__;\nvar Component = wp.element.Component;\nvar _wp$editor = wp.editor,\n    MediaPlaceholder = _wp$editor.MediaPlaceholder,\n    MediaUpload = _wp$editor.MediaUpload,\n    MediaUploadCheck = _wp$editor.MediaUploadCheck,\n    BlockControls = _wp$editor.BlockControls,\n    InspectorControls = _wp$editor.InspectorControls;\nvar _wp$components = wp.components,\n    Toolbar = _wp$components.Toolbar,\n    IconButton = _wp$components.IconButton,\n    RangeControl = _wp$components.RangeControl,\n    ToggleControl = _wp$components.ToggleControl,\n    TextControl = _wp$components.TextControl,\n    SelectControl = _wp$components.SelectControl,\n    PanelBody = _wp$components.PanelBody,\n    Dashicon = _wp$components.Dashicon,\n    Tooltip = _wp$components.Tooltip,\n    Placeholder = _wp$components.Placeholder;\nvar withSelect = wp.data.withSelect;\n\n\nvar ALLOWED_MEDIA_TYPES = ['image'];\n\nvar PanoramaBlock = function (_Component) {\n  _inherits(PanoramaBlock, _Component);\n\n  function PanoramaBlock() {\n    _classCallCheck(this, PanoramaBlock);\n\n    var _this = _possibleConstructorReturn(this, (PanoramaBlock.__proto__ || Object.getPrototypeOf(PanoramaBlock)).apply(this, arguments));\n\n    _this.setImageData = _this.setImageData.bind(_this);\n    _this.onSelectImage = _this.onSelectImage.bind(_this);\n    _this.onChangeMediaAlt = _this.onChangeMediaAlt.bind(_this);\n    _this.onChangeMediaTitle = _this.onChangeMediaTitle.bind(_this);\n    _this.onChangeContainerHeight = _this.onChangeContainerHeight.bind(_this);\n    _this.onChangeStartPosition = _this.onChangeStartPosition.bind(_this);\n    _this.onChangeGracefulFailure = _this.onChangeGracefulFailure.bind(_this);\n    _this.onChangeFailureMessage = _this.onChangeFailureMessage.bind(_this);\n    _this.onChangeFailureMessageInsert = _this.onChangeFailureMessageInsert.bind(_this);\n    _this.onChangeMinimumOverflow = _this.onChangeMinimumOverflow.bind(_this);\n    _this.onChangeDisplayMeta = _this.onChangeDisplayMeta.bind(_this);\n    return _this;\n  }\n\n  _createClass(PanoramaBlock, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _props = this.props,\n          url = _props.attributes.url,\n          image = _props.image;\n\n      if (!url && image && image.data !== undefined) {\n        this.setImageData(image.data);\n      }\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      var _props2 = this.props,\n          url = _props2.attributes.url,\n          image = _props2.image;\n\n      if (!url && image) {\n        this.setImageData(image);\n      }\n    }\n\n    /**\n     * @description Set component data from received params\n     * @param {object} Image data\n     * @return {array} Errors\n     */\n\n  }, {\n    key: 'setImageData',\n    value: function setImageData(data) {\n      var _props3 = this.props,\n          _props3$attributes = _props3.attributes,\n          url = _props3$attributes.url,\n          alt = _props3$attributes.alt,\n          title = _props3$attributes.title,\n          setAttributes = _props3.setAttributes;\n\n      if (!url) {\n        setAttributes({\n          url: data.source_url\n        });\n      }\n      if (!alt) {\n        setAttributes({\n          alt: data.alt_text\n        });\n      }\n      if (!title) {\n        setAttributes({\n          title: data.title.rendered\n        });\n      }\n    }\n\n    /**\n     * @description Handle component image selection\n     * @param {object} Component media data\n     */\n\n  }, {\n    key: 'onSelectImage',\n    value: function onSelectImage(media) {\n      this.props.setAttributes({\n        url: media.url,\n        id: media.id,\n        alt: media.alt,\n        title: media.title\n      });\n    }\n  }, {\n    key: 'onChangeMediaAlt',\n\n\n    /**\n     * @description Handle component image alt update\n     * @param {string} Image alt\n     */\n    value: function onChangeMediaAlt(alt) {\n      this.props.setAttributes({\n        alt: alt\n      });\n    }\n  }, {\n    key: 'onChangeMediaTitle',\n\n\n    /**\n     * @description Handle component image title update\n     * @param {string} Image title\n     */\n    value: function onChangeMediaTitle(title) {\n      this.props.setAttributes({\n        title: title\n      });\n    }\n  }, {\n    key: 'onChangeContainerHeight',\n\n\n    /**\n     * @description Handle component container height update\n     * @param {string} Container height\n     */\n    value: function onChangeContainerHeight(height) {\n      this.props.setAttributes({\n        containerHeight: Number(height)\n      });\n    }\n  }, {\n    key: 'onChangeStartPosition',\n\n\n    /**\n     * @description Handle component startPosition update\n     * @param {string} startPosition\n     */\n    value: function onChangeStartPosition(position) {\n      this.props.setAttributes({\n        startPosition: position\n      });\n    }\n  }, {\n    key: 'onChangeGracefulFailure',\n\n\n    /**\n     * @description Handle component gracefulFailure update\n     * @param none\n     */\n    value: function onChangeGracefulFailure() {\n      var _props4 = this.props,\n          gracefulFailure = _props4.attributes.gracefulFailure,\n          setAttributes = _props4.setAttributes;\n\n      setAttributes({\n        gracefulFailure: !gracefulFailure\n      });\n    }\n  }, {\n    key: 'onChangeFailureMessage',\n\n\n    /**\n     * @description Handle component failureMessage update\n     * @param {string} failureMessage\n     */\n    value: function onChangeFailureMessage(message) {\n      this.props.setAttributes({\n        failureMessage: message\n      });\n    }\n\n    /**\n     * @description Handle component failureMessageInsert update\n     * @param {string} failureMessageInsert\n     */\n\n  }, {\n    key: 'onChangeFailureMessageInsert',\n    value: function onChangeFailureMessageInsert(position) {\n      this.props.setAttributes({\n        failureMessageInsert: position\n      });\n    }\n\n    /**\n     * @description Handle component minimumOverflow update\n     * @param {string} minimumOverflow\n     */\n\n  }, {\n    key: 'onChangeMinimumOverflow',\n    value: function onChangeMinimumOverflow(value) {\n      this.props.setAttributes({\n        minimumOverflow: value\n      });\n    }\n\n    /**\n     * @description Handle component displayMeta update\n     * @param none\n     */\n\n  }, {\n    key: 'onChangeDisplayMeta',\n    value: function onChangeDisplayMeta() {\n      var _props5 = this.props,\n          displayMeta = _props5.attributes.displayMeta,\n          setAttributes = _props5.setAttributes;\n\n      setAttributes({\n        displayMeta: !displayMeta\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props6 = this.props,\n          isSelected = _props6.isSelected,\n          className = _props6.className,\n          image = _props6.image,\n          _props6$attributes = _props6.attributes,\n          url = _props6$attributes.url,\n          id = _props6$attributes.id,\n          alt = _props6$attributes.alt,\n          title = _props6$attributes.title,\n          containerHeight = _props6$attributes.containerHeight,\n          startPosition = _props6$attributes.startPosition,\n          gracefulFailure = _props6$attributes.gracefulFailure,\n          failureMessage = _props6$attributes.failureMessage,\n          failureMessageInsert = _props6$attributes.failureMessageInsert,\n          minimumOverflow = _props6$attributes.minimumOverflow,\n          displayMeta = _props6$attributes.displayMeta;\n\n\n      var panoramaStyle = {\n        height: containerHeight + 'px'\n      };\n\n      if (!url && image) {\n        return [wp.element.createElement(\n          Placeholder,\n          {\n            key: 'easypanorama-loading',\n            icon: 'cover-image',\n            label: __('Panorama'),\n            className: 'easypanorama-loading'\n          },\n          wp.element.createElement(\n            'span',\n            null,\n            __('Loading...')\n          )\n        )];\n      }\n\n      if (!url && !image) {\n        return [wp.element.createElement(MediaPlaceholder, {\n          key: 'easypanorama-placeholder',\n          icon: 'cover-image',\n          labels: {\n            title: __('Panorama'),\n            name: __('images')\n          },\n          className: className,\n          onSelect: this.onSelectImage,\n          accept: 'image/*',\n          allowedTypes: ALLOWED_MEDIA_TYPES\n        })];\n      };\n\n      var controls = isSelected && wp.element.createElement(\n        BlockControls,\n        { key: 'easypanorama-controls' },\n        wp.element.createElement(\n          Toolbar,\n          { key: 'easypanorama-toolbar' },\n          wp.element.createElement(\n            MediaUploadCheck,\n            null,\n            wp.element.createElement(MediaUpload, {\n              key: 'easypanorama-mediaupload',\n              onSelect: this.onSelectImage,\n              allowedTypes: ALLOWED_MEDIA_TYPES,\n              value: this.id,\n              render: function render(_ref) {\n                var open = _ref.open;\n                return wp.element.createElement(IconButton, {\n                  key: 'easypanorama-openmedia',\n                  className: 'components-toolbar__control',\n                  label: __('Edit image'),\n                  icon: 'edit',\n                  onClick: open\n                });\n              }\n            })\n          )\n        )\n      );\n\n      return [controls, isSelected && wp.element.createElement(\n        InspectorControls,\n        { key: 'easypanorama-inspector' },\n        wp.element.createElement(\n          PanelBody,\n          { title: __('Panorama settings'), key: 'easypanorama-inspector-settings' },\n          wp.element.createElement(TextControl, {\n            key: 'easypanorama-control-containerHeight',\n            label: __('Container height'),\n            help: __('Insert the height for this panoramic image container.'),\n            type: 'number',\n            value: containerHeight,\n            onChange: this.onChangeContainerHeight\n          }),\n          wp.element.createElement(RangeControl, {\n            key: 'easypanorama-control-startPosition',\n            label: __('Start position'),\n            help: __('Determines the start position of the panorama: insert a value from 0 (left) to 10 (right).'),\n            value: startPosition,\n            onChange: this.onChangeStartPosition,\n            min: 0,\n            max: 10\n          }),\n          wp.element.createElement(ToggleControl, {\n            key: 'easypanorama-control-displayMeta',\n            label: __('Show meta on overlay'),\n            checked: displayMeta,\n            onChange: this.onChangeDisplayMeta\n          }),\n          displayMeta && wp.element.createElement(TextControl, {\n            key: 'easypanorama-control-title',\n            label: __('Title'),\n            value: title,\n            onChange: this.onChangeMediaTitle\n          }),\n          displayMeta && wp.element.createElement(TextControl, {\n            key: 'easypanorama-control-alt',\n            label: __('Description'),\n            value: alt,\n            onChange: this.onChangeMediaAlt\n          })\n        ),\n        wp.element.createElement(\n          PanelBody,\n          { title: __('Advanced settings'), key: 'easypanorama-inspector-advanced' },\n          wp.element.createElement(TextControl, {\n            key: 'easypanorama-control-minimumOverflow',\n            label: __('Minimum overflow'),\n            help: __('The excess width in pixels the container must have before panorama kicks in.'),\n            type: 'number',\n            value: minimumOverflow,\n            onChange: this.onChangeMinimumOverflow\n          }),\n          wp.element.createElement(ToggleControl, {\n            key: 'easypanorama-control-gracefulFailure',\n            label: __('Insert failure message'),\n            checked: gracefulFailure,\n            onChange: this.onChangeGracefulFailure\n          }),\n          gracefulFailure && wp.element.createElement(SelectControl, {\n            key: 'easypanorama-control-failureMessageInsert',\n            label: __('Position'),\n            value: failureMessageInsert,\n            options: [{ value: 'after', label: 'After the panorama container' }, { value: 'before', label: 'Before the panorama container' }],\n            onChange: this.onChangeFailureMessageInsert\n          }),\n          gracefulFailure && wp.element.createElement(TextControl, {\n            key: 'easypanorama-control-failureMessage',\n            label: __('Message'),\n            help: __('This message will appear in mobile devices with no gyroscopic data or no physical orientation support.'),\n            value: failureMessage,\n            onChange: this.onChangeFailureMessage\n          })\n        )\n      ), wp.element.createElement(\n        'div',\n        { className: className, key: 'epblock' },\n        wp.element.createElement(\n          'div',\n          { style: panoramaStyle, className: 'epblock__image-container', key: 'easypanorama-block' },\n          wp.element.createElement('img', { src: url, alt: alt, title: title, className: 'wp-image-' + id, key: 'easypanorama-block-image' })\n        ),\n        wp.element.createElement(\n          'div',\n          { className: 'epblock__help-text', key: 'easypanorama-block-help' },\n          wp.element.createElement(\n            Tooltip,\n            { text: __('This is a preview, some features are not available.'), key: 'easypanorama-block-help-tooltip' },\n            wp.element.createElement(\n              'span',\n              { className: 'epblock__help-icon', key: 'easypanorama-block-help-icon-container' },\n              wp.element.createElement(Dashicon, { size: '25', icon: 'info', key: 'easypanorama-block-help-icon' })\n            )\n          )\n        )\n      )];\n    }\n  }]);\n\n  return PanoramaBlock;\n}(Component);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (withSelect(function (select, ownProps) {\n  var _select = select('core'),\n      getMedia = _select.getMedia;\n\n  var id = ownProps.attributes.id;\n\n  return {\n    image: id ? getMedia(id) : null\n  };\n})(PanoramaBlock));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2Jsb2NrLmpzPzM4OTciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX18gPSB3cC5pMThuLl9fO1xudmFyIENvbXBvbmVudCA9IHdwLmVsZW1lbnQuQ29tcG9uZW50O1xudmFyIF93cCRlZGl0b3IgPSB3cC5lZGl0b3IsXG4gICAgTWVkaWFQbGFjZWhvbGRlciA9IF93cCRlZGl0b3IuTWVkaWFQbGFjZWhvbGRlcixcbiAgICBNZWRpYVVwbG9hZCA9IF93cCRlZGl0b3IuTWVkaWFVcGxvYWQsXG4gICAgTWVkaWFVcGxvYWRDaGVjayA9IF93cCRlZGl0b3IuTWVkaWFVcGxvYWRDaGVjayxcbiAgICBCbG9ja0NvbnRyb2xzID0gX3dwJGVkaXRvci5CbG9ja0NvbnRyb2xzLFxuICAgIEluc3BlY3RvckNvbnRyb2xzID0gX3dwJGVkaXRvci5JbnNwZWN0b3JDb250cm9scztcbnZhciBfd3AkY29tcG9uZW50cyA9IHdwLmNvbXBvbmVudHMsXG4gICAgVG9vbGJhciA9IF93cCRjb21wb25lbnRzLlRvb2xiYXIsXG4gICAgSWNvbkJ1dHRvbiA9IF93cCRjb21wb25lbnRzLkljb25CdXR0b24sXG4gICAgUmFuZ2VDb250cm9sID0gX3dwJGNvbXBvbmVudHMuUmFuZ2VDb250cm9sLFxuICAgIFRvZ2dsZUNvbnRyb2wgPSBfd3AkY29tcG9uZW50cy5Ub2dnbGVDb250cm9sLFxuICAgIFRleHRDb250cm9sID0gX3dwJGNvbXBvbmVudHMuVGV4dENvbnRyb2wsXG4gICAgU2VsZWN0Q29udHJvbCA9IF93cCRjb21wb25lbnRzLlNlbGVjdENvbnRyb2wsXG4gICAgUGFuZWxCb2R5ID0gX3dwJGNvbXBvbmVudHMuUGFuZWxCb2R5LFxuICAgIERhc2hpY29uID0gX3dwJGNvbXBvbmVudHMuRGFzaGljb24sXG4gICAgVG9vbHRpcCA9IF93cCRjb21wb25lbnRzLlRvb2x0aXAsXG4gICAgUGxhY2Vob2xkZXIgPSBfd3AkY29tcG9uZW50cy5QbGFjZWhvbGRlcjtcbnZhciB3aXRoU2VsZWN0ID0gd3AuZGF0YS53aXRoU2VsZWN0O1xuXG5cbnZhciBBTExPV0VEX01FRElBX1RZUEVTID0gWydpbWFnZSddO1xuXG52YXIgUGFub3JhbWFCbG9jayA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQYW5vcmFtYUJsb2NrLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYW5vcmFtYUJsb2NrKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYW5vcmFtYUJsb2NrKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChQYW5vcmFtYUJsb2NrLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoUGFub3JhbWFCbG9jaykpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuXG4gICAgX3RoaXMuc2V0SW1hZ2VEYXRhID0gX3RoaXMuc2V0SW1hZ2VEYXRhLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uU2VsZWN0SW1hZ2UgPSBfdGhpcy5vblNlbGVjdEltYWdlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uQ2hhbmdlTWVkaWFBbHQgPSBfdGhpcy5vbkNoYW5nZU1lZGlhQWx0LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uQ2hhbmdlTWVkaWFUaXRsZSA9IF90aGlzLm9uQ2hhbmdlTWVkaWFUaXRsZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkNoYW5nZUNvbnRhaW5lckhlaWdodCA9IF90aGlzLm9uQ2hhbmdlQ29udGFpbmVySGVpZ2h0LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uQ2hhbmdlU3RhcnRQb3NpdGlvbiA9IF90aGlzLm9uQ2hhbmdlU3RhcnRQb3NpdGlvbi5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkNoYW5nZUdyYWNlZnVsRmFpbHVyZSA9IF90aGlzLm9uQ2hhbmdlR3JhY2VmdWxGYWlsdXJlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uQ2hhbmdlRmFpbHVyZU1lc3NhZ2UgPSBfdGhpcy5vbkNoYW5nZUZhaWx1cmVNZXNzYWdlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uQ2hhbmdlRmFpbHVyZU1lc3NhZ2VJbnNlcnQgPSBfdGhpcy5vbkNoYW5nZUZhaWx1cmVNZXNzYWdlSW5zZXJ0LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uQ2hhbmdlTWluaW11bU92ZXJmbG93ID0gX3RoaXMub25DaGFuZ2VNaW5pbXVtT3ZlcmZsb3cuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25DaGFuZ2VEaXNwbGF5TWV0YSA9IF90aGlzLm9uQ2hhbmdlRGlzcGxheU1ldGEuYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBhbm9yYW1hQmxvY2ssIFt7XG4gICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHVybCA9IF9wcm9wcy5hdHRyaWJ1dGVzLnVybCxcbiAgICAgICAgICBpbWFnZSA9IF9wcm9wcy5pbWFnZTtcblxuICAgICAgaWYgKCF1cmwgJiYgaW1hZ2UgJiYgaW1hZ2UuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0SW1hZ2VEYXRhKGltYWdlLmRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudERpZFVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB1cmwgPSBfcHJvcHMyLmF0dHJpYnV0ZXMudXJsLFxuICAgICAgICAgIGltYWdlID0gX3Byb3BzMi5pbWFnZTtcblxuICAgICAgaWYgKCF1cmwgJiYgaW1hZ2UpIHtcbiAgICAgICAgdGhpcy5zZXRJbWFnZURhdGEoaW1hZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgY29tcG9uZW50IGRhdGEgZnJvbSByZWNlaXZlZCBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gSW1hZ2UgZGF0YVxuICAgICAqIEByZXR1cm4ge2FycmF5fSBFcnJvcnNcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc2V0SW1hZ2VEYXRhJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0SW1hZ2VEYXRhKGRhdGEpIHtcbiAgICAgIHZhciBfcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBfcHJvcHMzJGF0dHJpYnV0ZXMgPSBfcHJvcHMzLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdXJsID0gX3Byb3BzMyRhdHRyaWJ1dGVzLnVybCxcbiAgICAgICAgICBhbHQgPSBfcHJvcHMzJGF0dHJpYnV0ZXMuYWx0LFxuICAgICAgICAgIHRpdGxlID0gX3Byb3BzMyRhdHRyaWJ1dGVzLnRpdGxlLFxuICAgICAgICAgIHNldEF0dHJpYnV0ZXMgPSBfcHJvcHMzLnNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIHVybDogZGF0YS5zb3VyY2VfdXJsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFhbHQpIHtcbiAgICAgICAgc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgYWx0OiBkYXRhLmFsdF90ZXh0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCF0aXRsZSkge1xuICAgICAgICBzZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZS5yZW5kZXJlZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlIGNvbXBvbmVudCBpbWFnZSBzZWxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gQ29tcG9uZW50IG1lZGlhIGRhdGFcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnb25TZWxlY3RJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uU2VsZWN0SW1hZ2UobWVkaWEpIHtcbiAgICAgIHRoaXMucHJvcHMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIHVybDogbWVkaWEudXJsLFxuICAgICAgICBpZDogbWVkaWEuaWQsXG4gICAgICAgIGFsdDogbWVkaWEuYWx0LFxuICAgICAgICB0aXRsZTogbWVkaWEudGl0bGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uQ2hhbmdlTWVkaWFBbHQnLFxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlIGNvbXBvbmVudCBpbWFnZSBhbHQgdXBkYXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IEltYWdlIGFsdFxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZU1lZGlhQWx0KGFsdCkge1xuICAgICAgdGhpcy5wcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgYWx0OiBhbHRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uQ2hhbmdlTWVkaWFUaXRsZScsXG5cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBIYW5kbGUgY29tcG9uZW50IGltYWdlIHRpdGxlIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBJbWFnZSB0aXRsZVxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZU1lZGlhVGl0bGUodGl0bGUpIHtcbiAgICAgIHRoaXMucHJvcHMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIHRpdGxlOiB0aXRsZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25DaGFuZ2VDb250YWluZXJIZWlnaHQnLFxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlIGNvbXBvbmVudCBjb250YWluZXIgaGVpZ2h0IHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBDb250YWluZXIgaGVpZ2h0XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlQ29udGFpbmVySGVpZ2h0KGhlaWdodCkge1xuICAgICAgdGhpcy5wcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgY29udGFpbmVySGVpZ2h0OiBOdW1iZXIoaGVpZ2h0KVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25DaGFuZ2VTdGFydFBvc2l0aW9uJyxcblxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEhhbmRsZSBjb21wb25lbnQgc3RhcnRQb3NpdGlvbiB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhcnRQb3NpdGlvblxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZVN0YXJ0UG9zaXRpb24ocG9zaXRpb24pIHtcbiAgICAgIHRoaXMucHJvcHMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIHN0YXJ0UG9zaXRpb246IHBvc2l0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvbkNoYW5nZUdyYWNlZnVsRmFpbHVyZScsXG5cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBIYW5kbGUgY29tcG9uZW50IGdyYWNlZnVsRmFpbHVyZSB1cGRhdGVcbiAgICAgKiBAcGFyYW0gbm9uZVxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZUdyYWNlZnVsRmFpbHVyZSgpIHtcbiAgICAgIHZhciBfcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBncmFjZWZ1bEZhaWx1cmUgPSBfcHJvcHM0LmF0dHJpYnV0ZXMuZ3JhY2VmdWxGYWlsdXJlLFxuICAgICAgICAgIHNldEF0dHJpYnV0ZXMgPSBfcHJvcHM0LnNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIHNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBncmFjZWZ1bEZhaWx1cmU6ICFncmFjZWZ1bEZhaWx1cmVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uQ2hhbmdlRmFpbHVyZU1lc3NhZ2UnLFxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlIGNvbXBvbmVudCBmYWlsdXJlTWVzc2FnZSB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmFpbHVyZU1lc3NhZ2VcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VGYWlsdXJlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICB0aGlzLnByb3BzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBmYWlsdXJlTWVzc2FnZTogbWVzc2FnZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEhhbmRsZSBjb21wb25lbnQgZmFpbHVyZU1lc3NhZ2VJbnNlcnQgdXBkYXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZhaWx1cmVNZXNzYWdlSW5zZXJ0XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ29uQ2hhbmdlRmFpbHVyZU1lc3NhZ2VJbnNlcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZUZhaWx1cmVNZXNzYWdlSW5zZXJ0KHBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnByb3BzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBmYWlsdXJlTWVzc2FnZUluc2VydDogcG9zaXRpb25cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBIYW5kbGUgY29tcG9uZW50IG1pbmltdW1PdmVyZmxvdyB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWluaW11bU92ZXJmbG93XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ29uQ2hhbmdlTWluaW11bU92ZXJmbG93JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VNaW5pbXVtT3ZlcmZsb3codmFsdWUpIHtcbiAgICAgIHRoaXMucHJvcHMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIG1pbmltdW1PdmVyZmxvdzogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBIYW5kbGUgY29tcG9uZW50IGRpc3BsYXlNZXRhIHVwZGF0ZVxuICAgICAqIEBwYXJhbSBub25lXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ29uQ2hhbmdlRGlzcGxheU1ldGEnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZURpc3BsYXlNZXRhKCkge1xuICAgICAgdmFyIF9wcm9wczUgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGRpc3BsYXlNZXRhID0gX3Byb3BzNS5hdHRyaWJ1dGVzLmRpc3BsYXlNZXRhLFxuICAgICAgICAgIHNldEF0dHJpYnV0ZXMgPSBfcHJvcHM1LnNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIHNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBkaXNwbGF5TWV0YTogIWRpc3BsYXlNZXRhXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZW5kZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3Byb3BzNiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgaXNTZWxlY3RlZCA9IF9wcm9wczYuaXNTZWxlY3RlZCxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHM2LmNsYXNzTmFtZSxcbiAgICAgICAgICBpbWFnZSA9IF9wcm9wczYuaW1hZ2UsXG4gICAgICAgICAgX3Byb3BzNiRhdHRyaWJ1dGVzID0gX3Byb3BzNi5hdHRyaWJ1dGVzLFxuICAgICAgICAgIHVybCA9IF9wcm9wczYkYXR0cmlidXRlcy51cmwsXG4gICAgICAgICAgaWQgPSBfcHJvcHM2JGF0dHJpYnV0ZXMuaWQsXG4gICAgICAgICAgYWx0ID0gX3Byb3BzNiRhdHRyaWJ1dGVzLmFsdCxcbiAgICAgICAgICB0aXRsZSA9IF9wcm9wczYkYXR0cmlidXRlcy50aXRsZSxcbiAgICAgICAgICBjb250YWluZXJIZWlnaHQgPSBfcHJvcHM2JGF0dHJpYnV0ZXMuY29udGFpbmVySGVpZ2h0LFxuICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSBfcHJvcHM2JGF0dHJpYnV0ZXMuc3RhcnRQb3NpdGlvbixcbiAgICAgICAgICBncmFjZWZ1bEZhaWx1cmUgPSBfcHJvcHM2JGF0dHJpYnV0ZXMuZ3JhY2VmdWxGYWlsdXJlLFxuICAgICAgICAgIGZhaWx1cmVNZXNzYWdlID0gX3Byb3BzNiRhdHRyaWJ1dGVzLmZhaWx1cmVNZXNzYWdlLFxuICAgICAgICAgIGZhaWx1cmVNZXNzYWdlSW5zZXJ0ID0gX3Byb3BzNiRhdHRyaWJ1dGVzLmZhaWx1cmVNZXNzYWdlSW5zZXJ0LFxuICAgICAgICAgIG1pbmltdW1PdmVyZmxvdyA9IF9wcm9wczYkYXR0cmlidXRlcy5taW5pbXVtT3ZlcmZsb3csXG4gICAgICAgICAgZGlzcGxheU1ldGEgPSBfcHJvcHM2JGF0dHJpYnV0ZXMuZGlzcGxheU1ldGE7XG5cblxuICAgICAgdmFyIHBhbm9yYW1hU3R5bGUgPSB7XG4gICAgICAgIGhlaWdodDogY29udGFpbmVySGVpZ2h0ICsgJ3B4J1xuICAgICAgfTtcblxuICAgICAgaWYgKCF1cmwgJiYgaW1hZ2UpIHtcbiAgICAgICAgcmV0dXJuIFt3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgUGxhY2Vob2xkZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnZWFzeXBhbm9yYW1hLWxvYWRpbmcnLFxuICAgICAgICAgICAgaWNvbjogJ2NvdmVyLWltYWdlJyxcbiAgICAgICAgICAgIGxhYmVsOiBfXygnUGFub3JhbWEnKSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ2Vhc3lwYW5vcmFtYS1sb2FkaW5nJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgJ3NwYW4nLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIF9fKCdMb2FkaW5nLi4uJylcbiAgICAgICAgICApXG4gICAgICAgICldO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVybCAmJiAhaW1hZ2UpIHtcbiAgICAgICAgcmV0dXJuIFt3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoTWVkaWFQbGFjZWhvbGRlciwge1xuICAgICAgICAgIGtleTogJ2Vhc3lwYW5vcmFtYS1wbGFjZWhvbGRlcicsXG4gICAgICAgICAgaWNvbjogJ2NvdmVyLWltYWdlJyxcbiAgICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAgIHRpdGxlOiBfXygnUGFub3JhbWEnKSxcbiAgICAgICAgICAgIG5hbWU6IF9fKCdpbWFnZXMnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAgb25TZWxlY3Q6IHRoaXMub25TZWxlY3RJbWFnZSxcbiAgICAgICAgICBhY2NlcHQ6ICdpbWFnZS8qJyxcbiAgICAgICAgICBhbGxvd2VkVHlwZXM6IEFMTE9XRURfTUVESUFfVFlQRVNcbiAgICAgICAgfSldO1xuICAgICAgfTtcblxuICAgICAgdmFyIGNvbnRyb2xzID0gaXNTZWxlY3RlZCAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIEJsb2NrQ29udHJvbHMsXG4gICAgICAgIHsga2V5OiAnZWFzeXBhbm9yYW1hLWNvbnRyb2xzJyB9LFxuICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgVG9vbGJhcixcbiAgICAgICAgICB7IGtleTogJ2Vhc3lwYW5vcmFtYS10b29sYmFyJyB9LFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIE1lZGlhVXBsb2FkQ2hlY2ssXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KE1lZGlhVXBsb2FkLCB7XG4gICAgICAgICAgICAgIGtleTogJ2Vhc3lwYW5vcmFtYS1tZWRpYXVwbG9hZCcsXG4gICAgICAgICAgICAgIG9uU2VsZWN0OiB0aGlzLm9uU2VsZWN0SW1hZ2UsXG4gICAgICAgICAgICAgIGFsbG93ZWRUeXBlczogQUxMT1dFRF9NRURJQV9UWVBFUyxcbiAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuaWQsXG4gICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKF9yZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3BlbiA9IF9yZWYub3BlbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KEljb25CdXR0b24sIHtcbiAgICAgICAgICAgICAgICAgIGtleTogJ2Vhc3lwYW5vcmFtYS1vcGVubWVkaWEnLFxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnY29tcG9uZW50cy10b29sYmFyX19jb250cm9sJyxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBfXygnRWRpdCBpbWFnZScpLFxuICAgICAgICAgICAgICAgICAgaWNvbjogJ2VkaXQnLFxuICAgICAgICAgICAgICAgICAgb25DbGljazogb3BlblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIFtjb250cm9scywgaXNTZWxlY3RlZCAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIEluc3BlY3RvckNvbnRyb2xzLFxuICAgICAgICB7IGtleTogJ2Vhc3lwYW5vcmFtYS1pbnNwZWN0b3InIH0sXG4gICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBQYW5lbEJvZHksXG4gICAgICAgICAgeyB0aXRsZTogX18oJ1Bhbm9yYW1hIHNldHRpbmdzJyksIGtleTogJ2Vhc3lwYW5vcmFtYS1pbnNwZWN0b3Itc2V0dGluZ3MnIH0sXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFRleHRDb250cm9sLCB7XG4gICAgICAgICAgICBrZXk6ICdlYXN5cGFub3JhbWEtY29udHJvbC1jb250YWluZXJIZWlnaHQnLFxuICAgICAgICAgICAgbGFiZWw6IF9fKCdDb250YWluZXIgaGVpZ2h0JyksXG4gICAgICAgICAgICBoZWxwOiBfXygnSW5zZXJ0IHRoZSBoZWlnaHQgZm9yIHRoaXMgcGFub3JhbWljIGltYWdlIGNvbnRhaW5lci4nKSxcbiAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgdmFsdWU6IGNvbnRhaW5lckhlaWdodCxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlQ29udGFpbmVySGVpZ2h0XG4gICAgICAgICAgfSksXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFJhbmdlQ29udHJvbCwge1xuICAgICAgICAgICAga2V5OiAnZWFzeXBhbm9yYW1hLWNvbnRyb2wtc3RhcnRQb3NpdGlvbicsXG4gICAgICAgICAgICBsYWJlbDogX18oJ1N0YXJ0IHBvc2l0aW9uJyksXG4gICAgICAgICAgICBoZWxwOiBfXygnRGV0ZXJtaW5lcyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHBhbm9yYW1hOiBpbnNlcnQgYSB2YWx1ZSBmcm9tIDAgKGxlZnQpIHRvIDEwIChyaWdodCkuJyksXG4gICAgICAgICAgICB2YWx1ZTogc3RhcnRQb3NpdGlvbixcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlU3RhcnRQb3NpdGlvbixcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTBcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVG9nZ2xlQ29udHJvbCwge1xuICAgICAgICAgICAga2V5OiAnZWFzeXBhbm9yYW1hLWNvbnRyb2wtZGlzcGxheU1ldGEnLFxuICAgICAgICAgICAgbGFiZWw6IF9fKCdTaG93IG1ldGEgb24gb3ZlcmxheScpLFxuICAgICAgICAgICAgY2hlY2tlZDogZGlzcGxheU1ldGEsXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZURpc3BsYXlNZXRhXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZGlzcGxheU1ldGEgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFRleHRDb250cm9sLCB7XG4gICAgICAgICAgICBrZXk6ICdlYXN5cGFub3JhbWEtY29udHJvbC10aXRsZScsXG4gICAgICAgICAgICBsYWJlbDogX18oJ1RpdGxlJyksXG4gICAgICAgICAgICB2YWx1ZTogdGl0bGUsXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZU1lZGlhVGl0bGVcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkaXNwbGF5TWV0YSAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVGV4dENvbnRyb2wsIHtcbiAgICAgICAgICAgIGtleTogJ2Vhc3lwYW5vcmFtYS1jb250cm9sLWFsdCcsXG4gICAgICAgICAgICBsYWJlbDogX18oJ0Rlc2NyaXB0aW9uJyksXG4gICAgICAgICAgICB2YWx1ZTogYWx0LFxuICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2VNZWRpYUFsdFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBQYW5lbEJvZHksXG4gICAgICAgICAgeyB0aXRsZTogX18oJ0FkdmFuY2VkIHNldHRpbmdzJyksIGtleTogJ2Vhc3lwYW5vcmFtYS1pbnNwZWN0b3ItYWR2YW5jZWQnIH0sXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFRleHRDb250cm9sLCB7XG4gICAgICAgICAgICBrZXk6ICdlYXN5cGFub3JhbWEtY29udHJvbC1taW5pbXVtT3ZlcmZsb3cnLFxuICAgICAgICAgICAgbGFiZWw6IF9fKCdNaW5pbXVtIG92ZXJmbG93JyksXG4gICAgICAgICAgICBoZWxwOiBfXygnVGhlIGV4Y2VzcyB3aWR0aCBpbiBwaXhlbHMgdGhlIGNvbnRhaW5lciBtdXN0IGhhdmUgYmVmb3JlIHBhbm9yYW1hIGtpY2tzIGluLicpLFxuICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICB2YWx1ZTogbWluaW11bU92ZXJmbG93LFxuICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2VNaW5pbXVtT3ZlcmZsb3dcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVG9nZ2xlQ29udHJvbCwge1xuICAgICAgICAgICAga2V5OiAnZWFzeXBhbm9yYW1hLWNvbnRyb2wtZ3JhY2VmdWxGYWlsdXJlJyxcbiAgICAgICAgICAgIGxhYmVsOiBfXygnSW5zZXJ0IGZhaWx1cmUgbWVzc2FnZScpLFxuICAgICAgICAgICAgY2hlY2tlZDogZ3JhY2VmdWxGYWlsdXJlLFxuICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2VHcmFjZWZ1bEZhaWx1cmVcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBncmFjZWZ1bEZhaWx1cmUgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFNlbGVjdENvbnRyb2wsIHtcbiAgICAgICAgICAgIGtleTogJ2Vhc3lwYW5vcmFtYS1jb250cm9sLWZhaWx1cmVNZXNzYWdlSW5zZXJ0JyxcbiAgICAgICAgICAgIGxhYmVsOiBfXygnUG9zaXRpb24nKSxcbiAgICAgICAgICAgIHZhbHVlOiBmYWlsdXJlTWVzc2FnZUluc2VydCxcbiAgICAgICAgICAgIG9wdGlvbnM6IFt7IHZhbHVlOiAnYWZ0ZXInLCBsYWJlbDogJ0FmdGVyIHRoZSBwYW5vcmFtYSBjb250YWluZXInIH0sIHsgdmFsdWU6ICdiZWZvcmUnLCBsYWJlbDogJ0JlZm9yZSB0aGUgcGFub3JhbWEgY29udGFpbmVyJyB9XSxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlRmFpbHVyZU1lc3NhZ2VJbnNlcnRcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBncmFjZWZ1bEZhaWx1cmUgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFRleHRDb250cm9sLCB7XG4gICAgICAgICAgICBrZXk6ICdlYXN5cGFub3JhbWEtY29udHJvbC1mYWlsdXJlTWVzc2FnZScsXG4gICAgICAgICAgICBsYWJlbDogX18oJ01lc3NhZ2UnKSxcbiAgICAgICAgICAgIGhlbHA6IF9fKCdUaGlzIG1lc3NhZ2Ugd2lsbCBhcHBlYXIgaW4gbW9iaWxlIGRldmljZXMgd2l0aCBubyBneXJvc2NvcGljIGRhdGEgb3Igbm8gcGh5c2ljYWwgb3JpZW50YXRpb24gc3VwcG9ydC4nKSxcbiAgICAgICAgICAgIHZhbHVlOiBmYWlsdXJlTWVzc2FnZSxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlRmFpbHVyZU1lc3NhZ2VcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApLCB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogY2xhc3NOYW1lLCBrZXk6ICdlcGJsb2NrJyB9LFxuICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgeyBzdHlsZTogcGFub3JhbWFTdHlsZSwgY2xhc3NOYW1lOiAnZXBibG9ja19faW1hZ2UtY29udGFpbmVyJywga2V5OiAnZWFzeXBhbm9yYW1hLWJsb2NrJyB9LFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJywgeyBzcmM6IHVybCwgYWx0OiBhbHQsIHRpdGxlOiB0aXRsZSwgY2xhc3NOYW1lOiAnd3AtaW1hZ2UtJyArIGlkLCBrZXk6ICdlYXN5cGFub3JhbWEtYmxvY2staW1hZ2UnIH0pXG4gICAgICAgICksXG4gICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogJ2VwYmxvY2tfX2hlbHAtdGV4dCcsIGtleTogJ2Vhc3lwYW5vcmFtYS1ibG9jay1oZWxwJyB9LFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFRvb2x0aXAsXG4gICAgICAgICAgICB7IHRleHQ6IF9fKCdUaGlzIGlzIGEgcHJldmlldywgc29tZSBmZWF0dXJlcyBhcmUgbm90IGF2YWlsYWJsZS4nKSwga2V5OiAnZWFzeXBhbm9yYW1hLWJsb2NrLWhlbHAtdG9vbHRpcCcgfSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgJ3NwYW4nLFxuICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogJ2VwYmxvY2tfX2hlbHAtaWNvbicsIGtleTogJ2Vhc3lwYW5vcmFtYS1ibG9jay1oZWxwLWljb24tY29udGFpbmVyJyB9LFxuICAgICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoRGFzaGljb24sIHsgc2l6ZTogJzI1JywgaWNvbjogJ2luZm8nLCBrZXk6ICdlYXN5cGFub3JhbWEtYmxvY2staGVscC1pY29uJyB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKV07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBhbm9yYW1hQmxvY2s7XG59KENvbXBvbmVudCk7XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTZWxlY3QoZnVuY3Rpb24gKHNlbGVjdCwgb3duUHJvcHMpIHtcbiAgdmFyIF9zZWxlY3QgPSBzZWxlY3QoJ2NvcmUnKSxcbiAgICAgIGdldE1lZGlhID0gX3NlbGVjdC5nZXRNZWRpYTtcblxuICB2YXIgaWQgPSBvd25Qcm9wcy5hdHRyaWJ1dGVzLmlkO1xuXG4gIHJldHVybiB7XG4gICAgaW1hZ2U6IGlkID8gZ2V0TWVkaWEoaWQpIDogbnVsbFxuICB9O1xufSkoUGFub3JhbWFCbG9jayk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ibG9jay5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3\n");
    9191
    9292/***/ })
  • easy-panorama/trunk/block/dist/editor.css

    r1864376 r1995612  
    1 .wp-block-easy-panorama-block{position:relative}.wp-block-easy-panorama-block .panorama--help-text{position:absolute;top:0;right:0}.wp-block-easy-panorama-block .panorama--help-icon{display:inline-block;padding:5px;color:#fff}.panorama--image{height:400px;overflow-x:scroll;overflow-y:hidden}.panorama--image img{height:100%;max-width:none}
     1.epblock{position:relative}.epblock__image-container{height:400px;overflow-x:scroll;overflow-y:hidden}.epblock__image-container img{height:100%;max-width:none}.epblock__help-text{position:absolute;bottom:0;right:0;line-height:0}.epblock__help-icon{display:inline-block;padding:10px;color:#fff}
  • easy-panorama/trunk/block/src/block.js

    r1936503 r1995612  
    66  MediaPlaceholder,
    77  MediaUpload,
     8  MediaUploadCheck,
    89  BlockControls,
    910  InspectorControls
     
    2526const { withSelect } = wp.data;
    2627
     28const ALLOWED_MEDIA_TYPES = [ 'image' ];
    2729
    2830class PanoramaBlock extends Component {
     
    234236          onSelect={ this.onSelectImage }
    235237          accept="image/*"
    236           type="image"
     238          allowedTypes={ ALLOWED_MEDIA_TYPES }
    237239        />
    238240      ]
     
    243245        <BlockControls key="easypanorama-controls">
    244246          <Toolbar key="easypanorama-toolbar">
    245             <MediaUpload
    246               key="easypanorama-mediaupload"
    247               onSelect={ this.onSelectImage }
    248               type="image"
    249               value={ this.id }
    250               render={ ( { open } ) => (
    251                 <IconButton
    252                   key="easypanorama-openmedia"
    253                   className="components-toolbar__control"
    254                   label={ __( 'Edit image' ) }
    255                   icon="edit"
    256                   onClick={ open }
    257                 />
    258               ) }
    259             />
     247            <MediaUploadCheck>
     248              <MediaUpload
     249                key="easypanorama-mediaupload"
     250                onSelect={ this.onSelectImage }
     251                allowedTypes={ ALLOWED_MEDIA_TYPES }
     252                value={ this.id }
     253                render={ ( { open } ) => (
     254                  <IconButton
     255                    key="easypanorama-openmedia"
     256                    className="components-toolbar__control"
     257                    label={ __( 'Edit image' ) }
     258                    icon="edit"
     259                    onClick={ open }
     260                  />
     261                ) }
     262              />
     263            </MediaUploadCheck>
    260264          </Toolbar>
    261265        </BlockControls>
     
    347351        </InspectorControls>
    348352      ),
    349       <div className={ className } key="easypanorama-block-editor">
    350         <div style={ panoramaStyle } className="panorama--image" key="easypanorama-panorama-container">
    351           <img src={ url } alt={ alt } title={ title } className={`wp-image-${ id }`} key="easypanorama-panorama-image"/>
     353      <div className={ className } key="epblock">
     354        <div style={ panoramaStyle } className="epblock__image-container" key="easypanorama-block">
     355          <img src={ url } alt={ alt } title={ title } className={`wp-image-${ id }`} key="easypanorama-block-image"/>
    352356        </div>
    353         <span className="panorama--help-text" key="easypanorama-block-help">
     357        <div className="epblock__help-text" key="easypanorama-block-help">
    354358          <Tooltip text={ __( 'This is a preview, some features are not available.' ) } key="easypanorama-block-help-tooltip">
    355             <span className="panorama--help-icon" key="easypanorama-block-help-icon-container">
     359            <span className="epblock__help-icon" key="easypanorama-block-help-icon-container">
    356360              <Dashicon size="25" icon="info" key="easypanorama-block-help-icon"/>
    357361            </span>
    358362          </Tooltip>
    359         </span>
     363        </div>
    360364      </div>
    361365    ];
  • easy-panorama/trunk/block/src/editor.scss

    r1864376 r1995612  
    11/* Easy Panorama Editor Styles */
    2 .wp-block-easy-panorama-block {
     2.epblock {
    33  position: relative;
    4   .panorama--help-text {
     4
     5  &__image-container {
     6    height: 400px;
     7    overflow-x: scroll;
     8    overflow-y: hidden;
     9    img {
     10      height: 100%;
     11      max-width: none;
     12    }
     13  }
     14
     15  &__help-text {
    516    position: absolute;
    6     top: 0;
     17    bottom: 0;
    718    right: 0;
     19    line-height: 0;
    820  }
    9   .panorama--help-icon {
     21
     22  &__help-icon {
    1023    display: inline-block;
    11     padding: 5px;
     24    padding: 10px;
    1225    color: #fff;
    1326  }
    1427}
    15 
    16 .panorama--image {
    17   height: 400px;
    18   overflow-x: scroll;
    19   overflow-y: hidden;
    20   img {
    21     height: 100%;
    22     max-width: none;
    23   }
    24 }
  • easy-panorama/trunk/easy-panorama.php

    r1936503 r1995612  
    1212 * Plugin URI: https://github.com/leopuleo
    1313 * Description: Embed interactive wide/panoramic images on your site. Optimised for responsive layouts, it works great with devices equipped with motion sensors.
    14  * Version:           1.1.3
     14 * Version:           1.1.4
    1515 * Author: Leonardo Giacone
    1616 * Author URI: https://github.com/leopuleo
  • easy-panorama/trunk/includes/class-easy-panorama.php

    r1936503 r1995612  
    9999
    100100    $this->plugin_name = 'easy-panorama';
    101     $this->version = '1.1.3';
     101    $this->version = '1.1.4';
    102102    $this->plugin_basename = plugin_basename(plugin_dir_path(__DIR__) . $this->plugin_name . '.php');
    103103
  • easy-panorama/trunk/readme.txt

    r1936503 r1995612  
    44Donate link: https://paypal.me/LeonardoGiacone
    55Requires at least: 4.5
    6 Tested up to: 4.9
     6Tested up to: 5.0
    77Requires PHP: 5.6
    8 Stable tag: 1.1.3
     8Stable tag: 1.1.4
    99License: GPL-2.0+
    1010License URI: http://www.gnu.org/licenses/gpl-2.0.txt
     
    117117== Changelog ==
    118118
     119= 1.1.4 (15/12/2018) =
     120* Bug fix: Added <code><MediaUploadCheck></code> + <code>allowedType</code> control
     121* Design: Moved tooltip help icon at bottom/right corner of the block
     122
    119123= 1.1.3 (05/08/2018) =
    120124* Bug fix: Replaced <code>withAPIData</code> with <code>withSelect</code>
Note: See TracChangeset for help on using the changeset viewer.