Plugin Directory

Changeset 1972900


Ignore:
Timestamp:
11/12/2018 10:19:47 AM (7 years ago)
Author:
mmuhsin
Message:

a11y: Author image is now selectable via keyboard

Location:
testimonials-slider-block/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • testimonials-slider-block/trunk/README.md

    r1927943 r1972900  
    3535---
    3636
    37 Feel free to say hi to me on Twitter [@muhsinlk](https://twitter.com/muhsinlk/)
     37This project was based on [guten-testimonial-block](https://github.com/laccadive-io/guten-testimonial-block) which was bootstrapped with [Create Guten Block](https://github.com/ahmadawais/create-guten-block).
  • testimonials-slider-block/trunk/dist/blocks.build.js

    r1927943 r1972900  
    366366/*! all exports used */
    367367/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/babel-runtime/core-js/object/assign.js (<- Module is not an ECMAScript module) */
    368 /*! ModuleConcatenation bailout: Cannot concat with ./node_modules/babel-runtime/helpers/toConsumableArray.js (<- Module is not an ECMAScript module) */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/babel-runtime/helpers/toConsumableArray.js\nvar toConsumableArray = __webpack_require__(1);\nvar toConsumableArray_default = /*#__PURE__*/__webpack_require__.n(toConsumableArray);\n\n// EXTERNAL MODULE: ./node_modules/babel-runtime/core-js/object/assign.js\nvar object_assign = __webpack_require__(2);\nvar assign_default = /*#__PURE__*/__webpack_require__.n(object_assign);\n\n// EXTERNAL MODULE: ./src/block/style.scss\nvar style = __webpack_require__(61);\n\n// EXTERNAL MODULE: ./src/block/editor.scss\nvar editor = __webpack_require__(62);\n\n// CONCATENATED MODULE: ./src/block/slider.js\n\n\n/**\r\n * BLOCK: my-block\r\n *\r\n * Registering a basic block with Gutenberg.\r\n * Simple block, renders and saves the same content without any interactivity.\r\n */\n\n//  Import CSS.\n\n\n\nvar __ = wp.i18n.__; // The __() for internationalization.\nvar registerBlockType = wp.blocks.registerBlockType; // The registerBlockType() to register blocks.\nvar _wp$editor = wp.editor,\n    MediaUpload = _wp$editor.MediaUpload,\n    PlainText = _wp$editor.PlainText;\n\n/**\r\n * Register: a Gutenberg Block.\r\n *\r\n * Registers a new block provided a unique name and an object defining its\r\n * behavior. Once registered, the block is made editor as an option to any\r\n * editor interface where blocks are implemented.\r\n *\r\n * @link https://wordpress.org/gutenberg/handbook/block-api/\r\n * @param  {string}   name     Block name.\r\n * @param  {Object}   settings Block settings.\r\n * @return {?WPBlock}          The block, if it has been successfully\r\n *                             registered; otherwise `undefined`.\r\n */\n\nregisterBlockType("gts/testimonials-slider-block", {\n  // Block name. Block names must be string that contains a namespace prefix. Example: my-plugin/my-custom-block.\n  title: __("Testimonials Slider"), // Block title.\n  icon: "format-quote", // Block icon from Dashicons → https://developer.wordpress.org/resource/dashicons/.\n  category: "common", // Block category — Group blocks together based on common traits E.g. common, formatting, layout widgets, embed.\n  keywords: [__("Testimonials Slider"), __("gts")],\n\n  attributes: {\n    testimonials: {\n      type: "array",\n      source: "query",\n      default: [],\n      selector: "blockquote.testimonial",\n      query: {\n        image: {\n          source: "attribute",\n          selector: "img",\n          attribute: "src"\n        },\n        index: {\n          type: "string",\n          source: "text",\n          selector: "span.testimonial-index"\n        },\n        content: {\n          type: "string",\n          source: "text",\n          selector: "span.testimonial-text"\n        },\n        author: {\n          type: "string",\n          source: "text",\n          selector: "span.testimonial-author span"\n        },\n        link: {\n          type: "string",\n          source: "text",\n          selector: ".testimonial-author-link"\n        }\n      }\n    },\n    id: {\n      type: "string",\n      source: "attribute",\n      selector: ".carousel.slide",\n      attribute: "id"\n    }\n  },\n\n  /**\r\n   * The edit function describes the structure of your block in the context of the editor.\r\n   * This represents what the editor will render when the block is used.\r\n   *\r\n   * The "edit" property must be a valid function.\r\n   *\r\n   * @link https://wordpress.org/gutenberg/handbook/block-api/block-edit-save/\r\n   */\n\n  // The "edit" property must be a valid function.\n  edit: function edit(props) {\n    var testimonials = props.attributes.testimonials;\n\n    if (!props.attributes.id) {\n      var id = "testimonial" + Math.floor(Math.random() * 100);\n      props.setAttributes({\n        id: id\n      });\n    }\n\n    var testimonialsList = testimonials.sort(function (a, b) {\n      return a.index - b.index;\n    }).map(function (testimonial) {\n      return wp.element.createElement(\n        "div",\n        { className: "gts-testimonial-block" },\n        wp.element.createElement(\n          "p",\n          null,\n          wp.element.createElement(\n            "span",\n            null,\n            "Insert Testmonial ",\n            Number(testimonial.index) + 1,\n            " Here:"\n          ),\n          wp.element.createElement(\n            "span",\n            {\n              className: "remove-testimonial",\n              onClick: function onClick() {\n                var newTestimonials = testimonials.filter(function (item) {\n                  return item.index != testimonial.index;\n                }).map(function (t) {\n                  if (t.index > testimonial.index) {\n                    t.index -= 1;\n                  }\n\n                  return t;\n                });\n\n                props.setAttributes({\n                  testimonials: newTestimonials\n                });\n              }\n            },\n            wp.element.createElement("i", { className: "fa fa-times" })\n          )\n        ),\n        wp.element.createElement(\n          "blockquote",\n          { className: "wp-block-quote" },\n          wp.element.createElement(PlainText, {\n            className: "content-plain-text",\n            style: { height: 58 },\n            placeholder: "Testimonial Text",\n            value: testimonial.content,\n            autoFocus: true,\n            onChange: function onChange(content) {\n              var newObject = assign_default()({}, testimonial, {\n                content: content\n              });\n              props.setAttributes({\n                testimonials: [].concat(toConsumableArray_default()(testimonials.filter(function (item) {\n                  return item.index != testimonial.index;\n                })), [newObject])\n              });\n            }\n          }),\n          wp.element.createElement(\n            "div",\n            { className: "row" },\n            wp.element.createElement(\n              "div",\n              { className: "gts__picture col-3" },\n              wp.element.createElement(MediaUpload, {\n                onSelect: function onSelect(media) {\n                  var image = media.sizes.medium ? media.sizes.medium.url : media.url;\n                  var newObject = assign_default()({}, testimonial, {\n                    image: image\n                  });\n                  props.setAttributes({\n                    testimonials: [].concat(toConsumableArray_default()(testimonials.filter(function (item) {\n                      return item.index != testimonial.index;\n                    })), [newObject])\n                  });\n                },\n                type: "image",\n                value: testimonial.image,\n                render: function render(_ref) {\n                  var open = _ref.open;\n                  return !!testimonial.image ? wp.element.createElement(\n                    "div",\n                    null,\n                    props.isSelected && wp.element.createElement(\n                      "div",\n                      { className: "gts__picture__actions" },\n                      wp.element.createElement(\n                        "a",\n                        {\n                          onClick: function onClick() {\n                            var newObject = assign_default()({}, testimonial, {\n                              image: null\n                            });\n                            props.setAttributes({\n                              testimonials: [].concat(toConsumableArray_default()(testimonials.filter(function (item) {\n                                return item.index != testimonial.index;\n                              })), [newObject])\n                            });\n                          }\n                        },\n                        "\\xD7 Remove"\n                      )\n                    ),\n                    wp.element.createElement("div", {\n                      className: "gts__picture__image",\n                      style: {\n                        backgroundImage: "url(" + testimonial.image + ")"\n                      },\n                      onClick: open\n                    })\n                  ) : wp.element.createElement(\n                    "a",\n                    { className: "gts__picture__image", onClick: open },\n                    "Select Image"\n                  );\n                }\n              })\n            ),\n            wp.element.createElement(\n              "div",\n              { className: "col-9 mt-3" },\n              wp.element.createElement(PlainText, {\n                className: "author-plain-text",\n                placeholder: "Author",\n                value: testimonial.author,\n                onChange: function onChange(author) {\n                  var newObject = assign_default()({}, testimonial, {\n                    author: author\n                  });\n                  props.setAttributes({\n                    testimonials: [].concat(toConsumableArray_default()(testimonials.filter(function (item) {\n                      return item.index != testimonial.index;\n                    })), [newObject])\n                  });\n                }\n              }),\n              wp.element.createElement(PlainText, {\n                className: "link-plain-text",\n                placeholder: "Link to Author Profile",\n                value: testimonial.link,\n                onChange: function onChange(link) {\n                  var newObject = assign_default()({}, testimonial, {\n                    link: link\n                  });\n                  props.setAttributes({\n                    testimonials: [].concat(toConsumableArray_default()(testimonials.filter(function (item) {\n                      return item.index != testimonial.index;\n                    })), [newObject])\n                  });\n                }\n              })\n            )\n          )\n        )\n      );\n    });\n    return wp.element.createElement(\n      "div",\n      null,\n      testimonialsList,\n      wp.element.createElement(\n        "button",\n        {\n          className: "add-more-testimonial",\n          onClick: function onClick(content) {\n            return props.setAttributes({\n              testimonials: [].concat(toConsumableArray_default()(props.attributes.testimonials), [{\n                index: props.attributes.testimonials.length,\n                content: "",\n                author: "",\n                link: ""\n              }])\n            });\n          }\n        },\n        "+"\n      )\n    );\n  },\n\n  /**\r\n   * The save function defines the way in which the different attributes should be combined\r\n   * into the final markup, which is then serialized by Gutenberg into post_content.\r\n   *\r\n   * The "save" property must be specified and must be a valid function.\r\n   *\r\n   * @link https://wordpress.org/gutenberg/handbook/block-api/block-edit-save/\r\n   */\n  save: function save(props) {\n    var testimonials = props.attributes.testimonials; // Content in our block.\n\n    var id = props.attributes.id;\n    var carouselIndicators = testimonials.map(function (testimonial, index) {\n      return wp.element.createElement("li", {\n        "data-target": "#" + id,\n        "data-slide-to": index,\n        className: testimonial.index == 0 ? "active" : ""\n      });\n    });\n    var testimonialsList = testimonials.map(function (testimonial) {\n      var carouselClass = testimonial.index == 0 ? "carousel-item active" : "carousel-item";\n      return wp.element.createElement(\n        "div",\n        { className: carouselClass, key: testimonial.index },\n        wp.element.createElement(\n          "blockquote",\n          { className: "testimonial" },\n          wp.element.createElement(\n            "span",\n            { className: "testimonial-index", style: { display: "none" } },\n            testimonial.index\n          ),\n          testimonial.content && wp.element.createElement(\n            "p",\n            { className: "testimonial-text-container" },\n            wp.element.createElement("i", { className: "fa fa-quote-left pull-left", "aria-hidden": "true" }),\n            wp.element.createElement(\n              "span",\n              { className: "testimonial-text" },\n              testimonial.content\n            ),\n            wp.element.createElement("i", { "class": "fa fa-quote-right pull-right", "aria-hidden": "true" })\n          ),\n          wp.element.createElement(\n            "div",\n            { className: "row" },\n            testimonial.image && wp.element.createElement(\n              "div",\n              { className: "gts__picture col-3" },\n              wp.element.createElement("img", { src: testimonial.image, style: { display: \'none\' } }),\n              wp.element.createElement("div", {\n                className: "gts__picture__image",\n                style: {\n                  backgroundImage: "url(" + testimonial.image + ")"\n                }\n              })\n            ),\n            wp.element.createElement(\n              "div",\n              { className: "testimonial-author-container mt-3 col-9" },\n              testimonial.author && wp.element.createElement(\n                "p",\n                { className: "testimonial-author-name" },\n                wp.element.createElement(\n                  "span",\n                  { className: "testimonial-author" },\n                  "\\u2014 ",\n                  wp.element.createElement(\n                    "span",\n                    null,\n                    testimonial.author\n                  )\n                )\n              ),\n              testimonial.link && wp.element.createElement(\n                "p",\n                { className: "testimonial-author-container" },\n                wp.element.createElement(\n                  "a",\n                  { target: "_blank", href: testimonial.link },\n                  wp.element.createElement("i", { className: "fas fa-user" }),\n                  wp.element.createElement(\n                    "span",\n                    { className: "testimonial-author-link" },\n                    testimonial.link\n                  )\n                )\n              )\n            )\n          )\n        )\n      );\n    });\n    if (testimonials.length > 0) {\n      return wp.element.createElement(\n        "div",\n        { className: "testimonial-slider" },\n        wp.element.createElement(\n          "div",\n          { className: "carousel slide", "data-ride": "carousel", id: id },\n          wp.element.createElement(\n            "ol",\n            { className: "carousel-indicators" },\n            carouselIndicators\n          ),\n          wp.element.createElement(\n            "div",\n            { className: "carousel-inner w-75 mx-auto" },\n            testimonialsList\n          ),\n          wp.element.createElement(\n            "a",\n            {\n              "class": "carousel-control-prev",\n              href: "#" + id,\n              role: "button",\n              "data-slide": "prev"\n            },\n            wp.element.createElement(\n              "span",\n              { "class": "carousel-control-prev-icon", "aria-hidden": "true" },\n              wp.element.createElement("i", { className: "fa fa-chevron-left" })\n            ),\n            wp.element.createElement(\n              "span",\n              { "class": "sr-only" },\n              "Previous"\n            )\n          ),\n          wp.element.createElement(\n            "a",\n            {\n              "class": "carousel-control-next",\n              href: "#" + id,\n              role: "button",\n              "data-slide": "next"\n            },\n            wp.element.createElement(\n              "span",\n              { "class": "carousel-control-next-icon", "aria-hidden": "true" },\n              wp.element.createElement("i", { className: "fa fa-chevron-right" })\n            ),\n            wp.element.createElement(\n              "span",\n              { "class": "sr-only" },\n              "Next"\n            )\n          )\n        )\n      );\n    } else return null;\n  }\n});\n// CONCATENATED MODULE: ./src/index.js\n/**\r\n * Import blocks\r\n */\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYmxvY2svc2xpZGVyLmpzP2NlOWEiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LmpzPzM3MDAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX09iamVjdCRhc3NpZ24gZnJvbSBcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduXCI7XG4vKipcclxuICogQkxPQ0s6IG15LWJsb2NrXHJcbiAqXHJcbiAqIFJlZ2lzdGVyaW5nIGEgYmFzaWMgYmxvY2sgd2l0aCBHdXRlbmJlcmcuXHJcbiAqIFNpbXBsZSBibG9jaywgcmVuZGVycyBhbmQgc2F2ZXMgdGhlIHNhbWUgY29udGVudCB3aXRob3V0IGFueSBpbnRlcmFjdGl2aXR5LlxyXG4gKi9cblxuLy8gIEltcG9ydCBDU1MuXG5pbXBvcnQgXCIuL3N0eWxlLnNjc3NcIjtcbmltcG9ydCBcIi4vZWRpdG9yLnNjc3NcIjtcblxudmFyIF9fID0gd3AuaTE4bi5fXzsgLy8gVGhlIF9fKCkgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLlxudmFyIHJlZ2lzdGVyQmxvY2tUeXBlID0gd3AuYmxvY2tzLnJlZ2lzdGVyQmxvY2tUeXBlOyAvLyBUaGUgcmVnaXN0ZXJCbG9ja1R5cGUoKSB0byByZWdpc3RlciBibG9ja3MuXG52YXIgX3dwJGVkaXRvciA9IHdwLmVkaXRvcixcbiAgICBNZWRpYVVwbG9hZCA9IF93cCRlZGl0b3IuTWVkaWFVcGxvYWQsXG4gICAgUGxhaW5UZXh0ID0gX3dwJGVkaXRvci5QbGFpblRleHQ7XG5cbi8qKlxyXG4gKiBSZWdpc3RlcjogYSBHdXRlbmJlcmcgQmxvY2suXHJcbiAqXHJcbiAqIFJlZ2lzdGVycyBhIG5ldyBibG9jayBwcm92aWRlZCBhIHVuaXF1ZSBuYW1lIGFuZCBhbiBvYmplY3QgZGVmaW5pbmcgaXRzXHJcbiAqIGJlaGF2aW9yLiBPbmNlIHJlZ2lzdGVyZWQsIHRoZSBibG9jayBpcyBtYWRlIGVkaXRvciBhcyBhbiBvcHRpb24gdG8gYW55XHJcbiAqIGVkaXRvciBpbnRlcmZhY2Ugd2hlcmUgYmxvY2tzIGFyZSBpbXBsZW1lbnRlZC5cclxuICpcclxuICogQGxpbmsgaHR0cHM6Ly93b3JkcHJlc3Mub3JnL2d1dGVuYmVyZy9oYW5kYm9vay9ibG9jay1hcGkvXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gICBuYW1lICAgICBCbG9jayBuYW1lLlxyXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgc2V0dGluZ3MgQmxvY2sgc2V0dGluZ3MuXHJcbiAqIEByZXR1cm4gez9XUEJsb2NrfSAgICAgICAgICBUaGUgYmxvY2ssIGlmIGl0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZDsgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxyXG4gKi9cblxucmVnaXN0ZXJCbG9ja1R5cGUoXCJndHMvdGVzdGltb25pYWxzLXNsaWRlci1ibG9ja1wiLCB7XG4gIC8vIEJsb2NrIG5hbWUuIEJsb2NrIG5hbWVzIG11c3QgYmUgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBuYW1lc3BhY2UgcHJlZml4LiBFeGFtcGxlOiBteS1wbHVnaW4vbXktY3VzdG9tLWJsb2NrLlxuICB0aXRsZTogX18oXCJUZXN0aW1vbmlhbHMgU2xpZGVyXCIpLCAvLyBCbG9jayB0aXRsZS5cbiAgaWNvbjogXCJmb3JtYXQtcXVvdGVcIiwgLy8gQmxvY2sgaWNvbiBmcm9tIERhc2hpY29ucyDihpIgaHR0cHM6Ly9kZXZlbG9wZXIud29yZHByZXNzLm9yZy9yZXNvdXJjZS9kYXNoaWNvbnMvLlxuICBjYXRlZ29yeTogXCJjb21tb25cIiwgLy8gQmxvY2sgY2F0ZWdvcnkg4oCUIEdyb3VwIGJsb2NrcyB0b2dldGhlciBiYXNlZCBvbiBjb21tb24gdHJhaXRzIEUuZy4gY29tbW9uLCBmb3JtYXR0aW5nLCBsYXlvdXQgd2lkZ2V0cywgZW1iZWQuXG4gIGtleXdvcmRzOiBbX18oXCJUZXN0aW1vbmlhbHMgU2xpZGVyXCIpLCBfXyhcImd0c1wiKV0sXG5cbiAgYXR0cmlidXRlczoge1xuICAgIHRlc3RpbW9uaWFsczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgc291cmNlOiBcInF1ZXJ5XCIsXG4gICAgICBkZWZhdWx0OiBbXSxcbiAgICAgIHNlbGVjdG9yOiBcImJsb2NrcXVvdGUudGVzdGltb25pYWxcIixcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgc291cmNlOiBcImF0dHJpYnV0ZVwiLFxuICAgICAgICAgIHNlbGVjdG9yOiBcImltZ1wiLFxuICAgICAgICAgIGF0dHJpYnV0ZTogXCJzcmNcIlxuICAgICAgICB9LFxuICAgICAgICBpbmRleDoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgc291cmNlOiBcInRleHRcIixcbiAgICAgICAgICBzZWxlY3RvcjogXCJzcGFuLnRlc3RpbW9uaWFsLWluZGV4XCJcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudDoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgc291cmNlOiBcInRleHRcIixcbiAgICAgICAgICBzZWxlY3RvcjogXCJzcGFuLnRlc3RpbW9uaWFsLXRleHRcIlxuICAgICAgICB9LFxuICAgICAgICBhdXRob3I6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIHNvdXJjZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgc2VsZWN0b3I6IFwic3Bhbi50ZXN0aW1vbmlhbC1hdXRob3Igc3BhblwiXG4gICAgICAgIH0sXG4gICAgICAgIGxpbms6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIHNvdXJjZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgc2VsZWN0b3I6IFwiLnRlc3RpbW9uaWFsLWF1dGhvci1saW5rXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgaWQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBzb3VyY2U6IFwiYXR0cmlidXRlXCIsXG4gICAgICBzZWxlY3RvcjogXCIuY2Fyb3VzZWwuc2xpZGVcIixcbiAgICAgIGF0dHJpYnV0ZTogXCJpZFwiXG4gICAgfVxuICB9LFxuXG4gIC8qKlxyXG4gICAqIFRoZSBlZGl0IGZ1bmN0aW9uIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHlvdXIgYmxvY2sgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGVkaXRvci5cclxuICAgKiBUaGlzIHJlcHJlc2VudHMgd2hhdCB0aGUgZWRpdG9yIHdpbGwgcmVuZGVyIHdoZW4gdGhlIGJsb2NrIGlzIHVzZWQuXHJcbiAgICpcclxuICAgKiBUaGUgXCJlZGl0XCIgcHJvcGVydHkgbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uLlxyXG4gICAqXHJcbiAgICogQGxpbmsgaHR0cHM6Ly93b3JkcHJlc3Mub3JnL2d1dGVuYmVyZy9oYW5kYm9vay9ibG9jay1hcGkvYmxvY2stZWRpdC1zYXZlL1xyXG4gICAqL1xuXG4gIC8vIFRoZSBcImVkaXRcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgdmFsaWQgZnVuY3Rpb24uXG4gIGVkaXQ6IGZ1bmN0aW9uIGVkaXQocHJvcHMpIHtcbiAgICB2YXIgdGVzdGltb25pYWxzID0gcHJvcHMuYXR0cmlidXRlcy50ZXN0aW1vbmlhbHM7XG5cbiAgICBpZiAoIXByb3BzLmF0dHJpYnV0ZXMuaWQpIHtcbiAgICAgIHZhciBpZCA9IFwidGVzdGltb25pYWxcIiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMCk7XG4gICAgICBwcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgaWQ6IGlkXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgdGVzdGltb25pYWxzTGlzdCA9IHRlc3RpbW9uaWFscy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgfSkubWFwKGZ1bmN0aW9uICh0ZXN0aW1vbmlhbCkge1xuICAgICAgcmV0dXJuIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgeyBjbGFzc05hbWU6IFwiZ3RzLXRlc3RpbW9uaWFsLWJsb2NrXCIgfSxcbiAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIFwicFwiLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgXCJJbnNlcnQgVGVzdG1vbmlhbCBcIixcbiAgICAgICAgICAgIE51bWJlcih0ZXN0aW1vbmlhbC5pbmRleCkgKyAxLFxuICAgICAgICAgICAgXCIgSGVyZTpcIlxuICAgICAgICAgICksXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJyZW1vdmUtdGVzdGltb25pYWxcIixcbiAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3VGVzdGltb25pYWxzID0gdGVzdGltb25pYWxzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaW5kZXggIT0gdGVzdGltb25pYWwuaW5kZXg7XG4gICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICBpZiAodC5pbmRleCA+IHRlc3RpbW9uaWFsLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHQuaW5kZXggLT0gMTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBwcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIHRlc3RpbW9uaWFsczogbmV3VGVzdGltb25pYWxzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXCJpXCIsIHsgY2xhc3NOYW1lOiBcImZhIGZhLXRpbWVzXCIgfSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBcImJsb2NrcXVvdGVcIixcbiAgICAgICAgICB7IGNsYXNzTmFtZTogXCJ3cC1ibG9jay1xdW90ZVwiIH0sXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFBsYWluVGV4dCwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImNvbnRlbnQtcGxhaW4tdGV4dFwiLFxuICAgICAgICAgICAgc3R5bGU6IHsgaGVpZ2h0OiA1OCB9LFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiVGVzdGltb25pYWwgVGV4dFwiLFxuICAgICAgICAgICAgdmFsdWU6IHRlc3RpbW9uaWFsLmNvbnRlbnQsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IHRydWUsXG4gICAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoY29udGVudCkge1xuICAgICAgICAgICAgICB2YXIgbmV3T2JqZWN0ID0gX09iamVjdCRhc3NpZ24oe30sIHRlc3RpbW9uaWFsLCB7XG4gICAgICAgICAgICAgICAgY29udGVudDogY29udGVudFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcHJvcHMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgdGVzdGltb25pYWxzOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRlc3RpbW9uaWFscy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmluZGV4ICE9IHRlc3RpbW9uaWFsLmluZGV4O1xuICAgICAgICAgICAgICAgIH0pKSwgW25ld09iamVjdF0pXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJyb3dcIiB9LFxuICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJndHNfX3BpY3R1cmUgY29sLTNcIiB9LFxuICAgICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoTWVkaWFVcGxvYWQsIHtcbiAgICAgICAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QobWVkaWEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBpbWFnZSA9IG1lZGlhLnNpemVzLm1lZGl1bSA/IG1lZGlhLnNpemVzLm1lZGl1bS51cmwgOiBtZWRpYS51cmw7XG4gICAgICAgICAgICAgICAgICB2YXIgbmV3T2JqZWN0ID0gX09iamVjdCRhc3NpZ24oe30sIHRlc3RpbW9uaWFsLCB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlOiBpbWFnZVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGltb25pYWxzOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRlc3RpbW9uaWFscy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pbmRleCAhPSB0ZXN0aW1vbmlhbC5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfSkpLCBbbmV3T2JqZWN0XSlcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0ZXN0aW1vbmlhbC5pbWFnZSxcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihfcmVmKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgb3BlbiA9IF9yZWYub3BlbjtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAhIXRlc3RpbW9uaWFsLmltYWdlID8gd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5pc1NlbGVjdGVkICYmIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcImd0c19fcGljdHVyZV9fYWN0aW9uc1wiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld09iamVjdCA9IF9PYmplY3QkYXNzaWduKHt9LCB0ZXN0aW1vbmlhbCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RpbW9uaWFsczogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh0ZXN0aW1vbmlhbHMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmluZGV4ICE9IHRlc3RpbW9uaWFsLmluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBbbmV3T2JqZWN0XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXFx4RDcgUmVtb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImd0c19fcGljdHVyZV9faW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcInVybChcIiArIHRlc3RpbW9uaWFsLmltYWdlICsgXCIpXCJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IG9wZW5cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICkgOiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiYVwiLFxuICAgICAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJndHNfX3BpY3R1cmVfX2ltYWdlXCIsIG9uQ2xpY2s6IG9wZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgXCJTZWxlY3QgSW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJjb2wtOSBtdC0zXCIgfSxcbiAgICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFBsYWluVGV4dCwge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJhdXRob3ItcGxhaW4tdGV4dFwiLFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIkF1dGhvclwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0ZXN0aW1vbmlhbC5hdXRob3IsXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGF1dGhvcikge1xuICAgICAgICAgICAgICAgICAgdmFyIG5ld09iamVjdCA9IF9PYmplY3QkYXNzaWduKHt9LCB0ZXN0aW1vbmlhbCwge1xuICAgICAgICAgICAgICAgICAgICBhdXRob3I6IGF1dGhvclxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGltb25pYWxzOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRlc3RpbW9uaWFscy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pbmRleCAhPSB0ZXN0aW1vbmlhbC5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfSkpLCBbbmV3T2JqZWN0XSlcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChQbGFpblRleHQsIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwibGluay1wbGFpbi10ZXh0XCIsXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiTGluayB0byBBdXRob3IgUHJvZmlsZVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0ZXN0aW1vbmlhbC5saW5rLFxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShsaW5rKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbmV3T2JqZWN0ID0gX09iamVjdCRhc3NpZ24oe30sIHRlc3RpbW9uaWFsLCB7XG4gICAgICAgICAgICAgICAgICAgIGxpbms6IGxpbmtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RpbW9uaWFsczogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh0ZXN0aW1vbmlhbHMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaW5kZXggIT0gdGVzdGltb25pYWwuaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH0pKSwgW25ld09iamVjdF0pXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICBcImRpdlwiLFxuICAgICAgbnVsbCxcbiAgICAgIHRlc3RpbW9uaWFsc0xpc3QsXG4gICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiYWRkLW1vcmUtdGVzdGltb25pYWxcIixcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgdGVzdGltb25pYWxzOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByb3BzLmF0dHJpYnV0ZXMudGVzdGltb25pYWxzKSwgW3tcbiAgICAgICAgICAgICAgICBpbmRleDogcHJvcHMuYXR0cmlidXRlcy50ZXN0aW1vbmlhbHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgYXV0aG9yOiBcIlwiLFxuICAgICAgICAgICAgICAgIGxpbms6IFwiXCJcbiAgICAgICAgICAgICAgfV0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiK1wiXG4gICAgICApXG4gICAgKTtcbiAgfSxcblxuICAvKipcclxuICAgKiBUaGUgc2F2ZSBmdW5jdGlvbiBkZWZpbmVzIHRoZSB3YXkgaW4gd2hpY2ggdGhlIGRpZmZlcmVudCBhdHRyaWJ1dGVzIHNob3VsZCBiZSBjb21iaW5lZFxyXG4gICAqIGludG8gdGhlIGZpbmFsIG1hcmt1cCwgd2hpY2ggaXMgdGhlbiBzZXJpYWxpemVkIGJ5IEd1dGVuYmVyZyBpbnRvIHBvc3RfY29udGVudC5cclxuICAgKlxyXG4gICAqIFRoZSBcInNhdmVcIiBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBhbmQgbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uLlxyXG4gICAqXHJcbiAgICogQGxpbmsgaHR0cHM6Ly93b3JkcHJlc3Mub3JnL2d1dGVuYmVyZy9oYW5kYm9vay9ibG9jay1hcGkvYmxvY2stZWRpdC1zYXZlL1xyXG4gICAqL1xuICBzYXZlOiBmdW5jdGlvbiBzYXZlKHByb3BzKSB7XG4gICAgdmFyIHRlc3RpbW9uaWFscyA9IHByb3BzLmF0dHJpYnV0ZXMudGVzdGltb25pYWxzOyAvLyBDb250ZW50IGluIG91ciBibG9jay5cblxuICAgIHZhciBpZCA9IHByb3BzLmF0dHJpYnV0ZXMuaWQ7XG4gICAgdmFyIGNhcm91c2VsSW5kaWNhdG9ycyA9IHRlc3RpbW9uaWFscy5tYXAoZnVuY3Rpb24gKHRlc3RpbW9uaWFsLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgXCJkYXRhLXRhcmdldFwiOiBcIiNcIiArIGlkLFxuICAgICAgICBcImRhdGEtc2xpZGUtdG9cIjogaW5kZXgsXG4gICAgICAgIGNsYXNzTmFtZTogdGVzdGltb25pYWwuaW5kZXggPT0gMCA/IFwiYWN0aXZlXCIgOiBcIlwiXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgdGVzdGltb25pYWxzTGlzdCA9IHRlc3RpbW9uaWFscy5tYXAoZnVuY3Rpb24gKHRlc3RpbW9uaWFsKSB7XG4gICAgICB2YXIgY2Fyb3VzZWxDbGFzcyA9IHRlc3RpbW9uaWFsLmluZGV4ID09IDAgPyBcImNhcm91c2VsLWl0ZW0gYWN0aXZlXCIgOiBcImNhcm91c2VsLWl0ZW1cIjtcbiAgICAgIHJldHVybiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHsgY2xhc3NOYW1lOiBjYXJvdXNlbENsYXNzLCBrZXk6IHRlc3RpbW9uaWFsLmluZGV4IH0sXG4gICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBcImJsb2NrcXVvdGVcIixcbiAgICAgICAgICB7IGNsYXNzTmFtZTogXCJ0ZXN0aW1vbmlhbFwiIH0sXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJ0ZXN0aW1vbmlhbC1pbmRleFwiLCBzdHlsZTogeyBkaXNwbGF5OiBcIm5vbmVcIiB9IH0sXG4gICAgICAgICAgICB0ZXN0aW1vbmlhbC5pbmRleFxuICAgICAgICAgICksXG4gICAgICAgICAgdGVzdGltb25pYWwuY29udGVudCAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInBcIixcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcInRlc3RpbW9uaWFsLXRleHQtY29udGFpbmVyXCIgfSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcImlcIiwgeyBjbGFzc05hbWU6IFwiZmEgZmEtcXVvdGUtbGVmdCBwdWxsLWxlZnRcIiwgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIiB9KSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcInRlc3RpbW9uaWFsLXRleHRcIiB9LFxuICAgICAgICAgICAgICB0ZXN0aW1vbmlhbC5jb250ZW50XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFwiaVwiLCB7IFwiY2xhc3NcIjogXCJmYSBmYS1xdW90ZS1yaWdodCBwdWxsLXJpZ2h0XCIsIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIgfSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJyb3dcIiB9LFxuICAgICAgICAgICAgdGVzdGltb25pYWwuaW1hZ2UgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJndHNfX3BpY3R1cmUgY29sLTNcIiB9LFxuICAgICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwgeyBzcmM6IHRlc3RpbW9uaWFsLmltYWdlLCBzdHlsZTogeyBkaXNwbGF5OiAnbm9uZScgfSB9KSxcbiAgICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiZ3RzX19waWN0dXJlX19pbWFnZVwiLFxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwidXJsKFwiICsgdGVzdGltb25pYWwuaW1hZ2UgKyBcIilcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcInRlc3RpbW9uaWFsLWF1dGhvci1jb250YWluZXIgbXQtMyBjb2wtOVwiIH0sXG4gICAgICAgICAgICAgIHRlc3RpbW9uaWFsLmF1dGhvciAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJwXCIsXG4gICAgICAgICAgICAgICAgeyBjbGFzc05hbWU6IFwidGVzdGltb25pYWwtYXV0aG9yLW5hbWVcIiB9LFxuICAgICAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgeyBjbGFzc05hbWU6IFwidGVzdGltb25pYWwtYXV0aG9yXCIgfSxcbiAgICAgICAgICAgICAgICAgIFwiXFx1MjAxNCBcIixcbiAgICAgICAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRlc3RpbW9uaWFsLmF1dGhvclxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgdGVzdGltb25pYWwubGluayAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJwXCIsXG4gICAgICAgICAgICAgICAgeyBjbGFzc05hbWU6IFwidGVzdGltb25pYWwtYXV0aG9yLWNvbnRhaW5lclwiIH0sXG4gICAgICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgXCJhXCIsXG4gICAgICAgICAgICAgICAgICB7IHRhcmdldDogXCJfYmxhbmtcIiwgaHJlZjogdGVzdGltb25pYWwubGluayB9LFxuICAgICAgICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFwiaVwiLCB7IGNsYXNzTmFtZTogXCJmYXMgZmEtdXNlclwiIH0pLFxuICAgICAgICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgeyBjbGFzc05hbWU6IFwidGVzdGltb25pYWwtYXV0aG9yLWxpbmtcIiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXN0aW1vbmlhbC5saW5rXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmICh0ZXN0aW1vbmlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgeyBjbGFzc05hbWU6IFwidGVzdGltb25pYWwtc2xpZGVyXCIgfSxcbiAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgeyBjbGFzc05hbWU6IFwiY2Fyb3VzZWwgc2xpZGVcIiwgXCJkYXRhLXJpZGVcIjogXCJjYXJvdXNlbFwiLCBpZDogaWQgfSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcIm9sXCIsXG4gICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJjYXJvdXNlbC1pbmRpY2F0b3JzXCIgfSxcbiAgICAgICAgICAgIGNhcm91c2VsSW5kaWNhdG9yc1xuICAgICAgICAgICksXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcImNhcm91c2VsLWlubmVyIHctNzUgbXgtYXV0b1wiIH0sXG4gICAgICAgICAgICB0ZXN0aW1vbmlhbHNMaXN0XG4gICAgICAgICAgKSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcImFcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJjbGFzc1wiOiBcImNhcm91c2VsLWNvbnRyb2wtcHJldlwiLFxuICAgICAgICAgICAgICBocmVmOiBcIiNcIiArIGlkLFxuICAgICAgICAgICAgICByb2xlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICBcImRhdGEtc2xpZGVcIjogXCJwcmV2XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICB7IFwiY2xhc3NcIjogXCJjYXJvdXNlbC1jb250cm9sLXByZXYtaWNvblwiLCBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiIH0sXG4gICAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcImlcIiwgeyBjbGFzc05hbWU6IFwiZmEgZmEtY2hldnJvbi1sZWZ0XCIgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICB7IFwiY2xhc3NcIjogXCJzci1vbmx5XCIgfSxcbiAgICAgICAgICAgICAgXCJQcmV2aW91c1wiXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcImFcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJjbGFzc1wiOiBcImNhcm91c2VsLWNvbnRyb2wtbmV4dFwiLFxuICAgICAgICAgICAgICBocmVmOiBcIiNcIiArIGlkLFxuICAgICAgICAgICAgICByb2xlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICBcImRhdGEtc2xpZGVcIjogXCJuZXh0XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICB7IFwiY2xhc3NcIjogXCJjYXJvdXNlbC1jb250cm9sLW5leHQtaWNvblwiLCBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiIH0sXG4gICAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcImlcIiwgeyBjbGFzc05hbWU6IFwiZmEgZmEtY2hldnJvbi1yaWdodFwiIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgeyBcImNsYXNzXCI6IFwic3Itb25seVwiIH0sXG4gICAgICAgICAgICAgIFwiTmV4dFwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSByZXR1cm4gbnVsbDtcbiAgfVxufSk7IiwiLyoqXHJcbiAqIEltcG9ydCBibG9ja3NcclxuICovXG5pbXBvcnQgJy4vYmxvY2svc2xpZGVyLmpzJzsiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbmJBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///60\n')},
     368/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/babel-runtime/helpers/toConsumableArray.js (<- Module is not an ECMAScript module) */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/babel-runtime/helpers/toConsumableArray.js\nvar toConsumableArray = __webpack_require__(1);\nvar toConsumableArray_default = /*#__PURE__*/__webpack_require__.n(toConsumableArray);\n\n// EXTERNAL MODULE: ./node_modules/babel-runtime/core-js/object/assign.js\nvar object_assign = __webpack_require__(2);\nvar assign_default = /*#__PURE__*/__webpack_require__.n(object_assign);\n\n// EXTERNAL MODULE: ./src/block/style.scss\nvar style = __webpack_require__(61);\n\n// EXTERNAL MODULE: ./src/block/editor.scss\nvar editor = __webpack_require__(62);\n\n// CONCATENATED MODULE: ./src/block/slider.js\n\n\n/**\r\n * BLOCK: my-block\r\n *\r\n * Registering a basic block with Gutenberg.\r\n * Simple block, renders and saves the same content without any interactivity.\r\n */\n\n//  Import CSS.\n\n\n\nvar __ = wp.i18n.__; // The __() for internationalization.\nvar registerBlockType = wp.blocks.registerBlockType; // The registerBlockType() to register blocks.\nvar _wp$editor = wp.editor,\n    MediaUpload = _wp$editor.MediaUpload,\n    PlainText = _wp$editor.PlainText;\n\n/**\r\n * Register: a Gutenberg Block.\r\n *\r\n * Registers a new block provided a unique name and an object defining its\r\n * behavior. Once registered, the block is made editor as an option to any\r\n * editor interface where blocks are implemented.\r\n *\r\n * @link https://wordpress.org/gutenberg/handbook/block-api/\r\n * @param  {string}   name     Block name.\r\n * @param  {Object}   settings Block settings.\r\n * @return {?WPBlock}          The block, if it has been successfully\r\n *                             registered; otherwise `undefined`.\r\n */\n\nregisterBlockType("gts/testimonials-slider-block", {\n  // Block name. Block names must be string that contains a namespace prefix. Example: my-plugin/my-custom-block.\n  title: __("Testimonials Slider"), // Block title.\n  icon: "format-quote", // Block icon from Dashicons → https://developer.wordpress.org/resource/dashicons/.\n  category: "common", // Block category — Group blocks together based on common traits E.g. common, formatting, layout widgets, embed.\n  keywords: [__("Testimonials Slider"), __("gts")],\n\n  attributes: {\n    id: {\n      source: "attribute",\n      selector: ".carousel.slide",\n      attribute: "id"\n    },\n    testimonials: {\n      source: "query",\n      default: [],\n      selector: "blockquote.testimonial",\n      query: {\n        image: {\n          source: "attribute",\n          selector: "img",\n          attribute: "src"\n        },\n        index: {\n          source: "text",\n          selector: "span.testimonial-index"\n        },\n        content: {\n          source: "text",\n          selector: "span.testimonial-text"\n        },\n        author: {\n          source: "text",\n          selector: "span.testimonial-author span"\n        },\n        link: {\n          source: "text",\n          selector: ".testimonial-author-link"\n        }\n      }\n    }\n  },\n\n  /**\r\n   * The edit function describes the structure of your block in the context of the editor.\r\n   * This represents what the editor will render when the block is used.\r\n   *\r\n   * The "edit" property must be a valid function.\r\n   *\r\n   * @link https://wordpress.org/gutenberg/handbook/block-api/block-edit-save/\r\n   */\n\n  // The "edit" property must be a valid function.\n  edit: function edit(props) {\n    var testimonials = props.attributes.testimonials;\n\n\n    if (!props.attributes.id) {\n      var id = "testimonial" + Math.floor(Math.random() * 100);\n      props.setAttributes({\n        id: id\n      });\n    }\n\n    var testimonialsList = testimonials.sort(function (a, b) {\n      return a.index - b.index;\n    }).map(function (testimonial) {\n      return wp.element.createElement(\n        "div",\n        { className: "gts-testimonial-block" },\n        wp.element.createElement(\n          "p",\n          null,\n          wp.element.createElement(\n            "span",\n            null,\n            "Insert Testmonial ",\n            Number(testimonial.index) + 1,\n            " Here:"\n          ),\n          wp.element.createElement(\n            "span",\n            {\n              className: "remove-testimonial",\n              onClick: function onClick() {\n                var newTestimonials = testimonials.filter(function (item) {\n                  return item.index != testimonial.index;\n                }).map(function (t) {\n                  if (t.index > testimonial.index) {\n                    t.index -= 1;\n                  }\n\n                  return t;\n                });\n\n                props.setAttributes({\n                  testimonials: newTestimonials\n                });\n              }\n            },\n            wp.element.createElement("i", { className: "fa fa-times" })\n          )\n        ),\n        wp.element.createElement(\n          "blockquote",\n          { className: "wp-block-quote" },\n          wp.element.createElement(PlainText, {\n            className: "content-plain-text",\n            style: { height: 58 },\n            placeholder: "Testimonial Text",\n            value: testimonial.content,\n            autoFocus: true,\n            onChange: function onChange(content) {\n              var newObject = assign_default()({}, testimonial, {\n                content: content\n              });\n              props.setAttributes({\n                testimonials: [].concat(toConsumableArray_default()(testimonials.filter(function (item) {\n                  return item.index != testimonial.index;\n                })), [newObject])\n              });\n            }\n          }),\n          wp.element.createElement(\n            "div",\n            { className: "row" },\n            wp.element.createElement(\n              "div",\n              { className: "gts__picture col-3" },\n              wp.element.createElement(MediaUpload, {\n                onSelect: function onSelect(media) {\n                  var image = media.sizes.medium ? media.sizes.medium.url : media.url;\n                  var newObject = assign_default()({}, testimonial, {\n                    image: image\n                  });\n                  props.setAttributes({\n                    testimonials: [].concat(toConsumableArray_default()(testimonials.filter(function (item) {\n                      return item.index != testimonial.index;\n                    })), [newObject])\n                  });\n                },\n                type: "image",\n                value: testimonial.image,\n                render: function render(_ref) {\n                  var open = _ref.open;\n                  return !!testimonial.image ? wp.element.createElement(\n                    "div",\n                    null,\n                    props.isSelected && wp.element.createElement(\n                      "div",\n                      { className: "gts__picture__actions" },\n                      wp.element.createElement(\n                        "a",\n                        {\n                          href: "#",\n                          onClick: function onClick() {\n                            var newObject = assign_default()({}, testimonial, {\n                              image: null\n                            });\n                            props.setAttributes({\n                              testimonials: [].concat(toConsumableArray_default()(testimonials.filter(function (item) {\n                                return item.index != testimonial.index;\n                              })), [newObject])\n                            });\n                          }\n                        },\n                        "\\xD7 Remove"\n                      )\n                    ),\n                    wp.element.createElement("div", {\n                      className: "gts__picture__image",\n                      style: {\n                        backgroundImage: "url(" + testimonial.image + ")"\n                      },\n                      onClick: open\n                    })\n                  ) : wp.element.createElement(\n                    "a",\n                    {\n                      href: "#",\n                      className: "gts__picture__image",\n                      onClick: open\n                    },\n                    "Select Image"\n                  );\n                }\n              })\n            ),\n            wp.element.createElement(\n              "div",\n              { className: "col-9 mt-3" },\n              wp.element.createElement(PlainText, {\n                className: "author-plain-text",\n                placeholder: "Author",\n                value: testimonial.author,\n                onChange: function onChange(author) {\n                  var newObject = assign_default()({}, testimonial, {\n                    author: author\n                  });\n                  props.setAttributes({\n                    testimonials: [].concat(toConsumableArray_default()(testimonials.filter(function (item) {\n                      return item.index != testimonial.index;\n                    })), [newObject])\n                  });\n                }\n              }),\n              wp.element.createElement(PlainText, {\n                className: "link-plain-text",\n                placeholder: "Link to Author Profile",\n                value: testimonial.link,\n                onChange: function onChange(link) {\n                  var newObject = assign_default()({}, testimonial, {\n                    link: link\n                  });\n                  props.setAttributes({\n                    testimonials: [].concat(toConsumableArray_default()(testimonials.filter(function (item) {\n                      return item.index != testimonial.index;\n                    })), [newObject])\n                  });\n                }\n              })\n            )\n          )\n        )\n      );\n    });\n    return wp.element.createElement(\n      "div",\n      { className: props.className },\n      testimonialsList,\n      wp.element.createElement(\n        "button",\n        {\n          className: "add-more-testimonial",\n          onClick: function onClick(content) {\n            return props.setAttributes({\n              testimonials: [].concat(toConsumableArray_default()(props.attributes.testimonials), [{\n                index: props.attributes.testimonials.length,\n                content: "",\n                author: "",\n                link: ""\n              }])\n            });\n          }\n        },\n        "+"\n      )\n    );\n  },\n\n  /**\r\n   * The save function defines the way in which the different attributes should be combined\r\n   * into the final markup, which is then serialized by Gutenberg into post_content.\r\n   *\r\n   * The "save" property must be specified and must be a valid function.\r\n   *\r\n   * @link https://wordpress.org/gutenberg/handbook/block-api/block-edit-save/\r\n   */\n  save: function save(props) {\n    var _props$attributes = props.attributes,\n        id = _props$attributes.id,\n        testimonials = _props$attributes.testimonials;\n\n    var carouselIndicators = testimonials.map(function (testimonial, index) {\n      return wp.element.createElement("li", {\n        "data-target": "#" + id,\n        "data-slide-to": index,\n        className: testimonial.index == 0 ? "active" : ""\n      });\n    });\n    var testimonialsList = testimonials.map(function (testimonial) {\n      var carouselClass = testimonial.index == 0 ? "carousel-item active" : "carousel-item";\n      return wp.element.createElement(\n        "div",\n        { className: carouselClass, key: testimonial.index },\n        wp.element.createElement(\n          "blockquote",\n          { className: "testimonial" },\n          wp.element.createElement(\n            "span",\n            { className: "testimonial-index", style: { display: "none" } },\n            testimonial.index\n          ),\n          testimonial.content && wp.element.createElement(\n            "p",\n            { className: "testimonial-text-container" },\n            wp.element.createElement("i", { className: "fa fa-quote-left pull-left", "aria-hidden": "true" }),\n            wp.element.createElement(\n              "span",\n              { className: "testimonial-text" },\n              testimonial.content\n            ),\n            wp.element.createElement("i", { "class": "fa fa-quote-right pull-right", "aria-hidden": "true" })\n          ),\n          wp.element.createElement(\n            "div",\n            { className: "row" },\n            testimonial.image && wp.element.createElement(\n              "div",\n              { className: "gts__picture col-3" },\n              wp.element.createElement("img", { src: testimonial.image, style: { display: "none" } }),\n              wp.element.createElement("div", {\n                className: "gts__picture__image",\n                style: {\n                  backgroundImage: "url(" + testimonial.image + ")"\n                }\n              })\n            ),\n            wp.element.createElement(\n              "div",\n              { className: "testimonial-author-container mt-3 col-9" },\n              testimonial.author && wp.element.createElement(\n                "p",\n                { className: "testimonial-author-name" },\n                wp.element.createElement(\n                  "span",\n                  { className: "testimonial-author" },\n                  "\\u2014 ",\n                  wp.element.createElement(\n                    "span",\n                    null,\n                    testimonial.author\n                  )\n                )\n              ),\n              testimonial.link && wp.element.createElement(\n                "p",\n                { className: "testimonial-author-container" },\n                wp.element.createElement(\n                  "a",\n                  { target: "_blank", href: testimonial.link },\n                  wp.element.createElement("i", { className: "fas fa-user" }),\n                  wp.element.createElement(\n                    "span",\n                    { className: "testimonial-author-link" },\n                    testimonial.link\n                  )\n                )\n              )\n            )\n          )\n        )\n      );\n    });\n    if (testimonials.length > 0) {\n      return wp.element.createElement(\n        "div",\n        { className: "testimonial-slider" },\n        wp.element.createElement(\n          "div",\n          { className: "carousel slide", "data-ride": "carousel", id: id },\n          wp.element.createElement(\n            "ol",\n            { className: "carousel-indicators" },\n            carouselIndicators\n          ),\n          wp.element.createElement(\n            "div",\n            { className: "carousel-inner w-75 mx-auto" },\n            testimonialsList\n          ),\n          wp.element.createElement(\n            "a",\n            {\n              "class": "carousel-control-prev",\n              href: "#" + id,\n              role: "button",\n              "data-slide": "prev"\n            },\n            wp.element.createElement(\n              "span",\n              { "class": "carousel-control-prev-icon", "aria-hidden": "true" },\n              wp.element.createElement("i", { className: "fa fa-chevron-left" })\n            ),\n            wp.element.createElement(\n              "span",\n              { "class": "sr-only" },\n              "Previous"\n            )\n          ),\n          wp.element.createElement(\n            "a",\n            {\n              "class": "carousel-control-next",\n              href: "#" + id,\n              role: "button",\n              "data-slide": "next"\n            },\n            wp.element.createElement(\n              "span",\n              { "class": "carousel-control-next-icon", "aria-hidden": "true" },\n              wp.element.createElement("i", { className: "fa fa-chevron-right" })\n            ),\n            wp.element.createElement(\n              "span",\n              { "class": "sr-only" },\n              "Next"\n            )\n          )\n        )\n      );\n    } else return null;\n  }\n});\n// CONCATENATED MODULE: ./src/index.js\n/**\r\n * Import blocks\r\n */\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYmxvY2svc2xpZGVyLmpzP2NlOWEiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LmpzPzM3MDAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiYmFiZWwtcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX09iamVjdCRhc3NpZ24gZnJvbSBcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduXCI7XG4vKipcclxuICogQkxPQ0s6IG15LWJsb2NrXHJcbiAqXHJcbiAqIFJlZ2lzdGVyaW5nIGEgYmFzaWMgYmxvY2sgd2l0aCBHdXRlbmJlcmcuXHJcbiAqIFNpbXBsZSBibG9jaywgcmVuZGVycyBhbmQgc2F2ZXMgdGhlIHNhbWUgY29udGVudCB3aXRob3V0IGFueSBpbnRlcmFjdGl2aXR5LlxyXG4gKi9cblxuLy8gIEltcG9ydCBDU1MuXG5pbXBvcnQgXCIuL3N0eWxlLnNjc3NcIjtcbmltcG9ydCBcIi4vZWRpdG9yLnNjc3NcIjtcblxudmFyIF9fID0gd3AuaTE4bi5fXzsgLy8gVGhlIF9fKCkgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLlxudmFyIHJlZ2lzdGVyQmxvY2tUeXBlID0gd3AuYmxvY2tzLnJlZ2lzdGVyQmxvY2tUeXBlOyAvLyBUaGUgcmVnaXN0ZXJCbG9ja1R5cGUoKSB0byByZWdpc3RlciBibG9ja3MuXG52YXIgX3dwJGVkaXRvciA9IHdwLmVkaXRvcixcbiAgICBNZWRpYVVwbG9hZCA9IF93cCRlZGl0b3IuTWVkaWFVcGxvYWQsXG4gICAgUGxhaW5UZXh0ID0gX3dwJGVkaXRvci5QbGFpblRleHQ7XG5cbi8qKlxyXG4gKiBSZWdpc3RlcjogYSBHdXRlbmJlcmcgQmxvY2suXHJcbiAqXHJcbiAqIFJlZ2lzdGVycyBhIG5ldyBibG9jayBwcm92aWRlZCBhIHVuaXF1ZSBuYW1lIGFuZCBhbiBvYmplY3QgZGVmaW5pbmcgaXRzXHJcbiAqIGJlaGF2aW9yLiBPbmNlIHJlZ2lzdGVyZWQsIHRoZSBibG9jayBpcyBtYWRlIGVkaXRvciBhcyBhbiBvcHRpb24gdG8gYW55XHJcbiAqIGVkaXRvciBpbnRlcmZhY2Ugd2hlcmUgYmxvY2tzIGFyZSBpbXBsZW1lbnRlZC5cclxuICpcclxuICogQGxpbmsgaHR0cHM6Ly93b3JkcHJlc3Mub3JnL2d1dGVuYmVyZy9oYW5kYm9vay9ibG9jay1hcGkvXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gICBuYW1lICAgICBCbG9jayBuYW1lLlxyXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgc2V0dGluZ3MgQmxvY2sgc2V0dGluZ3MuXHJcbiAqIEByZXR1cm4gez9XUEJsb2NrfSAgICAgICAgICBUaGUgYmxvY2ssIGlmIGl0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZDsgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxyXG4gKi9cblxucmVnaXN0ZXJCbG9ja1R5cGUoXCJndHMvdGVzdGltb25pYWxzLXNsaWRlci1ibG9ja1wiLCB7XG4gIC8vIEJsb2NrIG5hbWUuIEJsb2NrIG5hbWVzIG11c3QgYmUgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBuYW1lc3BhY2UgcHJlZml4LiBFeGFtcGxlOiBteS1wbHVnaW4vbXktY3VzdG9tLWJsb2NrLlxuICB0aXRsZTogX18oXCJUZXN0aW1vbmlhbHMgU2xpZGVyXCIpLCAvLyBCbG9jayB0aXRsZS5cbiAgaWNvbjogXCJmb3JtYXQtcXVvdGVcIiwgLy8gQmxvY2sgaWNvbiBmcm9tIERhc2hpY29ucyDihpIgaHR0cHM6Ly9kZXZlbG9wZXIud29yZHByZXNzLm9yZy9yZXNvdXJjZS9kYXNoaWNvbnMvLlxuICBjYXRlZ29yeTogXCJjb21tb25cIiwgLy8gQmxvY2sgY2F0ZWdvcnkg4oCUIEdyb3VwIGJsb2NrcyB0b2dldGhlciBiYXNlZCBvbiBjb21tb24gdHJhaXRzIEUuZy4gY29tbW9uLCBmb3JtYXR0aW5nLCBsYXlvdXQgd2lkZ2V0cywgZW1iZWQuXG4gIGtleXdvcmRzOiBbX18oXCJUZXN0aW1vbmlhbHMgU2xpZGVyXCIpLCBfXyhcImd0c1wiKV0sXG5cbiAgYXR0cmlidXRlczoge1xuICAgIGlkOiB7XG4gICAgICBzb3VyY2U6IFwiYXR0cmlidXRlXCIsXG4gICAgICBzZWxlY3RvcjogXCIuY2Fyb3VzZWwuc2xpZGVcIixcbiAgICAgIGF0dHJpYnV0ZTogXCJpZFwiXG4gICAgfSxcbiAgICB0ZXN0aW1vbmlhbHM6IHtcbiAgICAgIHNvdXJjZTogXCJxdWVyeVwiLFxuICAgICAgZGVmYXVsdDogW10sXG4gICAgICBzZWxlY3RvcjogXCJibG9ja3F1b3RlLnRlc3RpbW9uaWFsXCIsXG4gICAgICBxdWVyeToge1xuICAgICAgICBpbWFnZToge1xuICAgICAgICAgIHNvdXJjZTogXCJhdHRyaWJ1dGVcIixcbiAgICAgICAgICBzZWxlY3RvcjogXCJpbWdcIixcbiAgICAgICAgICBhdHRyaWJ1dGU6IFwic3JjXCJcbiAgICAgICAgfSxcbiAgICAgICAgaW5kZXg6IHtcbiAgICAgICAgICBzb3VyY2U6IFwidGV4dFwiLFxuICAgICAgICAgIHNlbGVjdG9yOiBcInNwYW4udGVzdGltb25pYWwtaW5kZXhcIlxuICAgICAgICB9LFxuICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgc291cmNlOiBcInRleHRcIixcbiAgICAgICAgICBzZWxlY3RvcjogXCJzcGFuLnRlc3RpbW9uaWFsLXRleHRcIlxuICAgICAgICB9LFxuICAgICAgICBhdXRob3I6IHtcbiAgICAgICAgICBzb3VyY2U6IFwidGV4dFwiLFxuICAgICAgICAgIHNlbGVjdG9yOiBcInNwYW4udGVzdGltb25pYWwtYXV0aG9yIHNwYW5cIlxuICAgICAgICB9LFxuICAgICAgICBsaW5rOiB7XG4gICAgICAgICAgc291cmNlOiBcInRleHRcIixcbiAgICAgICAgICBzZWxlY3RvcjogXCIudGVzdGltb25pYWwtYXV0aG9yLWxpbmtcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxyXG4gICAqIFRoZSBlZGl0IGZ1bmN0aW9uIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHlvdXIgYmxvY2sgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGVkaXRvci5cclxuICAgKiBUaGlzIHJlcHJlc2VudHMgd2hhdCB0aGUgZWRpdG9yIHdpbGwgcmVuZGVyIHdoZW4gdGhlIGJsb2NrIGlzIHVzZWQuXHJcbiAgICpcclxuICAgKiBUaGUgXCJlZGl0XCIgcHJvcGVydHkgbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uLlxyXG4gICAqXHJcbiAgICogQGxpbmsgaHR0cHM6Ly93b3JkcHJlc3Mub3JnL2d1dGVuYmVyZy9oYW5kYm9vay9ibG9jay1hcGkvYmxvY2stZWRpdC1zYXZlL1xyXG4gICAqL1xuXG4gIC8vIFRoZSBcImVkaXRcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgdmFsaWQgZnVuY3Rpb24uXG4gIGVkaXQ6IGZ1bmN0aW9uIGVkaXQocHJvcHMpIHtcbiAgICB2YXIgdGVzdGltb25pYWxzID0gcHJvcHMuYXR0cmlidXRlcy50ZXN0aW1vbmlhbHM7XG5cblxuICAgIGlmICghcHJvcHMuYXR0cmlidXRlcy5pZCkge1xuICAgICAgdmFyIGlkID0gXCJ0ZXN0aW1vbmlhbFwiICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwKTtcbiAgICAgIHByb3BzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBpZDogaWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciB0ZXN0aW1vbmlhbHNMaXN0ID0gdGVzdGltb25pYWxzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKHRlc3RpbW9uaWFsKSB7XG4gICAgICByZXR1cm4gd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7IGNsYXNzTmFtZTogXCJndHMtdGVzdGltb25pYWwtYmxvY2tcIiB9LFxuICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgXCJwXCIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBcIkluc2VydCBUZXN0bW9uaWFsIFwiLFxuICAgICAgICAgICAgTnVtYmVyKHRlc3RpbW9uaWFsLmluZGV4KSArIDEsXG4gICAgICAgICAgICBcIiBIZXJlOlwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcInJlbW92ZS10ZXN0aW1vbmlhbFwiLFxuICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdUZXN0aW1vbmlhbHMgPSB0ZXN0aW1vbmlhbHMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pbmRleCAhPSB0ZXN0aW1vbmlhbC5pbmRleDtcbiAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0LmluZGV4ID4gdGVzdGltb25pYWwuaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdC5pbmRleCAtPSAxO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHByb3BzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgdGVzdGltb25pYWxzOiBuZXdUZXN0aW1vbmlhbHNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcImlcIiwgeyBjbGFzc05hbWU6IFwiZmEgZmEtdGltZXNcIiB9KVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIFwiYmxvY2txdW90ZVwiLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiBcIndwLWJsb2NrLXF1b3RlXCIgfSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoUGxhaW5UZXh0LCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiY29udGVudC1wbGFpbi10ZXh0XCIsXG4gICAgICAgICAgICBzdHlsZTogeyBoZWlnaHQ6IDU4IH0sXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJUZXN0aW1vbmlhbCBUZXh0XCIsXG4gICAgICAgICAgICB2YWx1ZTogdGVzdGltb25pYWwuY29udGVudCxcbiAgICAgICAgICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShjb250ZW50KSB7XG4gICAgICAgICAgICAgIHZhciBuZXdPYmplY3QgPSBfT2JqZWN0JGFzc2lnbih7fSwgdGVzdGltb25pYWwsIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICB0ZXN0aW1vbmlhbHM6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodGVzdGltb25pYWxzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaW5kZXggIT0gdGVzdGltb25pYWwuaW5kZXg7XG4gICAgICAgICAgICAgICAgfSkpLCBbbmV3T2JqZWN0XSlcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcInJvd1wiIH0sXG4gICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcImd0c19fcGljdHVyZSBjb2wtM1wiIH0sXG4gICAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChNZWRpYVVwbG9hZCwge1xuICAgICAgICAgICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChtZWRpYSkge1xuICAgICAgICAgICAgICAgICAgdmFyIGltYWdlID0gbWVkaWEuc2l6ZXMubWVkaXVtID8gbWVkaWEuc2l6ZXMubWVkaXVtLnVybCA6IG1lZGlhLnVybDtcbiAgICAgICAgICAgICAgICAgIHZhciBuZXdPYmplY3QgPSBfT2JqZWN0JGFzc2lnbih7fSwgdGVzdGltb25pYWwsIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IGltYWdlXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICB0ZXN0aW1vbmlhbHM6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodGVzdGltb25pYWxzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmluZGV4ICE9IHRlc3RpbW9uaWFsLmluZGV4O1xuICAgICAgICAgICAgICAgICAgICB9KSksIFtuZXdPYmplY3RdKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRlc3RpbW9uaWFsLmltYWdlLFxuICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKF9yZWYpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBvcGVuID0gX3JlZi5vcGVuO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdGVzdGltb25pYWwuaW1hZ2UgPyB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmlzU2VsZWN0ZWQgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgeyBjbGFzc05hbWU6IFwiZ3RzX19waWN0dXJlX19hY3Rpb25zXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogXCIjXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld09iamVjdCA9IF9PYmplY3QkYXNzaWduKHt9LCB0ZXN0aW1vbmlhbCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RpbW9uaWFsczogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh0ZXN0aW1vbmlhbHMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmluZGV4ICE9IHRlc3RpbW9uaWFsLmluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBbbmV3T2JqZWN0XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXFx4RDcgUmVtb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImd0c19fcGljdHVyZV9faW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcInVybChcIiArIHRlc3RpbW9uaWFsLmltYWdlICsgXCIpXCJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IG9wZW5cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICkgOiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiYVwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgaHJlZjogXCIjXCIsXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImd0c19fcGljdHVyZV9faW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBvcGVuXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFwiU2VsZWN0IEltYWdlXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgeyBjbGFzc05hbWU6IFwiY29sLTkgbXQtM1wiIH0sXG4gICAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChQbGFpblRleHQsIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYXV0aG9yLXBsYWluLXRleHRcIixcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJBdXRob3JcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGVzdGltb25pYWwuYXV0aG9yLFxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShhdXRob3IpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBuZXdPYmplY3QgPSBfT2JqZWN0JGFzc2lnbih7fSwgdGVzdGltb25pYWwsIHtcbiAgICAgICAgICAgICAgICAgICAgYXV0aG9yOiBhdXRob3JcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RpbW9uaWFsczogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh0ZXN0aW1vbmlhbHMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaW5kZXggIT0gdGVzdGltb25pYWwuaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH0pKSwgW25ld09iamVjdF0pXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoUGxhaW5UZXh0LCB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImxpbmstcGxhaW4tdGV4dFwiLFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIkxpbmsgdG8gQXV0aG9yIFByb2ZpbGVcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGVzdGltb25pYWwubGluayxcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UobGluaykge1xuICAgICAgICAgICAgICAgICAgdmFyIG5ld09iamVjdCA9IF9PYmplY3QkYXNzaWduKHt9LCB0ZXN0aW1vbmlhbCwge1xuICAgICAgICAgICAgICAgICAgICBsaW5rOiBsaW5rXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICB0ZXN0aW1vbmlhbHM6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodGVzdGltb25pYWxzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmluZGV4ICE9IHRlc3RpbW9uaWFsLmluZGV4O1xuICAgICAgICAgICAgICAgICAgICB9KSksIFtuZXdPYmplY3RdKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICByZXR1cm4gd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJkaXZcIixcbiAgICAgIHsgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUgfSxcbiAgICAgIHRlc3RpbW9uaWFsc0xpc3QsXG4gICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiYWRkLW1vcmUtdGVzdGltb25pYWxcIixcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgdGVzdGltb25pYWxzOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByb3BzLmF0dHJpYnV0ZXMudGVzdGltb25pYWxzKSwgW3tcbiAgICAgICAgICAgICAgICBpbmRleDogcHJvcHMuYXR0cmlidXRlcy50ZXN0aW1vbmlhbHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgYXV0aG9yOiBcIlwiLFxuICAgICAgICAgICAgICAgIGxpbms6IFwiXCJcbiAgICAgICAgICAgICAgfV0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiK1wiXG4gICAgICApXG4gICAgKTtcbiAgfSxcblxuICAvKipcclxuICAgKiBUaGUgc2F2ZSBmdW5jdGlvbiBkZWZpbmVzIHRoZSB3YXkgaW4gd2hpY2ggdGhlIGRpZmZlcmVudCBhdHRyaWJ1dGVzIHNob3VsZCBiZSBjb21iaW5lZFxyXG4gICAqIGludG8gdGhlIGZpbmFsIG1hcmt1cCwgd2hpY2ggaXMgdGhlbiBzZXJpYWxpemVkIGJ5IEd1dGVuYmVyZyBpbnRvIHBvc3RfY29udGVudC5cclxuICAgKlxyXG4gICAqIFRoZSBcInNhdmVcIiBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBhbmQgbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uLlxyXG4gICAqXHJcbiAgICogQGxpbmsgaHR0cHM6Ly93b3JkcHJlc3Mub3JnL2d1dGVuYmVyZy9oYW5kYm9vay9ibG9jay1hcGkvYmxvY2stZWRpdC1zYXZlL1xyXG4gICAqL1xuICBzYXZlOiBmdW5jdGlvbiBzYXZlKHByb3BzKSB7XG4gICAgdmFyIF9wcm9wcyRhdHRyaWJ1dGVzID0gcHJvcHMuYXR0cmlidXRlcyxcbiAgICAgICAgaWQgPSBfcHJvcHMkYXR0cmlidXRlcy5pZCxcbiAgICAgICAgdGVzdGltb25pYWxzID0gX3Byb3BzJGF0dHJpYnV0ZXMudGVzdGltb25pYWxzO1xuXG4gICAgdmFyIGNhcm91c2VsSW5kaWNhdG9ycyA9IHRlc3RpbW9uaWFscy5tYXAoZnVuY3Rpb24gKHRlc3RpbW9uaWFsLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgXCJkYXRhLXRhcmdldFwiOiBcIiNcIiArIGlkLFxuICAgICAgICBcImRhdGEtc2xpZGUtdG9cIjogaW5kZXgsXG4gICAgICAgIGNsYXNzTmFtZTogdGVzdGltb25pYWwuaW5kZXggPT0gMCA/IFwiYWN0aXZlXCIgOiBcIlwiXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgdGVzdGltb25pYWxzTGlzdCA9IHRlc3RpbW9uaWFscy5tYXAoZnVuY3Rpb24gKHRlc3RpbW9uaWFsKSB7XG4gICAgICB2YXIgY2Fyb3VzZWxDbGFzcyA9IHRlc3RpbW9uaWFsLmluZGV4ID09IDAgPyBcImNhcm91c2VsLWl0ZW0gYWN0aXZlXCIgOiBcImNhcm91c2VsLWl0ZW1cIjtcbiAgICAgIHJldHVybiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHsgY2xhc3NOYW1lOiBjYXJvdXNlbENsYXNzLCBrZXk6IHRlc3RpbW9uaWFsLmluZGV4IH0sXG4gICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBcImJsb2NrcXVvdGVcIixcbiAgICAgICAgICB7IGNsYXNzTmFtZTogXCJ0ZXN0aW1vbmlhbFwiIH0sXG4gICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJ0ZXN0aW1vbmlhbC1pbmRleFwiLCBzdHlsZTogeyBkaXNwbGF5OiBcIm5vbmVcIiB9IH0sXG4gICAgICAgICAgICB0ZXN0aW1vbmlhbC5pbmRleFxuICAgICAgICAgICksXG4gICAgICAgICAgdGVzdGltb25pYWwuY29udGVudCAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInBcIixcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcInRlc3RpbW9uaWFsLXRleHQtY29udGFpbmVyXCIgfSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcImlcIiwgeyBjbGFzc05hbWU6IFwiZmEgZmEtcXVvdGUtbGVmdCBwdWxsLWxlZnRcIiwgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIiB9KSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcInRlc3RpbW9uaWFsLXRleHRcIiB9LFxuICAgICAgICAgICAgICB0ZXN0aW1vbmlhbC5jb250ZW50XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFwiaVwiLCB7IFwiY2xhc3NcIjogXCJmYSBmYS1xdW90ZS1yaWdodCBwdWxsLXJpZ2h0XCIsIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIgfSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJyb3dcIiB9LFxuICAgICAgICAgICAgdGVzdGltb25pYWwuaW1hZ2UgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJndHNfX3BpY3R1cmUgY29sLTNcIiB9LFxuICAgICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwgeyBzcmM6IHRlc3RpbW9uaWFsLmltYWdlLCBzdHlsZTogeyBkaXNwbGF5OiBcIm5vbmVcIiB9IH0pLFxuICAgICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJndHNfX3BpY3R1cmVfX2ltYWdlXCIsXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJ1cmwoXCIgKyB0ZXN0aW1vbmlhbC5pbWFnZSArIFwiKVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgeyBjbGFzc05hbWU6IFwidGVzdGltb25pYWwtYXV0aG9yLWNvbnRhaW5lciBtdC0zIGNvbC05XCIgfSxcbiAgICAgICAgICAgICAgdGVzdGltb25pYWwuYXV0aG9yICYmIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcInBcIixcbiAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJ0ZXN0aW1vbmlhbC1hdXRob3ItbmFtZVwiIH0sXG4gICAgICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJ0ZXN0aW1vbmlhbC1hdXRob3JcIiB9LFxuICAgICAgICAgICAgICAgICAgXCJcXHUyMDE0IFwiLFxuICAgICAgICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdGVzdGltb25pYWwuYXV0aG9yXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB0ZXN0aW1vbmlhbC5saW5rICYmIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcInBcIixcbiAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJ0ZXN0aW1vbmlhbC1hdXRob3ItY29udGFpbmVyXCIgfSxcbiAgICAgICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICBcImFcIixcbiAgICAgICAgICAgICAgICAgIHsgdGFyZ2V0OiBcIl9ibGFua1wiLCBocmVmOiB0ZXN0aW1vbmlhbC5saW5rIH0sXG4gICAgICAgICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXCJpXCIsIHsgY2xhc3NOYW1lOiBcImZhcyBmYS11c2VyXCIgfSksXG4gICAgICAgICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogXCJ0ZXN0aW1vbmlhbC1hdXRob3ItbGlua1wiIH0sXG4gICAgICAgICAgICAgICAgICAgIHRlc3RpbW9uaWFsLmxpbmtcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKHRlc3RpbW9uaWFscy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7IGNsYXNzTmFtZTogXCJ0ZXN0aW1vbmlhbC1zbGlkZXJcIiB9LFxuICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7IGNsYXNzTmFtZTogXCJjYXJvdXNlbCBzbGlkZVwiLCBcImRhdGEtcmlkZVwiOiBcImNhcm91c2VsXCIsIGlkOiBpZCB9LFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwib2xcIixcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBcImNhcm91c2VsLWluZGljYXRvcnNcIiB9LFxuICAgICAgICAgICAgY2Fyb3VzZWxJbmRpY2F0b3JzXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgeyBjbGFzc05hbWU6IFwiY2Fyb3VzZWwtaW5uZXIgdy03NSBteC1hdXRvXCIgfSxcbiAgICAgICAgICAgIHRlc3RpbW9uaWFsc0xpc3RcbiAgICAgICAgICApLFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiYVwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImNsYXNzXCI6IFwiY2Fyb3VzZWwtY29udHJvbC1wcmV2XCIsXG4gICAgICAgICAgICAgIGhyZWY6IFwiI1wiICsgaWQsXG4gICAgICAgICAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgIFwiZGF0YS1zbGlkZVwiOiBcInByZXZcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgIHsgXCJjbGFzc1wiOiBcImNhcm91c2VsLWNvbnRyb2wtcHJldi1pY29uXCIsIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIgfSxcbiAgICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFwiaVwiLCB7IGNsYXNzTmFtZTogXCJmYSBmYS1jaGV2cm9uLWxlZnRcIiB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgIHsgXCJjbGFzc1wiOiBcInNyLW9ubHlcIiB9LFxuICAgICAgICAgICAgICBcIlByZXZpb3VzXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiYVwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImNsYXNzXCI6IFwiY2Fyb3VzZWwtY29udHJvbC1uZXh0XCIsXG4gICAgICAgICAgICAgIGhyZWY6IFwiI1wiICsgaWQsXG4gICAgICAgICAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgIFwiZGF0YS1zbGlkZVwiOiBcIm5leHRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgIHsgXCJjbGFzc1wiOiBcImNhcm91c2VsLWNvbnRyb2wtbmV4dC1pY29uXCIsIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIgfSxcbiAgICAgICAgICAgICAgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFwiaVwiLCB7IGNsYXNzTmFtZTogXCJmYSBmYS1jaGV2cm9uLXJpZ2h0XCIgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICB7IFwiY2xhc3NcIjogXCJzci1vbmx5XCIgfSxcbiAgICAgICAgICAgICAgXCJOZXh0XCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHJldHVybiBudWxsO1xuICB9XG59KTsiLCIvKipcclxuICogSW1wb3J0IGJsb2Nrc1xyXG4gKi9cbmltcG9ydCAnLi9ibG9jay9zbGlkZXIuanMnOyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BiQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///60\n')},
    369369/*!******************************!*\
    370370  !*** ./src/block/style.scss ***!
  • testimonials-slider-block/trunk/dist/blocks.style.build.css

    r1927943 r1972900  
    1 .gts-testimonial-block{padding:20px;background:#f3f3f3;margin-bottom:1em;border-radius:10px;min-height:160px}.gts-testimonial-block blockquote{border-left:none;margin-bottom:1em}.testimonial-text{font-size:1.5em;font-style:normal}.testimonial-author-container{text-align:center}.testimonial-author-link,.testimonial-author-name{padding-left:12px;margin-bottom:5px;font-style:normal}span.testimonial-author{font-style:normal}.fa.fa-quote-left{padding-right:12px;padding-left:8px;font-size:1.25em}.fa.fa-quote-right{padding-left:12px;font-size:1.25em}ol.carousel-indicators{bottom:-25px}ol.carousel-indicators li{background-color:rgba(167,167,167,0.5)}ol.carousel-indicators .active{background-color:black}.entry-content a.carousel-control-prev,.entry-content a.carousel-control-next{-webkit-box-shadow:none;box-shadow:none;border-bottom:none}.entry-content a.carousel-control-prev:hover,.entry-content a.carousel-control-prev:focus,.entry-content a.carousel-control-prev:active,.entry-content a.carousel-control-next:hover,.entry-content a.carousel-control-next:focus,.entry-content a.carousel-control-next:active{-webkit-box-shadow:none;box-shadow:none;border-bottom:none}.carousel-control-next-icon,.carousel-control-prev-icon{color:#000}.gts-testimonial-slider-block.testimonial-slider{background:#f3f3f3;padding:10px;border-radius:10px;margin-bottom:1em;min-height:160px}.gts-testimonial-slider-block.testimonial-slider blockquote{border-left:none}.gts__picture{position:relative}.gts__picture .gts__picture__image{width:100px;height:100px;margin-right:30px;margin-left:4.5px;border-radius:50%;overflow:hidden;border:1px solid #dadada;font-size:.8em;background-size:cover;background-position:center}
     1.gts-testimonial-block{padding:20px;background:#f3f3f3;margin-bottom:1em;border-radius:10px;min-height:160px}.gts-testimonial-block blockquote{border-left:none;margin-bottom:1em}.testimonial-slider{margin-bottom:2em}.testimonial-text{font-size:1.5em;line-height:1.5;font-style:normal}.testimonial-author-container{text-align:center}.testimonial-author-link,.testimonial-author-name{padding-left:12px;margin-bottom:5px;font-style:normal}span.testimonial-author{font-style:normal}.fa.fa-quote-left{padding-right:12px;padding-left:8px;font-size:1.25em}.fa.fa-quote-right{padding-left:12px;font-size:1.25em}ol.carousel-indicators{bottom:-25px}ol.carousel-indicators li{background-color:rgba(167,167,167,0.5)}ol.carousel-indicators .active{background-color:black}.entry-content a.carousel-control-prev,.entry-content a.carousel-control-next{-webkit-box-shadow:none;box-shadow:none;border-bottom:none}.entry-content a.carousel-control-prev:hover,.entry-content a.carousel-control-prev:focus,.entry-content a.carousel-control-prev:active,.entry-content a.carousel-control-next:hover,.entry-content a.carousel-control-next:focus,.entry-content a.carousel-control-next:active{-webkit-box-shadow:none;box-shadow:none;border-bottom:none}.carousel-control-next-icon,.carousel-control-prev-icon{color:#000}.gts-testimonial-slider-block.testimonial-slider{background:#f3f3f3;padding:10px;border-radius:10px;margin-bottom:1em;min-height:160px}.gts-testimonial-slider-block.testimonial-slider blockquote{border-left:none}.gts__picture{position:relative}.gts__picture .gts__picture__image{width:100px;height:100px;margin-right:30px;margin-left:4.5px;border-radius:50%;overflow:hidden;border:1px solid #dadada;font-size:.8em;background-size:cover;background-position:center}
  • testimonials-slider-block/trunk/readme.txt

    r1927954 r1972900  
    4242== Changelog ==
    4343
     44= 1.0.1 (12/11/2018) =
     45* Added a11y support for author images
     46
     47= 1.0.0 (21/08/2018) =
     48* First release
     49
    4450== Donations ==
    4551
  • testimonials-slider-block/trunk/src/block/slider.js

    r1927943 r1972900  
    3535
    3636  attributes: {
     37    id: {
     38      source: "attribute",
     39      selector: ".carousel.slide",
     40      attribute: "id"
     41    },
    3742    testimonials: {
    38       type: "array",
    3943      source: "query",
    4044      default: [],
     
    4751        },
    4852        index: {
    49           type: "string",
    5053          source: "text",
    5154          selector: "span.testimonial-index"
    5255        },
    5356        content: {
    54           type: "string",
    5557          source: "text",
    5658          selector: "span.testimonial-text"
    5759        },
    5860        author: {
    59           type: "string",
    6061          source: "text",
    6162          selector: "span.testimonial-author span"
    6263        },
    6364        link: {
    64           type: "string",
    6565          source: "text",
    6666          selector: ".testimonial-author-link"
    6767        }
    6868      }
    69     },
    70     id: {
    71       type: "string",
    72       source: "attribute",
    73       selector: ".carousel.slide",
    74       attribute: "id"
    7569    }
    7670  },
     
    8882  edit: props => {
    8983    const { testimonials } = props.attributes;
     84
    9085    if (!props.attributes.id) {
    9186      const id = `testimonial${Math.floor(Math.random() * 100)}`;
     
    174169                            <div className="gts__picture__actions">
    175170                              <a
     171                                href="#"
    176172                                onClick={() => {
    177173                                  const newObject = Object.assign(
     
    206202                        </div>
    207203                      ) : (
    208                         <a className="gts__picture__image" onClick={open}>
     204                        <a
     205                          href="#"
     206                          className="gts__picture__image"
     207                          onClick={open}
     208                        >
    209209                          Select Image
    210210                        </a>
     
    258258      });
    259259    return (
    260       <div>
     260      <div className={props.className}>
    261261        {testimonialsList}
    262262        <button
     
    291291   */
    292292  save: props => {
    293     const { testimonials } = props.attributes; // Content in our block.
    294     const id = props.attributes.id;
     293    const { id, testimonials } = props.attributes;
    295294    const carouselIndicators = testimonials.map(function(testimonial, index) {
    296295      return (
     
    321320              {testimonial.image && (
    322321                <div className="gts__picture col-3">
    323                 <img src={testimonial.image} style={{ display: 'none' }} />
     322                  <img src={testimonial.image} style={{ display: "none" }} />
    324323                  <div
    325324                    className="gts__picture__image"
  • testimonials-slider-block/trunk/src/block/style.scss

    r1927943 r1972900  
    1717}
    1818
     19.testimonial-slider {
     20    margin-bottom: 2em;
     21}
     22
    1923.testimonial-text {
    2024    font-size: 1.5em;
     25    line-height: 1.5;
    2126    font-style: normal;
    2227}
Note: See TracChangeset for help on using the changeset viewer.