diff --git a/README.md b/README.md index aaae6c3..3ba3f9f 100644 --- a/README.md +++ b/README.md @@ -1,392 +1,138 @@ -# Awesome Nutrient - - - -[](https://awesome.re) -[](https://discord.gg/Z754Pfb8bD) - -This repository contains examples built with [Nutrient](https://www.nutrient.io/). These examples are not officially supported, which means they may stop working and not be fixed, but they exist to serve for inspiration. Read [the disclaimer](https://github.com/PSPDFKit/awesome-nutrient/blob/master/DISCLAIMER.md) or [reach out if you have questions](https://support.nutrient.io/hc/en-us/requests/new). - -## Web - -A wide variety of examples showcasing what Nutrient Web SDK can do can be found in the [Example Catalog](https://github.com/PSPDFKit/pspdfkit-web-examples-catalog). You can also [try them online](https://web-examples.our.services.nutrient-powered.io/). - -- **Electronic signatures** — Use our API to add electronic signature images to PDFs. -- **Watermarks** — Add custom content (like images, text, and logos) as watermarks to your PDF pages. -- **Image annotations** — Annotate images with Nutrient Web SDK. -- **Custom UI for annotations** — Create a fully customized UI for working with annotations. -- **Custom annotation permissions** — Define custom permissions for annotation types. -- **Custom annotation tools** — Add your own tools or actions when an annotation is selected. -- **Custom toolbar tools** — Add custom tools to the PDF toolbar. -- **PDF page manipulation** — Add, remove, reorder, or rotate pages in a PDF. -- **Advanced PDF search** — Modify PDF search behavior. -- **Custom overlays** — Extend PDFs by adding your own elements to pages. -- **Selective area revealing** — Allow users to hide/reveal areas on a PDF page. -- **HTML-based annotation customization** — Enhance or replace existing PDF annotations using custom HTML. -- **Dark mode** — Switch to dark mode programmatically. -- **Custom views and drag and drop** — Add custom views for dragging and dropping image elements. -- **Document editor customization** — Customize the document editor toolbar and footer items. -- **Page flip effect** — Create a magazine-like browsing experience. -- **Permissions enforcement** — Set permissions based on JSON Web Token (JWT) parameters. -- **Electronic signatures persistence** — Keep electronic signatures across page refreshes. - -## Web SDK Examples - -- [Web Examples](https://github.com/PSPDFKit/nutrient-web-examples) -- [React](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/react) -- [Angular](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/angular) -- [Next](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/nextjs) -- [Nuxt]( https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/nuxtjs) - - -#### Annotations - -- [Watermark from text annotation](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBkaXNhYmxlVGV4dFNlbGVjdGlvbjogdHJ1ZSxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIGxldCB3YXRlcm1hcmtzID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogaW5zdGFuY2UudG90YWxQYWdlQ291bnQgfSkubWFwKChfLCBwYWdlSW5kZXgpID0%252BXG4gICAgICAgIGluc3RhbmNlLnBhZ2VJbmZvRm9ySW5kZXgocGFnZUluZGV4KVxuICAgICAgKVxuICAgIClcbiAgKS5yZWR1Y2UoKGFjYywgcGFnZUluZm8pID0%252BIHtcbiAgICBjb25zdCB7IGluZGV4OiBwYWdlSW5kZXgsIHJhd1BkZkJveGVzIH0gPSBwYWdlSW5mbyxcbiAgICAgIHsgY3JvcEJveCB9ID0gcmF3UGRmQm94ZXMsXG4gICAgICBbbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0XSA9IGNyb3BCb3g7XG5cbiAgICBjb25zdCB0b3RhbFJvd3MgPSA0OyAvLyA0IHJvd3NcbiAgICBjb25zdCB0b3RhbENvbHMgPSAzOyAvLyAzIGNvbHVtbnNcbiAgICBjb25zdCB0ZXh0ID0gXCJDT05GSURFTlRJQUxcIjtcbiAgICBjb25zdCBmb250U2l6ZSA9IDE0O1xuICAgIGNvbnN0IHRleHRXaWR0aCA9IHdpZHRoICogMC40OyAvLyBJbmNyZWFzZWQgd2lkdGggKDQwJSBvZiBwYWdlIHdpZHRoKVxuICAgIGNvbnN0IHRleHRIZWlnaHQgPSA1MDsgLy8gSW5jcmVhc2VkIGhlaWdodCBmb3IgYmV0dGVyIHZpc2liaWxpdHlcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRvdGFsUm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHRvdGFsQ29sczsgY29sKyspIHtcbiAgICAgICAgY29uc3QgeCA9IChjb2wgKyAxKSAqICh3aWR0aCAvICh0b3RhbENvbHMgKyAxKSk7XG4gICAgICAgIGNvbnN0IHkgPSAocm93ICsgMSkgKiAoaGVpZ2h0IC8gKHRvdGFsUm93cyArIDEpKTtcblxuICAgICAgICBhY2MucHVzaChcbiAgICAgICAgICBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuVGV4dEFubm90YXRpb24oe1xuICAgICAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgICAgICB0ZXh0OiB7IGZvcm1hdDogXCJwbGFpblwiLCB2YWx1ZTogdGV4dCB9LFxuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgaXNCb2xkOiB0cnVlLFxuICAgICAgICAgICAgZm9udDogXCJIZWx2ZXRpY2FcIixcbiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICAgICAgICAgIGxlZnQ6IHggLSB0ZXh0V2lkdGggLyAyLCAvLyBDZW50ZXIgaG9yaXpvbnRhbGx5XG4gICAgICAgICAgICAgIHRvcDogeSAtIHRleHRIZWlnaHQgLyAyLCAvLyBDZW50ZXIgdmVydGljYWxseVxuICAgICAgICAgICAgICB3aWR0aDogdGV4dFdpZHRoICsgMTAwLCAvLyBJbmNyZWFzZWQgd2lkdGhcbiAgICAgICAgICAgICAgaGVpZ2h0OiB0ZXh0SGVpZ2h0ICsgMTAwLCAvLyBJbmNyZWFzZWQgaGVpZ2h0XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZvbnRDb2xvcjogUFNQREZLaXQuQ29sb3IuR1JBWSxcbiAgICAgICAgICAgIHJvdGF0aW9uOiAzMCwgLy8gU2xpZ2h0IHRpbHRcbiAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgb3BhY2l0eTogMC4yLCAvLyBUcmFuc3BhcmVudCB3YXRlcm1hcmtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG5cbiAgYXdhaXQgaW5zdGFuY2UuY3JlYXRlKHdhdGVybWFya3MpO1xuICBhd2FpdCBpbnN0YW5jZS5hcHBseU9wZXJhdGlvbnMoW3sgdHlwZTogXCJmbGF0dGVuQW5ub3RhdGlvbnNcIiB9XSk7IC8vIE9wdGlvbmFsOiBGbGF0dGVuIHdhdGVybWFya3NcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBMb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - - Dynamically add watermark text annotations to PDF pages before flattening them into a document. — [Video](https://www.youtube.com/watch?v=A6ydoCpCKMI) - -- [Flatten annotation on annotation create](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6IlBTUERGS2l0LmxvYWQoeyAuLi5iYXNlT3B0aW9ucywgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUksgfSkudGhlbihcbiAgKGluc3RhbmNlKSA9PiB7XG4gICAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcImFubm90YXRpb25zLmNyZWF0ZVwiLCAoYW5ub3RhdGlvbnMpID0%252BIHtcbiAgICAgIC8vIEFzc3VtaW5nIHdlIHdhbnQgdG8gZmxhdHRlbiBhbm5vdGF0aW9ucyBvbiB0aGUgcGFnZSB3aGVyZSB0aGUgYW5ub3RhdGlvbiB3YXMgYWRkZWRcbiAgICAgIGNvbnN0IHBhZ2VJbmRleGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChhbm5vdGF0aW9ucy5tYXAoKGFubm90YXRpb24pID0%252BIGFubm90YXRpb24ucGFnZUluZGV4KSlcbiAgICAgICk7XG4gICAgICBpbnN0YW5jZVxuICAgICAgICAuYXBwbHlPcGVyYXRpb25zKFtcbiAgICAgICAgICB7IHR5cGU6IFwiZmxhdHRlbkFubm90YXRpb25zXCIsIHBhZ2VJbmRleGVzOiBwYWdlSW5kZXhlcyB9LFxuICAgICAgICBdKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBmbGF0dGVuIGFubm90YXRpb25zOlwiLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pLFxuICAgICAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cdCIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIn19) - -- [Remove inline text selection toolbar on text select](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBpbmxpbmVUZXh0U2VsZWN0aW9uVG9vbGJhckl0ZW1zOiAoXG4gICAgeyBkZWZhdWx0SXRlbXMsIGhhc0Rlc2t0b3BMYXlvdXQgfSxcbiAgICBzZWxlY3Rpb25cbiAgKSA9PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9LFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - -- [Bulk delete all annotations](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6Ii8vIEJ1bGsgZGVsZXRlIEFMTCBhbm5vdGF0aW9uc1xuUFNQREZLaXQubG9hZCh7XG5cdC4uLmJhc2VPcHRpb25zLFxuXHR0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSS1xufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcblx0Y29uc3QgaXRlbXMgPSBpbnN0YW5jZS50b29sYmFySXRlbXM7XG5cblx0Y29uc3QgZGVsZXRlQnV0dG9uID0ge1xuXHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0aWQ6IFwiZGVsZXRlLWFubm90YXRpb25zXCIsXG5cdFx0dGl0bGU6IFwiRGVsZXRlXCIsIC8vIG9yIFwiUmVtb3ZlXCJcblx0XHRvblByZXNzOiBhc3luYyAoKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBwYWdlc0Fubm90YXRpb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0QXJyYXkuZnJvbSh7IGxlbmd0aDogaW5zdGFuY2UudG90YWxQYWdlQ291bnQgfSkubWFwKChfLCBwYWdlSW5kZXgpID0%252BXG5cdFx0XHRcdFx0XHRpbnN0YW5jZS5nZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnN0IGFubm90YXRpb25JZHMgPSBwYWdlc0Fubm90YXRpb25zLmZsYXRNYXAoKHBhZ2VBbm5vdGF0aW9ucykgPT5cblx0XHRcdFx0XHRwYWdlQW5ub3RhdGlvbnMubWFwKChhbm5vdGF0aW9uKSA9PiBhbm5vdGF0aW9uLmlkKS50b0FycmF5KClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoYW5ub3RhdGlvbklkcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRjb25zb2xlLmluZm8oXCJObyBhbm5vdGF0aW9ucyB0byBkZWxldGUuXCIpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IGluc3RhbmNlLmRlbGV0ZShhbm5vdGF0aW9uSWRzKTtcblx0XHRcdFx0Y29uc29sZS5pbmZvKGBEZWxldGVkICR7YW5ub3RhdGlvbklkcy5sZW5ndGh9IGFubm90YXRpb25zLmApO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGRlbGV0ZSBhbm5vdGF0aW9uczpcIiwgZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcyhbLi4uaXRlbXMsIGRlbGV0ZUJ1dHRvbl0pO1xufSk7IiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIn19) - - After the viewer loads, it gathers annotations from every page, flattens their IDs, and deletes them in a single operation. It uses `totalPageCount` with `getAnnotations` and an async IIFE to run the cleanup immediately. - -- [Straighten freeform highlight](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6Ii8vIENvbnZlcnRzIGZyZWVmb3JtIGhpZ2hsaWdodCBhbm5vdGF0aW9ucyBpbnRvIHN0cmFpZ2h0LWxpbmUgaGlnaGxpZ2h0c1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIC8vIFRvIGVuYWJsZSwgYXV0by1zZWxlY3Rpb24gb2YgRnJlZWZvcm0gSGlnaGxpZ2h0ZXIgdG9vbCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAvLyBpbnN0YW5jZS5zZXRDdXJyZW50QW5ub3RhdGlvblByZXNldChcImhpZ2hsaWdodGVyXCIpO1xuICAvLyBpbnN0YW5jZS5zZXRWaWV3U3RhdGUoKHZpZXdTdGF0ZSkgPT5cbiAgLy8gICB2aWV3U3RhdGUuc2V0KFwiaW50ZXJhY3Rpb25Nb2RlXCIsIFBTUERGS2l0LkludGVyYWN0aW9uTW9kZS5JTkspXG4gIC8vICk7XG5cbiAgLy8gTGlzdGVuIGZvciBuZXcgYW5ub3RhdGlvbiBjcmVhdGlvbiBldmVudHNcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcImFubm90YXRpb25zLmNyZWF0ZVwiLCBhc3luYyAoYW5ub3RhdGlvbikgPT4ge1xuICAgIC8vIEV4dHJhY3QgcmVsZXZhbnQgcHJvcGVydGllcyBmcm9tIHRoZSBmaXJzdCBhbm5vdGF0aW9uXG4gICAgY29uc3QgeyBib3VuZGluZ0JveCwgcGFnZUluZGV4LCBjdXN0b21EYXRhLCBsaW5lV2lkdGgsIGxpbmVzIH0gPVxuICAgICAgYW5ub3RhdGlvbi5nZXQoMCk7XG5cbiAgICAvLyBTa2lwIHByb2Nlc3NpbmcgaWY6XG4gICAgLy8gMS4gQW5ub3RhdGlvbiB3YXMgYWxyZWFkeSBjcmVhdGVkIGZyb20gZnJlZWZvcm0gKHByZXZlbnRzIGluZmluaXRlIGxvb3ApXG4gICAgLy8gMi4gQ3VycmVudCBwcmVzZXQgaXMgbm90IGhpZ2hsaWdodGVyXG4gICAgaWYgKFxuICAgICAgY3VzdG9tRGF0YT8uaXNDcmVhdGVkRnJvbUZyZWVGb3JtIHx8XG4gICAgICBpbnN0YW5jZS5jdXJyZW50QW5ub3RhdGlvblByZXNldCAhPT0gXCJoaWdobGlnaHRlclwiXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBsaW5lcyB0byBwbGFpbiBKYXZhU2NyaXB0IGFycmF5IGFuZCBleHRyYWN0IHN0YXJ0L2VuZCBwb2ludHNcbiAgICBjb25zdCBvcmlnaW5hbExpbmVzID0gbGluZXMuZ2V0KDApLnRvSlMoKTtcbiAgICBjb25zdCBzdGFydEFuZEVuZFBvaW50cyA9IFtvcmlnaW5hbExpbmVzWzBdLCBvcmlnaW5hbExpbmVzLmF0KC0xKV07XG5cbiAgICAvLyBFeHRyYWN0IGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IHN0cmFpZ2h0IGxpbmVcbiAgICBjb25zdCB7IHg6IHN0YXJ0WCwgeTogc3RhcnRZIH0gPSBzdGFydEFuZEVuZFBvaW50c1swXTtcbiAgICBjb25zdCB7IHg6IGVuZFggfSA9IHN0YXJ0QW5kRW5kUG9pbnRzWzFdO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHN0cmFpZ2h0IGxpbmUgdXNpbmcgc3RhcnQgYW5kIGVuZCBwb2ludHNcbiAgICBjb25zdCBzdHJhaWdodExpbmUgPSBQU1BERktpdC5JbW11dGFibGUuTGlzdChbXG4gICAgICBQU1BERktpdC5JbW11dGFibGUuTGlzdChbXG4gICAgICAgIG5ldyBQU1BERktpdC5HZW9tZXRyeS5EcmF3aW5nUG9pbnQoeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9KSxcbiAgICAgICAgbmV3IFBTUERGS2l0Lkdlb21ldHJ5LkRyYXdpbmdQb2ludCh7IHg6IGVuZFgsIHk6IHN0YXJ0WSB9KSxcbiAgICAgIF0pLFxuICAgIF0pO1xuXG4gICAgLy8gQ3JlYXRlIG5ldyBoaWdobGlnaHQgYW5ub3RhdGlvbiB3aXRoIHN0cmFpZ2h0IGxpbmVcbiAgICBjb25zdCBoaWdobGlnaHQgPSBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuSW5rQW5ub3RhdGlvbih7XG4gICAgICBwYWdlSW5kZXgsXG4gICAgICBsaW5lczogc3RyYWlnaHRMaW5lLFxuICAgICAgbGluZVdpZHRoLFxuICAgICAgYm91bmRpbmdCb3gsXG4gICAgICBibGVuZE1vZGU6IFwibXVsdGlwbHlcIixcbiAgICAgIGN1c3RvbURhdGE6IHtcbiAgICAgICAgaXNDcmVhdGVkRnJvbUZyZWVGb3JtOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIG9wYWNpdHk6IDEsXG4gICAgICBzdHJva2VDb2xvcjogUFNQREZLaXQuQ29sb3IuWUVMTE9XLFxuICAgIH0pO1xuXG4gICAgLy8gTG9nIHRoZSBzZXJpYWxpemVkIGhpZ2hsaWdodCBhbm5vdGF0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICBjb25zb2xlLmxvZyhQU1BERktpdC5Bbm5vdGF0aW9ucy50b1NlcmlhbGl6YWJsZU9iamVjdChoaWdobGlnaHQpKTtcblxuICAgIC8vIFJlcGxhY2Ugb3JpZ2luYWwgZnJlZWZvcm0gYW5ub3RhdGlvbiB3aXRoIG5ldyBzdHJhaWdodCBoaWdobGlnaHRcbiAgICBhd2FpdCBpbnN0YW5jZS5kZWxldGUoYW5ub3RhdGlvbik7XG4gICAgYXdhaXQgaW5zdGFuY2UuY3JlYXRlKGhpZ2hsaWdodCk7XG4gIH0pO1xufSk7XG4ifQ%253D%253D) - - Convert freeform ink annotations into highlight annotations. — [Video](https://www.youtube.com/watch?v=dJuIdtBJdcA) - -- [Add ink stroke color preset to custom buttons](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tY3Y3ZGo5NW16SyIsImxheWVyIjoicmFuZG9tY1FhQXJpcFVjMiJ9fSwianMiOiIvKipcbiAqIEluaXRpYWxpemVzIFBTUERGS2l0IFZpZXdlciB3aXRoIGN1c3RvbSB0b29sYmFyIGl0ZW1zIGZvciByZWQgYW5kIGJsdWUgaW5rIGFubm90YXRpb25zXG4gKi9cblxuLy8gSW5pdGlhbGl6ZSBQU1BERktpdCB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gU1ZHIHRlbXBsYXRlIGZvciBwZW4gaWNvbiAtIHVzZWQgZm9yIGJvdGggcmVkIGFuZCBibHVlIHBlbnNcbiAgY29uc3QgUEVOX0lDT05fU1ZHID0gYFxuICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBcbiAgICAgICB3aWR0aD1cIjI0XCIgXG4gICAgICAgaGVpZ2h0PVwiMjRcIiBcbiAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgXG4gICAgICAgY2xhc3M9XCJiaSBiaS1wZW5cIiBcbiAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCI%252BXG4gICAgPHBhdGggZD1cIm0xMy40OTguNzk1LjE0OS0uMTQ5YTEuMjA3IDEuMjA3IDAgMSAxIDEuNzA3IDEuNzA4bC0uMTQ5LjE0OGExLjUgMS41IDAgMCAxLS4wNTkgMi4wNTlMNC44NTQgMTQuODU0YS41LjUgMCAwIDEtLjIzMy4xMzFsLTQgMWEuNS41IDAgMCAxLS42MDYtLjYwNmwxLTRhLjUuNSAwIDAgMSAuMTMxLS4yMzJsOS42NDItOS42NDJhLjUuNSAwIDAgMC0uNjQyLjA1Nkw2Ljg1NCA0Ljg1NGEuNS41IDAgMSAxLS43MDgtLjcwOEw5LjQ0Ljg1NEExLjUgMS41IDAgMCAxIDExLjUuNzk2YTEuNSAxLjUgMCAwIDEgMS45OTgtLjAwMXptLS42NDQuNzY2YS41LjUgMCAwIDAtLjcwNyAwTDEuOTUgMTEuNzU2bC0uNzY0IDMuMDU3IDMuMDU3LS43NjRMMTQuNDQgMy44NTRhLjUuNSAwIDAgMCAwLS43MDhsLTEuNTg1LTEuNTg1elwiLz5cbiAgPC9zdmc%252BYDtcblxuICAvLyBDcmVhdGVzIGEgcGVuIGljb24gRE9NIG5vZGUgd2l0aCBzcGVjaWZpZWQgY29sb3JcbiAgZnVuY3Rpb24gY3JlYXRlUGVuSWNvbk5vZGUoY29sb3IpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBub2RlLmlubmVySFRNTCA9IFBFTl9JQ09OX1NWRy5yZXBsYWNlKFwiY3VycmVudENvbG9yXCIsIGNvbG9yKTtcbiAgICBub2RlLnF1ZXJ5U2VsZWN0b3IoXCJwYXRoXCIpLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgY29sb3IpO1xuICAgIG5vZGUucXVlcnlTZWxlY3RvcihcInN2Z1wiKS5zdHlsZS5jb2xvciA9IGNvbG9yO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgLy8gQ3JlYXRlcyBhIGN1c3RvbSB0b29sYmFyIGl0ZW1cbiAgZnVuY3Rpb24gY3JlYXRlSW5rVG9vbGJhckl0ZW0odGl0bGUsIG5vZGUsIGNvbG9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICB0aXRsZSxcbiAgICAgIG5vZGUsXG4gICAgICBvblByZXNzOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW50ZXJhY3Rpb25Nb2RlIH0gPSBpbnN0YW5jZS52aWV3U3RhdGU7XG5cbiAgICAgICAgaWYgKGludGVyYWN0aW9uTW9kZSA9PT0gXCJJTktcIiB8fCBpbnRlcmFjdGlvbk1vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIGN1cnJlbnQgaW50ZXJhY3Rpb24gbW9kZVxuICAgICAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgICAgICAgICAgdmlld1N0YXRlLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBudWxsKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgaW5rIHByZXNldCB3aXRoIHNlbGVjdGVkIGNvbG9yXG4gICAgICAgICAgaW5zdGFuY2Uuc2V0QW5ub3RhdGlvblByZXNldHMoKHByZXNldHMpID0%252BICh7XG4gICAgICAgICAgICAuLi5wcmVzZXRzLFxuICAgICAgICAgICAgaW5rOiB7XG4gICAgICAgICAgICAgIC4uLnByZXNldHMuaW5rLFxuICAgICAgICAgICAgICBzdHJva2VDb2xvcjogY29sb3IsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIC8vIEVuYWJsZSBpbmsgbW9kZSB3aXRoIG5ldyBjb2xvclxuICAgICAgICAgIGluc3RhbmNlLnNldEN1cnJlbnRBbm5vdGF0aW9uUHJlc2V0KFwiaW5rXCIpO1xuICAgICAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgICAgICAgICAgdmlld1N0YXRlLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuSU5LKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGlvbiBtb2RlXG4gICAgICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BXG4gICAgICAgICAgICB2aWV3U3RhdGUuc2V0KFwiaW50ZXJhY3Rpb25Nb2RlXCIsIG51bGwpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQ3JlYXRlIHBlbiBpY29uIG5vZGVzIGZvciBlYWNoIGNvbG9yXG4gIGNvbnN0IHJlZFBlbk5vZGUgPSBjcmVhdGVQZW5JY29uTm9kZShcInJlZFwiKTtcbiAgY29uc3QgYmx1ZVBlbk5vZGUgPSBjcmVhdGVQZW5JY29uTm9kZShcImJsdWVcIik7XG5cbiAgLy8gQ3JlYXRlIHRvb2xiYXIgaXRlbXMgZm9yIHJlZCBhbmQgYmx1ZSBpbmtcbiAgY29uc3QgcmVkSW5rVG9vbCA9IGNyZWF0ZUlua1Rvb2xiYXJJdGVtKFxuICAgIFwiUmVkIElua1wiLFxuICAgIHJlZFBlbk5vZGUsXG4gICAgUFNQREZLaXQuQ29sb3IuUkVEXG4gICk7XG4gIGNvbnN0IGJsdWVJbmtUb29sID0gY3JlYXRlSW5rVG9vbGJhckl0ZW0oXG4gICAgXCJCbHVlIElua1wiLFxuICAgIGJsdWVQZW5Ob2RlLFxuICAgIFBTUERGS2l0LkNvbG9yLkJMVUVcbiAgKTtcblxuICAvLyBBZGQgY3VzdG9tIHRvb2xzIHRvIHRvb2xiYXIgbmV4dCB0byB0aGUgZGVmYXVsdCBpbmsgdG9vbFxuICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoKGl0ZW1zKSA9PlxuICAgIGl0ZW1zLnJlZHVjZShcbiAgICAgICh0b29sYmFyLCBpdGVtKSA9PlxuICAgICAgICBpdGVtLnR5cGUgPT09IFwiaW5rXCJcbiAgICAgICAgICA%252FIFsuLi50b29sYmFyLCBpdGVtLCByZWRJbmtUb29sLCBibHVlSW5rVG9vbF1cbiAgICAgICAgICA6IFsuLi50b29sYmFyLCBpdGVtXSxcbiAgICAgIFtdXG4gICAgKVxuICApO1xufSk7XG4ifQ%253D%253D) - - Customize the toolbar to add two custom ink annotation buttons — one for red ink and one for blue ink — alongside the default ink annotation tool. — [Video](https://www.youtube.com/watch?v=5c1Djroucjk) - -- [Custom outlines for shape annotations](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLfSkudGhlbigoaW5zdGFuY2U9PntpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKCdwYWdlLnByZXNzJywoYXN5bmMgZXZlbnQ9Pntjb25zdHtwb2ludDpwb2ludCxwYWdlSW5kZXg6cGFnZUluZGV4LG5hdGl2ZUV2ZW50Om5hdGl2ZUV2ZW50fT1ldmVudCxhbm5vdGF0aW9uPShhd2FpdCBpbnN0YW5jZS5nZXRBbm5vdGF0aW9ucygwKSkuZmluZCgoYW5ub3RhdGlvbj0%252Be2NvbnN0IG91dGVyUmVjdD1hbm5vdGF0aW9uLmJvdW5kaW5nQm94Lmdyb3coMzApLGlubmVyUmVjdD1hbm5vdGF0aW9uLmJvdW5kaW5nQm94Lmdyb3coLTMwKTtyZXR1cm4gb3V0ZXJSZWN0LmlzUG9pbnRJbnNpZGUocG9pbnQpJiYhaW5uZXJSZWN0LmlzUG9pbnRJbnNpZGUocG9pbnQpfSkpLGlzU2VsZWN0PWluc3RhbmNlLmdldFNlbGVjdGVkQW5ub3RhdGlvbnMoKTthbm5vdGF0aW9uJiYhaXNTZWxlY3QmJihuYXRpdmVFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxzZXRUaW1lb3V0KCgoKT0%252BaW5zdGFuY2Uuc2V0U2VsZWN0ZWRBbm5vdGF0aW9ucyhhbm5vdGF0aW9uLmlkKSksMCkpfSkpfSkpOyIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4uUFNQREZLaXQtU2hhcGUtQW5ub3RhdGlvbntcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLlBTUERGS2l0LVNoYXBlLUFubm90YXRpb246bm90KDpoYXMoc3ZnIGVsbGlwc2UpKTo6YWZ0ZXJ7XG4gICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxLjI1cmVtO1xuICBib3R0b206IDEuMjVyZW07XG4gIGxlZnQ6IDEuMjVyZW07XG4gIHJpZ2h0OiAxLjI1cmVtO1xuICBvdXRsaW5lOiAxcHggc29saWQgcmVkICFpbXBvcnRhbnQ7XG59XG5cbi5QU1BERktpdC1TaGFwZS1Bbm5vdGF0aW9uOmhhcyhzdmcgZWxsaXBzZSk6OmFmdGVye1xuICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICBjb250ZW50OiBcIlwiO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMS4yNXJlbTtcbiAgYm90dG9tOiAxLjI1cmVtO1xuICBsZWZ0OiAxLjI1cmVtO1xuICByaWdodDogMS4yNXJlbTtcbiAgb3V0bGluZTogMXB4IHNvbGlkIHJlZCAhaW1wb3J0YW50O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG5cbi5QU1BERktpdC1TaGFwZS1Bbm5vdGF0aW9uOjpiZWZvcmUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICBjb250ZW50OiBcIlwiO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLTI1cHg7XG4gIGJvdHRvbTogLTI1cHg7XG4gIGxlZnQ6IC0yNXB4O1xuICByaWdodDogLTI1cHg7XG4gIG91dGxpbmU6IDJweCBzb2xpZCBwaW5rO1xufVxuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - - Customize shape annotations by adding an outline. — [Video](https://www.youtube.com/watch?v=9MFHv_CDwKU) - -- [Customize annotation creators](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiJsZXQgYWxsU3RhbXBzPVtdLGNyZWF0b3JzPVsnVHJpc3RhJywnRWxpJywnQWxleCcsJ1BhdicsJ0NocmlzJ107UFNQREZLaXQubG9hZCh7Li4uYmFzZU9wdGlvbnMsdGhlbWU6UFNQREZLaXQuVGhlbWUuREFSSyxjdXN0b21SZW5kZXJlcnM6e319KS50aGVuKChpbnN0YW5jZT0%252Be2NvbnN0IHNlbGVjdE5vZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7c2VsZWN0Tm9kZS5pbm5lckhUTUw9Y3JlYXRvcnMubWFwKChjcmVhdG9yPT5gPG9wdGlvbiB2YWx1ZT1cIiR7Y3JlYXRvcn1cIj4ke2NyZWF0b3J9PC9vcHRpb24%252BYCkpLFxuLy9saXN0ZW5pbmcgdG8gb25DaGFuZ2UgZXZlbnRzIHRvIHVwZGF0ZSB0aGUgZm9udCBmYW1pbHkgYWNjb3JkaW5nbHlcbnNlbGVjdE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoYXN5bmMgZXZlbnQ9Pntjb25zb2xlLmxvZyhgU2VsZWN0ZWQgb3B0aW9uOiAke2V2ZW50LnRhcmdldC52YWx1ZX1gKSxpbnN0YW5jZS5zZXRDdXN0b21SZW5kZXJlcnMoe0Fubm90YXRpb246KHthbm5vdGF0aW9uOmFubm90YXRpb259KT0%252BZXZlbnQudGFyZ2V0LnZhbHVlPT09YW5ub3RhdGlvbi5jcmVhdG9yTmFtZT97bm9kZTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxhcHBlbmQ6ITF9Om51bGx9KX0pKTtcbi8vQ3VzdG9tIFRvb2xiYXIgSXRlbVxuY29uc3QgZmlsdGVyPXt0eXBlOidjdXN0b20nLGlkOidteS1idXR0b24nLG5vZGU6c2VsZWN0Tm9kZX07aW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKFt7dHlwZTonc3BhY2VyJ30sZmlsdGVyLHt0eXBlOidzcGFjZXInfV0pLGluc3RhbmNlLnNldEFubm90YXRpb25DcmVhdG9yTmFtZSgnU2FzaGEnKTtmb3IobGV0IGk9MDtpPDU7KytpKWFsbFN0YW1wc1tpXT1uZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuU3RhbXBBbm5vdGF0aW9uKHtwYWdlSW5kZXg6MCxpZDpQU1BERktpdC5nZW5lcmF0ZUluc3RhbnRJZCgpLHN0YW1wVHlwZTonQ3VzdG9tJyx0aXRsZTpgU1RBTVAtJHtpfWAsY29sb3I6UFNQREZLaXQuQ29sb3IuQkxBQ0ssYm91bmRpbmdCb3g6bmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe2xlZnQ6aT4wP2FsbFN0YW1wc1tpLTFdLmJvdW5kaW5nQm94LmxlZnQrNTA6MTAwLHRvcDoxMDAsd2lkdGg6NTAsaGVpZ2h0OjUwfSksY3JlYXRvck5hbWU6Y3JlYXRvcnNbaV19KTtcbi8vY3JlYXRpbmcgYWxsIHRoZSBzdGFtcHNcbmluc3RhbmNlLmNyZWF0ZShhbGxTdGFtcHMpfSkpOyIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cdC5jaGVja2JveC1kcm9wZG93biB7XG4gICAgd2lkdGg6IDIwMHB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7XG4gICAgcGFkZGluZzogMTBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi8qIERpc3BsYXkgQ1NTIGFycm93IHRvIHRoZSByaWdodCBvZiB0aGUgZHJvcGRvd24gdGV4dCAqL1xuLmNoZWNrYm94LWRyb3Bkb3duOmFmdGVyIHtcbiAgICBjb250ZW50OicnO1xuICAgIGhlaWdodDogMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDA7XG4gICAgYm9yZGVyOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogIzAwMDtcbiAgICB0b3A6IDUwJTtcbiAgICByaWdodDogMTBweDtcbiAgICBtYXJnaW4tdG9wOiAtM3B4O1xufVxuXG4vKiBSZXZlcnNlIHRoZSBDU1MgYXJyb3cgd2hlbiB0aGUgZHJvcGRvd24gaXMgYWN0aXZlICovXG4uY2hlY2tib3gtZHJvcGRvd24uaXMtYWN0aXZlOmFmdGVyIHtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAwO1xuICAgIGJvcmRlci10b3AtY29sb3I6ICNmZmY7XG4gICAgbWFyZ2luLXRvcDogLTlweDtcbn1cblxuLmNoZWNrYm94LWRyb3Bkb3duLWxpc3Qge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMTAwJTsgLyogYWxpZ24gdGhlIGRyb3Bkb3duIHJpZ2h0IGJlbG93IHRoZSBkcm9wZG93biB0ZXh0ICovXG4gICAgYm9yZGVyOiBpbmhlcml0O1xuICAgIGJvcmRlci10b3A6IG5vbmU7XG4gICAgbGVmdDogLTFweDsgLyogYWxpZ24gdGhlIGRyb3Bkb3duIHRvIHRoZSBsZWZ0ICovXG4gICAgcmlnaHQ6IC0xcHg7IC8qIGFsaWduIHRoZSBkcm9wZG93biB0byB0aGUgcmlnaHQgKi9cbiAgICBvcGFjaXR5OiAwOyAvKiBoaWRlIHRoZSBkcm9wZG93biAqL1xuICAgXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjRzIGVhc2UtaW4tb3V0O1xuICAgIGhlaWdodDogMTAwcHg7XG4gICAgb3ZlcmZsb3c6IHNjcm9sbDtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7IC8qIGF2b2lkIG1vdXNlIGNsaWNrIGV2ZW50cyBpbnNpZGUgdGhlIGRyb3Bkb3duICovXG59XG4uaXMtYWN0aXZlIC5jaGVja2JveC1kcm9wZG93bi1saXN0IHtcbiAgICBvcGFjaXR5OiAxOyAvKiBkaXNwbGF5IHRoZSBkcm9wZG93biAqL1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOyAvKiBtYWtlIHN1cmUgdGhhdCB0aGUgdXNlciBzdGlsbCBjYW4gc2VsZWN0IGNoZWNrYm94ZXMgKi9cbn1cblxuLmNoZWNrYm94LWRyb3Bkb3duLWxpc3QgbGkgbGFiZWwge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBzaWx2ZXI7XG4gICAgcGFkZGluZzogMTBweDtcbiAgIFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2Utb3V0O1xufVxuXG4uY2hlY2tib3gtZHJvcGRvd24tbGlzdCBsaSBsYWJlbDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzU1NTtcbiAgICBjb2xvcjogd2hpdGU7XG59XG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - - Create and customize stamp annotations with multiple creators. — [Video](https://www.youtube.com/watch?v=etJAe9bJzic) - -- [Prevent dragging of annotations](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChpbnN0YW5jZT0%252Be2luc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLnByZXNzJywoZXZlbnQ9Pntjb25zdHthbm5vdGF0aW9uOmFubm90YXRpb24sbmF0aXZlRXZlbnQ6bmF0aXZlRXZlbnR9PWV2ZW50O1xuLy9oYW5kbGluZyBzcGVjaWFsIGNhc2UgZm9yIFRleHQgQW5ub3RhdGlvbnNcbnJldHVybiBudWxsIT09aW5zdGFuY2UuZ2V0U2VsZWN0ZWRBbm5vdGF0aW9ucygpJiZhbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuVGV4dEFubm90YXRpb24%252FaW5zdGFuY2Uuc2V0RWRpdGluZ0Fubm90YXRpb24oYW5ub3RhdGlvbix7YXV0b1NlbGVjdFRleHQ6ITF9KTpcbi8vSGFuZGxpbmcgc3BlY2lhbCBjYXNlIGZvciBOb3RlcyBzbGlnaGx0eSBkaWZmZXJlbnQgdGhhbiBUZXh0IEFubm90YXRpb25zXG5hbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuTm90ZUFubm90YXRpb24%252FKGV2ZW50LnByZXZlbnREZWZhdWx0KCksaW5zdGFuY2Uuc2V0RWRpdGluZ0Fubm90YXRpb24oYW5ub3RhdGlvbix7YXV0b1NlbGVjdFRleHQ6ITF9KSk6XG4vL2lnbm9yaW5nIEZvcm1zIGFuZCBMaW5rcyB0byBhbGxvdyBkZWZhdWx0IGZvY3VzIGFuZCByZWRpcmVjdCBiZWhhdmlvcnMgcmVzcGVjdGl2ZWx5XG5hbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuV2lkZ2V0QW5ub3RhdGlvbnx8YW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBTUERGS2l0LkFubm90YXRpb25zLkxpbmtBbm5vdGF0aW9uP3ZvaWQgMDooXG4vL3ByZXZlbnRpbmcgZHJhZ2dpbmcgZm9yIHRoZSByZXN0IG9mIEFubm90YXRpb24gVHlwZXNcbmV2ZW50LnByZXZlbnREZWZhdWx0KCksaW5zdGFuY2Uuc2V0U2VsZWN0ZWRBbm5vdGF0aW9ucyhhbm5vdGF0aW9uKSl9KSx7Y2FwdHVyZTohMH0pfSkpOyIsIm1vZGUiOiJzdGFuZGFsb25lIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) - - Allow special behavior for text and note annotations, while preserving default behaviors for forms and links, and restrict dragging for other annotation types. - -- [Restrict dragging and editing ink annotations and signatures](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb211cWlpT202ZU5xIiwibGF5ZXIiOiJyYW5kb21QRzRBRkxwbGM2In19LCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChhc3luYyBpbnN0YW5jZT0%252Be2NvbnN0IGFubm90YXRpb249bmV3IFBTUERGS2l0LkFubm90YXRpb25zLklua0Fubm90YXRpb24oe3BhZ2VJbmRleDowLGlzU2lnbmF0dXJlOiEwLGxpbmVzOlBTUERGS2l0LkltbXV0YWJsZS5MaXN0KFtQU1BERktpdC5JbW11dGFibGUuTGlzdChbbmV3IFBTUERGS2l0Lkdlb21ldHJ5LkRyYXdpbmdQb2ludCh7eDo1LHk6NX0pLG5ldyBQU1BERktpdC5HZW9tZXRyeS5EcmF3aW5nUG9pbnQoe3g6OTUseTo5NX0pXSksUFNQREZLaXQuSW1tdXRhYmxlLkxpc3QoW25ldyBQU1BERktpdC5HZW9tZXRyeS5EcmF3aW5nUG9pbnQoe3g6OTUseTo1fSksbmV3IFBTUERGS2l0Lkdlb21ldHJ5LkRyYXdpbmdQb2ludCh7eDo1LHk6OTV9KV0pXSksYm91bmRpbmdCb3g6bmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe2xlZnQ6MCx0b3A6MCx3aWR0aDoxMDAsaGVpZ2h0OjEwMH0pfSk7YXdhaXQgaW5zdGFuY2UuY3JlYXRlKGFubm90YXRpb24pLGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLnByZXNzJywoZXZlbnQ9Pntjb25zdHthbm5vdGF0aW9uOmFubm90YXRpb24sbmF0aXZlRXZlbnQ6bmF0aXZlRXZlbnR9PWV2ZW50O2NvbnNvbGUubG9nKGluc3RhbmNlLmdldFNlbGVjdGVkQW5ub3RhdGlvbnMoKSksbnVsbCE9PWluc3RhbmNlLmdldFNlbGVjdGVkQW5ub3RhdGlvbnMoKSYmYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBTUERGS2l0LkFubm90YXRpb25zLklua0Fubm90YXRpb24mJmFubm90YXRpb24uaXNTaWduYXR1cmUmJihldmVudC5wcmV2ZW50RGVmYXVsdCgpLGluc3RhbmNlLnNldFNlbGVjdGVkQW5ub3RhdGlvbnMoYW5ub3RhdGlvbikpfSkpfSkpOyIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cbi5QU1BERktpdC1SZXNpemUtQW5jaG9yIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXHQifQ%253D%253D) - - Prevent users from editing or dragging ink annotations and ink signatures, but allow them to delete them. - -- [Programmatically create a comment thread](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiIvL3NldCB1c2VyIG5hbWUgZnJvbSBhIGxvZ2luIG9yIGF1dGhlbnRpY2F0aW9uXG5jb25zdCB1c2VybmFtZT0nT21hcic7UFNQREZLaXQubG9hZCh7Li4uYmFzZU9wdGlvbnMsdGhlbWU6UFNQREZLaXQuVGhlbWUuREFSSyx0b29sYmFySXRlbXM6W3t0eXBlOidjb21tZW50J31dfSkudGhlbigoaW5zdGFuY2U9Pntjb25zdCBhbm5vdGF0aW9uPW5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5Db21tZW50TWFya2VyQW5ub3RhdGlvbih7aWQ6J3Rlc3QnLHBhZ2VJbmRleDowLGJvdW5kaW5nQm94Om5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHt0b3A6MTAwLGxlZnQ6MTAwLHdpZHRoOjEwLGhlaWdodDoxMH0pLGN1c3RvbURhdGE6e2NpcmNsZUlkOidteS1jaXJjbGUnfX0pLGNvbW1lbnQ9bmV3IFBTUERGS2l0LkNvbW1lbnQoe2lkOidjb21tZW50SWQnLHJvb3RJZDondGVzdCcscGFnZUluZGV4OjAsdGV4dDp7Zm9ybWF0OidwbGFpbicsdmFsdWU6J0hlbGxvJ319KTtpbnN0YW5jZS5zZXRBbm5vdGF0aW9uQ3JlYXRvck5hbWUoJ09tYXInKSxpbnN0YW5jZS5jcmVhdGUoW2Fubm90YXRpb24sY29tbWVudF0pLGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLmNyZWF0ZScsKGFubm90YXRpb25zPT57Y29uc29sZS5sb2coYW5ub3RhdGlvbnMuZ2V0KDApLnRvSlMoKSl9KSl9KSk7IiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) - - Programmatically add a comment marker annotation and an associated comment while setting the annotation creator’s name. — [Video](https://www.youtube.com/watch?v=zaan1UNYlZ8) - -- [Open URL from image annotation](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxufSkudGhlbihhc3luYyhpbnN0YW5jZSkgPT4ge1xuIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vcHNwZGZraXQuY29tL2Fzc2V0cy9pbWFnZXMvZGlhZ29uYWwtZmxpZ2h0LWNhcmRzLTdkOTk3Njk5LnBuZ1wiKTtcbmNvbnN0IGJsb2IgPSBhd2FpdCByZXF1ZXN0LmJsb2IoKTtcbmNvbnN0IGltYWdlQXR0YWNobWVudElkID0gYXdhaXQgaW5zdGFuY2UuY3JlYXRlQXR0YWNobWVudChibG9iKTtcbmNvbnN0IGFubm90YXRpb24gPSBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuSW1hZ2VBbm5vdGF0aW9uKHtcbiAgcGFnZUluZGV4OiAwLFxuICBjb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgaW1hZ2VBdHRhY2htZW50SWQsXG4gIGRlc2NyaXB0aW9uOiBcIkV4YW1wbGUgSW1hZ2UgQW5ub3RhdGlvblwiLFxuICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgIGxlZnQ6IDEwLFxuICAgIHRvcDogMjAsXG4gICAgd2lkdGg6IDE1MCxcbiAgICBoZWlnaHQ6IDE1MCxcbiAgfSksXG4gIGFjdGlvbjogbmV3IFBTUERGS2l0LkFjdGlvbnMuVVJJQWN0aW9uKHt1cmk6IFwiaHR0cHM6Ly9wc3BkZmtpdC5jb20vYXNzZXRzL2ltYWdlcy9sb2dvcy9wc3BkZmtpdC0zY2NkODI1My5zdmdcIn0pXG59KTtcbmF3YWl0IGluc3RhbmNlLmNyZWF0ZShhbm5vdGF0aW9uKVxufSk7XG5cdCJ9) - -- [Display highlighted text in annotation sidebar](https://playground.pspdfkit.com/?p=eyJ2IjoxLCJtb2RlIjoic3RhbmRhbG9uZSIsImpzIjoibGV0IGluc3RhbmNlPW51bGw7Y29uc3QgY3VzdG9tVUlDb25maWd1cmF0aW9uPXtbUFNQREZLaXQuVUlFbGVtZW50LlNpZGViYXJdOntbUFNQREZLaXQuU2lkZWJhck1vZGUuQU5OT1RBVElPTlNdOih7Y29udGFpbmVyTm9kZTpjb250YWluZXJOb2RlfSk9Pih7bm9kZTpjb250YWluZXJOb2RlLG9uUmVuZGVySXRlbTooe2l0ZW06YW5ub3RhdGlvbixpdGVtQ29udGFpbmVyTm9kZTppdGVtQ29udGFpbmVyTm9kZX0pPT57YW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBTUERGS2l0LkFubm90YXRpb25zLkhpZ2hsaWdodEFubm90YXRpb24mJmluc3RhbmNlLmdldFRleHRGcm9tUmVjdHMoYW5ub3RhdGlvbi5wYWdlSW5kZXgsYW5ub3RhdGlvbi5yZWN0cykudGhlbigodGV4dD0%252Be2l0ZW1Db250YWluZXJOb2RlLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLnRleHRDb250ZW50PXRleHR9KSl9fSl9fTtQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLGN1c3RvbVVJOmN1c3RvbVVJQ29uZmlndXJhdGlvbixpbml0aWFsVmlld1N0YXRlOm5ldyBQU1BERktpdC5WaWV3U3RhdGUoe3NpZGViYXJNb2RlOlBTUERGS2l0LlNpZGViYXJNb2RlLkFOTk9UQVRJT05TfSl9KS50aGVuKChfaW5zdGFuY2U9PihpbnN0YW5jZT1faW5zdGFuY2UsY29uc29sZS5sb2coJ1BTUERGS2l0IGZvciBXZWIgc3VjY2Vzc2Z1bGx5IGxvYWRlZCEhJyxpbnN0YW5jZSksaW5zdGFuY2UpKSk7Iiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYiLCJqd3QiOnsicGVybWlzc2lvbnMiOlsicmVhZC1kb2N1bWVudCIsIndyaXRlIl0sInVzZXJJZCI6InJhbmRvbXZ1bllZQjlENjciLCJsYXllciI6InJhbmRvbVlqSnMwTnZNZVAifX0sImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cdCJ9) - - Customize the annotation sidebar to display highlighted text and allow annotation editing (except for signatures). — [Video](https://www.youtube.com/watch?v=Fs1eeMrkXEQ) - -- [Log the print activity in the sidebar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmljb25fdGV4dCB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGglM0QlMjIyNSUyMiBoZWlnaHQlM0QlMjIyNSUyMiB2aWV3Qm94JTNEJTIyMCUyMDAlMjAyNSUyMDI1JTIyIGZpbGwlM0QlMjIlMjNGRkZGRkYlMjIgeG1sbnMlM0QlMjJodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTIyJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC43NSUyMiBkJTNEJTIyTTEuNzA2NzkgMjAuNTY4TDMuNDc0NzkgMjIuMzM1TDIuMDU5NzkgMjMuNzVDMS44NzIyNiAyMy45Mzc1IDEuNjE3OTUgMjQuMDQyOCAxLjM1Mjc5IDI0LjA0MjhDMS4wODc2MiAyNC4wNDI4IDAuODMzMzE0IDIzLjkzNzUgMC42NDU3ODcgMjMuNzVMMC4yOTI3ODYgMjMuMzk2QzAuMTA1MzE1IDIzLjIwODUgMCAyMi45NTQyIDAgMjIuNjg5QzAgMjIuNDIzOCAwLjEwNTMxNSAyMi4xNjk1IDAuMjkyNzg2IDIxLjk4MkwxLjcwNjc5IDIwLjU2OFolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NwYXRoIGQlM0QlMjJNOC45MjQ3OSA1LjkyOTk5TDguMjE0NzkgNi42Mjk5OUMzLjI2NDc5IDExLjYzIDMuNjI0NzkgMTYuODkgMy42MjQ3OSAxNi44OUwyLjA0NDc5IDE4LjQ4QzEuOTI4MzggMTguNTk2MSAxLjgzNjAyIDE4LjczNCAxLjc3MyAxOC44ODU5QzEuNzA5OTkgMTkuMDM3OCAxLjY3NzU1IDE5LjIwMDYgMS42Nzc1NSAxOS4zNjVDMS42Nzc1NSAxOS41Mjk0IDEuNzA5OTkgMTkuNjkyMiAxLjc3MyAxOS44NDQxQzEuODM2MDIgMTkuOTk1OSAxLjkyODM4IDIwLjEzMzkgMi4wNDQ3OSAyMC4yNUwzLjc5NDc5IDIyQzMuOTEwOSAyMi4xMTY0IDQuMDQ4ODQgMjIuMjA4OCA0LjIwMDcgMjIuMjcxOEM0LjM1MjU2IDIyLjMzNDggNC41MTUzNyAyMi4zNjcyIDQuNjc5NzkgMjIuMzY3MkM0Ljg0NDIgMjIuMzY3MiA1LjAwNzAxIDIyLjMzNDggNS4xNTg4NyAyMi4yNzE4QzUuMzEwNzMgMjIuMjA4OCA1LjQ0ODY3IDIyLjExNjQgNS41NjQ3OSAyMkw3LjE1NDc5IDIwLjQxQzcuMTU0NzkgMjAuNDEgMTIuNDY0OCAyMC43NyAxNy40MTQ4IDE1LjgyTDE4LjExNDggMTUuMTElMjIgc3Ryb2tlJTNEJTIyYmxhY2slMjIgc3Ryb2tlLW1pdGVybGltaXQlM0QlMjIxMCUyMiBzdHJva2UtbGluZWNhcCUzRCUyMnJvdW5kJTIyLyUzRSUzQ3BhdGggb3BhY2l0eSUzRCUyMjAuMzMlMjIgZCUzRCUyMk0xNi43MDY4IDE1LjgyNkw4LjIyMTggNy4zNDFMNi44MDc4IDguNzU1TDE1LjI5MjggMTcuMjRMMTYuNzA2OCAxNS44MjZaJTIyIGZpbGwlM0QlMjIlMjNGODI0MDAlMjIvJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC41JTIyIGQlM0QlMjJNNi45Mzk4MSAxOS45MzFMNC4xMTA4MSAxNy4xMDNMMy40MDM4MSAxNy44MUw2LjIzMjgxIDIwLjYzOEw2LjkzOTgxIDE5LjkzMVolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NjaXJjbGUgY3glM0QlMjIxOC4wNDQ4JTIyIGN5JTNEJTIyNiUyMiByJTNEJTIyNiUyMiBmaWxsJTNEJTIyJTIzRjgyNDAwJTIyLyUzRSUzQy9zdmclM0VcIilcbiAgICBuby1yZXBlYXQgY2VudGVyO1xufVxuIiwianMiOiJsZXQgcHJpbnRIaXN0b3J5ID0gW107XG5sZXQgaW5zdGFuY2UgPSBudWxsO1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50RGF0ZVRpbWUoKSB7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgeWVhcjogJ251bWVyaWMnLFxuICAgIG1vbnRoOiAnbG9uZycsXG4gICAgZGF5OiAnbnVtZXJpYycsXG4gICAgaG91cjogJzItZGlnaXQnLFxuICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgIHNlY29uZDogJzItZGlnaXQnLFxuICAgIGhvdXIxMjogdHJ1ZVxuICB9O1xuICByZXR1cm4gbm93LnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tVVMnLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gbG9nUHJpbnRBY3Rpdml0eSgpIHtcbiAgY29uc29sZS5sb2coJ0xvZ2dpbmcgcHJpbnQgYWN0aXZpdHknKTtcbiAgY29uc3QgcHJpbnRUaW1lID0gZ2V0Q3VycmVudERhdGVUaW1lKCk7XG4gIGNvbnN0IHByaW50RW50cnkgPSBgUHJpbnRlZCBvbiAke3ByaW50VGltZX1gO1xuICBcbiAgcHJpbnRIaXN0b3J5LnVuc2hpZnQocHJpbnRFbnRyeSk7XG4gIFxuICBpZiAocHJpbnRIaXN0b3J5Lmxlbmd0aCA%252BIDEwKSB7XG4gICAgcHJpbnRIaXN0b3J5ID0gcHJpbnRIaXN0b3J5LnNsaWNlKDAsIDEwKTtcbiAgfVxuICBcbiAgY29uc29sZS5sb2coJ1ByaW50IGhpc3RvcnkgdXBkYXRlZDonLCBwcmludEhpc3RvcnkpO1xuICB1cGRhdGVDdXN0b21VSSgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDdXN0b21VSSgpIHtcbiAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuICBcbiAgY29uc3QgY3VzdG9tVUkgPSB7XG4gICAgW051dHJpZW50Vmlld2VyLlVJRWxlbWVudC5TaWRlYmFyXToge1xuICAgICAgW051dHJpZW50Vmlld2VyLlNpZGViYXJNb2RlLkNVU1RPTV06ICh7IGNvbnRhaW5lck5vZGUgfSkgPT4ge1xuICAgICAgICAvLyBDbGVhciB0aGUgY29udGFpbmVyXG4gICAgICAgIGNvbnRhaW5lck5vZGUuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG1haW5Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBtYWluQ29udGFpbmVyLnN0eWxlLnBhZGRpbmcgPSBcIjIwcHhcIjtcbiAgICAgICAgbWFpbkNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcbiAgICAgICAgbWFpbkNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcbiAgICAgICAgXG4gICAgICAgIC8vIFByaW50IGFjdGl2aXR5IHRpdGxlXG4gICAgICAgIGNvbnN0IHByaW50VGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDRcIik7XG4gICAgICAgIHByaW50VGl0bGUuaW5uZXJUZXh0ID0gXCJQcmludCBBY3Rpdml0eSBMb2dcIjtcbiAgICAgICAgcHJpbnRUaXRsZS5zdHlsZS5tYXJnaW4gPSBcIjAgMCAxNXB4IDBcIjtcbiAgICAgICAgcHJpbnRUaXRsZS5zdHlsZS5jb2xvciA9IFwiI2ZmZlwiO1xuICAgICAgICBcbiAgICAgICAgLy8gSGlzdG9yeSBsaXN0IGNvbnRhaW5lclxuICAgICAgICBjb25zdCBoaXN0b3J5TGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGhpc3RvcnlMaXN0LnN0eWxlLm1heEhlaWdodCA9IFwiNDAwcHhcIjtcbiAgICAgICAgaGlzdG9yeUxpc3Quc3R5bGUub3ZlcmZsb3dZID0gXCJhdXRvXCI7XG4gICAgICAgIFxuICAgICAgICBpZiAocHJpbnRIaXN0b3J5Lmxlbmd0aCA%252BIDApIHtcbiAgICAgICAgICBwcmludEhpc3RvcnkuZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoaXN0b3J5SXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZjhmOWZhXCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5ib3JkZXIgPSBcIjFweCBzb2xpZCAjZGVlMmU2XCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIjRweFwiO1xuICAgICAgICAgICAgaGlzdG9yeUl0ZW0uc3R5bGUucGFkZGluZyA9IFwiMTBweFwiO1xuICAgICAgICAgICAgaGlzdG9yeUl0ZW0uc3R5bGUubWFyZ2luQm90dG9tID0gXCI4cHhcIjtcbiAgICAgICAgICAgIGhpc3RvcnlJdGVtLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5jb2xvciA9IFwiIzMzM1wiO1xuICAgICAgICAgICAgY29uc3QgcHJpbnROdW1iZXIgPSBwcmludEhpc3RvcnkubGVuZ3RoIC0gaW5kZXg7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5pbm5lckhUTUwgPSBgPHN0cm9uZz5QcmludCAjJHtwcmludE51bWJlcn08L3N0cm9uZz48YnI%252BJHtlbnRyeX1gO1xuICAgICAgICAgICAgaGlzdG9yeUxpc3QuYXBwZW5kQ2hpbGQoaGlzdG9yeUl0ZW0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vSGlzdG9yeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgbm9IaXN0b3J5LmlubmVyVGV4dCA9IFwiTm8gcHJpbnQgYWN0aXZpdHkgeWV0XCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLmNvbG9yID0gXCIjNmM3NTdkXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLmZvbnRTdHlsZSA9IFwiaXRhbGljXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLnRleHRBbGlnbiA9IFwiY2VudGVyXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLnBhZGRpbmcgPSBcIjIwcHhcIjtcbiAgICAgICAgICBoaXN0b3J5TGlzdC5hcHBlbmRDaGlsZChub0hpc3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBtYWluQ29udGFpbmVyLmFwcGVuZENoaWxkKHByaW50VGl0bGUpO1xuICAgICAgICBtYWluQ29udGFpbmVyLmFwcGVuZENoaWxkKGhpc3RvcnlMaXN0KTtcbiAgICAgICAgY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChtYWluQ29udGFpbmVyKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7IG5vZGU6IGNvbnRhaW5lck5vZGUgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgXG4gIGluc3RhbmNlLnNldEN1c3RvbVVJQ29uZmlndXJhdGlvbihjdXN0b21VSSk7XG59XG5cbmZ1bmN0aW9uIHNldHVwUHJpbnRFdmVudExpc3RlbmVycygpIHtcbiAgY29uc29sZS5sb2coJ1NldHRpbmcgdXAgcHJpbnQgZXZlbnQgbGlzdGVuZXJzJyk7XG4gIFxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JlcHJpbnQnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ0JlZm9yZSBwcmludCBldmVudCBkZXRlY3RlZCcpO1xuICAgIGxvZ1ByaW50QWN0aXZpdHkoKTtcbiAgfSk7XG4gIFxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYWZ0ZXJwcmludCcsICgpID0%252BIHtcbiAgICBjb25zb2xlLmxvZygnQWZ0ZXIgcHJpbnQgZXZlbnQgZGV0ZWN0ZWQnKTtcbiAgfSk7XG4gIFxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LmtleSA9PT0gJ3AnKSB7XG4gICAgICBjb25zb2xlLmxvZygnUHJpbnQga2V5Ym9hcmQgc2hvcnRjdXQgZGV0ZWN0ZWQnKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsb2dQcmludEFjdGl2aXR5KCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfSk7XG59XG5cbk51dHJpZW50Vmlld2VyLmxvYWQoeyBcbiAgLi4uYmFzZU9wdGlvbnMsIFxuICB0aGVtZTogTnV0cmllbnRWaWV3ZXIuVGhlbWUuREFSSyxcbiAgZW5hYmxlSGlzdG9yeTogdHJ1ZSxcbiAgZW5hYmxlQ2xpcGJvYXJkQWN0aW9uczogdHJ1ZSxcbn0pLnRoZW4oKGluc3RhbmNlUmVmKSA9PiB7XG4gIGNvbnNvbGUubG9nKCdOdXRyaWVudFZpZXdlciBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIGluc3RhbmNlID0gaW5zdGFuY2VSZWY7XG4gIHdpbmRvdy5pbnN0YW5jZSA9IGluc3RhbmNlUmVmO1xuICBcbiAgLy8gU2V0IHVwIHRoZSBjdXN0b20gVUlcbiAgY29uc3QgY3VzdG9tVUkgPSB7XG4gICAgW051dHJpZW50Vmlld2VyLlVJRWxlbWVudC5TaWRlYmFyXToge1xuICAgICAgW051dHJpZW50Vmlld2VyLlNpZGViYXJNb2RlLkNVU1RPTV06ICh7IGNvbnRhaW5lck5vZGUgfSkgPT4ge1xuICAgICAgICAvLyBDbGVhciB0aGUgY29udGFpbmVyXG4gICAgICAgIGNvbnRhaW5lck5vZGUuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG1haW5Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBtYWluQ29udGFpbmVyLnN0eWxlLnBhZGRpbmcgPSBcIjIwcHhcIjtcbiAgICAgICAgbWFpbkNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcbiAgICAgICAgbWFpbkNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcbiAgICAgICAgXG4gICAgICAgIC8vIFByaW50IGFjdGl2aXR5IHRpdGxlXG4gICAgICAgIGNvbnN0IHByaW50VGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDRcIik7XG4gICAgICAgIHByaW50VGl0bGUuaW5uZXJUZXh0ID0gXCJQcmludCBBY3Rpdml0eSBMb2dcIjtcbiAgICAgICAgcHJpbnRUaXRsZS5zdHlsZS5tYXJnaW4gPSBcIjAgMCAxNXB4IDBcIjtcbiAgICAgICAgcHJpbnRUaXRsZS5zdHlsZS5jb2xvciA9IFwiI2ZmZlwiO1xuICAgICAgICBcbiAgICAgICAgLy8gSGlzdG9yeSBsaXN0IGNvbnRhaW5lclxuICAgICAgICBjb25zdCBoaXN0b3J5TGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGhpc3RvcnlMaXN0LnN0eWxlLm1heEhlaWdodCA9IFwiNDAwcHhcIjtcbiAgICAgICAgaGlzdG9yeUxpc3Quc3R5bGUub3ZlcmZsb3dZID0gXCJhdXRvXCI7XG4gICAgICAgIFxuICAgICAgICBpZiAocHJpbnRIaXN0b3J5Lmxlbmd0aCA%252BIDApIHtcbiAgICAgICAgICBwcmludEhpc3RvcnkuZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoaXN0b3J5SXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZjhmOWZhXCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5ib3JkZXIgPSBcIjFweCBzb2xpZCAjZGVlMmU2XCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIjRweFwiO1xuICAgICAgICAgICAgaGlzdG9yeUl0ZW0uc3R5bGUucGFkZGluZyA9IFwiMTBweFwiO1xuICAgICAgICAgICAgaGlzdG9yeUl0ZW0uc3R5bGUubWFyZ2luQm90dG9tID0gXCI4cHhcIjtcbiAgICAgICAgICAgIGhpc3RvcnlJdGVtLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5jb2xvciA9IFwiIzMzM1wiO1xuICAgICAgICAgICAgY29uc3QgcHJpbnROdW1iZXIgPSBwcmludEhpc3RvcnkubGVuZ3RoIC0gaW5kZXg7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5pbm5lckhUTUwgPSBgPHN0cm9uZz5QcmludCAjJHtwcmludE51bWJlcn08L3N0cm9uZz48YnI%252BJHtlbnRyeX1gO1xuICAgICAgICAgICAgaGlzdG9yeUxpc3QuYXBwZW5kQ2hpbGQoaGlzdG9yeUl0ZW0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vSGlzdG9yeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgbm9IaXN0b3J5LmlubmVyVGV4dCA9IFwiTm8gcHJpbnQgYWN0aXZpdHkgeWV0XCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLmNvbG9yID0gXCIjNmM3NTdkXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLmZvbnRTdHlsZSA9IFwiaXRhbGljXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLnRleHRBbGlnbiA9IFwiY2VudGVyXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLnBhZGRpbmcgPSBcIjIwcHhcIjtcbiAgICAgICAgICBoaXN0b3J5TGlzdC5hcHBlbmRDaGlsZChub0hpc3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBtYWluQ29udGFpbmVyLmFwcGVuZENoaWxkKHByaW50VGl0bGUpO1xuICAgICAgICBtYWluQ29udGFpbmVyLmFwcGVuZENoaWxkKGhpc3RvcnlMaXN0KTtcbiAgICAgICAgY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChtYWluQ29udGFpbmVyKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7IG5vZGU6IGNvbnRhaW5lck5vZGUgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgXG4gIC8vIFNldCB0aGUgQ3VzdG9tIFVJXG4gIGluc3RhbmNlLnNldEN1c3RvbVVJQ29uZmlndXJhdGlvbihjdXN0b21VSSk7XG4gIFxuICAvLyBUaGUgU2lkZWJhciBDdXN0b20gQnV0dG9uIHdpdGggSWNvblxuICBjb25zdCBjdXN0b20gPSB7XG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICBpZDogXCJQcmludCBBY3Rpdml0eSBMb2dcIixcbiAgICB0aXRsZTogXCJQcmludCBBY3Rpdml0eSBMb2dcIixcbiAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgZHJvcGRvd25Hcm91cDogXCJzaWRlYmFyXCIsXG4gICAgaWNvbjogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwiY3VycmVudENvbG9yXCI%252BXG4gICAgICA8cGF0aCBkPVwiTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNSAxNEg3di0yaDd2MnptMy00SDd2LTJoMTB2MnptMC00SDdWN2gxMHYyelwiLz5cbiAgICA8L3N2Zz5gLFxuICAgIG9uUHJlc3M6IChldmVudCwgaWQpID0%252BIHtcbiAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgICAgICB2aWV3U3RhdGUuc2V0KFwic2lkZWJhck1vZGVcIiwgXCJDVVNUT01cIilcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbiAgXG4gIGNvbnN0IHRvb2xiYXJJdGVtcyA9IE51dHJpZW50Vmlld2VyLmRlZmF1bHRUb29sYmFySXRlbXMucmVkdWNlKFxuICAgIChhY2MsIGl0ZW0pID0%252BXG4gICAgICBcInNpZGViYXItdGh1bWJuYWlsc1wiID09PSBpdGVtLnR5cGVcbiAgICAgICAgPyBhY2MuY29uY2F0KFtpdGVtLCBjdXN0b21dKVxuICAgICAgICA6IGFjYy5jb25jYXQoW2l0ZW1dKSxcbiAgICBbXVxuICApO1xuICBcbiAgLy8gQWRkaW5nIGl0IHRvIHRoZSBzaWRlYmFyc1xuICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoWy4uLnRvb2xiYXJJdGVtc10pO1xuICBcbiAgLy8gU2V0IGluaXRpYWwgdmlldyB0byBjdXN0b20gc2lkZWJhclxuICBpbnN0YW5jZS5zZXRWaWV3U3RhdGUoXG4gICAgaW5zdGFuY2Uudmlld1N0YXRlLnNldChcInNpZGViYXJNb2RlXCIsIFwiQ1VTVE9NXCIpXG4gICk7XG4gIFxuICAvLyBTZXQgdXAgcHJpbnQgZXZlbnQgbGlzdGVuZXJzXG4gIHNldHVwUHJpbnRFdmVudExpc3RlbmVycygpO1xufSk7XG5cbmNvbnNvbGUubG9nKCdTY3JpcHQgbG9hZGVkLiBQcmludCBhY3Rpdml0eSB3aWxsIGJlIHRyYWNrZWQgYXV0b21hdGljYWxseS4nKTsiLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - -- [Hide link annotations tooltip](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6Ii8vY2hlY2sgQ1NTIFRhYiBmb3IgQ1NTIHNlbGVjdG9yXG4vL0hvdyB0byBhZGQgQ3VzdG9tIENTUyB0byBQU1BERktpdDogaHR0cHM6Ly9wc3BkZmtpdC5jb20vZ3VpZGVzL3dlYi9jdXN0b21pemluZy10aGUtaW50ZXJmYWNlL2Nzcy1jdXN0b21pemF0aW9uL1xuLy9QU1BERktpdCBDU1MgQ2xhc3NlczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vYXBpL3dlYi8jOn46dGV4dD1XaWRnZXRBbm5vdGF0aW9uQWRkaXRpb25hbEFjdGlvbnMtLENTUywtQW5ub3RhdGlvbiUyMFRvb2x0aXBcbi8qXG4gIC5QU1BERktpdC1MaW5rLUVkaXRvci1Qb3BvdmVyIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4qL1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgaW5pdGlhbFZpZXdTdGF0ZTogbmV3IFBTUERGS2l0LlZpZXdTdGF0ZSh7IGN1cnJlbnRQYWdlSW5kZXg6IDEgfSksXG59KS50aGVuKGFzeW5jIChpbnN0YW5jZSkgPT4ge1xuICBjb25zdCBsaW5rQW5ub3RhdGlvbiA9IGF3YWl0IGluc3RhbmNlLmdldEFubm90YXRpb25zKDEpO1xuICBpbnN0YW5jZS5zZXRTZWxlY3RlZEFubm90YXRpb25zKGxpbmtBbm5vdGF0aW9uKTtcbiAgY29uc29sZS5sb2coXCJQU1BERktpdCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7IC8vIExvZyBhIG1lc3NhZ2UgdG8gaW5kaWNhdGUgc3VjY2Vzc2Z1bCBsb2FkaW5nXG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4uUFNQREZLaXQtTGluay1FZGl0b3ItUG9wb3ZlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - - Hide the popover element when a link annotation is selected. — [Video](https://www.youtube.com/watch?v=_sCyG5hdG10) - -- [Toggle all Annotation to show/hide with a custom button in toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJsZXQgYW5ub3RhdGlvbnNIaWRkZW4gPSB0cnVlO1xuXG5OdXRyaWVudFZpZXdlci5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBOdXRyaWVudFZpZXdlci5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFsuLi5OdXRyaWVudFZpZXdlci5kZWZhdWx0VG9vbGJhckl0ZW1zXSxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IHRvZ2dsZUFubm90YXRpb25zQnV0dG9uID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwidG9nZ2xlLWFubm90YXRpb25zXCIsXG4gICAgdGl0bGU6IFwiVG9nZ2xlIEFubm90YXRpb25zXCIsXG4gICAgb25QcmVzczogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdFBhZ2VzID0gaW5zdGFuY2UudG90YWxQYWdlQ291bnQ7XG4gICAgICBjb25zb2xlLmxvZyhcIlRvdGFsIFBhZ2VzOiBcIiwgdFBhZ2VzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdFBhZ2VzOyBpKyspIHtcbiAgICAgICAgY29uc3QgYW5ubyA9IGF3YWl0IGluc3RhbmNlLmdldEFubm90YXRpb25zKGkpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIjIgLSBBbm5vdGF0aW9uczogXCIsIGFubm8pO1xuICAgICAgICBjb25zb2xlLmxvZyhcInRvdGFsIGFubm90YXRpb24gaW4gZWFjaCBwYWdlXCIsIGFubm8uc2l6ZSk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uc0hpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFubm8uZm9yRWFjaChhc3luYyAoYW5ubykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlYW5ubyA9IGFubm8uc2V0KFwibm9WaWV3XCIsIHRydWUpO1xuICAgICAgICAgICAgYXdhaXQgaW5zdGFuY2UudXBkYXRlKHVwZGF0ZWFubm8pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFubm8uZm9yRWFjaChhc3luYyAoYW5ubykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlYW5ubyA9IGFubm8uc2V0KFwibm9WaWV3XCIsIGZhbHNlKTtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbmNlLnVwZGF0ZSh1cGRhdGVhbm5vKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYW5ub3RhdGlvbnNIaWRkZW4gPSAhYW5ub3RhdGlvbnNIaWRkZW47XG4gICAgfSxcbiAgfTtcblxuICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoKGl0ZW1zKSA9PiB7XG4gICAgaXRlbXMucHVzaCh0b2dnbGVBbm5vdGF0aW9uc0J1dHRvbik7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9KTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - - - -- [Use custom renderers to display annotation information on hover](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIudG9vbHRpcCB7XG4gIHBvc2l0aW9uOiBpbmhlcml0O1xufVxuLnRvb2x0aXA6OmJlZm9yZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBvcGFjaXR5OiAxO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiA5O1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNzUpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGNvbG9yOiAjZmZmO1xuICBjb250ZW50OiBhdHRyKGRhdGEtYW5ub3RhdGlvbi1pZCk7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogNnB4IDEwcHg7XG4gIHRvcDogMjZweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLyogdGhlIGFuaW1hdGlvbnMgKi9cbi8qIGZhZGUgKi9cbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiZm9ybS5wZGYiLCJqd3QiOnsicGVybWlzc2lvbnMiOlsicmVhZC1kb2N1bWVudCIsIndyaXRlIl0sInVzZXJJZCI6InJhbmRvbWVvTzNmV1JaaWciLCJsYXllciI6InJhbmRvbVRYTVM2SkZuRk4ifX0sImpzIjoiLy8gSW5pdGlhbGl6ZSBQU1BERktpdCBWaWV3ZXIgaW5zdGFuY2VcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIGN1c3RvbVJlbmRlcmVyczoge1xuICAgIC8vIEN1c3RvbSByZW5kZXJlciBmb3IgYW5ub3RhdGlvbnMgdGhhdCBhZGRzIGludGVyYWN0aXZlIHRvb2x0aXBzLCB3aWxsIHNob3cgdGhlIGFubm90YXRpb24gSURcbiAgICBBbm5vdGF0aW9uKHsgYW5ub3RhdGlvbiB9KSB7XG4gICAgICBjb25zdCB0b29sdGlwQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgLy8gU2V0IHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYW5ub3RhdGlvblxuICAgICAgdG9vbHRpcENvbnRhaW5lci5kYXRhc2V0LmFubm90YXRpb25JZCA9IGFubm90YXRpb24uaWQ7XG5cbiAgICAgIC8vIEFwcGx5IHN0eWxlcyBmb3IgdG9vbHRpcCBjb250YWluZXJcbiAgICAgIHRvb2x0aXBDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIFNlZSBDU1MgdGFiIGZvciBtb3JlIHRvb2x0aXAgc3R5bGVzXG5cbiAgICAgIC8vIENyZWF0ZSBpbm5lciB0b29sdGlwIGVsZW1lbnQgd2l0aCBhbm5vdGF0aW9uIElEIGFzIHRpdGxlXG4gICAgICB0b29sdGlwQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGRhdGEtdGl0bGU9XCIke2Fubm90YXRpb24uaWR9XCI%252BPC9kaXY%252BYDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZTogdG9vbHRpcENvbnRhaW5lcixcbiAgICAgICAgYXBwZW5kOiB0cnVlLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gRGlzYWJsZSBhbm5vdGF0aW9uIGVkaXRpbmdcbiAgaW5zdGFuY2Uuc2V0RWRpdGFibGVBbm5vdGF0aW9uVHlwZXMoW10pO1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGFubm90YXRpb24gZWxlbWVudCBieSBJRFxuICBjb25zdCBnZXRBbm5vdGF0aW9uRWxlbWVudCA9IChhbm5vdGF0aW9uSWQpID0%252BIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBgLlBTUERGS2l0LUFubm90YXRpb25bZGF0YS1hbm5vdGF0aW9uLWlkPVwiJHthbm5vdGF0aW9uSWR9XCJdYFxuICAgICk7XG4gIH07XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGhhbmRsZSBhbm5vdGF0aW9uIGludGVyYWN0aW9uc1xuICBjb25zdCBoYW5kbGVBbm5vdGF0aW9uSW50ZXJhY3Rpb24gPSAoZXZlbnQsIGlzSG92ZXJpbmcpID0%252BIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hbm5vdGF0aW9uSWQ7XG5cbiAgICBpZiAoYW5ub3RhdGlvbklkKSB7XG4gICAgICBjb25zdCBhbm5vdGF0aW9uRWxlbWVudCA9IGdldEFubm90YXRpb25FbGVtZW50KGFubm90YXRpb25JZCk7XG5cbiAgICAgIGlmIChpc0hvdmVyaW5nKSB7XG4gICAgICAgIGFubm90YXRpb25FbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0b29sdGlwXCIsIFwiZmFkZVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFubm90YXRpb25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJ0b29sdGlwXCIsIFwiZmFkZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gQWRkIG1vdXNlb3ZlciBldmVudCBsaXN0ZW5lciBmb3Igc2hvd2luZyB0b29sdGlwc1xuICAvLyBodHRwczovL3d3dy5udXRyaWVudC5pby9hcGkvd2ViL1BTUERGS2l0LlRleHRDb21wYXJpc29uSW5zdGFuY2UuaHRtbCNhZGRFdmVudExpc3RlbmVyXG4gIGluc3RhbmNlLmNvbnRlbnREb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIChldmVudCkgPT5cbiAgICBoYW5kbGVBbm5vdGF0aW9uSW50ZXJhY3Rpb24oZXZlbnQsIHRydWUpXG4gICk7XG5cbiAgLy8gQWRkIG1vdXNlb3V0IGV2ZW50IGxpc3RlbmVyIGZvciBoaWRpbmcgdG9vbHRpcHNcbiAgaW5zdGFuY2UuY29udGVudERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCAoZXZlbnQpID0%252BXG4gICAgaGFuZGxlQW5ub3RhdGlvbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSlcbiAgKTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - - Enhance annotations by adding hover-based tooltips while preventing edits. — [Video](https://www.youtube.com/watch?v=drdvz12ntlE) - -- [Create highlight annotations programmatically from search](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJqcyI6Ii8vIExvYWQgUFNQREZLaXQgd2l0aCBkYXJrIHRoZW1lXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxufSkudGhlbihhc3luYyAoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gTGlzdCBvZiB0ZXJtcyB0byBzZWFyY2ggZm9yIGluIHRoZSBkb2N1bWVudFxuICBjb25zdCBuYW1lc0xpc3QgPSBbXCJwcmltYXRlXCIsIFwic2hlbGxmaXNoXCIsIFwibW9ua2V5XCIsIFwibWFjYXF1ZVwiXTtcblxuICAvLyBDcmVhdGVzIGFuIGFycmF5IG9mIHByb21pc2VzIHRoYXQgcmV0dXJuIHRoZSBzZWFyY2hSZXN1bHQgb2YgZWFjaCBzZWFyY2hcbiAgY29uc3QgYW5ub3RhdGlvbnMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuYW1lc0xpc3QubGVuZ3RoIH0pLm1hcCgoZWxlbWVudCwgaW5kZXgpID0%252BXG4gICAgICAgIGluc3RhbmNlLnNlYXJjaChuYW1lc0xpc3RbaW5kZXhdKVxuICAgICAgKVxuICAgICAgLy8gaHR0cHM6Ly93d3cubnV0cmllbnQuaW8vYXBpL3dlYi9QU1BERktpdC5JbnN0YW5jZS5odG1sI3NlYXJjaFxuICAgICAgLy8gaHR0cHM6Ly93d3cubnV0cmllbnQuaW8vYXBpL3dlYi9QU1BERktpdC5TZWFyY2hSZXN1bHQuaHRtbFxuICAgIClcbiAgKS5mbGF0TWFwKChzZWFyY2hSZXN1bHRzKSA9PlxuICAgIHNlYXJjaFJlc3VsdHMucmVkdWNlKChhY2MsIHNlYXJjaFJlc3VsdCkgPT4ge1xuICAgICAgLy8gRXh0cmFjdCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGZvdW5kIHRleHRcbiAgICAgIGNvbnN0IHsgcmVjdHNPblBhZ2UsIHBhZ2VJbmRleCB9ID0gc2VhcmNoUmVzdWx0O1xuXG4gICAgICAvLyBDcmVhdGUgYm91bmRpbmcgYm94IGZvciB0aGUgaGlnaGxpZ2h0XG4gICAgICBjb25zdCBiYm94ID0gbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3QocmVjdHNPblBhZ2VbMF0pO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgaGlnaGxpZ2h0IGFubm90YXRpb25cbiAgICAgIHJldHVybiBhY2MuY29uY2F0KFxuICAgICAgICBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuSGlnaGxpZ2h0QW5ub3RhdGlvbih7XG4gICAgICAgICAgaWQ6IFBTUERGS2l0LmdlbmVyYXRlSW5zdGFudElkKCksXG4gICAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgICAgYm91bmRpbmdCb3g6IGJib3gsXG4gICAgICAgICAgcmVjdHM6IHJlY3RzT25QYWdlLFxuICAgICAgICAgIGNvbG9yOiBQU1BERktpdC5Db2xvci5ZRUxMT1csXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sIFtdKVxuICApO1xuXG4gIC8vIEFwcGx5IGFsbCBoaWdobGlnaHQgYW5ub3RhdGlvbnMgdG8gdGhlIGRvY3VtZW50XG4gIGF3YWl0IGluc3RhbmNlLmNyZWF0ZShhbm5vdGF0aW9ucyk7XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) - - Search for specific text values in a document, create highlight annotations for the found text, and apply those annotations to the document. — [Video](https://www.youtube.com/watch?v=tzRcFwRbaE4) - -- [Use custom actions with the embedded PDF widget button](https://nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImxldCBnbG9iYWxJbnN0YW5jZTtcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuXG4gIC8vIENyZWF0ZSBhIG5ldyBidXR0b24gZm9ybSBmaWVsZC5cbiAgY29uc3Qgd2lkZ2V0ID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLldpZGdldEFubm90YXRpb24oe1xuICAgIGlkOiBQU1BERktpdC5nZW5lcmF0ZUluc3RhbnRJZCgpLFxuICAgIHBhZ2VJbmRleDogMCxcbiAgICBmb3JtRmllbGROYW1lOiBcIk15Rm9ybUZpZWxkXCIsXG4gICAgYm91bmRpbmdCb3g6IG5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHtcbiAgICAgIGxlZnQ6IDEwMCxcbiAgICAgIHRvcDogNzUsXG4gICAgICB3aWR0aDogMTUwLFxuICAgICAgaGVpZ2h0OiA0MCxcbiAgICB9KSxcbiAgICAvL2FkZGluZyB0aGUgY3VzdG9tIGRhdGEgdG8gY2hlY2sgbGF0ZXIgdGhhdCBpdCBpcyBhIGJ1dHRvblxuICAgIGN1c3RvbURhdGE6IHtcbiAgICAgIGlzQnV0dG9uOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vQnV0dG9uIEZvcm0gRmllbGRcbiAgY29uc3QgZm9ybUZpZWxkID0gbmV3IFBTUERGS2l0LkZvcm1GaWVsZHMuQnV0dG9uRm9ybUZpZWxkKHtcbiAgICBuYW1lOiBcIk15Rm9ybUZpZWxkXCIsXG4gICAgYW5ub3RhdGlvbklkczogbmV3IFBTUERGS2l0LkltbXV0YWJsZS5MaXN0KFt3aWRnZXQuaWRdKSxcbiAgICB2YWx1ZTogXCJUZXh0IHNob3duIGluIHRoZSBmb3JtIGZpZWxkXCIsXG4gICAgbGFiZWw6IFwiTXkgQnV0dG9uXCIsXG4gIH0pO1xuXG4gIC8vQ3JlYXRpbmcgdGhlIGJ1dHRvblxuICBpbnN0YW5jZS5jcmVhdGUoW3dpZGdldCwgZm9ybUZpZWxkXSk7XG5cbiAgLy9FdmVudCBsaXN0ZW5lciB0byBkZXRlY3QgdGhlIGFubm90YXRpb24gY2xpY2sgYW5kIGltcG9ydCBmaWxlIGlucHV0XG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbm5vdGF0aW9ucy5wcmVzc1wiLCAoZXZlbnQpID0%252BIHtcbiAgICBjb25zdCB7IGFubm90YXRpb24gfSA9IGV2ZW50XG4gICAgaWYgKGFubm90YXRpb24uY3VzdG9tRGF0YT8uaXNCdXR0b24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIilcbiAgICAgICAgaW5wdXQudHlwZSA9IFwiZmlsZVwiXG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQuZmlsZXNbMF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHR5cGUgfSA9IGV2ZW50LnRhcmdldC5maWxlc1swXVxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmNyZWF0ZUF0dGFjaG1lbnQobmV3IEJsb2IoW2V2ZW50LnRhcmdldC5maWxlc1swXV0sIHsgdHlwZSB9KSkudGhlbihpbWFnZUF0dGFjaG1lbnRJZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlQW5ub3RhdGlvbiA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5JbWFnZUFubm90YXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4OiBhbm5vdGF0aW9uLnBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kaW5nQm94OiBhbm5vdGF0aW9uLmJvdW5kaW5nQm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY3JlYXRlKGltYWdlQW5ub3RhdGlvbilcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pXG4gICAgICAgIGlucHV0LmNsaWNrKClcbiAgICB9XG59KVxufSk7XG4iLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tQ21zYzBOZXozQSIsImxheWVyIjoicmFuZG9tN244UDg0Q3pyUiJ9fSwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) - - Create a button form field, add an event listener to handle button clicks that trigger a file input for uploading images, and attach the selected image as an annotation in the document. — [Video](https://www.youtube.com/watch?v=ghmh4sjwUic) - -- [Prevent showing note annotation content on hover](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLfSkudGhlbigoaW5zdGFuY2U9PntpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywoZXZlbnQ9Pntjb25zdHt0YXJnZXQ6dGFyZ2V0fT1ldmVudCxub3RlSWNvbj10YXJnZXQ%252FLmNsb3Nlc3QoJy5QU1BERktpdC1Ob3RlLUFubm90YXRpb24tSWNvbi1Db21tZW50Jyk7bm90ZUljb24mJihpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignLlBTUERGS2l0LVBvcG92ZXItTm90ZS1Bbm5vdGF0aW9uJykuc3R5bGUuZGlzcGxheT0nbm9uZScpfSkse2NhcHR1cmU6ITB9KX0pKTsiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - - Add an event listener to hide the note annotation popover when the mouse is over the note icon. — [Video](https://www.youtube.com/watch?v=wspjZ_mjLBw) - -- [Link comments with annotations](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/comment-annotations) - - When an annotation is selected, a tooltip appears, allowing users to create a linked comment marker annotation. — [Video](https://www.youtube.com/watch?v=Gevho94VSmk) - -- [Create annotations from the clipboard](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/create-annotation-from-clipboard) - - Enable pasting content from the clipboard onto a PDF as a text or image annotation. — [Video](https://www.youtube.com/watch?v=1N3U0voT4Tc) - -- [Navigate annotations with a custom toolbar button](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/get-all-annotations-boundingBox) - - Get all annotation coordinates and seamlessly navigate with a custom “Next Annotation” button that highlights and jumps to each annotation. — [Video](https://www.youtube.com/watch?v=BprV9kSGBlU) - -- [Snip and save annotations as JPEG images](https://github.com/PSPDFKit/awesome-nutrient/tree/master/web/annotation/snipping-annotation) - - Snip the area covered by an annotation and save it as a JPEG image. — [Video](https://www.youtube.com/watch?v=QLSBa6X4tmU) - -- [Add a timestamp as a subtitle to a custom stamp](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJjb25zdCB7XG4gIGNyZWF0ZUJsb2NrOiBjcmVhdGVCbG9jayxcbiAgSW50ZXJmYWNlczogSW50ZXJmYWNlcyxcbiAgUmVjaXBlczogUmVjaXBlcyxcbiAgQ29yZTogQ29yZSxcbn0gPSBQU1BERktpdC5VSTtcbnZhciBzdGFtcEFubm90YXRpb25UZW1wbGF0ZXMgPSBQU1BERktpdC5kZWZhdWx0U3RhbXBBbm5vdGF0aW9uVGVtcGxhdGVzO1xuc3RhbXBBbm5vdGF0aW9uVGVtcGxhdGVzLnB1c2goXG4gIG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5TdGFtcEFubm90YXRpb24oe1xuICAgIHN0YW1wVHlwZTogXCJDdXN0b21cIixcbiAgICB0aXRsZTogXCJNeSBjdXN0b20gdGV4dFwiLFxuICAgIGNvbG9yOiBuZXcgUFNQREZLaXQuQ29sb3IoeyByOiAwLCBnOiAwLCBiOiA2NCB9KSxcbiAgICBzdWJ0aXRsZTogYE5hbWUgJHtuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygpfSAke25ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YCxcbiAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAzMDAsXG4gICAgICBoZWlnaHQ6IDEwMCxcbiAgICB9KSxcbiAgfSlcbiksXG4gIFBTUERGS2l0LmxvYWQoe1xuICAgIC4uLmJhc2VPcHRpb25zLFxuICAgIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICAgIHN0YW1wQW5ub3RhdGlvblRlbXBsYXRlczogc3RhbXBBbm5vdGF0aW9uVGVtcGxhdGVzLFxuICAgIHVpOiB7XG4gICAgICBbSW50ZXJmYWNlcy5TdGFtcHNMaXN0XTogKHsgaW5zdGFuY2U6IGluc3RhbmNlIH0pID0%252BIChcbiAgICAgICAgLy8gRXZlcnkgdGltZSBTdGFtcHMgTGlzdCBvcGVucywgd2Ugd2FudCB0byBzZXQgY29ycmVjdCBkYXRlIHRvIGN1c3RvbSBzdGFtcHNcbiAgICAgICAgaW5zdGFuY2Uuc2V0U3RhbXBBbm5vdGF0aW9uVGVtcGxhdGVzKCh0ZW1wbGF0ZXMpID0%252BXG4gICAgICAgICAgdGVtcGxhdGVzLm1hcCgodGVtcGxhdGUpID0%252BXG4gICAgICAgICAgICBcIkN1c3RvbVwiID09PSB0ZW1wbGF0ZS5zdGFtcFR5cGVcbiAgICAgICAgICAgICAgPyB0ZW1wbGF0ZS5zZXQoXCJzdWJ0aXRsZVwiLCBuZXcgRGF0ZShEYXRlLm5vdygpKS50b0xvY2FsZVN0cmluZygpKVxuICAgICAgICAgICAgICA6IHRlbXBsYXRlXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB7fVxuICAgICAgKSxcbiAgICB9LFxuICB9KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiUFNQREZLaXQgbG9hZGVkISBieSBOYXJhc2hpbWFuXCIpO1xuICB9KTtcbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIn0sIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - - Add a custom stamp annotation template with dynamic subtitle text (including the current date and time), and set up the UI to update the subtitle each time the stamps list is opened. — [Video](https://www.youtube.com/watch?v=TseqHd_MWcI) - -- [Add PDF file as custom stamp](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6IlBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCEgYnkgTmFyYXNoaW1hblwiKTtcblxuICBhc3luYyBmdW5jdGlvbiBvcGVuRmlsZURpYWxvZygpIHtcbiAgICBjb25zb2xlLmxvZyhcIk9wZW5pbmcgZmlsZSBkaWFsb2dcIik7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiZmlsZVwiO1xuICAgIGlucHV0LmFjY2VwdCA9IFwiLnBkZlwiOyAvLyBSZXN0cmljdCBmaWxlIHNlbGVjdGlvbiB0byBQREZzXG4gICAgaW5wdXQudmFsdWUgPSBcIlwiOyAvLyBDbGVhciB2YWx1ZSB0byBlbnN1cmUgb25jaGFuZ2UgdHJpZ2dlcnNcblxuICAgIGlucHV0Lm9uY2hhbmdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBmID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuXG4gICAgICBpZiAoIWYpIHJldHVybjtcblxuICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGFzeW5jIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vcGRmXCIgfSk7XG5cbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGF3YWl0IGluc3RhbmNlLmNyZWF0ZUF0dGFjaG1lbnQoYmxvYik7XG4gICAgICAgIGNvbnN0IHN0YW1wQW5ub3RhdGlvbiA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5JbWFnZUFubm90YXRpb24oe1xuICAgICAgICAgIHBhZ2VJbmRleDogMCxcbiAgICAgICAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9wZGZcIixcbiAgICAgICAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgICAgICAgbGVmdDogMTAwLFxuICAgICAgICAgICAgdG9wOiAxMDAsXG4gICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDAsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaW1hZ2VBdHRhY2htZW50SWQ6IGF0dGFjaG1lbnQsXG4gICAgICAgIH0pO1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGUoc3RhbXBBbm5vdGF0aW9uKTtcbiAgICAgIH07XG5cbiAgICAgIGZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZik7XG4gICAgfTtcblxuICAgIGlucHV0LmNsaWNrKCk7XG4gIH1cblxuICBjb25zdCBjdXN0b21GaWxlU3RhbXBJdGVtID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwiZmlsZS1zdGFtcC1idXR0b25cIixcbiAgICB0aXRsZTogXCJGaWxlIFN0YW1wXCIsXG4gICAgb25QcmVzczogKCkgPT4ge1xuICAgICAgb3BlbkZpbGVEaWFsb2coKTtcbiAgICB9LFxuICB9O1xuXG4gIGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcyhbY3VzdG9tRmlsZVN0YW1wSXRlbV0pO1xufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - -- [Add and count a checkmark annotation in the toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmljb25fdGV4dCB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJeU5DSWdhR1ZwWjJoMFBTSXlOQ0lnZG1sbGQwSnZlRDBpTUNBd0lESTBJREkwSWo0OGNHRjBhQ0JrUFNKTk1DQXhNUzQxTWpKc01TNDFOemd0TVM0Mk1qWWdOeTQzTXpRZ05DNDJNVGtnTVRNdU16TTFMVEV5TGpVeU5pQXhMak0xTXlBeExqTTFOQzB4TkNBeE9DNDJORFo2SWk4K1BDOXpkbWMrXCIpXG4gICAgbm8tcmVwZWF0IGNlbnRlcjtcbn1cbiIsImpzIjoiLy8gRGVjbGFyZSB0aGUgaW5zdGFuY2UgdmFyaWFibGUgZm9yIFBTUERGS2l0XG5sZXQgaW5zdGFuY2U7XG5cbi8vIFRyYWNrIHdoZXRoZXIgc3RhbXAgY3JlYXRpb24gbW9kZSBpcyBlbmFibGVkXG5sZXQgaXNTdGFtcENyZWF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuXG4vLyBGdW5jdGlvbiB0byBhZGQgYSBzdGFtcCBhbm5vdGF0aW9uIG9uIHRoZSBzZWxlY3RlZCBwYWdlXG5mdW5jdGlvbiBhZGRTdGFtcChldmVudCkge1xuICBjb25zdCBzdGFtcCA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5TdGFtcEFubm90YXRpb24oe1xuICAgIHBhZ2VJbmRleDogZXZlbnQucGFnZUluZGV4LFxuICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICBsZWZ0OiBldmVudC5wb2ludC54LFxuICAgICAgdG9wOiBldmVudC5wb2ludC55LFxuICAgICAgd2lkdGg6IDI1LFxuICAgICAgaGVpZ2h0OiAyNSxcbiAgICB9KSxcbiAgICBzdGFtcFR5cGU6IFwiQWNjZXB0ZWRcIixcbiAgfSk7XG4gIGluc3RhbmNlLmNyZWF0ZShzdGFtcCk7XG59XG5cbi8vIEN1c3RvbSB0b29sYmFyIGl0ZW0gZm9yIGFkZGluZyBzdGFtcHNcbmNvbnN0IGNvdW50ZXJJdGVtID0ge1xuICB0eXBlOiBcImN1c3RvbVwiLFxuICBpZDogXCJDb3VudGVyXCIsXG4gIC8vcmVzcG9uc2l2ZUdyb3VwOiBcImFubm90YXRlXCIsXG4gIGNsYXNzTmFtZTogXCJpY29uX3RleHRcIixcbiAgc2VsZWN0ZWQ6IGlzU3RhbXBDcmVhdGlvbkVuYWJsZWQsXG4gIG9uUHJlc3MoKSB7XG4gICAgLy8gVG9nZ2xlIGJldHdlZW4gZW5hYmxpbmcgYW5kIGRpc2FibGluZyBzdGFtcCBjcmVhdGlvbiBtb2RlXG4gICAgaWYgKGlzU3RhbXBDcmVhdGlvbkVuYWJsZWQpIHtcbiAgICAgIGluc3RhbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYWdlLnByZXNzXCIsIGFkZFN0YW1wKTtcbiAgICAgIGlzU3RhbXBDcmVhdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2UucHJlc3NcIiwgYWRkU3RhbXApO1xuICAgICAgaXNTdGFtcENyZWF0aW9uRW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRvb2xiYXIgaXRlbSB0byByZWZsZWN0IGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlXG4gICAgaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcykgPT5cbiAgICAgIGl0ZW1zLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgaXRlbS5pZCA9PT0gXCJDb3VudGVyXCJcbiAgICAgICAgICA%252FIHsgLi4uaXRlbSwgc2VsZWN0ZWQ6IGlzU3RhbXBDcmVhdGlvbkVuYWJsZWQgfVxuICAgICAgICAgIDogaXRlbVxuICAgICAgKVxuICAgICk7XG4gIH0sXG4gIC8vdGl0bGU6IFwiQ291bnRlclwiLFxufTtcblxuLy8gTG9hZCBQU1BERktpdCBhbmQgaW5pdGlhbGl6ZSB0b29sYmFyIGl0ZW1zIGluY2x1ZGluZyB0aGUgY3VzdG9tIHN0YW1wIHRvb2xcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdG9vbGJhckl0ZW1zOiBQU1BERktpdC5kZWZhdWx0VG9vbGJhckl0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJleHBvcnQtcGRmXCIpIHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KFtpdGVtLCBjb3VudGVySXRlbV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChbaXRlbV0pO1xuICAgIH1cbiAgfSwgW10pLFxufSkudGhlbihhc3luYyAoX2luc3RhbmNlKSA9PiB7XG4gIGluc3RhbmNlID0gX2luc3RhbmNlO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIHRvIGxvZyB0aGUgbnVtYmVyIG9mIGNvdW50ZXIgc3RhbXAgYW5ub3RhdGlvbnMgd2hlbmV2ZXIgYSBuZXcgYW5ub3RhdGlvbiBpcyBjcmVhdGVkXG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbm5vdGF0aW9ucy5jcmVhdGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiY291bnRlcjogXCIgKyAoYXdhaXQgZ2V0Q291bnRlckFubm90YXRpb25zKCkpKTtcbiAgfSk7XG5cbiAgLy8gRnVuY3Rpb24gdG8gY291bnQgYWxsIFwiQWNjZXB0ZWRcIiBzdGFtcCBhbm5vdGF0aW9ucyBhY3Jvc3MgYWxsIHBhZ2VzXG4gIGFzeW5jIGZ1bmN0aW9uIGdldENvdW50ZXJBbm5vdGF0aW9ucygpIHtcbiAgICBsZXQgYW5ub3RhdGlvbk9iamVjdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGluc3RhbmNlLnRvdGFsUGFnZUNvdW50IH0pLm1hcCgoXywgcGFnZUluZGV4KSA9PlxuICAgICAgICBpbnN0YW5jZS5nZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgpXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIEZpbHRlciBhbmQgY291bnQgb25seSBzdGFtcCBhbm5vdGF0aW9ucyBvZiB0eXBlIFwiQWNjZXB0ZWRcIlxuICAgIGFubm90YXRpb25PYmplY3RzID0gYW5ub3RhdGlvbk9iamVjdHMuZmxhdE1hcCgoYW5ub3RzKSA9PlxuICAgICAgYW5ub3RzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGFubm90KSA9PlxuICAgICAgICAgICAgYW5ub3QgaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5TdGFtcEFubm90YXRpb24gJiZcbiAgICAgICAgICAgIGFubm90LnN0YW1wVHlwZSA9PT0gXCJBY2NlcHRlZFwiXG4gICAgICAgIClcbiAgICAgICAgLnRvQXJyYXkoKVxuICAgICk7XG5cbiAgICByZXR1cm4gYW5ub3RhdGlvbk9iamVjdHMubGVuZ3RoO1xuICB9XG4gICAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIn0sIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - - Use a custom toolbar button for toggling stamp creation mode, allowing users to add "Accepted" stamp annotations on page press and track the total count of such annotations across a document. — [Video](https://www.youtube.com/watch?v=kaEmxWfG2bA) - -- [Strike through text using a line annotation and automatically add a text annotation above](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmljb25fdGV4dCB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjJhV1YzUW05NFBTSXdJREFnTkRnZ05EZ2lJR1JoZEdFdGJtRnRaVDBpVEdGNVpYSWdNU0lnYVdROUlreGhlV1Z5WHpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ1ptbHNiRDBpSXpBd01EQXdNQ0krUEdjZ2FXUTlJbE5XUjFKbGNHOWZZbWREWVhKeWFXVnlJaUJ6ZEhKdmEyVXRkMmxrZEdnOUlqQWlQand2Wno0OFp5QnBaRDBpVTFaSFVtVndiMTkwY21GalpYSkRZWEp5YVdWeUlpQnpkSEp2YTJVdGJHbHVaV05oY0QwaWNtOTFibVFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlQand2Wno0OFp5QnBaRDBpVTFaSFVtVndiMTlwWTI5dVEyRnljbWxsY2lJK0lEeGtaV1p6UGlBOGMzUjViR1UrSUM1amJITXRNU3dnTG1Oc2N5MHlJSHNnWm1sc2JEb2dibTl1WlRzZ2MzUnliMnRsT2lBak16VXpOVE0xT3lCemRISnZhMlV0YkdsdVpXTmhjRG9nY205MWJtUTdJSE4wY205clpTMTNhV1IwYURvZ01uQjRPeUI5SUM1amJITXRNU0I3SUhOMGNtOXJaUzFzYVc1bGFtOXBiam9nY205MWJtUTdJSDBnTG1Oc2N5MHlJSHNnYzNSeWIydGxMVzFwZEdWeWJHbHRhWFE2SURFd095QjlJRHd2YzNSNWJHVStJRHd2WkdWbWN6NGdQSFJwZEd4bFBqd3ZkR2wwYkdVK0lEeG5QaUE4Y0c5c2VXeHBibVVnWTJ4aGMzTTlJbU5zY3kweElpQndiMmx1ZEhNOUlqRWdNVEl1TXpFMElERXhJREl5TGpNeE5DQXlPUzR6T0RVZ01qa3VNemcxSURJeUxqTXhOQ0F4TVNBeE1pNHpNVFFnTVNJK1BDOXdiMng1YkdsdVpUNGdQSEJ2Ykhsc2FXNWxJR05zWVhOelBTSmpiSE10TWlJZ2NHOXBiblJ6UFNJeE1TQXlNaTR6TVRRZ01URXVOekEzSURFM0xqTTJOQ0F4Tmk0Mk5UY2dNVFl1TmpVM0lERTNMak0yTkNBeE1TNDNNRGNnTWpJdU16RTBJREV4SWo0OEwzQnZiSGxzYVc1bFBpQThiR2x1WlNCamJHRnpjejBpWTJ4ekxUSWlJSGd4UFNJeU1TNDJNRFkwTlNJZ2VESTlJakkxTGpnME9URWlJSGt4UFNJeU5TNDRORGt3TVNJZ2VUSTlJakl4TGpZd05qTTNJajQ4TDJ4cGJtVStJRHd2Wno0Z1BHeHBibVVnWTJ4aGMzTTlJbU5zY3kweUlpQjRNVDBpTkRZdU9EazVNellpSUhneVBTSXlOeTR4TURBek9DSWdlVEU5SWpNMkxqazVPVGcySWlCNU1qMGlNell1T1RrNU9EWWlQand2YkdsdVpUNGdQQzluUGp3dmMzWm5QZz09XCIpXG4gICAgbm8tcmVwZWF0IGNlbnRlcjtcbn1cbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIn0sImpzIjoiUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuTElHSFQsXG4gICAgZW5hYmxlUmljaFRleHQ6ICgpID0%252BIHRydWUsXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCEgLSBieSBOYXJhc2hpbWFuXCIpO1xuXG4gIC8vIERlZmluZSBhIGN1c3RvbSB0b29sYmFyIGJ1dHRvbiB0byBjcmVhdGUgYSBjdXN0b20tc3R5bGVkIGxpbmUgYW5ub3RhdGlvblxuICBjb25zdCBjdXN0b21Ub29sYmFySXRlbTEgPSBbXG4gICAge1xuICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgIGlkOiBcImZpbGxSZWN0QW5ub3RhdGlvblwiLFxuICAgICAgZHJvcGRvd25Hcm91cDogXCJmaWxsUmVjdEFubm90YXRpb25cIixcbiAgICAgIGNsYXNzTmFtZTogXCJpY29uX3RleHRcIixcbiAgICAgIG9uUHJlc3M6IGFzeW5jICgpID0%252BIHtcbiAgICAgICAgLy8gU2V0IGN1c3RvbSBhbm5vdGF0aW9uIHByZXNldCBiYXNlZCBvbiB0aGUgZGVmYXVsdCBsaW5lIHByZXNldFxuICAgICAgICBpbnN0YW5jZS5zZXRBbm5vdGF0aW9uUHJlc2V0cygocHJlc2V0cykgPT4gKHtcbiAgICAgICAgICAuLi5wcmVzZXRzLFxuICAgICAgICAgIGN1c3RvbUxpbmU6IHtcbiAgICAgICAgICAgIC4uLnByZXNldHMubGluZSwgLy8gQmFzZSBvbiBkZWZhdWx0IGxpbmUgcHJlc2V0XG4gICAgICAgICAgICBmaWxsQ29sb3I6IFBTUERGS2l0LkNvbG9yLkJMQUNLLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDAuNSxcbiAgICAgICAgICAgIHN0cm9rZUNvbG9yOiBQU1BERktpdC5Db2xvci5SRUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIC8vIEFwcGx5IHRoZSBjdXN0b20gcHJlc2V0XG4gICAgICAgIGluc3RhbmNlLnNldEN1cnJlbnRBbm5vdGF0aW9uUHJlc2V0KFwiY3VzdG9tTGluZVwiKTtcblxuICAgICAgICAvLyBTZXQgdGhlIGludGVyYWN0aW9uIG1vZGUgdG8gYWxsb3cgZHJhd2luZyBsaW5lIGFubm90YXRpb25zXG4gICAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgICAgICAgIHZpZXdTdGF0ZS5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLlNIQVBFX0xJTkUpXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0sXG4gIF07XG5cbiAgLy8gQWRkIHRoZSBjdXN0b20gdG9vbGJhciBidXR0b24gdG8gdGhlIGV4aXN0aW5nIHRvb2xiYXJcbiAgaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcykgPT4gaXRlbXMuY29uY2F0KGN1c3RvbVRvb2xiYXJJdGVtMSkpO1xuXG4gIC8vIExpc3RlbiBmb3IgY3JlYXRpb24gb2YgYW5ub3RhdGlvbnNcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcImFubm90YXRpb25zLmNyZWF0ZVwiLCBhc3luYyAoYW5ub3RhdGlvbnMpID0%252BIHtcbiAgICBmb3IgKGxldCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7XG4gICAgICAvLyBJZiB0aGUgY3JlYXRlZCBhbm5vdGF0aW9uIGlzIGEgTGluZUFubm90YXRpb25cbiAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuTGluZUFubm90YXRpb24pIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJMaW5lIGNyZWF0ZWQhXCIsIGFubm90YXRpb24pO1xuXG4gICAgICAgIGNvbnN0IGJveCA9IGFubm90YXRpb24uYm91bmRpbmdCb3g7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQm94OiBcIiwgYm94KTtcblxuICAgICAgICAvLyBEZWZpbmUgZGltZW5zaW9ucyBhbmQgcG9zaXRpb24gZm9yIHRoZSB0ZXh0IGFubm90YXRpb25cbiAgICAgICAgY29uc3QgdGV4dFdpZHRoID0gMjA7XG4gICAgICAgIGNvbnN0IHRleHRIZWlnaHQgPSAxNTtcbiAgICAgICAgY29uc3QgcGFkZGluZ0Fib3ZlID0gMTA7XG4gICAgICAgIGNvbnN0IHRlblBlcmNlbnQgPSBib3gud2lkdGggKiAwLjM7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBib3gucmlnaHQgLSB0ZW5QZXJjZW50O1xuICAgICAgICBjb25zdCB0b3AgPSBib3gudG9wIC0gdGV4dEhlaWdodCAtIHBhZGRpbmdBYm92ZTtcblxuICAgICAgICAvLyBDcmVhdGUgYSB0ZXh0IGFubm90YXRpb24ganVzdCBhYm92ZSB0aGUgbGluZVxuICAgICAgICBjb25zdCB0ZXh0QW5ub3RhdGlvbiA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5UZXh0QW5ub3RhdGlvbih7XG4gICAgICAgICAgcGFnZUluZGV4OiBhbm5vdGF0aW9uLnBhZ2VJbmRleCxcbiAgICAgICAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgIHdpZHRoOiB0ZXh0V2lkdGggKyAxMjAsIC8vIEFkanVzdGVkIHdpZHRoXG4gICAgICAgICAgICBoZWlnaHQ6IHRleHRIZWlnaHQsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZm9udDogXCJWZXJkYW5hXCIsXG4gICAgICAgICAgZm9udFNpemU6IDgsXG4gICAgICAgICAgZm9udENvbG9yOiBQU1BERktpdC5Db2xvci5SRUQsXG4gICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246IFwiY2VudGVyXCIsXG4gICAgICAgICAgdGV4dDoge1xuICAgICAgICAgICAgZm9ybWF0OiBcInBsYWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogXCJEb3VibGUgQ2xpY2sgaGVyZSB0byBjb21tZW50XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBJbnRlcmFjdGlvbk1vZGU6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgYW5ub3RhdGlvbiBpbiB0aGUgZG9jdW1lbnRcbiAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBpbnN0YW5jZS5jcmVhdGUodGV4dEFubm90YXRpb24pO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlRleHQgYW5ub3RhdGlvbiBwbGFjZWQgYWJvdmUgdGhlIGxpbmUuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59KTtcbiJ9) - -- [Cut, copy, and paste an annotation between pages](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBlbmFibGVDbGlwYm9hcmRBY3Rpb25zOiB0cnVlLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIC0gYnkgTmFyYXNoaW1hblwiKTtcblxuICAvLyBDbGlwYm9hcmQgYWN0aW9uc1xuICBjb25zdCBjb3B5ID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgdGl0bGU6IFwiQ29weVwiLFxuICAgIG9uUHJlc3M6IGFzeW5jICgpID0%252BIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gLyhNYWMpL2kudGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pXG4gICAgICAgID8gbmV3IEtleWJvYXJkRXZlbnQoXCJrZXlkb3duXCIsIHsga2V5OiBcImNcIiwgbWV0YUtleTogdHJ1ZSB9KVxuICAgICAgICA6IG5ldyBLZXlib2FyZEV2ZW50KFwia2V5ZG93blwiLCB7IGtleTogXCJjXCIsIGN0cmxLZXk6IHRydWUgfSk7XG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IHBhc3RlID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgdGl0bGU6IFwiUGFzdGVcIixcbiAgICBvblByZXNzOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IC8oTWFjKS9pLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxuICAgICAgICA%252FIG5ldyBLZXlib2FyZEV2ZW50KFwia2V5ZG93blwiLCB7IGtleTogXCJ2XCIsIG1ldGFLZXk6IHRydWUgfSlcbiAgICAgICAgOiBuZXcgS2V5Ym9hcmRFdmVudChcImtleWRvd25cIiwgeyBrZXk6IFwidlwiLCBjdHJsS2V5OiB0cnVlIH0pO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBjdXQgPSB7XG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICB0aXRsZTogXCJDdXRcIixcbiAgICBvblByZXNzOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IC8oTWFjKS9pLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxuICAgICAgICA%252FIG5ldyBLZXlib2FyZEV2ZW50KFwia2V5ZG93blwiLCB7IGtleTogXCJ4XCIsIG1ldGFLZXk6IHRydWUgfSlcbiAgICAgICAgOiBuZXcgS2V5Ym9hcmRFdmVudChcImtleWRvd25cIiwgeyBrZXk6IFwieFwiLCBjdHJsS2V5OiB0cnVlIH0pO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfSxcbiAgfTtcblxuICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoKGl0ZW1zKSA9PiB7XG4gICAgaXRlbXMucHVzaChjdXQpO1xuICAgIGl0ZW1zLnB1c2gocGFzdGUpO1xuICAgIGl0ZW1zLnB1c2goY29weSk7XG4gICAgaXRlbXMucHVzaCh7IHR5cGU6IFwiY29tbWVudFwiIH0pO1xuICAgIHJldHVybiBpdGVtcztcbiAgfSk7XG5cbiAgbGV0IGlzUHJvY2Vzc2luZ1Bhc3RlID0gZmFsc2U7ICAvLyBEZWNsYXJlZCBvdXRzaWRlIHRvIHBlcnNpc3QgYWNyb3NzIGV2ZW50c1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCBhc3luYyAoZXZlbnQpID0%252BIHtcbiAgICBpZiAoaXNQcm9jZXNzaW5nUGFzdGUpIHJldHVybjtcblxuICAgIGlzUHJvY2Vzc2luZ1Bhc3RlID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpdGVtcyA9IChldmVudC5jbGlwYm9hcmREYXRhIHx8IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YSkuaXRlbXM7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXNbMF07ICAvLyBPbmx5IHByb2Nlc3NpbmcgdGhlIGxhc3QgY2xpcGJvYXJkIGl0ZW1cblxuICAgICAgY29uc3QgY29udGVudF9UeXBlID0gaXRlbS50eXBlO1xuICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSBpbnN0YW5jZS52aWV3U3RhdGUuY3VycmVudFBhZ2VJbmRleDtcblxuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gXCJmaWxlXCIgJiYgaXRlbS50eXBlLnN0YXJ0c1dpdGgoXCJpbWFnZVwiKSkge1xuICAgICAgICBjb25zdCBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICAgICAgY29uc3QgaW1hZ2VBdHRhY2htZW50SWQgPSBhd2FpdCBpbnN0YW5jZS5jcmVhdGVBdHRhY2htZW50KGZpbGUpO1xuICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLkltYWdlQW5ub3RhdGlvbih7XG4gICAgICAgICAgcGFnZUluZGV4OiBjdXJyZW50UGFnZSxcbiAgICAgICAgICBjb250ZW50VHlwZTogY29udGVudF9UeXBlLFxuICAgICAgICAgIGltYWdlQXR0YWNobWVudElkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBhc3RlZCBJbWFnZSBBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgYm91bmRpbmdCb3g6IG5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHtcbiAgICAgICAgICAgIGxlZnQ6IDEwLFxuICAgICAgICAgICAgdG9wOiA1MCxcbiAgICAgICAgICAgIHdpZHRoOiAxNTAsXG4gICAgICAgICAgICBoZWlnaHQ6IDE1MCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IGluc3RhbmNlLmNyZWF0ZShhbm5vdGF0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5raW5kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGl0ZW0uZ2V0QXNTdHJpbmcoYXN5bmMgKHBhc3RlZFRleHQpID0%252BIHtcbiAgICAgICAgICBjb25zdCB0ZXh0QW5ub3RhdGlvbiA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5UZXh0QW5ub3RhdGlvbih7XG4gICAgICAgICAgICBwYWdlSW5kZXg6IGN1cnJlbnRQYWdlLFxuICAgICAgICAgICAgZm9udFNpemU6IDEwLFxuICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IFBTUERGS2l0LkNvbG9yLkdSRUVOLFxuICAgICAgICAgICAgZm9udENvbG9yOiBQU1BERktpdC5Db2xvci5CTFVFLFxuICAgICAgICAgICAgdGV4dDoge1xuICAgICAgICAgICAgICBmb3JtYXQ6IFwicGxhaW5cIixcbiAgICAgICAgICAgICAgdmFsdWU6IHBhc3RlZFRleHQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm91bmRpbmdCb3g6IG5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHtcbiAgICAgICAgICAgICAgbGVmdDogMTAsXG4gICAgICAgICAgICAgIHRvcDogNTAsXG4gICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG4gICAgICAgICAgICAgIGhlaWdodDogNTAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhd2FpdCBpbnN0YW5jZS5jcmVhdGUodGV4dEFubm90YXRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiVW5zdXBwb3J0ZWQgY2xpcGJvYXJkIGl0ZW1cIik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzUHJvY2Vzc2luZ1Bhc3RlID0gZmFsc2U7XG4gICAgfVxuICB9KTtcbn0pO1xuIn0%253D) - -- [Drop stamp annotations from the toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJsZXQgc2VsZWN0ZWRTdGFtcCA9IG51bGxcbmxldCBpbnN0YW5jZSA9IG51bGxcblxuZnVuY3Rpb24gdXBkYXRlQ3Vyc29yKGluc3RhbmNlKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGluc3RhbmNlLmNvbnRlbnREb2N1bWVudC5ob3N0O1xuICBpZiAoc2VsZWN0ZWRTdGFtcCkge1xuICAgIGNvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSAnbW92ZSc7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgfVxufVxuXG4vLyBGdW5jdGlvbiB0byBhcHBseSBzdGFtcCB0byB0aGUgY3VycmVudGx5IHZpc2libGUgcGFnZVxuYXN5bmMgZnVuY3Rpb24gYXBwbHlTdGFtcFRvQ3VycmVudFBhZ2UoaW5zdGFuY2UsIHN0YW1wVHlwZSwgdG9wID0gNTAsIGxlZnQgPSA1MCwgd2lkdGggPSAxNTAsIGhlaWdodCA9IDUwKSB7XG4gIC8vIEdldCB0aGUgY3VycmVudCBwYWdlIGluZGV4IGZyb20gdGhlIHZpZXcgc3RhdGVcbiAgY29uc3QgY3VycmVudFBhZ2VJbmRleCA9IGluc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4O1xuXG4gIGNvbnN0IHN0YW1wID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLlN0YW1wQW5ub3RhdGlvbih7XG4gICAgcGFnZUluZGV4OiBjdXJyZW50UGFnZUluZGV4LFxuICAgIHN0YW1wVHlwZTogc3RhbXBUeXBlLFxuICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICBsZWZ0OiBsZWZ0IC0gd2lkdGggLyAyLFxuICAgICAgdG9wOiB0b3AgLSBoZWlnaHQgLyAyLFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgfSksXG4gIH0pO1xuXG4gIC8vIENyZWF0ZSB0aGUgc3RhbXAgYW5ub3RhdGlvblxuICBhd2FpdCBpbnN0YW5jZS5jcmVhdGUoc3RhbXApO1xufVxuXG4vLyBGdW5jdGlvbiB0byByZW1vdmUgc3RhbXAgYW5ub3RhdGlvbnMgZnJvbSB0aGUgY3VycmVudCBwYWdlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVTdGFtcEZyb21DdXJyZW50UGFnZSgpIHtcbiAgY29uc3QgY3VycmVudFBhZ2VJbmRleCA9IGluc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4O1xuXG4gIC8vIEdldCBhbGwgYW5ub3RhdGlvbnMgb24gdGhlIGN1cnJlbnQgcGFnZVxuICBjb25zdCBhbm5vdGF0aW9ucyA9IGF3YWl0IGluc3RhbmNlLmdldEFubm90YXRpb25zKGN1cnJlbnRQYWdlSW5kZXgpO1xuXG4gIC8vIEZpbHRlciBmb3Igc3RhbXAgYW5ub3RhdGlvbnMgb25seVxuICBjb25zdCBzdGFtcEFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuZmlsdGVyKFxuICAgIChhbm5vdGF0aW9uKSA9PiBhbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuU3RhbXBBbm5vdGF0aW9uXG4gICk7XG4gIGF3YWl0IGluc3RhbmNlLmRlbGV0ZShzdGFtcEFubm90YXRpb25zKTtcbn1cblxuY29uc3QgY3VzdG9tU3RhbXBJdGVtcyA9IFtcbiAge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwibm8tc3RhbXBcIixcbiAgICB0aXRsZTogXCJObyBTdGFtcFwiLFxuICAgIGRyb3Bkb3duR3JvdXA6IFwiY3VzdG9tLXN0YW1wc1wiLFxuICAgIG9uUHJlc3M6ICgpID0%252BIHJlbW92ZVN0YW1wRnJvbUN1cnJlbnRQYWdlKCksXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgIGlkOiBcInN0YW1wLWFwcHJvdmVkXCIsXG4gICAgdGl0bGU6IFwiQXBwcm92ZWQgU3RhbXBcIixcbiAgICBkcm9wZG93bkdyb3VwOiBcImN1c3RvbS1zdGFtcHNcIixcbiAgICBvblByZXNzOiAoKSA9PiB7XG4gICAgICBzZWxlY3RlZFN0YW1wID0gXCJBcHByb3ZlZFwiO1xuICAgICAgdXBkYXRlQ3Vyc29yKGluc3RhbmNlKTtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICBpZDogXCJzdGFtcC1yZWplY3RlZFwiLFxuICAgIHRpdGxlOiBcIlJlamVjdGVkIFN0YW1wXCIsXG4gICAgZHJvcGRvd25Hcm91cDogXCJjdXN0b20tc3RhbXBzXCIsXG4gICAgb25QcmVzczogKCkgPT4ge1xuICAgICAgc2VsZWN0ZWRTdGFtcCA9IFwiUmVqZWN0ZWRcIjtcbiAgICAgIHVwZGF0ZUN1cnNvcihpbnN0YW5jZSk7XG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwic3RhbXAtZHJhZnRcIixcbiAgICB0aXRsZTogXCJEcmFmdCBTdGFtcFwiLFxuICAgIGRyb3Bkb3duR3JvdXA6IFwiY3VzdG9tLXN0YW1wc1wiLFxuICAgIG9uUHJlc3M6ICgpID0%252BIHtcbiAgICAgIHNlbGVjdGVkU3RhbXAgPSBcIkRyYWZ0XCI7XG4gICAgICB1cGRhdGVDdXJzb3IoaW5zdGFuY2UpO1xuICAgIH0sXG4gIH0sXG5dO1xuXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMuY29uY2F0KGN1c3RvbVN0YW1wSXRlbXMpXG59KS50aGVuKChfaW5zdGFuY2UpID0%252BIHtcbiAgaW5zdGFuY2UgPSBfaW5zdGFuY2VcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2UucHJlc3NcIiwgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkU3RhbXApIHtcbiAgICAgIGF3YWl0IGFwcGx5U3RhbXBUb0N1cnJlbnRQYWdlKF9pbnN0YW5jZSwgc2VsZWN0ZWRTdGFtcCwgZXZlbnQucG9pbnQueSwgZXZlbnQucG9pbnQueCk7XG4gICAgICBzZWxlY3RlZFN0YW1wID0gbnVsbDsgLy8gUmVzZXQgYWZ0ZXIgYXBwbHlpbmdcbiAgICAgIHVwZGF0ZUN1cnNvcihfaW5zdGFuY2UpO1xuICAgIH1cbiAgfSk7XG59KTsifQ%253D%253D) - -- [Custom rendering of link annotations with pins](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFt7dHlwZTogJ2xpbmsnLCBkcm9wZG93bkdyb3VwOiAndHdvJ31dLFxuICBjdXN0b21SZW5kZXJlcnM6IHtcbiAgICBBbm5vdGF0aW9uOiAoeyBhbm5vdGF0aW9uIH0pID0%252BIHtcbiAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuTGlua0Fubm90YXRpb24pIHtcbiAgICAgICAgLy8gQ3JlYXRlIG91ciBwaW4gZWxlbWVudFxuICAgICAgICBjb25zdCBwaW5Ob2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgcGluTm9kZS5pbm5lckhUTUwgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGNsYXNzPVwiYmkgYmktcGluXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNC4xNDYuMTQ2QS41LjUgMCAwIDEgNC41IDBoN2EuNS41IDAgMCAxIC41LjVjMCAuNjgtLjM0MiAxLjE3NC0uNjQ2IDEuNDc5LS4xMjYuMTI1LS4yNS4yMjQtLjM1NC4yOTh2NC40MzFsLjA3OC4wNDhjLjIwMy4xMjcuNDc2LjMxNC43NTEuNTU1QzEyLjM2IDcuNzc1IDEzIDguNTI3IDEzIDkuNWEuNS41IDAgMCAxLS41LjVoLTR2NC41YzAgLjI3Ni0uMjI0IDEuNS0uNSAxLjVzLS41LTEuMjI0LS41LTEuNVYxMGgtNGEuNS41IDAgMCAxLS41LS41YzAtLjk3My42NC0xLjcyNSAxLjE3LTIuMTg5QTYgNiAwIDAgMSA1IDYuNzA4VjIuMjc3YTMgMyAwIDAgMS0uMzU0LS4yOThDNC4zNDIgMS42NzQgNCAxLjE3OSA0IC41YS41LjUgMCAwIDEgLjE0Ni0uMzU0bTEuNTggMS40MDgtLjAwMi0uMDAxem0tLjAwMi0uMDAxLjAwMi4wMDFBLjUuNSAwIDAgMSA2IDJ2NWEuNS41IDAgMCAxLS4yNzYuNDQ3aC0uMDAybC0uMDEyLjAwNy0uMDU0LjAzYTUgNSAwIDAgMC0uODI3LjU4Yy0uMzE4LjI3OC0uNTg1LjU5Ni0uNzI1LjkzNmg3Ljc5MmMtLjE0LS4zNC0uNDA3LS42NTgtLjcyNS0uOTM2YTUgNSAwIDAgMC0uODgxLS42MWwtLjAxMi0uMDA2aC0uMDAyQS41LjUgMCAwIDEgMTAgN1YyYS41LjUgMCAwIDEgLjI5NS0uNDU4IDEuOCAxLjggMCAwIDAgLjM1MS0uMjcxYy4wOC0uMDguMTU1LS4xNy4yMTQtLjI3MUg1LjE0cS4wOTEuMTUuMjE0LjI3MWExLjggMS44IDAgMCAwIC4zNy4yODJcIi8%252BXG4gICAgICAgIDwvc3ZnPmA7XG5cbiAgICAgICAgLy8gU3R5bGUgZm9yIHRvcC1jZW50ZXIgb3ZlcmxheVxuICAgICAgICBPYmplY3QuYXNzaWduKHBpbk5vZGUuc3R5bGUsIHtcbiAgICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICAgIHRvcDogXCItNDAlXCIsXG4gICAgICAgICAgbGVmdDogXCI1MCVcIixcbiAgICAgICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWCgtNTAlKVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBwaW5Ob2RlLFxuICAgICAgICAgIGFwcGVuZDogdHJ1ZSAvLyBSZXBsYWNlIHRoZSBlbnRpcmUgbm90ZSBhbm5vdGF0aW9uIFVJLlxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIFJlbmRlciB0aGUgZGVmYXVsdCBVSS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pLnRoZW4oYXN5bmMoaW5zdGFuY2UpID0%252BIHsgfSk7XG4ifQ%253D%253D) - -- [Skip the Delete confirmation popup dialog for annotations](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6Ii8vVGl0bGU6IFNraXAgdGhlIERlbGV0ZSBjb25maXJtYXRpb24gcG9wLXVwIGRpYWxvZyBmb3IgQW5ub3RhdGlvbnNcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAvLyBTa2lwIGFubm90YXRpb24gZGVsZXRlIGNvbmZpcm1hdGlvbiBwb3B1cFxuICBpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKFwiYW5ub3RhdGlvbnMud2lsbENoYW5nZVwiLCAoZXZlbnQpID0%252BIHtcbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZGVsZXRlIHN0YXJ0IGFjdGlvblxuICAgIGlmIChldmVudC5yZWFzb24gPT09IFBTUERGS2l0LkFubm90YXRpb25zV2lsbENoYW5nZVJlYXNvbi5ERUxFVEVfU1RBUlQpIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgYW5ub3RhdGlvbiBpbW1lZGlhdGVseVxuICAgICAgaW5zdGFuY2UuZGVsZXRlKGV2ZW50LmFubm90YXRpb25zLmdldCgwKSk7XG4gICAgICAvLyBDbGljayB0aGUgY2FuY2VsIGJ1dHRvbiB0byBwcmV2ZW50IHRoZSBkaWFsb2cgZnJvbSBzaG93aW5nXG4gICAgICBpbnN0YW5jZS5jb250ZW50RG9jdW1lbnRcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCIuUFNQREZLaXQtQ29uZmlybS1EaWFsb2ctQnV0dG9uLUNhbmNlbFwiKVxuICAgICAgICAuY2xpY2soKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifX0%253D) - - This hook listens for the annotation deletion start event and immediately deletes the targeted annotation. It then clicks the dialog’s Cancel button to suppress the confirmation UI. The result is a seamless delete action with no popup interrupting the workflow - -#### Redaction - -- [Redact keywords programmatically](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21WS2V6VG00d2hVIiwibGF5ZXIiOiJyYW5kb21TbThmV0s5RnRQIn19LCJqcyI6Ii8qKlxuICogSW5pdGlhbGl6ZXMgUFNQREZLaXQgYW5kIHBlcmZvcm1zIGJhdGNoIHJlZGFjdGlvbiBvZiBzZW5zaXRpdmUgaW5mb3JtYXRpb25cbiAqIEF1dG9tYXRpY2FsbHkgcmVkYWN0cyBzcGVjaWZpZWQgcGxhY2UgbmFtZXMgYW5kIHBlcnNvbmFsIG5hbWVzIGZyb20gdGhlIGRvY3VtZW50XG4gKi9cblxuLy8gTGlzdHMgb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHRvIGJlIHJlZGFjdGVkXG5jb25zdCBTRU5TSVRJVkVfREFUQSA9IHtcbiAgcGxhY2VzOiBbXG4gICAgXCJLb3JhbVwiLFxuICAgIFwiTm9tU2FvXCIsXG4gICAgXCJVZ2FuZGFcIixcbiAgICBcIk5nb2dvXCIsXG4gICAgXCJUaGFpbGFuZFwiLFxuICAgIFwiTXlhbm1hclwiXG4gIF0sXG4gIG5hbWVzOiBbXG4gICAgXCJMeWRpYSBWIEx1bmN6XCIsXG4gICAgXCJBbWFuZGEgVGFuXCIsXG4gICAgXCJNaWNoYWVsIEhhc2xhbVwiLFxuICAgIFwiTGFycyBLdWxpa1wiLFxuICAgIFwiVG9tb3MgUHJvZmZpdHRcIixcbiAgICBcIlN1Y2hpbmRhIE1hbGFpdmlqaXRub25kXCIsXG4gICAgXCJNaWNoYWVsIEd1bWVydFwiXG4gIF1cbn07XG5cbi8vIERlZmF1bHQgc2VhcmNoIG9wdGlvbnMgZm9yIHJlZGFjdGlvblxuY29uc3QgUkVEQUNUSU9OX1NFQVJDSF9PUFRJT05TID0ge1xuICBzZWFyY2hUeXBlOiBQU1BERktpdC5TZWFyY2hUeXBlLlRFWFQsXG4gIHNlYXJjaEluQW5ub3RhdGlvbnM6IGZhbHNlLFxuICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgc3RhcnRQYWdlSW5kZXg6IDBcbn07XG5cblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUktcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gQ3JlYXRlIHJlZGFjdGlvbnMgZm9yIHBsYWNlc1xuICAgIGNvbnNvbGUubG9nKCdDcmVhdGluZyByZWRhY3Rpb25zIGZvciBwbGFjZXMuLi4nKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFNFTlNJVElWRV9EQVRBLnBsYWNlcy5tYXAocGxhY2UgPT4gXG4gICAgICAgIGluc3RhbmNlLmNyZWF0ZVJlZGFjdGlvbnNCeVNlYXJjaChwbGFjZSwgUkVEQUNUSU9OX1NFQVJDSF9PUFRJT05TKVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgcmVkYWN0aW9ucyBmb3IgbmFtZXNcbiAgICBjb25zb2xlLmxvZygnQ3JlYXRpbmcgcmVkYWN0aW9ucyBmb3IgbmFtZXMuLi4nKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFNFTlNJVElWRV9EQVRBLm5hbWVzLm1hcChuYW1lID0%252BIFxuICAgICAgICBpbnN0YW5jZS5jcmVhdGVSZWRhY3Rpb25zQnlTZWFyY2gobmFtZSwgUkVEQUNUSU9OX1NFQVJDSF9PUFRJT05TKVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBBcHBseSBhbGwgcmVkYWN0aW9ucyB0byB0aGUgZG9jdW1lbnRcbiAgICBjb25zb2xlLmxvZygnQXBwbHlpbmcgYWxsIHJlZGFjdGlvbnMuLi4nKTtcbiAgICBhd2FpdCBpbnN0YW5jZS5hcHBseVJlZGFjdGlvbnMoKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnQmF0Y2ggcmVkYWN0aW9uIGNvbXBsZXRlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGJhdGNoIHJlZGFjdGlvbjonLCBlcnJvcik7XG4gIH1cbn0pOyIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - - Load a PDF, search for keywords, create redaction annotations over the found text, and apply the redactions to permanently remove the text. — [Video](https://www.youtube.com/watch?v=eGfnOXXTjWo) - -- [Apply redactions to text with an overlay](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21IYm5aaFZLTnRCIiwibGF5ZXIiOiJyYW5kb21EWXN5NjgzZUxFIn19LCJqcyI6Ii8qKlxuICogSW5pdGlhbGl6ZXMgUFNQREZLaXQgYW5kIGNyZWF0ZXMgcmVkYWN0aW9ucyBmb3IgYWxsIHRleHQgaW4gdGhlIGRvY3VtZW50XG4gKiBDcmVhdGVzIGEgcmVkYWN0aW9uIGFubm90YXRpb24gZm9yIGVhY2ggbGluZSBvZiB0ZXh0IGFuZCBhcHBsaWVzIHRoZW1cbiAqL1xuXG4vLyBDb25maWd1cmF0aW9uIGZvciByZWRhY3Rpb24gYW5ub3RhdGlvbnNcbmNvbnN0IFJFREFDVElPTl9DT05GSUcgPSB7XG4gIGNvbG9yOiBQU1BERktpdC5Db2xvci5SRUQsXG4gIG92ZXJsYXlUZXh0OiBcIlJFREFDVEVEXCIsXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWRhY3Rpb24gYW5ub3RhdGlvbiBmb3IgYSB0ZXh0IGxpbmVcbiAqIEBwYXJhbSB7UFNQREZLaXQuVGV4dExpbmV9IHRleHRMaW5lIC0gVGhlIHRleHQgbGluZSB0byByZWRhY3RcbiAqIEByZXR1cm5zIHtQU1BERktpdC5Bbm5vdGF0aW9ucy5SZWRhY3Rpb25Bbm5vdGF0aW9ufSBUaGUgcmVkYWN0aW9uIGFubm90YXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUmVkYWN0aW9uRnJvbVRleHRMaW5lKHRleHRMaW5lKSB7XG4gIGNvbnN0IHsgYm91bmRpbmdCb3gsIHBhZ2VJbmRleCB9ID0gdGV4dExpbmU7XG5cbiAgcmV0dXJuIG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5SZWRhY3Rpb25Bbm5vdGF0aW9uKHtcbiAgICBpZDogUFNQREZLaXQuZ2VuZXJhdGVJbnN0YW50SWQoKSxcbiAgICBwYWdlSW5kZXgsXG4gICAgYm91bmRpbmdCb3gsXG4gICAgcmVjdHM6IG5ldyBQU1BERktpdC5JbW11dGFibGUuTGlzdChbYm91bmRpbmdCb3hdKSxcbiAgICAuLi5SRURBQ1RJT05fQ09ORklHLFxuICB9KTtcbn1cblxuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coXCJTdGFydGluZyBmdWxsIGRvY3VtZW50IHJlZGFjdGlvbi4uLlwiKTtcblxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBwYWdlIGluZGljZXMgYmFzZWQgb24gdG90YWwgcGFnZSBjb3VudFxuICAgIGNvbnN0IHBhZ2VJbmRpY2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogaW5zdGFuY2UudG90YWxQYWdlQ291bnQgfSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBwYWdlIGluZGV4IGFuZCBnZXRzIHRleHQgbGluZXMgb24gcGFnZVxuICAgIC8vIFdhaXQgZm9yIGFsbCBwYWdlcyB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICBjb25zdCBhbGxQYWdlc1RleHRMaW5lcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFnZUluZGljZXMubWFwKCh2YWx1ZSwgaW5kZXgpID0%252BIGluc3RhbmNlLnRleHRMaW5lc0ZvclBhZ2VJbmRleChpbmRleCkpXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBhcnJheSBvZiByZWRhY3Rpb24gYW5ub3RhdGlvbnMgZm9yIGFsbCB0ZXh0IGxpbmVzXG4gICAgY29uc29sZS5sb2coXCJDcmVhdGluZyByZWRhY3Rpb24gYW5ub3RhdGlvbnMuLi5cIik7XG4gICAgY29uc3QgcmVkYWN0aW9uQW5ub3RhdGlvbnMgPSBhbGxQYWdlc1RleHRMaW5lcy5mbGF0TWFwKChwYWdlVGV4dExpbmVzKSA9PlxuICAgICAgcGFnZVRleHRMaW5lcy5yZWR1Y2UoXG4gICAgICAgIChhbm5vdGF0aW9ucywgdGV4dExpbmUpID0%252BIFtcbiAgICAgICAgICAuLi5hbm5vdGF0aW9ucyxcbiAgICAgICAgICBjcmVhdGVSZWRhY3Rpb25Gcm9tVGV4dExpbmUodGV4dExpbmUpLFxuICAgICAgICBdLFxuICAgICAgICBbXVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYW5kIGFwcGx5IHRoZSByZWRhY3Rpb25zXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgQ3JlYXRpbmcgJHtyZWRhY3Rpb25Bbm5vdGF0aW9ucy5sZW5ndGh9IHJlZGFjdGlvbiBhbm5vdGF0aW9ucy4uLmBcbiAgICApO1xuICAgIGF3YWl0IGluc3RhbmNlLmNyZWF0ZShyZWRhY3Rpb25Bbm5vdGF0aW9ucyk7XG5cbiAgICBjb25zb2xlLmxvZyhcIkFwcGx5aW5nIHJlZGFjdGlvbnMuLi5cIik7XG4gICAgYXdhaXQgaW5zdGFuY2UuYXBwbHlSZWRhY3Rpb25zKCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIkRvY3VtZW50IHJlZGFjdGlvbiBjb21wbGV0ZVwiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIGRvY3VtZW50IHJlZGFjdGlvbjpcIiwgZXJyb3IpO1xuICB9XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - - Load a PDF, retrieve all text lines from every page, create redaction annotations over the detected text using an overlay, and apply the redactions to the document. — [Video](https://www.youtube.com/watch?v=IIciwmN-LZ4) - -- [Approve or reject redactions before applying](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/redact-one-by-one) - -- [Approve or reject redactions before applying — Playground](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIn0sImpzIjoiLy8gRGVjbGFyZSB0aGUgUFNQREZLaXQgaW5zdGFuY2UgdmFyaWFibGVcbmxldCBpbnN0YW5jZTtcblxuLy8gRnVuY3Rpb24gdG8gcmV0cmlldmUgYWxsIHJlZGFjdGlvbiBhbm5vdGF0aW9ucyBpbiB0aGUgZG9jdW1lbnRcbmNvbnN0IGdldEFsbEFubm90YXRpb25zID0gYXN5bmMgKCkgPT4ge1xuICBsZXQgYW5ub3RhdGlvbnNMaXN0ID0gUFNQREZLaXQuSW1tdXRhYmxlLkxpc3QoKTsgLy8gSW5pdGlhbGl6ZSBhbiBpbW11dGFibGUgbGlzdCB0byBzdG9yZSBhbm5vdGF0aW9uc1xuXG4gIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgcGFnZXMgdG8gY29sbGVjdCByZWRhY3Rpb24gYW5ub3RhdGlvbnNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0YW5jZS50b3RhbFBhZ2VDb3VudCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGFubnMgPSAoYXdhaXQgaW5zdGFuY2UuZ2V0QW5ub3RhdGlvbnMoaSkpLmZpbHRlcihcbiAgICAgIChhKSA9PiBhIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuUmVkYWN0aW9uQW5ub3RhdGlvbiAvLyBGaWx0ZXIgb25seSByZWRhY3Rpb24gYW5ub3RhdGlvbnNcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKGFubnMpOyAvLyBMb2cgcmVkYWN0aW9uIGFubm90YXRpb25zIGZvciBkZWJ1Z2dpbmdcbiAgICBhbm5vdGF0aW9uc0xpc3QgPSBhbm5vdGF0aW9uc0xpc3QuY29uY2F0KGFubnMpOyAvLyBDb25jYXRlbmF0ZSBhbm5vdGF0aW9ucyB0byB0aGUgbGlzdFxuICB9XG4gIHJldHVybiBhbm5vdGF0aW9uc0xpc3Q7IC8vIFJldHVybiB0aGUgbGlzdCBvZiByZWRhY3Rpb24gYW5ub3RhdGlvbnNcbn07XG5cbi8vIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBhbm5vdGF0aW9uIHRvb2x0aXBzXG5jb25zdCByZWRhY3Rpb25Bbm5vdGF0aW9uc0hhbmRsZXJDYWxsYmFjayA9IChhbm5vdGF0aW9uKSA9PlxuICAvLyBDaGVjayBpZiB0aGUgYW5ub3RhdGlvbiBpcyBhIHJlZGFjdGlvbiBhbm5vdGF0aW9uXG4gIGFubm90YXRpb24gaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5SZWRhY3Rpb25Bbm5vdGF0aW9uXG4gICAgPyBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImN1c3RvbVwiLCAvLyBEZWZpbmUgYXMgYSBjdXN0b20gdG9vbHRpcCBpdGVtXG4gICAgICAgICAgdGl0bGU6IFwiQWNjZXB0XCIsIC8vIExhYmVsIGZvciB0aGUgYWNjZXB0IG9wdGlvblxuICAgICAgICAgIGlkOiBcInRvb2x0aXAtYWNjZXB0LWFubm90YXRpb25cIiwgLy8gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0b29sdGlwXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlRvb2x0aXBJdGVtLUR1cGxpY2F0aW9uXCIsIC8vIENTUyBjbGFzcyBmb3Igc3R5bGluZ1xuICAgICAgICAgIG9uUHJlc3M6IGFzeW5jICgpID0%252BIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgcmVkYWN0aW9uIGFubm90YXRpb25zIGV4Y2VwdCB0aGUgY3VycmVudCBvbmVcbiAgICAgICAgICAgIGNvbnN0IGFsbFJlZGFjdGlvbkFubm90YXRpb25zID0gKGF3YWl0IGdldEFsbEFubm90YXRpb25zKCkpLmZpbHRlcihcbiAgICAgICAgICAgICAgKGEpID0%252BIGEuaWQgIT09IGFubm90YXRpb24uaWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgb3RoZXIgcmVkYWN0aW9uIGFubm90YXRpb25zLCBhcHBseSByZWRhY3Rpb25zLCBhbmQgcmVzdG9yZSB0aGVtXG4gICAgICAgICAgICBhd2FpdCBpbnN0YW5jZS5kZWxldGUoYWxsUmVkYWN0aW9uQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgYXdhaXQgaW5zdGFuY2UuYXBwbHlSZWRhY3Rpb25zKCk7XG4gICAgICAgICAgICBhd2FpdCBpbnN0YW5jZS5jcmVhdGUoYWxsUmVkYWN0aW9uQW5ub3RhdGlvbnMpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImN1c3RvbVwiLCAvLyBEZWZpbmUgYXMgYSBjdXN0b20gdG9vbHRpcCBpdGVtXG4gICAgICAgICAgdGl0bGU6IFwiUmVqZWN0XCIsIC8vIExhYmVsIGZvciB0aGUgcmVqZWN0IG9wdGlvblxuICAgICAgICAgIGlkOiBcInRvb2x0aXAtcmVqZWN0LWFubm90YXRpb25cIiwgLy8gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0b29sdGlwXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlRvb2x0aXBJdGVtLUR1cGxpY2F0aW9uXCIsIC8vIENTUyBjbGFzcyBmb3Igc3R5bGluZ1xuICAgICAgICAgIG9uUHJlc3M6IGFzeW5jICgpID0%252BIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmRlbGV0ZShhbm5vdGF0aW9uKTsgLy8gRGVsZXRlIHRoZSBzZWxlY3RlZCByZWRhY3Rpb24gYW5ub3RhdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdXG4gICAgOiBbXTsgLy8gUmV0dXJuIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBhbm5vdGF0aW9uIGlzIG5vdCBhIHJlZGFjdGlvbiBhbm5vdGF0aW9uXG5cbi8vIExvYWQgUFNQREZLaXQgd2l0aCBjb25maWd1cmF0aW9uc1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLCAvLyBTcHJlYWQgYmFzZSBvcHRpb25zIHRvIHJldGFpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLCAvLyBTZXQgdGhlbWUgdG8gZGFyayBtb2RlXG4gIGVuYWJsZUF1dG9tYXRpY0xpbmtFeHRyYWN0aW9uOiB0cnVlLCAvLyBFbmFibGUgYXV0b21hdGljIGxpbmsgZGV0ZWN0aW9uIGluIHRoZSBkb2N1bWVudFxuICBhbm5vdGF0aW9uVG9vbHRpcENhbGxiYWNrOiByZWRhY3Rpb25Bbm5vdGF0aW9uc0hhbmRsZXJDYWxsYmFjaywgLy8gQXNzaWduIGN1c3RvbSB0b29sdGlwIGNhbGxiYWNrXG4gIHRvb2xiYXJJdGVtczogW1xuICAgIC4uLlBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMsIC8vIEluY2x1ZGUgZGVmYXVsdCB0b29sYmFyIGl0ZW1zXG4gICAgeyB0eXBlOiBcInJlZGFjdC1yZWN0YW5nbGVcIiB9LCAvLyBBZGQgcmVkYWN0aW9uIHJlY3RhbmdsZSB0b29sXG4gICAgeyB0eXBlOiBcInJlZGFjdC10ZXh0LWhpZ2hsaWdodGVyXCIgfSwgLy8gQWRkIHJlZGFjdGlvbiB0ZXh0IGhpZ2hsaWdodGVyIHRvb2xcbiAgXSxcbn0pLnRoZW4oKF9pbnN0YW5jZSkgPT4ge1xuICBpbnN0YW5jZSA9IF9pbnN0YW5jZTsgLy8gQXNzaWduIHRoZSBsb2FkZWQgaW5zdGFuY2UgdG8gdGhlIGdsb2JhbCB2YXJpYWJsZVxuICBjb25zb2xlLmxvZyhcIlBTUERGS2l0IGxvYWRlZCEgYnkgTmFyYXNoaW1hblwiKTsgLy8gTG9nIGEgbWVzc2FnZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsIGxvYWRpbmdcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmN1c3RvbS10b29sYmFyLWl0ZW0ge1xuICBoZWlnaHQ6IDEwMCU7XG59XG4ifQ%253D%253D) - - Manage redaction annotations from an annotation tooltip with two options that allow you to apply or reject redactions one by one. — [Video](https://www.youtube.com/watch?v=1vAsjBmU1FA) - -- [Add a custom tooltip to a redaction annotation](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkssdG9vbGJhckl0ZW1zOlsuLi5QU1BERktpdC5kZWZhdWx0VG9vbGJhckl0ZW1zLHt0eXBlOidyZWRhY3QtcmVjdGFuZ2xlJ30se3R5cGU6J3JlZGFjdC10ZXh0LWhpZ2hsaWdodGVyJ31dLGFubm90YXRpb25Ub29sdGlwQ2FsbGJhY2s6YW5uPT57aWYoYW5uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuUmVkYWN0aW9uQW5ub3RhdGlvbil7Y29uc3Qgc2VsZWN0Tm9kZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtyZXR1cm4gc2VsZWN0Tm9kZS5jbGFzc05hbWU9J3NlbGVjdC1ub2RlJyxzZWxlY3ROb2RlLmlubmVySFRNTD0nVGVzdCcsW3t0eXBlOidjdXN0b20nLGlkOidteS1idXR0b24nLG5vZGU6c2VsZWN0Tm9kZSxvblByZXNzOmV2ZW50PT57YWxlcnQoJ2hlbGxvIGZyb20gbXkgYnV0dG9uJyl9fV19cmV0dXJuW119fSkudGhlbigoYXN5bmMgaW5zdGFuY2U9Pntjb25zdCByZWRhY3Rpb25JZD1hd2FpdCBpbnN0YW5jZS5jcmVhdGVSZWRhY3Rpb25zQnlTZWFyY2goJ1NldCBvZiBLaXRjaGVuJyk7YXdhaXQgaW5zdGFuY2Uuc2V0U2VsZWN0ZWRBbm5vdGF0aW9ucyhyZWRhY3Rpb25JZCl9KSk7Iiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJhbm5vdGF0aW9ucy5wZGYiLCJqd3QiOnsicGVybWlzc2lvbnMiOlsicmVhZC1kb2N1bWVudCIsIndyaXRlIl0sInVzZXJJZCI6InJhbmRvbU9GZDlxdzAwdVAiLCJsYXllciI6InJhbmRvbVNLR3hlUjVubXUifX0sImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cbi5QU1BERktpdC1Qb3BvdmVyLUFubm90YXRpb24tVG9vbHRpcCB7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLnNlbGVjdC1ub2RlIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgYmFja2dyb3VuZDogIzNkNDY0ZDtcbiAgbWluLXdpZHRoOiA0NHB4O1xuICBib3JkZXI6IDAgc29saWQgIzAwMDA7XG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgaGVpZ2h0OiAyNXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAtMTVweDtcbiAgdG9wOiAtMTBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uc2VsZWN0LW5vZGU6OmFmdGVyIHtcbiAgY29udGVudDogXCJcIjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IC01cHg7IC8qIEFkanVzdHMgdGhlIGFycm93IHBvc2l0aW9uIHRvIGxvb2sgYXR0YWNoZWQgdG8gdGhlIGJ1dHRvbiAqL1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci10b3A6IDVweCBzb2xpZCAjM2Q0NjRkOyAvKiBBcnJvdyBjb2xvciAqL1xufVxuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - - Add redaction tools to the toolbar and modify the tooltip behavior for redaction annotations. — [Video](https://www.youtube.com/watch?v=b1pMsyNb8y8) - -#### Content Editor - -- [Content Editor state change listener](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6IlBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIHRvb2xiYXJJdGVtczogWy4uLlBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMsIHsgdHlwZTogXCJjb250ZW50LWVkaXRvclwiIH1dLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIC0gYnkgTmFyYXNoaW1hblwiKTtcblxuICBsZXQgaXNDb250ZW50RWRpdG9yQWN0aXZlID0gZmFsc2U7XG4gIGxldCBjbGlja0xpc3RlbmVyQWRkZWQgPSBmYWxzZTtcblxuICAvLyBGdW5jdGlvbiB0byBhZGQgYnV0dG9uIGNsaWNrIGRldGVjdGlvblxuICBmdW5jdGlvbiBhZGRCdXR0b25DbGlja0RldGVjdGlvbigpIHtcbiAgICBpZiAoIWluc3RhbmNlLmNvbnRlbnREb2N1bWVudCB8fCBjbGlja0xpc3RlbmVyQWRkZWQpIHJldHVybjtcbiAgICBcbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXIgdG8gZGV0ZWN0IGJ1dHRvbiBjbGlja3MgaW4gY29udGVudCBlZGl0b3JcbiAgICBpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKCFpc0NvbnRlbnRFZGl0b3JBY3RpdmUpIHJldHVybjtcbiAgICAgIFxuICAgICAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbicpO1xuICAgICAgaWYgKCFidXR0b24pIHJldHVybjtcbiAgICAgIFxuICAgICAgY29uc3QgYnV0dG9uVGV4dCA9IGJ1dHRvbi50ZXh0Q29udGVudCB8fCBidXR0b24uaW5uZXJUZXh0IHx8ICcnO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBmb3IgQ2FuY2VsIGJ1dHRvblxuICAgICAgaWYgKGJ1dHRvblRleHQudHJpbSgpID09PSAnQ2FuY2VsJykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkNhbmNlbCBidXR0b24gY2xpY2tlZFwiKTtcbiAgICAgICAgLy8gWW91IGNhbiBhZGQgeW91ciBsb2dpYyBoZXJlXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZvciBTYXZlICYgQ2xvc2UgYnV0dG9uXG4gICAgICBpZiAoYnV0dG9uVGV4dC5pbmNsdWRlcygnU2F2ZScpICYmIGJ1dHRvblRleHQuaW5jbHVkZXMoJ0Nsb3NlJykpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJTYXZlICYgQ2xvc2UgYnV0dG9uIGNsaWNrZWRcIik7XG4gICAgICAgIC8vIFlvdXIgY2FuIGFkZCB5dW9yIGxvZ2ljIGhlcmVcbiAgICAgIH1cbiAgICB9LCB0cnVlKTtcbiAgICBcbiAgICBjbGlja0xpc3RlbmVyQWRkZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gTW9uaXRvciB2aWV3IHN0YXRlIGNoYW5nZXNcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInZpZXdTdGF0ZS5jaGFuZ2VcIiwgKHZpZXdTdGF0ZSwgcHJldmlvdXNWaWV3U3RhdGUpID0%252BIHtcbiAgICBjb25zdCBjdXJyZW50TW9kZSA9IHZpZXdTdGF0ZS50b0pTKCkuaW50ZXJhY3Rpb25Nb2RlO1xuICAgIGNvbnN0IHByZXZpb3VzTW9kZSA9IHByZXZpb3VzVmlld1N0YXRlLnRvSlMoKS5pbnRlcmFjdGlvbk1vZGU7XG4gICAgXG4gICAgaWYgKGN1cnJlbnRNb2RlID09PSBcIkNPTlRFTlRfRURJVE9SXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ29udGVudCBFZGl0b3Igb3BlbmVkXCIpO1xuICAgICAgaXNDb250ZW50RWRpdG9yQWN0aXZlID0gdHJ1ZTtcbiAgICAgIFxuICAgICAgLy8gQWRkIGJ1dHRvbiBjbGljayBkZXRlY3Rpb25cbiAgICAgIHNldFRpbWVvdXQoYWRkQnV0dG9uQ2xpY2tEZXRlY3Rpb24sIDUwMCk7XG4gICAgICBcbiAgICB9IGVsc2UgaWYgKHByZXZpb3VzTW9kZSA9PT0gXCJDT05URU5UX0VESVRPUlwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNvbnRlbnQgRWRpdG9yIGNsb3NlZFwiKTtcbiAgICAgIGlzQ29udGVudEVkaXRvckFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG59KTsiLCJtb2RlIjoic3RhbmRhbG9uZSIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4ifQ%253D%253D) - -#### Comments - -- [Set annotation creator name](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiIvL3NldCB1c2VyIG5hbWUgZnJvbSBhIGxvZ2luIG9yIGF1dGhlbnRpY2F0aW9uXG5jb25zdCB1c2VybmFtZSA9IFwiSm9obiBTbWl0aFwiO1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgdG9vbGJhckl0ZW1zOiBbeyB0eXBlOiBcImNvbW1lbnRcIiB9XSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGluc3RhbmNlLnNldEFubm90YXRpb25DcmVhdG9yTmFtZShcIkpvaG4gU21pdGhcIik7XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) - - Set an annotation creator’s name, ensuring any annotations — including comments — made by that user are attributed to them. — [Video](https://www.youtube.com/watch?v=1VJzTbdY_F0) - -- [Link comments with annotations](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/comment-annotations) - -- [Add custom buttons for customizing comments](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/comments-status) - - Customize the comments popover by adding custom actions, like approve and reject, allowing users to manage comments efficiently. — [Video](https://www.youtube.com/watch?v=lVbuW7gMuVg) - -- [Clean up empty comment threads and highlights](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6Ii8vIENsZWFuIFVwIEVtcHR5IENvbW1lbnQgVGhyZWFkcyBhbmQgSGlnaGxpZ2h0c1xubGV0IG9ic2VydmVyID0gbnVsbDtcbmxldCBoYXNCZWVuRWRpdGVkID0gZmFsc2U7XG5cbk51dHJpZW50Vmlld2VyLmxvYWQoe1xuXHQuLi5iYXNlT3B0aW9ucyxcblx0dGhlbWU6IE51dHJpZW50Vmlld2VyLlRoZW1lLkRBUkssXG5cdHRvb2xiYXJJdGVtczogW1xuXHRcdC4uLk51dHJpZW50Vmlld2VyLmRlZmF1bHRUb29sYmFySXRlbXMsXG5cdFx0eyB0eXBlOiBcImNvbW1lbnRcIiB9LFxuXHRdLFxuXHR1aToge1xuXHRcdGNvbW1lbnRUaHJlYWQ6IHtcblx0XHRcdGVkaXRvcjogKGluc3RhbmNlLCB0aHJlYWRJZCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHJlbmRlcjogKHBhcmFtcykgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gVXNlIGRlZmF1bHQgZWRpdG9yIFVJIGJ5IHJldHVybmluZyBudWxsXG5cdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9uTW91bnQ6IChyb290SWQpID0%252BIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGBIZWFkZXIgbW91bnRlZCB3aXRoIHJvb3RJZDogJHtyb290SWR9YCk7XG5cblx0XHRcdFx0XHRcdC8vIEVuc3VyZSBhIHNpbmdsZSBvYnNlcnZlciBpbnN0YW5jZSBwZXIgdmlld2VyIGluc3RhbmNlXG5cdFx0XHRcdFx0XHRpZiAoIW9ic2VydmVyKSB7XG5cdFx0XHRcdFx0XHRcdG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgY29udGFpbmVyO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hhcmFjdGVyRGF0YVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciB0ZXh0IG5vZGVzLCB1c2UgcGFyZW50RWxlbWVudCB0byBnZXQgdG8gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGFpbmVyID0gbXV0YXRpb24udGFyZ2V0Py5wYXJlbnRFbGVtZW50Py5jbG9zZXN0Py4oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YC5CYXNlbGluZVVJLUVkaXRvci1SaWNoRWRpdG9yRWRpdGluZ0FyZWFgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3IgZWxlbWVudCBub2RlcywgdXNlIGNsb3Nlc3QgZGlyZWN0bHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGFpbmVyID0gbXV0YXRpb24udGFyZ2V0Py5jbG9zZXN0Py4oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YC5CYXNlbGluZVVJLUVkaXRvci1SaWNoRWRpdG9yRWRpdGluZ0FyZWFgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb250YWluZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGV4dENvbnRlbnQgPSBjb250YWluZXIudGV4dENvbnRlbnQ%252FLnRyaW0oKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgaGFzUmVhbENvbnRlbnQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCEhdGV4dENvbnRlbnQgJiYgIXRleHRDb250ZW50LmluY2x1ZGVzKFwiQWRkIHlvdXIgY29tbWVudFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aGFzQmVlbkVkaXRlZCA9IGhhc1JlYWxDb250ZW50O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkVkaXRvciBzdGF0ZTpcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRoYXNSZWFsQ29udGVudCA%252FIFwiaGFzIGNvbnRlbnRcIiA6IFwiZW1wdHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBGaW5kIHRoZSBjb3JyZWN0IGVkaXRvciBjb250YWluZXIgZm9yIHRoaXMgdGhyZWFkLCBwcmVmZXIgc2NvcGVkIHNlbGVjdG9yXG5cdFx0XHRcdFx0XHRjb25zdCBjb250YWluZXIgPVxuXHRcdFx0XHRcdFx0XHRpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3Rvcihcblx0XHRcdFx0XHRcdFx0XHRgW2RhdGEtcm9vdC1pZD1cIiR7cm9vdElkfVwiXSAuQmFzZWxpbmVVSS1FZGl0b3ItUmljaEVkaXRvckVkaXRpbmdBcmVhYFxuXHRcdFx0XHRcdFx0XHQpIHx8XG5cdFx0XHRcdFx0XHRcdGluc3RhbmNlLmNvbnRlbnREb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0XHRcdGAuQmFzZWxpbmVVSS1FZGl0b3ItUmljaEVkaXRvckVkaXRpbmdBcmVhYFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoY29udGFpbmVyKSB7XG5cdFx0XHRcdFx0XHRcdG9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyLCB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hpbGRMaXN0OiB0cnVlLCAgICAgICAgLy8gV2F0Y2ggZm9yIGFkZGVkL3JlbW92ZWQgY2hpbGQgbm9kZXNcblx0XHRcdFx0XHRcdFx0XHRhdHRyaWJ1dGVzOiB0cnVlLCAgICAgICAgLy8gV2F0Y2ggZm9yIGF0dHJpYnV0ZSBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0c3VidHJlZTogdHJ1ZSwgICAgICAgICAgIC8vIFdhdGNoIGRlc2NlbmRhbnRzIHRvb1xuXHRcdFx0XHRcdFx0XHRcdGNoYXJhY3RlckRhdGE6IHRydWUsICAgICAvLyBUcmFjayB0ZXh0IHVwZGF0ZXNcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvblVubW91bnQ6IGFzeW5jIChyb290SWQpID0%252BIHtcblx0XHRcdFx0XHRcdC8vIFNhZmVseSBkaXNjb25uZWN0IG9ic2VydmVyIGZvciB0aGlzIGxpZmVjeWNsZTsga2VlcCBpbnN0YW5jZS1zY29wZWQgc3RhdGVcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdG9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIHt9XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGBIZWFkZXIgdW5tb3VudGVkIHdpdGggcm9vdElkOiAke3Jvb3RJZH1gKTtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgYXJlIGNvbW1lbnRzIGluIHRoaXMgdGhyZWFkIG9yIHRoZSBlZGl0b3IgaGFkIGNvbnRlbnQsIGRvIG5vdGhpbmdcblx0XHRcdFx0XHRcdGNvbnN0IGhhc0NvbW1lbnRzID0gKGF3YWl0IGluc3RhbmNlLmdldENvbW1lbnRzKCkpLmZpbmQoXG5cdFx0XHRcdFx0XHRcdChjb21tZW50KSA9PiBjb21tZW50LnJvb3RJZCA9PT0gcm9vdElkXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0aWYgKCEhaGFzQ29tbWVudHMgfHwgaGFzQmVlbkVkaXRlZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBSZXNldCBlZGl0IGZsYWcgZm9yIG5leHQgbGlmZWN5Y2xlXG5cdFx0XHRcdFx0XHRcdGhhc0JlZW5FZGl0ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBObyBjb21tZW50cyBhbmQgZWRpdG9yIHN0YXllZCBlbXB0eTogcmVtb3ZlIHRoZSBsaW5nZXJpbmcgbWFya2VyIGFubm90YXRpb25cblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiRGVsZXRpbmcgbGluZ2VyaW5nIGFubm90YXRpb24gLSBlZGl0b3IgaXMgZW1wdHlcIik7XG5cdFx0XHRcdFx0XHRjb25zdCB7IGN1cnJlbnRQYWdlSW5kZXggfSA9IGluc3RhbmNlLnZpZXdTdGF0ZTtcblx0XHRcdFx0XHRcdGNvbnN0IGxpbmdlcmluZ0NvbW1lbnRNYXJrZXIgPSAoYXdhaXQgaW5zdGFuY2UuZ2V0QW5ub3RhdGlvbnMoY3VycmVudFBhZ2VJbmRleCkpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoKGFubm90YXRpb24pID0%252BIGFubm90YXRpb24uaWQgPT09IHJvb3RJZCk7XG5cblx0XHRcdFx0XHRcdGlmIChsaW5nZXJpbmdDb21tZW50TWFya2VyLmxlbmd0aCA%252BIDApIHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgaW5zdGFuY2UuZGVsZXRlKGxpbmdlcmluZ0NvbW1lbnRNYXJrZXIpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBSZXNldCBmb3IgbmV4dCBtb3VudFxuXHRcdFx0XHRcdFx0aGFzQmVlbkVkaXRlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuXHQvLyBFU0MgaGFuZGxpbmc6IGRlbGV0ZSB0ZW1wb3JhcnkgbWFya2VycyBvciBjYW5jZWwgZW1wdHkgdGhyZWFkIHJvb3RzXG5cdGNvbnN0IGlzSUUxMSA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIlRyaWRlbnQvXCIpID4gLTE7XG5cblx0aW5zdGFuY2UuY29udGVudERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XCJrZXlkb3duXCIsXG5cdFx0a2V5RG93bkhhbmRsZXIsXG5cdFx0aXNJRTExID8geyBjYXB0dXJlOiB0cnVlIH0gOiB0cnVlXG5cdCk7XG5cblx0YXN5bmMgZnVuY3Rpb24ga2V5RG93bkhhbmRsZXIoZXZlbnQpIHtcblx0XHRpZiAoZXZlbnQua2V5ICE9PSBcIkVzY2FwZVwiKSByZXR1cm47XG5cblx0XHRjb25zdCBzZWxlY3RlZCA9IGluc3RhbmNlLmdldFNlbGVjdGVkQW5ub3RhdGlvbnMoKTtcblx0XHRjb25zdCBzZWxlY3RlZEZpcnN0ID0gc2VsZWN0ZWQ%252FLmdldD8uKDApO1xuXHRcdGlmICghc2VsZWN0ZWRGaXJzdCkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgY29tbWVudHMgPSBhd2FpdCBpbnN0YW5jZS5nZXRDb21tZW50cygpO1xuXHRcdGNvbnN0IGNvbW1lbnRzQ3JlYXRlZCA9IGNvbW1lbnRzLnNvbWUoXG5cdFx0XHQoY29tbWVudCkgPT4gY29tbWVudD8ucm9vdElkID09PSBzZWxlY3RlZEZpcnN0LmlkXG5cdFx0KTtcblxuXHRcdGNvbnN0IGlzQ29tbWVudE1hcmtlciA9XG5cdFx0XHRzZWxlY3RlZEZpcnN0IGluc3RhbmNlb2YgTnV0cmllbnRWaWV3ZXIuQW5ub3RhdGlvbnMuQ29tbWVudE1hcmtlckFubm90YXRpb247XG5cblx0XHQvLyBEZWxldGUgaWY6XG5cdFx0Ly8gLSBBIG5vbi1yb290IGNvbW1lbnQgbWFya2VyIGlzIHNlbGVjdGVkLCBvclxuXHRcdC8vIC0gQSByb290IG1hcmtlciBpcyBzZWxlY3RlZCBidXQgbm8gY29tbWVudHMgd2VyZSBjcmVhdGVkIHlldFxuXHRcdGNvbnN0IHNob3VsZERlbGV0ZSA9XG5cdFx0XHQoIXNlbGVjdGVkRmlyc3Q%252FLmlzQ29tbWVudFRocmVhZFJvb3QgJiYgaXNDb21tZW50TWFya2VyKSB8fFxuXHRcdFx0KCFjb21tZW50c0NyZWF0ZWQgJiYgc2VsZWN0ZWRGaXJzdD8uaXNDb21tZW50VGhyZWFkUm9vdCk7XG5cblx0XHRpZiAoc2hvdWxkRGVsZXRlKSB7XG5cdFx0XHRhd2FpdCBpbnN0YW5jZS5kZWxldGUoc2VsZWN0ZWQpO1xuXHRcdH1cblx0fVxufSk7IiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cblx0Iiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifX0%253D) - - Prevent stray comment markers when someone opens a thread but no longer wants it. If no real text is entered and no comments are posted, the yellow highlight/marker is auto-removed when the editor closes, keeping pages tidy. Press Escape to instantly clear temporary markers while drafting - -#### Signing - -- [Disable signature annotation editing](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIn0sImpzIjoiLy8gTG9hZCBQU1BERktpdCB3aXRoIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsIC8vIFNwcmVhZCB0aGUgYmFzZSBvcHRpb25zIHRvIHJldGFpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zXG5cbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssIC8vIFNldCB0aGUgdGhlbWUgdG8gZGFyayBtb2RlIGZvciBiZXR0ZXIgdmlzaWJpbGl0eVxuXG4gIGlzRWRpdGFibGVBbm5vdGF0aW9uOiBmdW5jdGlvbiAoYW5ub3RhdGlvbikge1xuICAgIC8vIEZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGFubm90YXRpb24gaXMgZWRpdGFibGVcblxuICAgIC8vIENoZWNrIGlmIHRoZSBhbm5vdGF0aW9uIGlzIGEgc2lnbmF0dXJlXG4gICAgcmV0dXJuICFhbm5vdGF0aW9uLmlzU2lnbmF0dXJlOyAvLyBSZXR1cm4gdHJ1ZSBpZiBpdCdzIG5vdCBhIHNpZ25hdHVyZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gIH0sXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAvLyBDYWxsYmFjayBmdW5jdGlvbiBleGVjdXRlZCBhZnRlciBQU1BERktpdCBoYXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZFxuICBjb25zb2xlLmxvZyhcIlBTUERGS2l0IGxvYWRlZCEgYnkgTmFyYXNoaW1hblwiKTsgLy8gTG9nIGEgbWVzc2FnZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsIGxvYWRpbmdcbn0pO1xuIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - - Customize the editability of annotations by preventing users from modifying signature annotations. — [Video](https://www.youtube.com/watch?v=uOZbzjrgs8A) - -- [Automate signature placement in form fields and restrict signature placement to other fields](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJtb2RlIjoic3RhbmRhbG9uZSIsImpzIjoiUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbn0pLnRoZW4oYXN5bmMoaW5zdGFuY2UpID0%2BIHtcbiAgbGV0IHN0b3JlZFNpZ25hdHVyZTtcblxuICAvL0dldHRpbmcgYWxsIGZvcm0gZmllbGRzIHRvIHVzZSBpbiBhbm5vdGF0aW9uIHByZXNzIGV2ZW50XG4gIGNvbnN0IGZvcm1GaWVsZHMgPSBhd2FpdCBpbnN0YW5jZS5nZXRGb3JtRmllbGRzKCk7XG5cbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcImFubm90YXRpb25zLmNyZWF0ZVwiLCAoYW5ub3RhdGlvbnMpID0%2BIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnMuZ2V0KDApO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGFubm90YXRpb24uaXNTaWduYXR1cmUgJiYgYW5ub3RhdGlvbjtcblxuICAgIGlmIChzaWduYXR1cmUpIHtcbiAgICAgIHN0b3JlZFNpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbiAgICB9XG4gIH0pO1xuXG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbm5vdGF0aW9ucy5wcmVzc1wiLCAoZXZlbnQpID0%2BIHtcbiAgICBjb25zdCB7YW5ub3RhdGlvbjogd2lkZ2V0fSA9IGV2ZW50XG5cbiAgICAvL0dldHRpbmcgdGhlIGlkIG9mIHRoZSB3aWRnZXQgdG8gc2VlIGlmIGFueSBmb3JtIGZpZWxkIGhhcyBpdFxuICAgIGNvbnN0IHtpZH0gPSB3aWRnZXRcbiAgICAvL0NoZWNraW5nIGlmIHRoZSB3aWRnZXQgaGFzIGEgZm9ybSBmaWVsZCBvZiB0eXBlIFNpZ25hdHVyZVxuICAgIGNvbnN0IGlzV2lkZ2V0U2lnbmF0dXJlID0gZm9ybUZpZWxkcy5zb21lKGZvcm09PntcbiAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIFBTUERGS2l0LkZvcm1GaWVsZHMuU2lnbmF0dXJlRm9ybUZpZWxkICYmIGZvcm0uYW5ub3RhdGlvbklkcy5zb21lKGlkcz0%2BaWRzPT09aWQpKSByZXR1cm4gdHJ1ZVxuICAgICAgICByZXR1cm5cbiAgICAgIH0pXG4gIFxuICAgIGlmKCFzdG9yZWRTaWduYXR1cmUpIHJldHVyblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy9TZXR0aW5nIHRoZSBTaWduYXR1cmUgb25seSBpZiB0aGUgV2lkZ2V0IGhhcyBhIGZvcm0gZmllbGQgb2YgdHlwZSBTaWduYXR1cmVcbiAgICBpc1dpZGdldFNpZ25hdHVyZSAmJiBpbnN0YW5jZS5jcmVhdGUodHJhbnNsYXRlSW5rQW5ub3RhdGlvbihzdG9yZWRTaWduYXR1cmUsIHdpZGdldCkpO1xuICB9KTtcblxuICBmdW5jdGlvbiBvZmZzZXRUcmFuc2xhdGlvbih3aWRnZXQsIHNpZ25hdHVyZSkge1xuICAgIHJldHVybiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUG9pbnQoe1xuICAgICAgeDpcbiAgICAgICAgd2lkZ2V0LmJvdW5kaW5nQm94LmxlZnQgLVxuICAgICAgICBzaWduYXR1cmUuYm91bmRpbmdCb3gubGVmdCArXG4gICAgICAgICh3aWRnZXQuYm91bmRpbmdCb3gud2lkdGggLSBzaWduYXR1cmUuYm91bmRpbmdCb3gud2lkdGgpIC8gMixcbiAgICAgIHk6XG4gICAgICAgIHdpZGdldC5ib3VuZGluZ0JveC50b3AgLVxuICAgICAgICBzaWduYXR1cmUuYm91bmRpbmdCb3gudG9wICtcbiAgICAgICAgKHdpZGdldC5ib3VuZGluZ0JveC5oZWlnaHQgLSBzaWduYXR1cmUuYm91bmRpbmdCb3guaGVpZ2h0KSAvIDIsXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGVJbmtBbm5vdGF0aW9uKGFubm90YXRpb24sIHdpZGdldCkge1xuICAgIGNvbnN0IG9mZnNldCA9IG9mZnNldFRyYW5zbGF0aW9uKHdpZGdldCwgYW5ub3RhdGlvbik7XG4gICAgY29uc3QgbmV3U2l6ZSA9IGZpdEluKFxuICAgICAge1xuICAgICAgICB3aWR0aDogYW5ub3RhdGlvbi5ib3VuZGluZ0JveC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBhbm5vdGF0aW9uLmJvdW5kaW5nQm94LmhlaWdodCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHdpZHRoOiB3aWRnZXQuYm91bmRpbmdCb3gud2lkdGgsXG4gICAgICAgIGhlaWdodDogd2lkZ2V0LmJvdW5kaW5nQm94LmhlaWdodCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgcmVzaXplUmF0aW8gPSBuZXdTaXplLndpZHRoIC8gYW5ub3RhdGlvbi5ib3VuZGluZ0JveC53aWR0aDtcbiAgICBjb25zdCBuZXdMZWZ0ID1cbiAgICAgIHdpZGdldC5ib3VuZGluZ0JveC5sZWZ0ICtcbiAgICAgIHdpZGdldC5ib3VuZGluZ0JveC53aWR0aCAvIDIgLVxuICAgICAgbmV3U2l6ZS53aWR0aCAvIDI7XG4gICAgY29uc3QgbmV3VG9wID1cbiAgICAgIHdpZGdldC5ib3VuZGluZ0JveC50b3AgK1xuICAgICAgd2lkZ2V0LmJvdW5kaW5nQm94LmhlaWdodCAvIDIgLVxuICAgICAgbmV3U2l6ZS5oZWlnaHQgLyAyO1xuXG4gICAgY29uc3QgbmV3Qm91bmRpbmdCb3ggPSBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICBsZWZ0OiBuZXdMZWZ0LFxuICAgICAgdG9wOiBuZXdUb3AsXG4gICAgICB3aWR0aDogbmV3U2l6ZS53aWR0aCxcbiAgICAgIGhlaWdodDogbmV3U2l6ZS5oZWlnaHQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYW5ub3RhdGlvblxuICAgICAgLnNldChcImlkXCIsIG51bGwpXG4gICAgICAuc2V0KFwicGFnZUluZGV4XCIsIHdpZGdldC5wYWdlSW5kZXgpXG4gICAgICAuc2V0KFwiYm91bmRpbmdCb3hcIiwgbmV3Qm91bmRpbmdCb3gpO1xuICB9XG5cbiAgZnVuY3Rpb24gZml0SW4oc2l6ZSwgY29udGFpbmVyU2l6ZSkge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gc2l6ZTtcblxuICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBjb250YWluZXJTaXplLndpZHRoIC8gd2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBjb250YWluZXJTaXplLmhlaWdodCAvIGhlaWdodDtcblxuICAgIGNvbnN0IHJhdGlvID0gTWF0aC5taW4od2lkdGhSYXRpbywgaGVpZ2h0UmF0aW8pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB3aWR0aCAqIHJhdGlvLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQgKiByYXRpbyxcbiAgICB9O1xuICB9XG59KTtcbiJ9) - - Detect signature annotations and allow users to apply them to designated signature fields. — [Video](https://www.youtube.com/watch?v=SiD59eLElKw) - -- [Prevent overlapping signature widgets](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6Ii8vUHJldmVudCBPdmVybGFwcGluZyBTaWduYXR1cmUgV2lkZ2V0c1xuXG5sZXQgZ2xvYmFsSW5zdGFuY2U7XG5sZXQgZXhpc3RpbmdXaWRnZXRzID0gW107IC8vIFRyYWNrIGV4aXN0aW5nIHNpZ25hdHVyZSB3aWRnZXRzXG5cbmNvbnN0IHRvb2xiYXJJdGVtcyA9IFtcbiAgeyB0eXBlOiBcImZvcm0tY3JlYXRvclwiIH0sXG4gIC4uLk51dHJpZW50Vmlld2VyLmRlZmF1bHRUb29sYmFySXRlbXMsXG5dO1xuXG5OdXRyaWVudFZpZXdlci5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBOdXRyaWVudFZpZXdlci5UaGVtZS5EQVJLLFxuICBvbldpZGdldEFubm90YXRpb25DcmVhdGlvblN0YXJ0OiAoYW5ub3RhdGlvbiwgZm9ybUZpZWxkKSA9PiB7XG4gICAgY29uc3QgeyBib3VuZGluZ0JveCB9ID0gYW5ub3RhdGlvbjtcblxuICAgIC8vIENoZWNrIGlmIHRoaXMgd2lkZ2V0IHdvdWxkIG92ZXJsYXAgd2l0aCBhbnkgZXhpc3Rpbmcgc2lnbmF0dXJlIHdpZGdldHNcbiAgICBjb25zdCBoYXNPdmVybGFwID0gZXhpc3RpbmdXaWRnZXRzLnNvbWUoKGV4aXN0aW5nV2lkZ2V0KSA9PlxuICAgICAgYm91bmRpbmdCb3guaXNSZWN0T3ZlcmxhcHBpbmcoZXhpc3RpbmdXaWRnZXQuYm91bmRpbmdCb3gpXG4gICAgKTtcblxuICAgIGlmIChoYXNPdmVybGFwKSB7XG4gICAgICBhbGVydChcIkNhbm5vdCBjcmVhdGUgb3ZlcmxhcHBpbmcgc2lnbmF0dXJlIHdpZGdldHNcIik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBvdmVybGFwLCBzdG9yZSB0aGlzIHdpZGdldCBhbmQgYWxsb3cgY3JlYXRpb25cbiAgICBleGlzdGluZ1dpZGdldHMucHVzaCh7IGJvdW5kaW5nQm94LCBmb3JtRmllbGQgfSk7XG4gICAgcmV0dXJuIHsgYW5ub3RhdGlvbiwgZm9ybUZpZWxkIH07XG4gIH0sXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICBnbG9iYWxJbnN0YW5jZSA9IGluc3RhbmNlO1xuICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXModG9vbGJhckl0ZW1zKTtcbiAgY29uc29sZS5sb2coXCJQU1BERktpdCBsb2FkZWQhXCIpO1xufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIn0%253D) - - Intercepts widget creation and checks the new widget’s bounding box against existing signature widgets. If an overlap is detected, it shows an alert and cancels creation; otherwise, it records the widget and continues. - -- [Display a “Sign Here" widget that guides users to the next signature field](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/signing/sign-here-upgraded) - - Manage a signing widget in a PDF document, guiding users to the next available signature field and hiding the widget once all required signatures are completed. — [Video](https://www.youtube.com/watch?v=DkxInhZoatI) - -- [Customize the size of signature annotations](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tRXhaUFJxQTVFQSIsImxheWVyIjoicmFuZG9tNFY2T1cyT0syTyJ9fSwianMiOiJsZXQgc2NhbGluZ0ZhY3RvclR5cGVTaWduYXR1cmU9LjIsc2NhbGluZ0ZhY3RvckRyYXdTaWduYXR1cmU9LjI7UFNQREZLaXQubG9hZCh7Li4uYmFzZU9wdGlvbnMsdGhlbWU6UFNQREZLaXQuVGhlbWUuREFSS30pLnRoZW4oKGluc3RhbmNlPT57aW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignYW5ub3RhdGlvbnMuY3JlYXRlJywoYXN5bmMgY3JlYXRlZEFubm90YXRpb25zPT57XG4vLyBSZXNpemUgdHlwZSBzaWduYXR1cmUgYW5ub3RhdGlvbnNcbmxldCB0eXBlU2lnbmF0dXJlPWNyZWF0ZWRBbm5vdGF0aW9ucy5maWx0ZXIoKGFubm90YXRpb249PmFubm90YXRpb24gaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5JbWFnZUFubm90YXRpb24pKTtpZih0eXBlU2lnbmF0dXJlLl90YWlsKXtjb25zdCB0eXBlU2lnbmF0dXJlRmxhdD10eXBlU2lnbmF0dXJlLl90YWlsLmFycmF5WzBdO2lmKHR5cGVTaWduYXR1cmVGbGF0LmlzU2lnbmF0dXJlKXtjb25zdCBib3VuZGluZ0JveD10eXBlU2lnbmF0dXJlRmxhdC5ib3VuZGluZ0JveCxuZXdXaWR0aD1zY2FsaW5nRmFjdG9yVHlwZVNpZ25hdHVyZSpib3VuZGluZ0JveC53aWR0aCxuZXdIZWlnaHQ9c2NhbGluZ0ZhY3RvclR5cGVTaWduYXR1cmUqYm91bmRpbmdCb3guaGVpZ2h0LG5ld0xlZnQ9Ym91bmRpbmdCb3gubGVmdCsoYm91bmRpbmdCb3gud2lkdGgtbmV3V2lkdGgpLzIsbmV3VG9wPWJvdW5kaW5nQm94LnRvcCsoYm91bmRpbmdCb3guaGVpZ2h0LW5ld0hlaWdodCkvMixuZXdCb3VuZGluZ0JveD1uZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7bGVmdDpuZXdMZWZ0LHRvcDpuZXdUb3Asd2lkdGg6bmV3V2lkdGgsaGVpZ2h0Om5ld0hlaWdodH0pLG5ld0Fubm90YXRpb249dHlwZVNpZ25hdHVyZUZsYXQuc2V0KCdib3VuZGluZ0JveCcsbmV3Qm91bmRpbmdCb3gpO2F3YWl0IGluc3RhbmNlLnVwZGF0ZShuZXdBbm5vdGF0aW9uKX19XG4vLyBSZXNpemUgZHJhdyBzaWduYXR1cmUgYW5ub3RhdGlvbnNcbmVsc2UgY3JlYXRlZEFubm90YXRpb25zLmZpbHRlcigoYW5ub3RhdGlvbj0%252BYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBTUERGS2l0LkFubm90YXRpb25zLklua0Fubm90YXRpb24pKSxjcmVhdGVkQW5ub3RhdGlvbnM9Y3JlYXRlZEFubm90YXRpb25zLm1hcCgoYW5ub3RhdGlvbj0%252BYW5ub3RhdGlvbi51cGRhdGUoJ2JvdW5kaW5nQm94JywoYm91bmRpbmdCb3g9PmJvdW5kaW5nQm94LnNjYWxlKHNjYWxpbmdGYWN0b3JEcmF3U2lnbmF0dXJlKS5tZXJnZSh7bGVmdDpib3VuZGluZ0JveC5sZWZ0K2JvdW5kaW5nQm94LndpZHRoLzQsdG9wOmJvdW5kaW5nQm94LnRvcCtib3VuZGluZ0JveC5oZWlnaHQvNH0pKSkudXBkYXRlKCdsaW5lcycsKGxpbmVzPT5saW5lcy5tYXAoKGxpbmU9PmxpbmUubWFwKChwb2ludD0%252BcG9pbnQudHJhbnNsYXRlKHt4Oi1hbm5vdGF0aW9uLmJvdW5kaW5nQm94LmxlZnQseTotYW5ub3RhdGlvbi5ib3VuZGluZ0JveC50b3B9KS5zY2FsZSguMikudHJhbnNsYXRlKHt4OmFubm90YXRpb24uYm91bmRpbmdCb3gubGVmdCthbm5vdGF0aW9uLmJvdW5kaW5nQm94LndpZHRoLzQseTphbm5vdGF0aW9uLmJvdW5kaW5nQm94LnRvcCthbm5vdGF0aW9uLmJvdW5kaW5nQm94LmhlaWdodC80fSkpKSkpKSkpKSxhd2FpdCBpbnN0YW5jZS51cGRhdGUoY3JlYXRlZEFubm90YXRpb25zKX0pKX0pKTsifQ%253D%253D) - - Listen for the creation of signature annotations and resize and reposition them based on specific scaling factors. — [Video](https://www.youtube.com/watch?v=wrTeL1ZRyS4) - -- [Get the last signed signature field](https://nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9uc30pLnRoZW4oKGFzeW5jIGluc3RhbmNlPT57bGV0IGxhc3RGb3JtRmllbGRDbGlja2VkO2luc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLnByZXNzJywoZXZlbnQ9PntsYXN0Rm9ybUZpZWxkQ2xpY2tlZD1ldmVudC5hbm5vdGF0aW9ufSkpLGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLmNyZWF0ZScsKGNyZWF0ZWRBbm5vdGF0aW9ucz0%252Beyhhc3luYyBjcmVhdGVkQW5ub3RhdGlvbnM9PntsZXQgY3JlYXRlZEFubm90YXRpb25zRmxhdD1jcmVhdGVkQW5ub3RhdGlvbnMudG9BcnJheSgpWzBdO2NvbnNvbGUubG9nKCd0aGlzIGlzIHRoZSBzaWduYXR1cmUgYW5ub3RhdGlvbicpLGNvbnNvbGUubG9nKGNyZWF0ZWRBbm5vdGF0aW9uc0ZsYXQpLGNyZWF0ZWRBbm5vdGF0aW9uc0ZsYXQuaXNTaWduYXR1cmUmJmxhc3RGb3JtRmllbGRDbGlja2VkJiYoY29uc29sZS5sb2coJ3RoaXMgaXMgdGhlIGZpZWxkIHRoYXQgd2FzIHNpZ25lZCcpLGNvbnNvbGUubG9nKGxhc3RGb3JtRmllbGRDbGlja2VkKSxsYXN0Rm9ybUZpZWxkQ2xpY2tlZD1udWxsKX0pKGNyZWF0ZWRBbm5vdGF0aW9ucyl9KSl9KSk7Iiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJmb3JtLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tS044eHVKaWhnbyIsImxheWVyIjoicmFuZG9teDJXSWtzVFA5cyJ9fSwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - - Listen for the creation of signature annotations and track which form field was last clicked before they were created. — [Video](https://www.youtube.com/watch?v=NeIfQtK-Sg8) - -- [Implement a multi-signer PDF signing app in Next.js](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/signing/signing-demo-complete) - - Implement a signing app that allows multiple signers to sign PDFs using electronic signatures and customize signing fields, and that supports digital signatures for verifying document integrity. — [Video](https://www.youtube.com/watch?v=l749tKkP1Ak) - -- [Implement multi-party signing in Vanilla JS](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/document-generator-vanillajs) - - Implement a signing app that allows different users to sign specific fields in a PDF. — [Video](https://www.youtube.com/watch?v=1UmR6Zo8Ql4) - -- [Navigate signature fields smoothly](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmJsb2Ige1xuICBiYWNrZ3JvdW5kOiBibGFjaztcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuXG4gIGJveC1zaGFkb3c6IDAgMCAwIDAgcmdiYSgwLCAwLCAwLCAxKTtcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgYW5pbWF0aW9uOiBwdWxzZSAycyBpbmZpbml0ZTtcbn1cblxuQGtleWZyYW1lcyBwdWxzZSB7XG4gIDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpO1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDAgcmdiYSgwLCAwLCAwLCAwLjcpO1xuICB9XG5cbiAgNzAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDEwcHggcmdiYSgwLCAwLCAwLCAwKTtcbiAgfVxuXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSk7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMCByZ2JhKDAsIDAsIDAsIDApO1xuICB9XG59XG4iLCJqcyI6ImxldCBnbG9iYWxJbnN0YW5jZTtcbi8vVG8gaXRlcmF0ZSB0aHJvdWdoIGZvcm1zXG5mdW5jdGlvbiBmb3JtRWxlbWVudHNJdGVyYXRvcihpbmRleCxyZWN0KXtcbi8vZ2xvYmFsSW5zdGFuY2UuanVtcFRvUmVjdChpbmRleCwgcmVjdCk7XG5jb25zdCBwYWdlPWdsb2JhbEluc3RhbmNlLmNvbnRlbnREb2N1bWVudC5nZXRSb290Tm9kZSgpLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXBhZ2UtaW5kZXg9XCIke2luZGV4fVwiXWApLGFycm93PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTthcnJvdy5jbGFzc0xpc3QuYWRkKCdibG9iJyksYXJyb3cuc3R5bGUuY3NzVGV4dCs9J2JhY2tncm91bmQ6IHVybChodHRwczovL3BzcGRma2l0LmNvbS9hc3NldHMvaW1hZ2VzL2ljb25zL2Fycm93UmlnaHRMaWdodEJnLWVkYWYyNmI3LnN2ZykgNTAlIG5vLXJlcGVhdDtcXG4gICAgY29udGVudDogXCJcIjtcXG4gICAgaGVpZ2h0OiAxLjJlbTtcXG4gICAgbGVmdDogLTJyZW07XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICB3aWR0aDogMXJlbTsnO2NvbnN0IGl0ZW09bmV3IFBTUERGS2l0LkN1c3RvbU92ZXJsYXlJdGVtKHtpZDonYXJyb3cnLG5vZGU6YXJyb3cscGFnZUluZGV4OmluZGV4LHBvc2l0aW9uOm5ldyBQU1BERktpdC5HZW9tZXRyeS5Qb2ludCh7eDpyZWN0LmxlZnQrMTUseTpyZWN0LnRvcH0pLG9uQXBwZWFyKCl7XG4vLyBjb25zb2xlLmxvZyhcInJlbmRlcmVkIVwiKTtcbn19KTtnbG9iYWxJbnN0YW5jZS5zZXRDdXN0b21PdmVybGF5SXRlbShpdGVtKSx3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0%252Be3BhZ2Uuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOidlbmQnLGlubGluZTonbmVhcmVzdCcsYmVoYXZpb3I6J3Ntb290aCd9KX0pKX1sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZm9ybS1jb3VudGVyJywnMCcpLFBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkssaXNFZGl0YWJsZUFubm90YXRpb246YW5ub3RhdGlvbj0%252BJ1NpZ25lcjEnPT1hbm5vdGF0aW9uPy5jdXN0b21EYXRhPy5yb2xlXG4vLyBpbml0aWFsVmlld1N0YXRlOiBuZXcgUFNQREZLaXQuVmlld1N0YXRlKHsgem9vbTogMiB9KSxcbn0pLnRoZW4oKGFzeW5jIGluc3RhbmNlPT57aW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGU9PnZpZXdTdGF0ZS5zZXQoJ3ByZXJlbmRlcmVkUGFnZVNwcmVhZHMnLG51bGwpKSksZ2xvYmFsSW5zdGFuY2U9aW5zdGFuY2U7XG4vLyA8IS0tIElHTk9SRSAtLT5cbi8vVXBkYXRpbmcgc29tZSBmaWVsZHMgdG8gZml0IHRoZSBzYW1wbGUgcHVycG9zZVxuY29uc3QgY2hhbmdlcz0oYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7bGVuZ3RoOmluc3RhbmNlLnRvdGFsUGFnZUNvdW50fSkubWFwKCgoXyxwYWdlSW5kZXgpPT5pbnN0YW5jZS5nZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgpKSkpKS5mbGF0TWFwKChhbm5vdGF0aW9ucz0%252BYW5ub3RhdGlvbnMucmVkdWNlKCgoYWNjLGFubm90YXRpb24pPT5hbm5vdGF0aW9uLmlkLm1hdGNoKC9eMTc2JHxeNTckL2cpP2FjYy5jb25jYXQoYW5ub3RhdGlvbi5zZXQoJ2N1c3RvbURhdGEnLHtyb2xlOidTaWduZXIxJ30pKTphY2MpLFtdKSkpO2F3YWl0IGluc3RhbmNlLnVwZGF0ZShjaGFuZ2VzKTtcbi8vIDwtLSBJR05PUkUgIS0tPlxuY29uc3QgcGFnZUFubm90YXRpb25zPShhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHtsZW5ndGg6aW5zdGFuY2UudG90YWxQYWdlQ291bnR9KS5tYXAoKChfLHBhZ2VJbmRleCk9Pmluc3RhbmNlLmdldEFubm90YXRpb25zKHBhZ2VJbmRleCkpKSkpLmZsYXRNYXAoKGFubm90YXRpb25zPT5hbm5vdGF0aW9ucy5yZWR1Y2UoKChhY2MsYW5ub3RhdGlvbik9PmFubm90YXRpb24%252FLmN1c3RvbURhdGE%252FLnJvbGUuaW5jbHVkZXMoJ1NpZ25lcjEnKT9hY2MuY29uY2F0KGFubm90YXRpb24pOmFjYyksW10pKSk7c2V0VGltZW91dCgoKCk9PntwYWdlQW5ub3RhdGlvbnMubGVuZ3RoPjAmJmZvcm1FbGVtZW50c0l0ZXJhdG9yKHBhZ2VBbm5vdGF0aW9uc1swXS5wYWdlSW5kZXgscGFnZUFubm90YXRpb25zWzBdLmJvdW5kaW5nQm94KX0pLDFlMyksXG4vL3NlbGVjdGluZyB0aGUgbmV4dCBmb3JtIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCBzaWduZXJcbmluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLndpbGxDaGFuZ2UnLChhc3luYyBldmVudD0%252Be2NvbnN0e2Fubm90YXRpb25zOmFubm90YXRpb25zLHJlYXNvbjpyZWFzb259PWV2ZW50O2xldCBjb3VudGVyPXBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmb3JtLWNvdW50ZXInKSk7YW5ub3RhdGlvbnMuZ2V0KDApLmlzU2lnbmF0dXJlJiYnU0VMRUNUX0VORCc9PT1yZWFzb24mJihpbnN0YW5jZS5yZW1vdmVDdXN0b21PdmVybGF5SXRlbSgnYXJyb3cnKSxjb3VudGVyKz0xLGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdmb3JtLWNvdW50ZXInLGNvdW50ZXIudG9TdHJpbmcoKSksY291bnRlcjxwYWdlQW5ub3RhdGlvbnMubGVuZ3RoJiZzZXRUaW1lb3V0KCgoKT0%252Be2Zvcm1FbGVtZW50c0l0ZXJhdG9yKHBhZ2VBbm5vdGF0aW9uc1tjb3VudGVyXS5wYWdlSW5kZXgscGFnZUFubm90YXRpb25zW2NvdW50ZXJdLmJvdW5kaW5nQm94KX0pLDFlMykpfSkpfSkpOyIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - - Create a document signing workflow that highlights form elements with an arrow overlay to guide users through the signing process. — [Video](https://www.youtube.com/watch?v=r3HZD6mvU6I) - -- [Automatically add timestamp after eSignature](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJsZXQgc2lnbmF0dXJlV2lkZ2V0SWQgPSBudWxsOyAvLyBTdG9yZSB0aGUgd2lkZ2V0IElEIGZvciBkZWxldGlvblxubGV0IHNpZ25hdHVyZUZpZWxkTmFtZSA9IFwiU2lnMVwiOyAvLyBTaWduYXR1cmUgZmllbGQgbmFtZVxubGV0IGxlZnQxID0gMzgwLFxuICB0b3AyID0gMTUwLFxuICB3aWR0aDMgPSAxODAsXG4gIGhlaWdodDQgPSAzMDtcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIGlzRWRpdGFibGVBbm5vdGF0aW9uOiBmdW5jdGlvbiAoYW5ub3RhdGlvbikge1xuICAgIHJldHVybiAhYW5ub3RhdGlvbi5pc1NpZ25hdHVyZTsgLy8gUHJldmVudHMgZWRpdGluZyBzaWduYXR1cmVzXG4gIH0sXG4gIGVsZWN0cm9uaWNTaWduYXR1cmVzOiB7XG4gICAgLy9jcmVhdGlvbk1vZGVzOiBbUFNQREZLaXQuRWxlY3Ryb25pY1NpZ25hdHVyZUNyZWF0aW9uTW9kZS5EUkFXXSxcbiAgICAvL2NyZWF0aW9uTW9kZXM6IFtQU1BERktpdC5FbGVjdHJvbmljU2lnbmF0dXJlQ3JlYXRpb25Nb2RlLlRZUEVdLFxuICAgIC8vY3JlYXRpb25Nb2RlczogW1BTUERGS2l0LkVsZWN0cm9uaWNTaWduYXR1cmVDcmVhdGlvbk1vZGUuSU1BR0VdLFxuICAgIC8vZm9udHM6IFtuZXcgUFNQREZLaXQuRm9udChcIkFFUklBTFwiKV1cbiAgfSxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiTnV0cmllbnQgbG9hZGVkISAtIGJ5IE5hcmFzaGltYW5cIik7XG5cbiAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGFubm90YXRpb24gZm9yIHRoZSBzaWduYXR1cmVcbiAgY29uc3Qgd2lkZ2V0ID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLldpZGdldEFubm90YXRpb24oe1xuICAgIHBhZ2VJbmRleDogMCxcbiAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgbGVmdDogbGVmdDEsXG4gICAgICB0b3A6IHRvcDIsXG4gICAgICB3aWR0aDogd2lkdGgzLCAvLyBGaXhlZCB3aWR0aFxuICAgICAgaGVpZ2h0OiBoZWlnaHQ0LCAvLyBGaXhlZCBoZWlnaHRcbiAgICB9KSxcbiAgICBvcGFjaXR5OiAwLjUsIC8vIE1ha2UgaXQgc2xpZ2h0bHkgdHJhbnNwYXJlbnRcbiAgICBmb3JtRmllbGROYW1lOiBzaWduYXR1cmVGaWVsZE5hbWUsXG4gICAgaWQ6IFBTUERGS2l0LmdlbmVyYXRlSW5zdGFudElkKCksXG4gIH0pO1xuXG4gIC8vIFN0b3JlIHRoZSB3aWRnZXQgSUQgZm9yIGxhdGVyIGRlbGV0aW9uXG4gIHNpZ25hdHVyZVdpZGdldElkID0gd2lkZ2V0LmlkO1xuXG4gIC8vIENyZWF0ZSB0aGUgc2lnbmF0dXJlIGZvcm0gZmllbGRcbiAgY29uc3QgZm9ybUZpZWxkID0gbmV3IFBTUERGS2l0LkZvcm1GaWVsZHMuU2lnbmF0dXJlRm9ybUZpZWxkKHtcbiAgICBuYW1lOiBzaWduYXR1cmVGaWVsZE5hbWUsXG4gICAgYW5ub3RhdGlvbklkczogUFNQREZLaXQuSW1tdXRhYmxlLkxpc3QoW3dpZGdldC5pZF0pLFxuICB9KTtcbiAgYXdhaXQgaW5zdGFuY2UuY3JlYXRlKFt3aWRnZXQsIGZvcm1GaWVsZF0pO1xuICBjb25zb2xlLmxvZyhcIlNpZ25hdHVyZSB3aWRnZXQgYW5ub3RhdGlvbiBhZGRlZC5cIik7XG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJpbmtTaWduYXR1cmVzLmNyZWF0ZVwiLCBhc3luYyAoYW5ub3RhdGlvbikgPT4ge1xuICAgIGF3YWl0IGluc3RhbmNlLmRlbGV0ZShzaWduYXR1cmVXaWRnZXRJZCk7XG4gICAgaWYgKFxuICAgICAgLy9jcmVhdGlvbk1vZGVzOiBbUFNQREZLaXQuRWxlY3Ryb25pY1NpZ25hdHVyZUNyZWF0aW9uTW9kZS5EUkFXXVxuICAgICAgYW5ub3RhdGlvbi5jb250ZW50VHlwZSA9PT0gbnVsbCB8fFxuICAgICAgYW5ub3RhdGlvbi5jb250ZW50VHlwZSA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBsZWZ0MSA9IGxlZnQxICsgMTA7XG4gICAgICB0b3AyID0gdG9wMiAtIDEyO1xuICAgICAgd2lkdGgzID0gd2lkdGgzIC0gNTA7XG4gICAgICBoZWlnaHQ0ID0gaGVpZ2h0NCArIDI1O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAvL2NyZWF0aW9uTW9kZXM6IFtQU1BERktpdC5FbGVjdHJvbmljU2lnbmF0dXJlQ3JlYXRpb25Nb2RlLlRZUEVdXG4gICAgICBhbm5vdGF0aW9uLmNvbnRlbnRUeXBlID09PSBcImltYWdlL3BuZ1wiICYmXG4gICAgICBhbm5vdGF0aW9uLmZpbGVOYW1lID09PSBudWxsXG4gICAgKSB7XG4gICAgICBsZWZ0MSA9IGxlZnQxIC0gMzA7XG4gICAgICB0b3AyID0gdG9wMiAtIDEyO1xuICAgICAgd2lkdGgzID0gd2lkdGgzICsgMjAwO1xuICAgICAgaGVpZ2h0NCA9IGhlaWdodDQgKyAyNTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgLy9jcmVhdGlvbk1vZGVzOiBbUFNQREZLaXQuRWxlY3Ryb25pY1NpZ25hdHVyZUNyZWF0aW9uTW9kZS5JTUFHRV0sXG4gICAgICAoYW5ub3RhdGlvbi5jb250ZW50VHlwZSA9PT0gXCJpbWFnZS9wbmdcIiB8fFxuICAgICAgICBhbm5vdGF0aW9uLmNvbnRlbnRUeXBlID09PSBcImltYWdlL2pwZWdcIikgJiZcbiAgICAgIGFubm90YXRpb24uZmlsZU5hbWUgIT0gbnVsbFxuICAgICkge1xuICAgICAgbGVmdDEgPSBsZWZ0MSArIDEwO1xuICAgICAgdG9wMiA9IHRvcDIgLSAxMjtcbiAgICAgIHdpZHRoMyA9IHdpZHRoMyAtIDUwO1xuICAgICAgaGVpZ2h0NCA9IGhlaWdodDQgKyAyNTtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGluZ0JveCA9IGFubm90YXRpb24uYm91bmRpbmdCb3g7XG4gICAgY29uc29sZS5sb2coXCJCb3VuZGluZyBCb3g6XCIsIGJvdW5kaW5nQm94KTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBCb3VuZGluZyBCb3ggLSBMZWZ0OiAke2xlZnQxfSwgVG9wOiAke3RvcDJ9LCBXaWR0aDogJHt3aWR0aDN9LCBIZWlnaHQ6ICR7aGVpZ2h0NH1gXG4gICAgKTtcblxuICAgIGNvbnN0IExvZ2dlZGludXNlciA9IFwiTnV0cmllbnRcIjtcbiAgICBjb25zdCBzaWduZWRCeSA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5UZXh0QW5ub3RhdGlvbih7XG4gICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICB0ZXh0OiB7XG4gICAgICAgIGZvcm1hdDogXCJwbGFpblwiLFxuICAgICAgICB2YWx1ZTogYHBvd2VyZWQgYnkgYCArIExvZ2dlZGludXNlcixcbiAgICAgIH0sXG4gICAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgICBsZWZ0OiBsZWZ0MSArIDMwLFxuICAgICAgICB0b3A6IHRvcDIgLSA1LFxuICAgICAgICB3aWR0aDogd2lkdGgzICsgMTAwLFxuICAgICAgICBoZWlnaHQ6IDEzLFxuICAgICAgfSksXG4gICAgICBmb250OiBcIlZlcmRhbmFcIixcbiAgICAgIGZvbnRTaXplOiA5LFxuICAgICAgZm9udENvbG9yOiBQU1BERktpdC5Db2xvci5CTFVFLFxuICAgICAgaG9yaXpvbnRhbEFsaWduOiBcImxlZnRcIixcbiAgICAgIC8vcmVhZE9ubHk6IHRydWUsXG4gICAgICBsb2NrZWQ6IHRydWUsXG4gICAgICBsb2NrZWRDb250ZW50czogdHJ1ZSxcbiAgICAgIG5vdGU6IFwiQXV0aGVudGljYXRlZCB1c2VyXCIsXG4gICAgICBpc0ZpdHRpbmc6IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IHNpZ25lZGJ5QW5ubyA9IGluc3RhbmNlLmNyZWF0ZShzaWduZWRCeSk7XG5cbiAgICB2YXIgY3VycmVudGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHZhciBvcHRpb25zID0geyBkYXk6IFwiMi1kaWdpdFwiLCBtb250aDogXCJzaG9ydFwiLCB5ZWFyOiBcIm51bWVyaWNcIiB9O1xuICAgIHZhciBmb3JtYXR0ZWREYXRlID0gY3VycmVudGRhdGVcbiAgICAgIC50b0xvY2FsZURhdGVTdHJpbmcoXCJlbi1HQlwiLCBvcHRpb25zKVxuICAgICAgLnJlcGxhY2UoXCIsXCIsIFwiXCIpOyAvLyBFeGFtcGxlOiBcIjA0IERlYyAyMDI0XCJcbiAgICB2YXIgdGltZU9wdGlvbnMgPSB7XG4gICAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICAgIG1pbnV0ZTogXCIyLWRpZ2l0XCIsXG4gICAgICBzZWNvbmQ6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICB9O1xuICAgIHZhciBmb3JtYXR0ZWRUaW1lID0gY3VycmVudGRhdGUudG9Mb2NhbGVUaW1lU3RyaW5nKFwiZW4tR0JcIiwgdGltZU9wdGlvbnMpOyAvLyBFeGFtcGxlOiBcIjEzOjQ1OjMwXCJcbiAgICB2YXIgZGF0ZXRpbWUgPSBmb3JtYXR0ZWREYXRlICsgXCIgVGltZTogXCIgKyBmb3JtYXR0ZWRUaW1lO1xuICAgIGNvbnN0IHNpZ25lZEF0ID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLlRleHRBbm5vdGF0aW9uKHtcbiAgICAgIHBhZ2VJbmRleDogMCxcbiAgICAgIHRleHQ6IHtcbiAgICAgICAgZm9ybWF0OiBcInBsYWluXCIsXG4gICAgICAgIHZhbHVlOiBgU2lnbmVkIEAgYCArIGRhdGV0aW1lLFxuICAgICAgfSxcbiAgICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICAgIGxlZnQ6IGxlZnQxICsgMzAsXG4gICAgICAgIHRvcDogdG9wMiArIDUwLFxuICAgICAgICB3aWR0aDogd2lkdGgzICsgMTAwLFxuICAgICAgICBoZWlnaHQ6IDEzLFxuICAgICAgfSksXG4gICAgICBmb250OiBcIlZlcmRhbmFcIixcbiAgICAgIGZvbnRTaXplOiA5LFxuICAgICAgZm9udENvbG9yOiBQU1BERktpdC5Db2xvci5CTFVFLFxuICAgICAgaG9yaXpvbnRhbEFsaWduOiBcImxlZnRcIixcbiAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IHNpZ25UaW1lQW5ubyA9IGluc3RhbmNlLmNyZWF0ZShzaWduZWRBdCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBcIkxlZnQ6IFwiLFxuICAgICAgbGVmdDEsXG4gICAgICBcIlRvcDogXCIsXG4gICAgICB0b3AyLFxuICAgICAgXCJ3aWR0aDogXCIsXG4gICAgICB3aWR0aDMsXG4gICAgICBcImhlaWdodDogXCIsXG4gICAgICBoZWlnaHQ0XG4gICAgKTtcbiAgICBjb25zdCBsaW5lQW5ubyA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5MaW5lQW5ub3RhdGlvbih7XG4gICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICBzdGFydFBvaW50OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUG9pbnQoeyB4OiBsZWZ0MSArIDIwLCB5OiB0b3AyIC0gMiB9KSxcbiAgICAgIGVuZFBvaW50OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUG9pbnQoe1xuICAgICAgICB4OiBsZWZ0MSArIDIwLFxuICAgICAgICB5OiB0b3AyICsgaGVpZ2h0NCArIDUsXG4gICAgICB9KSxcbiAgICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICAgIGxlZnQ6IGxlZnQxLFxuICAgICAgICB0b3A6IHRvcDIsXG4gICAgICAgIHdpZHRoOiAyMCxcbiAgICAgICAgaGVpZ2h0OiA2MCxcbiAgICAgIH0pLFxuICAgICAgbG9ja2VkOiB0cnVlLFxuICAgICAgbG9ja2VkQ29udGVudHM6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgbGluZURyYXduQW5ubyA9IGluc3RhbmNlLmNyZWF0ZShsaW5lQW5ubyk7XG4gIH0pO1xufSk7XG4ifQ%253D%253D) - -- [Restrict signature widget to page bounds](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6Ii8vIFJlc3RyaWN0IFNpZ25hdHVyZSBXaWRnZXQgdG8gUGFnZSBCb3VuZHNcbmxldCBnbG9iYWxJbnN0YW5jZTtcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIHRvb2xiYXJJdGVtczogW3sgdHlwZTogXCJmb3JtLWNyZWF0b3JcIiB9XSxcbiAgb25XaWRnZXRBbm5vdGF0aW9uQ3JlYXRpb25TdGFydDogKGFubm90YXRpb24sIGZvcm1GaWVsZCkgPT4ge1xuICAgIGNvbnN0IHsgYm91bmRpbmdCb3g6IGJvdW5kaW5nQm94LCBwYWdlSW5kZXg6IHBhZ2VJbmRleCB9ID0gYW5ub3RhdGlvbixcbiAgICAgIHsgaGVpZ2h0OiBoZWlnaHQsIHdpZHRoOiB3aWR0aCB9ID1cbiAgICAgICAgZ2xvYmFsSW5zdGFuY2UucGFnZUluZm9Gb3JJbmRleChwYWdlSW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIH0pLmlzUmVjdEluc2lkZShib3VuZGluZ0JveCkgfHwgYWxlcnQoXCJDYW5ub3QgY3JlYXRlIFNpZ25hdHVyZVwiKSxcbiAgICAgIG51bGxcbiAgICApO1xuICB9LFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgKGdsb2JhbEluc3RhbmNlID0gaW5zdGFuY2UpLFxuICAgIGNvbnNvbGUubG9nKFwiUFNQREZLaXQgbG9hZGVkIVwiKSxcbiAgICBjb25zb2xlLmxvZyhcIkFQSSBkb2NzOiBodHRwczovL3BzcGRma2l0LmNvbS9hcGkvd2ViL1wiKSxcbiAgICBjb25zb2xlLmxvZyhcIkd1aWRlczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vZ3VpZGVzL3dlYi9cIik7XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4uUFNQREZLaXQtQW5ub3RhdGlvbi1GbGFncy1Qb3BvdmVyIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgY3Vyc29yOiBub25lO1xufVxuXG4uVGh1bWJuYWlsLUlzLVJlYWQge1xuICBjb250ZW50OiB1cmwoL2Fzc2V0cy9pbWFnZXMvaWNvbnMvbW9uby9jaGVja21hcmstYzQyYjBkNTIuc3ZnKTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICByaWdodDogMjIlO1xuICB0b3A6IDExJTtcbiAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xufVxuLlBTUERGS2l0LVNpZGViYXItVGh1bWJuYWlscy1QYWdlLVNlbGVjdGVkXG4gIC5QU1BERktpdC1TaWRlYmFyLVRodW1ibmFpbHMtUGFnZS1JbWFnZSB7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDRweCBsYXZlbmRlcjtcbn1cblxuLlBTUERGS2l0LVNpZGViYXItVGh1bWJuYWlscy1QYWdlLVNlbGVjdGVkXG4gIC5QU1BERktpdC1TaWRlYmFyLVRodW1ibmFpbHMtUGFnZS1MYWJlbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IGxhdmVuZGVyO1xufVxuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - - On widget creation, this should compare the widget’s bounding box to the full page rectangle and block placement if any part falls outside the page. It shows an alert and cancels creation when invalid. - -#### Forms - -- [Add a user role dropdown to signature form fields](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJsZXQgaW5zdGFuY2U7UFNQREZLaXQubG9hZCh7Li4uYmFzZU9wdGlvbnMsdGhlbWU6UFNQREZLaXQuVGhlbWUuREFSSyx0b29sYmFySXRlbXM6Wy4uLlBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMse3R5cGU6J2Zvcm0tY3JlYXRvcid9XX0pLnRoZW4oKGk9PntpbnN0YW5jZT1pO1xuLy9UaGlzIGlzIHRoZSBVc2VyIFJvbGUgU2VsZWN0IEVsZW1lbnRcbmxldCBodG1sPSc8ZGl2IGNsYXNzPVwiUFNQREZLaXQtNzFoNjVhc3g5azg1bWRuczRuOGoya3QzYWdcIj48ZGl2PjxkaXYgY2xhc3M9XCJQU1BERktpdC00cTZyZjQ3cmhxaHJwbTlnZGZlZnh0N3F4YVwiPjxsYWJlbCBjbGFzcz1cIlBTUERGS2l0LW50MTJhZHR0YnliNTJhd3NnajJwdnVjeHlcIj5Bc3NpZ24gVG8gVXNlcjogPHNlbGVjdCBpZD1cInVzZXJSb2xlc1wiIGNsYXNzPVwiUFNQREZLaXQtMzhjanB2eHNhZHVwbTI1aDJxeXhhN241Z2QgUFNQREZLaXQtM3lqdTJ1Mjc3ODM0Y3kzZ2FocjJyNXB4d2EgUFNQREZLaXQtRm9ybS1DcmVhdG9yLUVkaXRvci1Gb3JtLUZpZWxkLU5hbWVcIj48b3B0aW9uIHZhbHVlPVwibm9uZVwiIHNlbGVjdGVkIGRpc2FibGVkIGhpZGRlbj5zZWxlY3Qgcm9sZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJMYW5kbG9yZFwiPkxhbmRsb3JkPC9vcHRpb24%252BPG9wdGlvbiB2YWx1ZT1cIlRlbmFudFwiPlRlbmFudDwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw%252BPC9kaXY%252BPC9kaXY%252BPC9kaXY%252BJztcbi8vRXZlbnQgbGlzdGVuZXIgdG8gY2hlY2sgd2hlaHRlciB0aGUgY2xpY2tlZCBhbm5vdGF0aW9uIGlzIGEgU2lnbmF0dXJlIFdpZGdldFxuaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignYW5ub3RhdGlvbnMucHJlc3MnLChhc3luYyBldmVudD0%252Be2NvbnN0e2Fubm90YXRpb246YW5ub3RhdGlvbn09ZXZlbnQsdXNlclJvbGU9YW5ub3RhdGlvbi5jdXN0b21EYXRhPy51c2VyUm9sZSxmb3JtRmllbGRzPWF3YWl0IGluc3RhbmNlLmdldEZvcm1GaWVsZHMoKSxmb3JtRmllbGQ9Zm9ybUZpZWxkcy5nZXQoZm9ybUZpZWxkcy5tYXAoKGU9PmUubmFtZSkpLmluZGV4T2YoYW5ub3RhdGlvbi5mb3JtRmllbGROYW1lKSk7XG4vL0lmIGl0J3MgYSBzaWduYXR1cmUgd2lkZ2V0IEkgYWN0aXZhdGUgdGhlIEZvcm0gQ3JlYXRvciBNb2RlXG5pZihhbm5vdGF0aW9uJiZmb3JtRmllbGQgaW5zdGFuY2VvZiBQU1BERktpdC5Gb3JtRmllbGRzLlNpZ25hdHVyZUZvcm1GaWVsZCl7aW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGU9PnZpZXdTdGF0ZS5zZXQoJ2ludGVyYWN0aW9uTW9kZScsUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLkZPUk1fQ1JFQVRPUikpKSxcbi8vU2V0dGluZyB0aGUgY2xpY2tlZCBBbm5vdGF0aW9uIGFzIHRoZSBzZWxlY3RlZCBBbm5vdGF0aW9uXG4vL1NlYXJjaGluZyBmb3IgdGhlIFByb3BlcnR5IEV4cGFuZG8gQ29udHJvbCBXaWRnZXQgd2hlcmUgSSdsbCBpbnNlcnQgdGhlIFNlbGVjdCBFbGVtZW50XG5pbnN0YW5jZS5zZXRTZWxlY3RlZEFubm90YXRpb24oYW5ub3RhdGlvbi5pZCk7Y29uc3QgZXhwYW5kb0NvbnRyb2w9aW5zdGFuY2UuY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5QU1BERktpdC1FeHBhbmRvLUNvbnRyb2wnKTtcbi8vSWYgdGhlIEFubm90YXRpb24gaGFzIHVzZXJSb2xlcywgdGhlbiBJJ2xsIHNldCB0aGUgdXNlciByb2xlIGZvciB0aGUgY3VycmVudCB1c2VyOyBvdGhlcndpc2UgZGlzcGxheSB0aGUgc2VsZWN0IG1lbnVcbnVzZXJSb2xlPyhleHBhbmRvQ29udHJvbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZUJlZ2luJyxodG1sKSxpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3VzZXJSb2xlcyBvcHRpb25bdmFsdWU9Jyt1c2VyUm9sZSsnXScpLnNldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCEwKSxjb25zb2xlLmxvZyhpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3VzZXJSb2xlcyBvcHRpb25bdmFsdWU9VGVuYW50XScpKSk6ZXhwYW5kb0NvbnRyb2wuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVCZWdpbicsaHRtbCl9fSkpLFxuLy9FdmVudCBsaXN0ZW5lciB0byBkZWFjdGl2YXRlIHRoZSBGb3JtIENyZWF0b3Igb25jZSBJIGNsaWNrIGRvbmUgb3Igb3V0c2lkZSB0aGUgc2VsZWN0ZWQgU2lnbmF0dXJlIFdpZGdldFxuaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignYW5ub3RhdGlvblNlbGVjdGlvbi5jaGFuZ2UnLChhbm5vdGF0aW9uPT57XG4vL0lmIHRoZSBhbm5vdGF0aW9uIGlzIG5vdCBzZWxlY3RlZCwgSSBkZWFjdGl2YXRlIHRoZSBGb3JtIENyZWF0b3IgTW9kZVxuYW5ub3RhdGlvbnx8J0ZPUk1fQ1JFQVRPUichPWluc3RhbmNlLnZpZXdTdGF0ZS5pbnRlcmFjdGlvbk1vZGU%252FYW5ub3RhdGlvbiYmJ0ZPUk1fQ1JFQVRPUic9PWluc3RhbmNlLnZpZXdTdGF0ZS5pbnRlcmFjdGlvbk1vZGUmJlxuLy9PdGhlcndpc2UsIEkgdXBkYXRlIHRoZSB1c2VyUm9sZSB2YWx1ZVxuc2V0VGltZW91dCgoKCk9Pntjb25zdCBzZWxlY3RlZFJvbGU9aW5zdGFuY2UuY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN1c2VyUm9sZXMnKTtzZWxlY3RlZFJvbGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoZXZlbnQ9Pntjb25zdHt2YWx1ZTp2YWx1ZX09ZXZlbnQudGFyZ2V0LHVzZXJSb2xlPWFubm90YXRpb24uc2V0KCdjdXN0b21EYXRhJyx7dXNlclJvbGU6dmFsdWV9KTtpbnN0YW5jZS51cGRhdGUodXNlclJvbGUpLHNlbGVjdGVkUm9sZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgoKT0%252Be30pKX0pLCExKX0pLDApOmluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlPT52aWV3U3RhdGUuc2V0KCdpbnRlcmFjdGlvbk1vZGUnLG51bGwpKSl9KSksXG4vKlRoaXMgZXZlbnQgbGlzdGVuZXIgaXMganVzdCB0byBkZW1vbnN0cmF0ZSB0aGUgY29ycmVjdCBhbm5vdGF0aW9uIGlzIGdldHRpbmcgXG4gICAgdXBkYXRlZCB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlXG4gICovXG5pbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKCdhbm5vdGF0aW9ucy51cGRhdGUnLChhbm5vdGF0aW9uPT57Y29uc3R7Y3VzdG9tRGF0YTpjdXN0b21EYXRhfT1hbm5vdGF0aW9uLmdldCgwKTtjb25zb2xlLmxvZyhgVXNlciBSb2xlOiAke2N1c3RvbURhdGE%252FLnVzZXJSb2xlfSBmb3IgQW5ub3RhdGlvbjogJHthbm5vdGF0aW9uLmdldCgwKS5pZH1gKX0pKX0pKTsiLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - - Enhance form creator mode by adding a custom dropdown to assign user roles to signature fields. This demo focuses on UI enhancements, dynamically displaying the dropdown when a signature field is selected. — [Video](https://www.youtube.com/watch?v=F3jx7kWNnMI) - -- [Add custom form fields](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tRmt1NE5hekZ6YiIsImxheWVyIjoicmFuZG9tOWZQd2puWDJMdiJ9fSwianMiOiJjb25zdCB1cGRhdGVJbnRlcmF0aXZlID0gKGluc3RhbmNlKSA9PiB7XG4gIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgIHZpZXdTdGF0ZS5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLkZPUk1fQ1JFQVRPUilcbiAgKTtcbiAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BXG4gICAgdmlld1N0YXRlLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuVEVYVF9XSURHRVQpXG4gICk7XG59O1xubGV0IGJ1dHRvbk5hbWU7XG5jb25zdCBmaWVsZHMgPSB7XG4gIG5hbWU6IHsgbmFtZTogXCJjdXN0b21lcl9uYW1lXCIsIHZhbHVlOiBcIkN1c3RvbWVyIG5hbWUgZmllbGRcIiB9LFxuICBlbWFpbDogeyBuYW1lOiBcImN1c3RvbWVyX2VtYWlsXCIsIHZhbHVlOiBcIkN1c3RvbWVyIGVtYWlsIGZpZWxkXCIgfSxcbn07XG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBvbldpZGdldEFubm90YXRpb25DcmVhdGlvblN0YXJ0OiAoYW5ub3RhdGlvbiwgZm9ybUZpZWxkKSA9PiB7XG4gICAgY29uc3QgcmFuZG9tU3RyID0gUFNQREZLaXQuZ2VuZXJhdGVJbnN0YW50SWQoKVxuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uOiBhbm5vdGF0aW9uXG4gICAgICAgIC5zZXQoJ2Zvcm1GaWVsZE5hbWUnLCBgJHtmaWVsZHNbYnV0dG9uTmFtZV0ubmFtZX0tJHtyYW5kb21TdHJ9YClcbiAgICAgICAgLnNldCgnY3VzdG9tRGF0YScsIHtjdXN0b21lckZpZWxkOiB0cnVlfSksXG4gICAgICBmb3JtRmllbGQ6IGZvcm1GaWVsZFxuICAgICAgICAuc2V0KCduYW1lJywgYCR7ZmllbGRzW2J1dHRvbk5hbWVdLm5hbWV9LSR7cmFuZG9tU3RyfWApXG4gICAgICAgIC5zZXQoJ3ZhbHVlJywgZmllbGRzW2J1dHRvbk5hbWVdLnZhbHVlKVxuICAgIH1cbiAgfSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIC8vVGhpcyBidXR0b24gY3JlYXRlcyBhIEZvcm0gRmllbGQgYW5kIFdpZGdldCBwcm9ncmFtbWF0aWNhbGx5XG5cbiAgaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKFtcbiAgICB7IHR5cGU6IFwic3BhY2VyXCIgfSxcbiAgICB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgaWQ6IFwibmFtZVwiLFxuICAgICAgdGl0bGU6IFwiQ3VzdG9tZXIgTmFtZVwiLFxuICAgICAgb25QcmVzczogKGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIEhlcmUgSSdtIHNldHRpbmcgdGhlIGludGVyYWN0aW9uIG1vZGUgdG8gRm9ybSBEZXNpZ25lciBNb2RlIHdpdGggaXRzIHRvb2xcbiAgICAgICAgYnV0dG9uTmFtZSA9IFwibmFtZVwiO1xuICAgICAgICB1cGRhdGVJbnRlcmF0aXZlKGluc3RhbmNlKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgaWQ6IFwiZW1haWxcIixcbiAgICAgIHRpdGxlOiBcIkN1c3RvbWVyIEVtYWlsXCIsXG4gICAgICBvblByZXNzOiAoZXZlbnQpID0%252BIHtcbiAgICAgICAgYnV0dG9uTmFtZSA9IFwiZW1haWxcIjtcbiAgICAgICAgLy8gSGVyZSBJJ20gc2V0dGluZyB0aGUgaW50ZXJhY3Rpb24gbW9kZSB0byBGb3JtIERlc2lnbmVyIE1vZGUgd2l0aCBpdHMgdG9vbFxuICAgICAgICB1cGRhdGVJbnRlcmF0aXZlKGluc3RhbmNlKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiBcImZvcm0tY3JlYXRvclwiLFxuICAgIH0sXG4gIF0pO1xufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLlBTUERGS2l0LUZvcm0tQ3JlYXRvci1FZGl0b3ItRm9ybS1GaWVsZC1OYW1lIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmUgaW1wb3J0YW50O1xuICBvcGFjaXR5OiAwLjUgIWltcG9ydGFudDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxuLlBTUERGS2l0LUZvcm0tQ3JlYXRvci1FZGl0b3ItRGVsZXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - - Dynamically create form fields with unique IDs and custom data when a user interacts with a toolbar button. — [Video](https://www.youtube.com/watch?v=42kpjqLoVYo) - -- [Add name to signature field](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6Ii8vIEdsb2JhbCB2YXJpYWJsZSB0byBzdG9yZSB0aGUgUFNQREZLaXQgaW5zdGFuY2VcbmxldCBnbG9iYWxJbnN0YW5jZTtcblxuLy8gU2V0IHRoZSBkZWZhdWx0IHVzZXJuYW1lIGZvciBhbm5vdGF0aW9uc1xuY29uc3QgdXNlcjEgPSBcIk51dHJpZW50XCI7XG5jb25zdCB1c2VyMiA9IFwiUFNQREZLaXRcIjtcblxuLy8gRnVuY3Rpb24gdG8gcmVuZGVyIGN1c3RvbSBhbm5vdGF0aW9uIGFwcGVhcmFuY2VcbmNvbnN0IGFubm90YXRpb25SZW5kZXJlciA9ICh7IGFubm90YXRpb24gfSkgPT4ge1xuICAvLyBEb24ndCBzaG93IHRoZSBjcmVhdG9yJ3MgbmFtZSBpZiBpdCdzIG5vdCBzZXQgb3IgaXMgZW1wdHkuXG4gIGlmICghYW5ub3RhdGlvbi5jcmVhdG9yTmFtZSB8fCBhbm5vdGF0aW9uLmNyZWF0b3JOYW1lLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gbnVsbDtcblxuICAvLyBDcmVhdGUgYSBjb250YWluZXIgZWxlbWVudCB0byBkaXNwbGF5IHRoZSBhdXRob3IncyBuYW1lXG4gIGNvbnN0IGF1dGhvckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAvLyBDaGVjayBpZiB0aGUgYW5ub3RhdGlvbiBpcyBhIFdpZGdldEFubm90YXRpb24gKGUuZy4sIHNpZ25hdHVyZSBmaWVsZClcbiAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5XaWRnZXRBbm5vdGF0aW9uKSB7XG4gICAgKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFJldHJpZXZlIHRoZSBmb3JtIGZpZWxkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvblxuICAgICAgY29uc3QgZmllbGQgPSAoYXdhaXQgZ2xvYmFsSW5zdGFuY2UuZ2V0Rm9ybUZpZWxkcygpKS5maW5kKFxuICAgICAgICAoZmYpID0%252BXG4gICAgICAgICAgZmYgaW5zdGFuY2VvZiBQU1BERktpdC5Gb3JtRmllbGRzLlNpZ25hdHVyZUZvcm1GaWVsZCAmJlxuICAgICAgICAgIGZmLm5hbWUgPT09IGFubm90YXRpb24uZm9ybUZpZWxkTmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgYW55IG90aGVyIG92ZXJsYXBwaW5nIHNpZ25hdHVyZSBhbm5vdGF0aW9ucyBleGlzdFxuICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdTaWduYXR1cmUgPVxuICAgICAgICBhd2FpdCBnbG9iYWxJbnN0YW5jZS5nZXRPdmVybGFwcGluZ0Fubm90YXRpb25zKGFubm90YXRpb24pO1xuXG4gICAgICAvLyBJZiB0aGUgZmllbGQgZXhpc3RzIGFuZCBubyBvdmVybGFwcGluZyBzaWduYXR1cmVzLCBhZGQgdGhlIGNyZWF0b3IncyBuYW1lXG4gICAgICBpZiAoZmllbGQgJiYgb3ZlcmxhcHBpbmdTaWduYXR1cmUuc2l6ZSA9PT0gMCkge1xuICAgICAgICBhdXRob3JMYWJlbC5jbGFzc0xpc3QuYWRkKGBuYW1lLWxhYmVsLSR7YW5ub3RhdGlvbi5pZH1gKTtcblxuICAgICAgICAvLyBBZGQgdGhlIGFubm90YXRpb24ncyBhdXRob3IgbmFtZSBhcyB0ZXh0XG4gICAgICAgIGF1dGhvckxhYmVsLmFwcGVuZENoaWxkKFxuICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGFubm90YXRpb24uY3JlYXRvck5hbWUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGNyZWF0ZWQgbm9kZS5cbiAgICAgIG5vZGU6IGF1dGhvckxhYmVsLFxuICAgICAgLy8gQXBwZW5kIHRvIHRoZSBhbm5vdGF0aW9uJ3MgYXBwZWFyYW5jZSBpbnN0ZWFkIG9mIHJlcGxhY2luZyBpdC5cbiAgICAgIGFwcGVuZDogdHJ1ZSxcbiAgICAgIC8vIEFsbG93IHpvb21pbmcgdG8gc2NhbGUgdGhlIGFubm90YXRpb24gcHJvcGVybHkuXG4gICAgICBub1pvb206IGZhbHNlLFxuICAgIH07XG4gIH1cbn07XG5cbi8vIExvYWQgUFNQREZLaXQgd2l0aCBjdXN0b20gY29uZmlndXJhdGlvblxuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLCAvLyBTcHJlYWQgdGhlIGJhc2UgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLCAvLyBBcHBseSBkYXJrIHRoZW1lIHRvIHRoZSB2aWV3ZXJcbiAgY3VzdG9tUmVuZGVyZXJzOiB7IEFubm90YXRpb246IGFubm90YXRpb25SZW5kZXJlciB9LCAvLyBBcHBseSB0aGUgY3VzdG9tIGFubm90YXRpb24gcmVuZGVyZXJcbiAgaXNFZGl0YWJsZUFubm90YXRpb246IGZ1bmN0aW9uIChhbm5vdGF0aW9uKSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGFubm90YXRpb24gaXMgYSBzaWduYXR1cmVcbiAgICByZXR1cm4gIWFubm90YXRpb24uaXNTaWduYXR1cmU7IC8vIFJldHVybiB0cnVlIGlmIGl0J3Mgbm90IGEgc2lnbmF0dXJlLCBmYWxzZSBvdGhlcndpc2VcbiAgfSxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIC8vIFN0b3JlIHRoZSBpbnN0YW5jZSBnbG9iYWxseSBmb3IgbGF0ZXIgdXNlXG4gIGdsb2JhbEluc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgLy8gQ3JlYXRlIHRoZSBmaXJzdCB3aWRnZXQgYW5ub3RhdGlvbiAoc2lnbmF0dXJlIGZpZWxkKVxuICBjb25zdCB3aWRnZXQxID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLldpZGdldEFubm90YXRpb24oe1xuICAgIGlkOiBQU1BERktpdC5nZW5lcmF0ZUluc3RhbnRJZCgpLCAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGFubm90YXRpb25cbiAgICBwYWdlSW5kZXg6IDAsIC8vIFBsYWNlIGl0IG9uIHRoZSBmaXJzdCBwYWdlXG4gICAgYm91bmRpbmdCb3g6IG5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHtcbiAgICAgIGxlZnQ6IDEwMCxcbiAgICAgIHRvcDogMzAwLFxuICAgICAgd2lkdGg6IDE1MCxcbiAgICAgIGhlaWdodDogNzUsXG4gICAgfSksIC8vIERlZmluZSBhbm5vdGF0aW9uIHNpemUgYW5kIHBvc2l0aW9uXG4gICAgZm9ybUZpZWxkTmFtZTogXCJmb3JtMVwiLCAvLyBBc3NpZ24gYSBmb3JtIGZpZWxkIG5hbWVcbiAgICBjdXN0b21EYXRhOiB7IGlzSW5pdGlhbHM6IGZhbHNlIH0sIC8vIEN1c3RvbSBmbGFnIChub3QgaW5pdGlhbHMpXG4gICAgY3JlYXRvck5hbWU6IHVzZXIxLCAvLyBTZXQgdGhlIGNyZWF0b3IncyBuYW1lXG4gIH0pO1xuXG4gIC8vIENyZWF0ZSB0aGUgZmlyc3Qgc2lnbmF0dXJlIGZvcm0gZmllbGQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3aWRnZXRcbiAgY29uc3QgZm9ybUZpZWxkMSA9IG5ldyBQU1BERktpdC5Gb3JtRmllbGRzLlNpZ25hdHVyZUZvcm1GaWVsZCh7XG4gICAgbmFtZTogXCJmb3JtMVwiLCAvLyBTZXQgdGhlIGZvcm0gZmllbGQgbmFtZVxuICAgIGFubm90YXRpb25JZHM6IG5ldyBQU1BERktpdC5JbW11dGFibGUuTGlzdChbd2lkZ2V0MS5pZF0pLCAvLyBMaW5rIGFubm90YXRpb24gdG8gdGhlIGZvcm0gZmllbGRcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBzZWNvbmQgd2lkZ2V0IGFubm90YXRpb24gKHNpZ25hdHVyZSBmaWVsZClcbiAgY29uc3Qgd2lkZ2V0MiA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5XaWRnZXRBbm5vdGF0aW9uKHtcbiAgICBpZDogUFNQREZLaXQuZ2VuZXJhdGVJbnN0YW50SWQoKSwgLy8gR2VuZXJhdGUgYSB1bmlxdWUgSUQgZm9yIHRoZSBhbm5vdGF0aW9uXG4gICAgcGFnZUluZGV4OiAwLCAvLyBQbGFjZSBpdCBvbiB0aGUgZmlyc3QgcGFnZVxuICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICBsZWZ0OiAzNTUsXG4gICAgICB0b3A6IDMwMCxcbiAgICAgIHdpZHRoOiAxNTAsXG4gICAgICBoZWlnaHQ6IDc1LFxuICAgIH0pLCAvLyBEZWZpbmUgYW5ub3RhdGlvbiBzaXplIGFuZCBwb3NpdGlvblxuICAgIGZvcm1GaWVsZE5hbWU6IFwiZm9ybTJcIiwgLy8gQXNzaWduIGEgZm9ybSBmaWVsZCBuYW1lXG4gICAgY3VzdG9tRGF0YTogeyBpc0luaXRpYWxzOiB0cnVlIH0sIC8vIEN1c3RvbSBmbGFnICh0aGlzIGlzIGZvciBpbml0aWFscylcbiAgICBjcmVhdG9yTmFtZTogdXNlcjIsIC8vIFNldCB0aGUgY3JlYXRvcidzIG5hbWVcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBzZWNvbmQgc2lnbmF0dXJlIGZvcm0gZmllbGQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3aWRnZXRcbiAgY29uc3QgZm9ybUZpZWxkMiA9IG5ldyBQU1BERktpdC5Gb3JtRmllbGRzLlNpZ25hdHVyZUZvcm1GaWVsZCh7XG4gICAgbmFtZTogXCJmb3JtMlwiLCAvLyBTZXQgdGhlIGZvcm0gZmllbGQgbmFtZVxuICAgIGFubm90YXRpb25JZHM6IG5ldyBQU1BERktpdC5JbW11dGFibGUuTGlzdChbd2lkZ2V0Mi5pZF0pLCAvLyBMaW5rIGFubm90YXRpb24gdG8gdGhlIGZvcm0gZmllbGRcbiAgfSk7XG5cbiAgLy8gQWRkIGJvdGggd2lkZ2V0cyBhbmQgZm9ybSBmaWVsZHMgdG8gdGhlIFBTUERGS2l0IGluc3RhbmNlXG4gIGF3YWl0IGluc3RhbmNlLmNyZWF0ZShbd2lkZ2V0MSwgZm9ybUZpZWxkMSwgd2lkZ2V0MiwgZm9ybUZpZWxkMl0pO1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCEgYnkgTmFyYXNoaW1hblwiKTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuW2NsYXNzKj1cIm5hbWUtbGFiZWxcIl0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuXG4ubmFtZS1sYWJlbC1mYWRlb3V0IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiJ9) - - Create signature form fields and display the creator’s name next to them. — [Video](https://www.youtube.com/watch?v=-LeAvQTuUFg) - -- [Add custom database form fields](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tMTU2VGZzUkY1QSIsImxheWVyIjoicmFuZG9tYVRtalpzcjNyQiJ9fSwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLfSkudGhlbigoaW5zdGFuY2U9PntsZXQgZm9ybURlc2lnbk1vZGU9ITE7aW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcz0%252BWy4uLml0ZW1zLHt0eXBlOidmb3JtLWNyZWF0b3InfV0pKSxpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKCd2aWV3U3RhdGUuY2hhbmdlJywoKHZpZXdTdGF0ZSxwcmV2aW91c1ZpZXdTdGF0ZSk9Pntmb3JtRGVzaWduTW9kZT0hMD09PXZpZXdTdGF0ZS5mb3JtRGVzaWduTW9kZX0pKSxpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKCdhbm5vdGF0aW9ucy5jcmVhdGUnLChjcmVhdGVkQW5ub3RhdGlvbnM9PntpZighMD09PWZvcm1EZXNpZ25Nb2RlKXtsZXQgZm9ybU1vZGFsPWluc3RhbmNlLmNvbnRlbnREb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuUFNQREZLaXQtRm9ybS1DcmVhdG9yLUVkaXRvcicpWzBdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXSxuZXdCdXR0b24xPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuLy8gU2V0IHNvbWUgcHJvcGVydGllcyBmb3IgdGhlIGJ1dHRvblxubmV3QnV0dG9uMS5pbm5lckhUTUw9J0RCIEZpZWxkIDEnLG5ld0J1dHRvbjEuaWQ9J25ld0J1dHRvbklkJyxcbi8vIEFkZCBhbiBvbmNsaWNrIGV2ZW50IHRvIHRoZSBidXR0b25cbm5ld0J1dHRvbjEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLChmdW5jdGlvbigpe2xldCB1cGRhdGVkQW5ub3Q9Y3JlYXRlZEFubm90YXRpb25zLl90YWlsLmFycmF5WzBdLnNldCgnY3VzdG9tRGF0YScse2RiRmllbGQ6JzEnfSk7aW5zdGFuY2UudXBkYXRlKHVwZGF0ZWRBbm5vdCksY29uc29sZS5sb2coJ1VwZGF0ZWQgQW5ub3RhdGlvbicpLGNvbnNvbGUubG9nKHVwZGF0ZWRBbm5vdCl9KSk7XG4vLyBDcmVhdGUgYSBuZXcgYnV0dG9uIGVsZW1lbnRcbmxldCBuZXdCdXR0b24yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuLy8gU2V0IHNvbWUgcHJvcGVydGllcyBmb3IgdGhlIGJ1dHRvblxubmV3QnV0dG9uMi5pbm5lckhUTUw9J0RCIEZpZWxkIDInLG5ld0J1dHRvbjIuaWQ9J25ld0J1dHRvbklkJyxuZXdCdXR0b24yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoZnVuY3Rpb24oKXtsZXQgdXBkYXRlZEFubm90PWNyZWF0ZWRBbm5vdGF0aW9ucy5fdGFpbC5hcnJheVswXS5zZXQoJ2N1c3RvbURhdGEnLHtkYkZpZWxkOicyJ30pO2luc3RhbmNlLnVwZGF0ZSh1cGRhdGVkQW5ub3QpLGNvbnNvbGUubG9nKCdVcGRhdGVkIEFubm90YXRpb24nKSxjb25zb2xlLmxvZyh1cGRhdGVkQW5ub3QpfSkpLGZvcm1Nb2RhbC5hcHBlbmRDaGlsZChuZXdCdXR0b24xKSxmb3JtTW9kYWwuYXBwZW5kQ2hpbGQobmV3QnV0dG9uMil9fSkpfSkpOyIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - - Modify the form creation modal to include buttons for mapping input fields to database fields, allowing users to update the form’s custom data. — [Video](https://www.youtube.com/watch?v=RppsQeOCfis) - -- [Iterate over form fields and widgets and output their properties](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChhc3luYyBpbnN0YW5jZT0%252Be1xuLy8gUmV0cmlldmUgYWxsIGZvcm0gZmllbGRzLlxuY29uc3QgZm9ybUZpZWxkcz1hd2FpdCBpbnN0YW5jZS5nZXRGb3JtRmllbGRzKCksd2lkZ2V0QW5ub3RhdGlvbnM9KGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oe2xlbmd0aDppbnN0YW5jZS50b3RhbFBhZ2VDb3VudH0pLm1hcCgoYXN5bmMoXyxwYWdlSW5kZXgpPT4oYXdhaXQgaW5zdGFuY2UuZ2V0QW5ub3RhdGlvbnMocGFnZUluZGV4KSkuZmlsdGVyKChpdD0%252BaXQgaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5XaWRnZXRBbm5vdGF0aW9uKSkpKSkpLmZsYXRNYXAoKHBhZ2VBbm5vdGF0aW9ucz0%252BcGFnZUFubm90YXRpb25zLnRvQXJyYXkoKSkpO1xuLy8gUmV0cmlldmUgYWxsIHdpZGdldCBhbm5vdGF0aW9ucyBpbiB0aGUgZG9jdW1lbnQuXG5mb3JtRmllbGRzLmZsYXRNYXAoKGZvcm1GaWVsZD0%252Be1xuLy8gVXBkYXRlIGFsbCB3aWRnZXRzIGJhc2VkIG9uIHRoZSBmb3JtIGZpZWxkIHZhbHVlLlxud2lkZ2V0QW5ub3RhdGlvbnMuZmlsdGVyKChhbm5vdGF0aW9uPT5mb3JtRmllbGQuYW5ub3RhdGlvbklkcy5jb250YWlucyhhbm5vdGF0aW9uLmlkKSkpLm1hcCgod2lkZ2V0PT5jb25zb2xlLmxvZygnTmFtZTonK2Zvcm1GaWVsZC5uYW1lKydcXG4nLCdWYWx1ZTonK2Zvcm1GaWVsZC52YWx1ZSsnXFxuJywnUmVjdDonK3dpZGdldC5ib3VuZGluZ0JveCsnXFxuJywnUGFnZUluZGV4Oicrd2lkZ2V0LnBhZ2VJbmRleCkpKX0pKX0pKTsiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - -- [Set radio button and checkbox values](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIn0sIm1vZGUiOiJzdGFuZGFsb25lIiwianMiOiIvLyBMb2FkIFBTUERGS2l0IHdpdGggc3BlY2lmaWMgY29uZmlndXJhdGlvbnNcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucywgLy8gU3ByZWFkIHRoZSBiYXNlIG9wdGlvbnMgdG8gcmV0YWluIGRlZmF1bHQgY29uZmlndXJhdGlvbnNcblxuICB0b29sYmFySXRlbXM6IFtcbiAgICAuLi5QU1BERktpdC5kZWZhdWx0VG9vbGJhckl0ZW1zLCAvLyBJbmNsdWRlIGRlZmF1bHQgdG9vbGJhciBpdGVtc1xuICAgIHsgdHlwZTogXCJmb3JtLWNyZWF0b3JcIiB9LCAvLyBBZGQgYSBmb3JtIGNyZWF0b3IgdG9vbCB0byB0aGUgdG9vbGJhclxuICBdLFxufSlcbiAgLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQgc3VjY2Vzc2Z1bGx5ISBieSBOYXJhc2hpbWFuXCIpOyAvLyBMb2cgc3VjY2VzcyBtZXNzYWdlXG5cbiAgICAvLyBSZXRyaWV2ZSBhbGwgZm9ybSBmaWVsZHMgYW5kIHVwZGF0ZSB0aGUgdmFsdWUgb2YgcmFkaW8gYnV0dG9uc1xuICAgIChhd2FpdCBpbnN0YW5jZS5nZXRGb3JtRmllbGRzKCkpLmZvckVhY2goKGZvcm1GaWVsZCkgPT4ge1xuICAgICAgaWYgKGZvcm1GaWVsZCBpbnN0YW5jZW9mIFBTUERGS2l0LkZvcm1GaWVsZHMuUmFkaW9CdXR0b25Gb3JtRmllbGQpIHtcbiAgICAgICAgLy8gU2V0IHRoZSByYWRpbyBidXR0b24gdmFsdWUgdG8gXCJZZXNcIlxuICAgICAgICBpbnN0YW5jZS5zZXRGb3JtRmllbGRWYWx1ZXMoeyBbZm9ybUZpZWxkLm5hbWVdOiBcIlllc1wiIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gR2V0IGFsbCBmb3JtIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnRcbiAgICBjb25zdCBmb3JtRmllbGRzID0gYXdhaXQgaW5zdGFuY2UuZ2V0Rm9ybUZpZWxkcygpO1xuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBmb3JtIGZpZWxkcyB0byBmaW5kIGNoZWNrYm94ZXNcbiAgICBmb3IgKGNvbnN0IGZvcm1GaWVsZCBvZiBmb3JtRmllbGRzKSB7XG4gICAgICBpZiAoZm9ybUZpZWxkIGluc3RhbmNlb2YgUFNQREZLaXQuRm9ybUZpZWxkcy5DaGVja0JveEZvcm1GaWVsZCkge1xuICAgICAgICAvLyBDaGVjayB0aGUgY2hlY2tib3ggYnkgc2V0dGluZyBpdHMgdmFsdWUgdG8gXCJZZXNcIlxuICAgICAgICBhd2FpdCBpbnN0YW5jZS5zZXRGb3JtRmllbGRWYWx1ZXMoe1xuICAgICAgICAgIFtmb3JtRmllbGQubmFtZV06IFBTUERGS2l0LkltbXV0YWJsZS5MaXN0KFtcIlllc1wiXSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBDaGVja2JveCBDaGVja2VkIHdpdGggdmFsdWVzIHllczogJHtmb3JtRmllbGQubmFtZX0gLT4gXCJZZXNcImBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIC5jYXRjaCgoZXJyb3IpID0%252BIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgbG9hZGluZyBOdXRyaWVudDpcIiwgZXJyb3IpOyAvLyBMb2cgYW55IGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBQU1BERktpdCBsb2FkaW5nXG4gIH0pO1xuIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) - - Use custom configurations to automatically set values for radio buttons and checkboxes in a PDF form. — [Video](https://www.youtube.com/watch?v=JjCYGL2ff74) - -- [Highlight all required fields](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb203Q1FKbkZwdVFWIiwibGF5ZXIiOiJyYW5kb21lNXNocEtoSHdsIn19LCJqcyI6Ii8vIFZhcmlhYmxlIHRvIHN0b3JlIHJlcXVpcmVkIGZvcm0gZmllbGRzXG5sZXQgcmVxdWlyZWRGb3JtRmllbGRzO1xuXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuXG4gIC8vIERlZmluZSBjdXN0b20gcmVuZGVyZXJzIGZvciBhbm5vdGF0aW9uc1xuICBjdXN0b21SZW5kZXJlcnM6IHtcbiAgICBBbm5vdGF0aW9uOiAoeyBhbm5vdGF0aW9uIH0pID0%252BIHtcbiAgICAgIC8vIFNraXAgaWYgYW5ub3RhdGlvbiBpcyBub3QgYSB3aWRnZXQgKGZvcm0gZmllbGQpXG4gICAgICBpZiAoIShhbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuV2lkZ2V0QW5ub3RhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgZm9ybSBmaWVsZCBpcyBpbiBvdXIgcmVxdWlyZWQgZmllbGRzIGxpc3RcbiAgICAgIGNvbnN0IGlzUmVxdWlyZWRGaWVsZCA9XG4gICAgICAgIHJlcXVpcmVkRm9ybUZpZWxkcy5zaXplID4gMCAmJlxuICAgICAgICByZXF1aXJlZEZvcm1GaWVsZHMuZmluZChcbiAgICAgICAgICAoZm9ybUZpZWxkKSA9PiBmb3JtRmllbGQubmFtZSA9PT0gYW5ub3RhdGlvbi5mb3JtRmllbGROYW1lXG4gICAgICAgICk7XG5cbiAgICAgIC8vIElmIGl0J3MgYSByZXF1aXJlZCBmaWVsZCwgY3JlYXRlIGEgY3VzdG9tIHdyYXBwZXIgd2l0aCBzcGVjaWFsIHN0eWxpbmdcbiAgICAgIGlmIChpc1JlcXVpcmVkRmllbGQpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChcInJlcXVpcmVkLWZvcm0tZmllbGRcIik7XG4gICAgICAgIC8vIFNlZSBDU1MgdGFiIGZvciBzdHlsaW5nIG9mIC5yZXF1aXJlZC1mb3JtLWZpZWxkXG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBub2RlIHdpdGggYXBwZW5kIGZsYWcgdG8gcHJlc2VydmUgZGVmYXVsdCByZW5kZXJpbmdcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGFwcGVuZDogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIG51bGwgZm9yIG5vbi1yZXF1aXJlZCBmaWVsZHMgKGRlZmF1bHQgcmVuZGVyaW5nKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgfSxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIC8vIEdldCBhbGwgZm9ybSBmaWVsZHNcbiAgY29uc3QgZm9ybUZpZWxkcyA9IGF3YWl0IGluc3RhbmNlLmdldEZvcm1GaWVsZHMoKTtcbiAgLy8gTWFyayB0aGVtIGFzIHJlcXVpcmVkXG4gIGNvbnN0IGNoYW5nZXMgPSBmb3JtRmllbGRzLm1hcCgoZm9ybUZpZWxkKSA9PlxuICAgIGZvcm1GaWVsZC5zZXQoXCJyZXF1aXJlZFwiLCB0cnVlKVxuICApO1xuXG4gIC8vIEFwcGx5IHRoZSBjaGFuZ2VzIHRvIG1ha2UgZmllbGRzIHJlcXVpcmVkXG4gIGF3YWl0IGluc3RhbmNlLnVwZGF0ZShjaGFuZ2VzKTtcblxuICAvLyBHZXQgdXBkYXRlZCBmb3JtIGZpZWxkc1xuICBjb25zdCB1cGRhdGVkRm9ybUZpZWxkcyA9IGF3YWl0IGluc3RhbmNlLmdldEZvcm1GaWVsZHMoKTtcbiAgXG4gIC8vIEZpbHRlciBvbmx5IHJlcXVpcmVkIGZpZWxkc1xuICAvLyBPcHRpb25hbCAtIGFsbCBmb3JtIGZpZWxkcyBpbiB0aGlzIGV4YW1wbGUgYXJlIHJlcXVpcmVkXG4gIHJlcXVpcmVkRm9ybUZpZWxkcyA9IHVwZGF0ZWRGb3JtRmllbGRzLmZpbHRlcihcbiAgICAoZm9ybUZpZWxkKSA9PiBmb3JtRmllbGQucmVxdWlyZWQgJiYgZm9ybUZpZWxkXG4gICk7XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4ucmVxdWlyZWQtZm9ybS1maWVsZDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiICpcIjtcbiAgY29sb3I6IHJlZDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IC0xMnB4O1xuICB0b3A6IDM1JTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuIn0%253D) - - Mark all form fields as required, and visually highlight them using a custom renderer. — [Video](https://www.youtube.com/watch?v=tt-C3Ps9gj4) - -#### Form Creator - -- [Prevent creating widgets outside of page bounds](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiIvLyBHbG9iYWwgdmFyaWFibGUgdG8gc3RvcmUgdGhlIFBTUERGS2l0IGluc3RhbmNlIGZvciB1c2UgYWNyb3NzIGZ1bmN0aW9uc1xubGV0IGdsb2JhbEluc3RhbmNlO1xuXG4vLyBJbml0aWFsaXplIFBTUERGS2l0IHdpdGggY29uZmlndXJhdGlvblxuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgLy8gQWRkIGZvcm0gY3JlYXRvciB0b29sIHRvIHRoZSB0b29sYmFyXG4gIHRvb2xiYXJJdGVtczogW3sgdHlwZTogXCJmb3JtLWNyZWF0b3JcIiB9XSxcblxuICAvLyBIYW5kbGVyIHRoYXQgcnVucyB3aGVuIGEgdXNlciBzdGFydHMgY3JlYXRpbmcgYSB3aWRnZXQgYW5ub3RhdGlvbiAobGlrZSBhIHNpZ25hdHVyZSBmaWVsZClcbiAgb25XaWRnZXRBbm5vdGF0aW9uQ3JlYXRpb25TdGFydDogKGFubm90YXRpb24sIGZvcm1GaWVsZCkgPT4ge1xuICAgIC8vIERlc3RydWN0dXJlIHRoZSBhbm5vdGF0aW9uIHByb3BlcnRpZXMgd2UgbmVlZFxuICAgIGNvbnN0IHsgYm91bmRpbmdCb3gsIHBhZ2VJbmRleCB9ID0gYW5ub3RhdGlvbjtcblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgY3VycmVudCBwYWdlXG4gICAgY29uc3QgeyBoZWlnaHQsIHdpZHRoIH0gPSBnbG9iYWxJbnN0YW5jZS5wYWdlSW5mb0ZvckluZGV4KHBhZ2VJbmRleCk7XG5cbiAgICAvLyBDcmVhdGUgYSByZWN0YW5nbGUgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgcGFnZVxuICAgIGNvbnN0IHBhZ2VSZWN0ID0gbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgdG9wOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGFubm90YXRpb24ncyBib3VuZGluZyBib3ggaXMgZnVsbHkgaW5zaWRlIHRoZSBwYWdlXG4gICAgaWYgKHBhZ2VSZWN0LmlzUmVjdEluc2lkZShib3VuZGluZ0JveCkpIHtcbiAgICAgIC8vIElmIGluc2lkZSBwYWdlIGJvdW5kcywgYWxsb3cgY3JlYXRpb24gYnkgcmV0dXJuaW5nIHRoZSBhbm5vdGF0aW9uIGFuZCBmb3JtIGZpZWxkXG4gICAgICByZXR1cm4geyBhbm5vdGF0aW9uLCBmb3JtRmllbGQgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgb3V0c2lkZSBwYWdlIGJvdW5kcywgc2hvdyBlcnJvciBhbmQgcHJldmVudCBjcmVhdGlvblxuICAgICAgYWxlcnQoXCJDYW5ub3QgY3JlYXRlIGFubm90YXRpb24gLSBvdXRzaWRlIG9mIGJvdW5kc1wiKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIC8vIFN0b3JlIGluc3RhbmNlIGdsb2JhbGx5IGZvciBsYXRlciB1c2VcbiAgZ2xvYmFsSW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAvLyBMb2cgc3VjY2VzcyBtZXNzYWdlcyBhbmQgaGVscGZ1bCBkb2N1bWVudGF0aW9uIGxpbmtzXG4gIGNvbnNvbGUubG9nKFwiUFNQREZLaXQgbG9hZGVkIVwiKTtcbiAgY29uc29sZS5sb2coXCJBUEkgZG9jczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vYXBpL3dlYi9cIik7XG4gIGNvbnNvbGUubG9nKFwiR3VpZGVzOiBodHRwczovL3BzcGRma2l0LmNvbS9ndWlkZXMvd2ViL1wiKTtcbn0pO1xuIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbi5QU1BERktpdC1Bbm5vdGF0aW9uLUZsYWdzLVBvcG92ZXIge1xuICBkaXNwbGF5OiBub25lO1xuICBjdXJzb3I6IG5vbmU7XG59XG5cbi5UaHVtYm5haWwtSXMtUmVhZCB7XG4gIGNvbnRlbnQ6IHVybCgvYXNzZXRzL2ltYWdlcy9pY29ucy9tb25vL2NoZWNrbWFyay1jNDJiMGQ1Mi5zdmcpO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHJpZ2h0OiAyMiU7XG4gIHRvcDogMTElO1xuICBvcGFjaXR5OiAxICFpbXBvcnRhbnQ7XG59XG4uUFNQREZLaXQtU2lkZWJhci1UaHVtYm5haWxzLVBhZ2UtU2VsZWN0ZWRcbiAgLlBTUERGS2l0LVNpZGViYXItVGh1bWJuYWlscy1QYWdlLUltYWdlIHtcbiAgYm94LXNoYWRvdzogMCAwIDAgNHB4IGxhdmVuZGVyO1xufVxuXG4uUFNQREZLaXQtU2lkZWJhci1UaHVtYm5haWxzLVBhZ2UtU2VsZWN0ZWRcbiAgLlBTUERGS2l0LVNpZGViYXItVGh1bWJuYWlscy1QYWdlLUxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogbGF2ZW5kZXI7XG59XG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - -- [Visual alignment techniques for form elements](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIuZ3JpZC1vdmVybGF5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiA5OTk5O1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoMGRlZywgYmxhY2sgMXB4LCB0cmFuc3BhcmVudCAxcHgpLFxuICAgIGxpbmVhci1ncmFkaWVudCg5MGRlZywgYmxhY2sgMXB4LCB0cmFuc3BhcmVudCAxcHgpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDUwcHggNTBweDtcbn1cbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiZm9ybS5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFsuLi5QU1BERktpdC5kZWZhdWx0VG9vbGJhckl0ZW1zLCB7IHR5cGU6IFwiZm9ybS1jcmVhdG9yXCIgfV0sXG59KS50aGVuKGFzeW5jIChpbnN0YW5jZSkgPT4ge1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IExvYWRlZCAtIGJ5IE5hcmFzaGltYW5cIik7XG4gIGNvbnN0IHBhZ2VJbmRleCA9IGluc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4O1xuICBjb25zdCBwYWdlSW5mbyA9IGF3YWl0IGluc3RhbmNlLnBhZ2VJbmZvRm9ySW5kZXgocGFnZUluZGV4KTtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlSW5mbztcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBcImFubm90YXRpb25zLmZvY3VzXCIsXG4gICAgZnVuY3Rpb24gKGFubm90YXRpb25Gb2N1c0V2ZW50KSB7XG4gICAgICBhdHRhY2hHcmlkT3ZlcmxheVRvZ2dsZShpbnN0YW5jZSwgd2lkdGgsIGhlaWdodCwgcGFnZUluZGV4KTtcbiAgICB9XG4gICk7XG5cbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2UucHJlc3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5zdGFuY2UucmVtb3ZlQ3VzdG9tT3ZlcmxheUl0ZW0oXCJncmlkLW92ZXJsYXlcIik7XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH0sIDUwKTtcbiAgfSk7XG59KTtcblxuZnVuY3Rpb24gYXR0YWNoR3JpZE92ZXJsYXlUb2dnbGUoaW5zdGFuY2UsIHdpZHRoLCBoZWlnaHQsIHBhZ2VJbmRleCkge1xuICB0cnkge1xuICAgIGluc3RhbmNlLnJlbW92ZUN1c3RvbU92ZXJsYXlJdGVtKFwiZ3JpZC1vdmVybGF5XCIpO1xuICB9IGNhdGNoIChfKSB7fVxuICBjb25zdCBncmlkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgZ3JpZC5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuICBncmlkLnN0eWxlLmhlaWdodCA9IGhlaWdodCArIFwicHhcIjtcbiAgZ3JpZC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XG4gIGdyaWQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgxOCwwLDE4LDAuMSkgMXB4LCB0cmFuc3BhcmVudCAwLjFweCksXG4gICAgICBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDE4LDAsMTgsMC4xKSAxcHgsIHRyYW5zcGFyZW50IDAuMXB4KWA7XG4gIGdyaWQuc3R5bGUuYmFja2dyb3VuZFNpemUgPSBgMjVweCAyNXB4YDtcbiAgZ3JpZC5zdHlsZS56SW5kZXggPSBcIi0xXCI7XG5cbiAgY29uc3Qgb3ZlcmxheUl0ZW0gPSBuZXcgUFNQREZLaXQuQ3VzdG9tT3ZlcmxheUl0ZW0oe1xuICAgIGlkOiBcImdyaWQtb3ZlcmxheVwiLFxuICAgIG5vZGU6IGdyaWQsXG4gICAgcGFnZUluZGV4LFxuICAgIHBvc2l0aW9uOiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUG9pbnQoeyB4OiAwLCB5OiAwIH0pLFxuICB9KTtcblxuICBpbnN0YW5jZS5zZXRDdXN0b21PdmVybGF5SXRlbShvdmVybGF5SXRlbSk7XG59XG4ifQ%253D%253D) - - In Form Creator mode, enable overlay grid lines to provide visual guidance for precise alignment of form elements. - -- [Replace the default form creator menu with custom buttons](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLlBTUERGS2l0LUZvcm0tQ3JlYXRvci1Ub29sYmFyIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFsuLi5QU1BERktpdC5kZWZhdWx0VG9vbGJhckl0ZW1zLCB7IHR5cGU6IFwiZm9ybS1jcmVhdG9yXCIgfV0sXG59KS50aGVuKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IExvYWRlZCAtIGJ5IE5hcmFzaGltYW5cIik7XG4gIGF0dGFjaEZvcm1DcmVhdG9yTGlzdGVuZXIoaW5zdGFuY2UpO1xufSk7XG5cbmZ1bmN0aW9uIGF0dGFjaEZvcm1DcmVhdG9yTGlzdGVuZXIoaW5zdGFuY2UpIHtcbiAgdmFyIGRvYyA9IGluc3RhbmNlLmNvbnRlbnREb2N1bWVudDtcbiAgdmFyIGJ1dHRvbiA9IGRvYy5xdWVyeVNlbGVjdG9yKFwiLlBTUERGS2l0LVRvb2xiYXItQnV0dG9uLUZvcm0tQ3JlYXRvclwiKTtcbiAgaWYgKCFidXR0b24pIHJldHVybjtcblxuICB2YXIgT1ZFUkxBWV9JRCA9IFwiZm9ybS1jcmVhdG9yLWZsb2F0aW5nXCI7XG5cbiAgZnVuY3Rpb24gcmVuZGVyRmxvYXRpbmcoKSB7XG4gICAgdmFyIG9sZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKE9WRVJMQVlfSUQpO1xuICAgIGlmIChvbGQpIG9sZC5yZW1vdmUoKTtcblxuICAgIGlmIChidXR0b24uZ2V0QXR0cmlidXRlKFwiYXJpYS1wcmVzc2VkXCIpICE9PSBcInRydWVcIikgcmV0dXJuO1xuXG4gICAgdmFyIG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIG92ZXJsYXkuaWQgPSBPVkVSTEFZX0lEO1xuICAgIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9XG4gICAgICBcInBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtnYXA6NHB4O1wiICtcbiAgICAgIFwiYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNyk7cGFkZGluZzo4cHg7Ym9yZGVyLXJhZGl1czo0cHg7XCIgK1xuICAgICAgXCJmb250LWZhbWlseTpzYW5zLXNlcmlmO2NvbG9yOndoaXRlO3otaW5kZXg6MTAwMDA7XCI7XG5cbiAgICB2YXIgbW9kZXMgPSBbXG4gICAgICB7IGxhYmVsOiBcIkJ1dHRvblwiLCBtb2RlOiBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuQlVUVE9OX1dJREdFVCB9LFxuICAgICAgeyBsYWJlbDogXCJUZXh0XCIsIG1vZGU6IFBTUERGS2l0LkludGVyYWN0aW9uTW9kZS5URVhUX1dJREdFVCB9LFxuICAgICAgeyBsYWJlbDogXCJDaGVja2JveFwiLCBtb2RlOiBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuQ0hFQ0tCT1hfV0lER0VUIH0sXG4gICAgICB7IGxhYmVsOiBcIlJhZGlvXCIsIG1vZGU6IFBTUERGS2l0LkludGVyYWN0aW9uTW9kZS5SQURJT19CVVRUT05fV0lER0VUIH0sXG4gICAgICB7IGxhYmVsOiBcIkNvbWJvXCIsIG1vZGU6IFBTUERGS2l0LkludGVyYWN0aW9uTW9kZS5DT01CT19CT1hfV0lER0VUIH0sXG4gICAgICB7IGxhYmVsOiBcIkxpc3RcIiwgbW9kZTogUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLkxJU1RfQk9YX1dJREdFVCB9LFxuICAgICAgeyBsYWJlbDogXCJTaWduYXR1cmVcIiwgbW9kZTogUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLlNJR05BVFVSRV9XSURHRVQgfSxcbiAgICAgIHsgbGFiZWw6IFwiRGF0ZVwiLCBtb2RlOiBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuREFURV9XSURHRVQgfSxcbiAgICBdO1xuICAgIG1vZGVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gaXRlbS5sYWJlbDtcbiAgICAgIGJ0bi5zdHlsZS5wYWRkaW5nID0gXCI0cHggOHB4XCI7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKGZ1bmN0aW9uICh2cykge1xuICAgICAgICAgIHJldHVybiB2cy5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgaXRlbS5tb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIG92ZXJsYXkuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgICB9KTtcblxuICAgIHZhciB0b29sYmFyID0gZG9jLnF1ZXJ5U2VsZWN0b3IoXCIuUFNQREZLaXQtVG9vbGJhclwiKTtcbiAgICBpZiAoIXRvb2xiYXIpIHJldHVybjtcbiAgICB2YXIgciA9IHRvb2xiYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgb3ZlcmxheS5zdHlsZS50b3AgPSByLmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgXCJweFwiO1xuICAgIG92ZXJsYXkuc3R5bGUubGVmdCA9IHIubGVmdCArIHdpbmRvdy5zY3JvbGxYICsgXCJweFwiO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcbiAgfVxuXG4gIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgIHNldFRpbWVvdXQocmVuZGVyRmxvYXRpbmcsIDApO1xuICB9KTtcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4LmNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dChyZW5kZXJGbG9hdGluZywgMCk7XG4gIH0pO1xufVxuIn0%253D) - -#### Toolbars and Menus - -- [Add a custom sidebar item in menu](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiIsImpzIjoiUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgLyp0b29sYmFySXRlbXM6IFBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMucmVkdWNlKChhY2MsIGl0ZW0pID0%252BIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSBcInNpZGViYXItdGh1bWJuYWlsc1wiKSB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChbaXRlbSwgY3VzdG9tXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYy5jb25jYXQoW2l0ZW1dKTtcbiAgfSwgW10pKi9cbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gICAgY29uc3QgY3VzdG9tID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwibXktYnV0dG9uXCIsXG4gICAgdGl0bGU6IFwiU2hvdy9IaWRlXCIsXG4gICAgZHJvcGRvd25Hcm91cDogXCJzaWRlYmFyXCIsXG4gICAgb25QcmVzczogKGV2ZW50LCBpZCkgPT4ge1xuICAgICAgYWxlcnQoXCJjdXN0b20gYnV0dG9uIGFkZGVkXCIpXG4gICAgfSxcbiAgfTtcbiAgY29uc3QgdG9vbGJhckl0ZW1zID0gUFNQREZLaXQuZGVmYXVsdFRvb2xiYXJJdGVtcy5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtLnR5cGUgPT09IFwic2lkZWJhci10aHVtYm5haWxzXCIpIHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KFtpdGVtLCBjdXN0b21dKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjLmNvbmNhdChbaXRlbV0pO1xuICB9LCBbXSlcblxuaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKFsuLi50b29sYmFySXRlbXNdKVxuXG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - - Add a custom “Show/Hide” button next to the sidebar thumbnails in the toolbar that triggers an alert when clicked. — [Video](https://www.youtube.com/watch?v=9EY2C0Eadx8) - -- [Add a custom sidebar item with selected text](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJjb25zdCB7XG4gIEludGVyZmFjZXM6IEludGVyZmFjZXMsXG4gIGNyZWF0ZUJsb2NrOiBjcmVhdGVCbG9jayxcbiAgUmVjaXBlczogUmVjaXBlcyxcbiAgQ29yZTogQ29yZSxcbn0gPSBQU1BERktpdC5VSTtcbmZ1bmN0aW9uIGdlbmVyYXRlQ3VzdG9tVUkodGV4dCkge1xuICByZXR1cm4ge1xuICAgIFtQU1BERktpdC5VSUVsZW1lbnQuU2lkZWJhcl06IHtcbiAgICAgIFtQU1BERktpdC5TaWRlYmFyTW9kZS5DVVNUT01dOiAoeyBjb250YWluZXJOb2RlOiBjb250YWluZXJOb2RlIH0pID0%252BIHtcbiAgICAgICAgY29uc3QgZG9jaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIC8vIFNldCB0aGUgdGV4dCBjb250ZW50XG4gICAgICAgIC8vIFJldHVybiB0aGUgY3VzdG9tIFVJIG5vZGVcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoZG9jaS5pbm5lclRleHQgPSB0ZXh0KSxcbiAgICAgICAgICAvLyBBcHBseSBzdHlsZXNcbiAgICAgICAgICAoZG9jaS5zdHlsZS5jb2xvciA9IFwicmVkXCIpLFxuICAgICAgICAgIChkb2NpLnN0eWxlLmJhY2tncm91bmQgPSBcIndoaXRlXCIpLFxuICAgICAgICAgIChkb2NpLnN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkIGJsYWNrXCIpLCAvLyBCb3JkZXIgd2l0aCBjb2xvclxuICAgICAgICAgIChkb2NpLnN0eWxlLm1hcmdpbiA9IFwiMjBweFwiKSwgLy8gVW5pZm9ybSBtYXJnaW4gYXJvdW5kIHRoZSBlbGVtZW50XG4gICAgICAgICAgKGRvY2kuc3R5bGUucGFkZGluZyA9IFwiMTBweFwiKSwgLy8gUGFkZGluZyBpbnNpZGUgdGhlIGRpdlxuICAgICAgICAgIChkb2NpLnN0eWxlLnRleHRBbGlnbiA9IFwiY2VudGVyXCIpLCAvLyBBbGlnbiB0ZXh0IGluIHRoZSBjZW50ZXIgb2YgdGhlIGRpdlxuICAgICAgICAgIChkb2NpLnN0eWxlLmJvcmRlclJhZGl1cyA9IFwiOHB4XCIpLCAvLyBBZGQgcm91bmRlZCBjb3JuZXJzXG4gICAgICAgICAgLy9kb2NpLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiOyAvLyBJbmxpbmUtYmxvY2sgZm9yIG1pZGRsZSBhbGlnbm1lbnRcbiAgICAgICAgICAoZG9jaS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIiksIC8vIFRvIGFsbG93IHByZWNpc2UgcG9zaXRpb25pbmdcbiAgICAgICAgICAvL2RvY2kuc3R5bGUubGVmdCA9IFwiMTAlXCI7IC8vIEFsaWduIGhvcml6b250YWxseVxuICAgICAgICAgIC8vZG9jaS5zdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVgoLTUwJSlcIjsgLy8gQ2VudGVyLWFsaWduIGhvcml6b250YWxseVxuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgZGl2IHRvIHRoZSBjb250YWluZXJcbiAgICAgICAgICBjb250YWluZXJOb2RlLmFwcGVuZENoaWxkKGRvY2kpLFxuICAgICAgICAgIHsgbm9kZTogY29udGFpbmVyTm9kZSB9XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB1aToge1xuICAgIFtJbnRlcmZhY2VzLlByaW1hcnlUb29sYmFyXTogKHsgcHJvcHM6IHByb3BzLCBpbnN0YW5jZTogaW5zdGFuY2UgfSkgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IGNyZWF0ZUJsb2NrKFJlY2lwZXMuUHJpbWFyeVRvb2xiYXIsIHByb3BzLCAoeyB1aTogdWkgfSkgPT4ge1xuICAgICAgICBjb25zdCBzaWRlYmFyID0gdWkuZ2V0QmxvY2tCeUlkKFwic2lkZWJhclwiKTtcbiAgICAgICAgaWYgKHNpZGViYXIpIHtcbiAgICAgICAgICBjb25zdCBuZXdTaWRlYmFyID0gY3JlYXRlQmxvY2soQ29yZS5CdXR0b25TZWxlY3QsIHtcbiAgICAgICAgICAgIC4uLnNpZGViYXIucHJvcHMsXG4gICAgICAgICAgICBvblNlbGVjdGlvbkNoYW5nZTogKGtleSkgPT4ge1xuICAgICAgICAgICAgICBcInNpZGViYXItY3VzdG9tXCIgPT09IGtleVxuICAgICAgICAgICAgICAgID8gaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BXG4gICAgICAgICAgICAgICAgICAgIHZpZXdTdGF0ZS5zZXQoXCJzaWRlYmFyTW9kZVwiLCBQU1BERktpdC5TaWRlYmFyTW9kZS5DVVNUT00pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBzaWRlYmFyLnByb3BzLm9uU2VsZWN0aW9uQ2hhbmdlPy4oa2V5KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAuLi5zaWRlYmFyLnByb3BzLml0ZW1zLFxuICAgICAgICAgICAgICB7IGlkOiBcInNpZGViYXItY3VzdG9tXCIsIGxhYmVsOiBcIkN1c3RvbSBTaWRlYmFyXCIgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdWkucmVwbGFjZShcInNpZGViYXJcIiwgbmV3U2lkZWJhcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVpLmNyZWF0ZUNvbXBvbmVudCgpO1xuICAgICAgfSkuY3JlYXRlQ29tcG9uZW50KCksXG4gICAgfSksXG4gIH0sXG4gIGluaXRpYWxWaWV3U3RhdGU6IG5ldyBQU1BERktpdC5WaWV3U3RhdGUoe1xuICAgIHNpZGViYXJNb2RlOiBQU1BERktpdC5TaWRlYmFyTW9kZS5DVVNUT00sXG4gIH0pLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInRleHRTZWxlY3Rpb24uY2hhbmdlXCIsIGFzeW5jICh0ZXh0U2VsZWN0aW9uKSA9PiB7XG4gICAgaWYgKHRleHRTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCB0ZXh0U2VsZWN0aW9uLmdldFRleHQoKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiU2VsZWN0ZWQgdGV4dDpcIiwgdGV4dCksXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVGV4dCBsZW5ndGg6XCIsIHRleHQubGVuZ3RoKTtcbiAgICAgIC8vIEdlbmVyYXRlIGFuZCBhcHBseSBjdXN0b20gVUkgd2l0aCB0aGUgc2VsZWN0ZWQgdGV4dFxuICAgICAgY29uc3QgY3VzdG9tVUkgPSBnZW5lcmF0ZUN1c3RvbVVJKHRleHQpO1xuICAgICAgaW5zdGFuY2Uuc2V0Q3VzdG9tVUlDb25maWd1cmF0aW9uKGN1c3RvbVVJKTtcbiAgICB9IGVsc2UgY29uc29sZS5sb2coXCJObyB0ZXh0IGlzIHNlbGVjdGVkXCIpO1xuICB9KTtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - -- [Add a read checkmark to thumbnails](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLGluaXRpYWxWaWV3U3RhdGU6bmV3IFBTUERGS2l0LlZpZXdTdGF0ZSh7c2lkZWJhck1vZGU6J1RIVU1CTkFJTFMnfSl9KS50aGVuKChhc3luYyBpbnN0YW5jZT0%252Be2NvbnN0IGFubm90YXRpb249bmV3IFBTUERGS2l0LkFubm90YXRpb25zLlJlY3RhbmdsZUFubm90YXRpb24oe3BhZ2VJbmRleDowLGJvdW5kaW5nQm94Om5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHtsZWZ0OjEwLHRvcDoxMCx3aWR0aDoxMDAsaGVpZ2h0OjEwMH0pLGxvY2tlZDohMH0pO2luc3RhbmNlLmNyZWF0ZShhbm5vdGF0aW9uKTtjb25zdCByZWFkQ2hlY2ttYXJrPXBhZ2VJbmRleD0%252Be2NvbnN0IGN1cnJlbnRUaHVtYm5haWw9aW5zdGFuY2UuY29udGVudERvY3VtZW50LmdldFJvb3ROb2RlKCkucXVlcnlTZWxlY3RvcihgLlBTUERGS2l0LVNpZGViYXItVGh1bWJuYWlscy1QYWdlW2RhdGEtcGFnZS1pbmRleD1cIiR7cGFnZUluZGV4fVwiXWApO2N1cnJlbnRUaHVtYm5haWwucXVlcnlTZWxlY3RvcignLlRodW1ibmFpbC1Jcy1SZWFkJyl8fGN1cnJlbnRUaHVtYm5haWwuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywnPHNwYW4gY2xhc3M9XCJUaHVtYm5haWwtSXMtUmVhZFwiPjwvc3Bhbj4nKX07XG4vL2luaXQgZm9yIGN1cnJlbnQgcGFnZSBpbmRleFxucmVhZENoZWNrbWFyayhpbnN0YW5jZS52aWV3U3RhdGUuY3VycmVudFBhZ2VJbmRleCksaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcigndmlld1N0YXRlLmN1cnJlbnRQYWdlSW5kZXguY2hhbmdlJyxyZWFkQ2hlY2ttYXJrKX0pKTsiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLlBTUERGS2l0LUFubm90YXRpb24tRmxhZ3MtUG9wb3ZlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGN1cnNvcjogbm9uZTtcbn1cblxuLlRodW1ibmFpbC1Jcy1SZWFkIHtcbiAgY29udGVudDogdXJsKC9hc3NldHMvaW1hZ2VzL2ljb25zL21vbm8vY2hlY2ttYXJrLWM0MmIwZDUyLnN2Zyk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgcmlnaHQ6IDIyJTtcbiAgdG9wOiAxMSU7XG4gIG9wYWNpdHk6IDEgIWltcG9ydGFudDtcbn1cbiJ9) - -- [Custom button on redaction annotation toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiIvKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gZHJvcGRvd24gbWVudSBhbmQgY29uZmlndXJlcyBQU1BERktpdCB3aXRoIGEgbW9kaWZpZWQgdG9vbGJhclxuICogZm9yIHJlZGFjdGlvbiBhbm5vdGF0aW9ucy5cbiAqL1xuXG4vLyBDcmVhdGUgYSBkcm9wZG93biBtZW51IHdpdGggdXNlciBvcHRpb25zXG5jb25zdCBzZWxlY3ROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcbnNlbGVjdE5vZGUuaW5uZXJIVE1MID0gYFxuICAgIDxvcHRpb24gdmFsdWU9XCJhbGljZVwiPkFsaWNlPC9vcHRpb24%252BXG4gICAgPG9wdGlvbiB2YWx1ZT1cImJvYlwiPkJvYjwvb3B0aW9uPlxuICAgIDxvcHRpb24gdmFsdWU9XCJjYXJvbFwiPkNhcm9sPC9vcHRpb24%252BXG4gICAgPG9wdGlvbiB2YWx1ZT1cImpvaG5cIj5Kb2huPC9vcHRpb24%252BXG5gO1xuXG4vLyBBZGRlZCBzdHlsZSB0byBzZWxlY3QgYW5kIHBhcmVudCBlbGVtZW50IGluIENTUyB0YWIgdG8gdGFrZSB1cCB0aGUgZnVsbCBoZWlnaHRcblxuLy8gQWRkIGNoYW5nZSBldmVudCBsaXN0ZW5lciB0byBsb2cgc2VsZWN0ZWQgdmFsdWVzXG5zZWxlY3ROb2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKGV2ZW50KSA9PiB7XG4gIGNvbnNvbGUubG9nKGBTZWxlY3RlZCBvcHRpb246ICR7ZXZlbnQudGFyZ2V0LnZhbHVlfWApO1xuICBhbGVydChgU2VsZWN0ZWQgb3B0aW9uOiAke2V2ZW50LnRhcmdldC52YWx1ZX1gKTtcbn0pO1xuXG4vLyBEZWZpbmUgY3VzdG9tIHRvb2xiYXIgaXRlbSBjb25maWd1cmF0aW9uXG5jb25zdCBjdXN0b21Ub29sYmFySXRlbSA9IHtcbiAgdHlwZTogXCJjdXN0b21cIixcbiAgaWQ6IFwibXktYnV0dG9uXCIsXG4gIHRpdGxlOiBcIk15IEJ1dHRvblwiLFxuICBub2RlOiBzZWxlY3ROb2RlLFxuICBvblByZXNzOiAoZXZlbnQpID0%252BIHtcbiAgICBjb25zb2xlLmxvZyhcImhlbGxvIGZyb20gbXkgYnV0dG9uXCIpO1xuICB9LFxufTtcblxuLy8gSW5pdGlhbGl6ZSBQU1BERktpdCB3aXRoIGN1c3RvbSB0b29sYmFyIGNvbmZpZ3VyYXRpb25cblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG5cbiAgLy8gQ3VzdG9tIHRvb2xiYXIgY29uZmlndXJhdGlvbiBmb3IgYW5ub3RhdGlvbnNcbiAgYW5ub3RhdGlvblRvb2xiYXJJdGVtczogKGFubm90YXRpb24sIHsgZGVmYXVsdEFubm90YXRpb25Ub29sYmFySXRlbXMgfSkgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBhbm5vdGF0aW9uIGlzIGEgcmVkYWN0aW9uXG4gICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5SZWRhY3Rpb25Bbm5vdGF0aW9uKSB7XG4gICAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgXCJhcHBseS1yZWRhY3Rpb25zXCIgYnV0dG9uXG4gICAgICBjb25zdCBhcHBseVJlZGFjdGlvbnNJbmRleCA9IGRlZmF1bHRBbm5vdGF0aW9uVG9vbGJhckl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgKGl0ZW0pID0%252BIGl0ZW0udHlwZSA9PT0gXCJhcHBseS1yZWRhY3Rpb25zXCJcbiAgICAgICk7XG5cbiAgICAgIC8vIEluc2VydCBjdXN0b20gYnV0dG9uIGFmdGVyIHRoZSBcImFwcGx5LXJlZGFjdGlvbnNcIiBidXR0b25cbiAgICAgIGRlZmF1bHRBbm5vdGF0aW9uVG9vbGJhckl0ZW1zLnNwbGljZShcbiAgICAgICAgYXBwbHlSZWRhY3Rpb25zSW5kZXggKyAxLFxuICAgICAgICAwLFxuICAgICAgICBjdXN0b21Ub29sYmFySXRlbVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGRlZmF1bHRBbm5vdGF0aW9uVG9vbGJhckl0ZW1zO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBkZWZhdWx0IHRvb2xiYXIgaXRlbXMgZm9yIG5vbi1yZWRhY3Rpb24gYW5ub3RhdGlvbnNcbiAgICByZXR1cm4gZGVmYXVsdEFubm90YXRpb25Ub29sYmFySXRlbXM7XG4gIH0sXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAvLyBMb2cgc3VjY2VzcyBtZXNzYWdlcyBhbmQgZG9jdW1lbnRhdGlvbiBsaW5rc1xuICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZGl2W3RpdGxlPSdNeSBCdXR0b24nXVwiKTtcbiAgY29uc29sZS5sb2coXCJQU1BERktpdCBsb2FkZWQhXCIpO1xuICBjb25zb2xlLmxvZyhcIkFQSSBkb2NzOiBodHRwczovL251dHJpZW50LmlvL2FwaS93ZWIvXCIpO1xuICBjb25zb2xlLmxvZyhcIkd1aWRlczogaHR0cHM6Ly9udXRyaWVudC5pby9ndWlkZXMvd2ViL1wiKTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuZGl2W3RpdGxlPVwiTXkgQnV0dG9uXCJdIHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG5kaXZbdGl0bGU9XCJNeSBCdXR0b25cIl0gc2VsZWN0IHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuIn0%253D) - - Add a custom dropdown menu to the redaction annotation toolbar that logs the selected name when changed. — [Video](https://www.youtube.com/watch?v=XH7GJM9yMnw) - -- [Add link, highlight, and underline annotations](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tWmFpZTY0V0M5dCIsImxheWVyIjoicmFuZG9tNE02M1BlUWNZNiJ9fSwianMiOiIvLyBDb25maWd1cmVzIFBTUERGS2l0IHdpdGggYSBjdXN0b20gbGluayBhbm5vdGF0aW9uIHRvb2wgdGhhdCBjcmVhdGVzIGEgaGlnaGxpZ2h0ZWQsIHVuZGVybGluZWQsIGNsaWNrYWJsZSBsaW5rIGZyb20gc2VsZWN0ZWQgdGV4dFxuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gQ3JlYXRlIGN1c3RvbSB0b29sYmFyIGJ1dHRvbiBlbGVtZW50XG4gIGNvbnN0IGJ1dHRvbk5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBidXR0b25Ob2RlLmlubmVySFRNTCA9IGBcbiAgICA8YnV0dG9uIFxuICAgICAgY2xhc3M9XCJQU1BERktpdC04ZWhjYmh6MjQxejF0Znloanp0YmUxMnViZSBQU1BERktpdC01aHF2cGdjZ3BmMTc2OWNuMzVkdnRnNGt0eiBcbiAgICAgICAgUFNQREZLaXQtVG9vbGJhci1CdXR0b24tTGluay1Bbm5vdGF0aW9uIFBTUERGS2l0LXl6cGZ6dzliZmQ5ZWpwMWs3a2dkYWN1N2QgXG4gICAgICAgIFBTUERGS2l0LVRvb2xiYXItQnV0dG9uIFBTUERGS2l0LVRvb2wtQnV0dG9uXCJcbiAgICAgIHRpdGxlPVwiTGlua1wiXG4gICAgICBhcmlhLWxhYmVsPVwiTGlua1wiXG4gICAgICBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCI%252BXG4gICAgICA8c3BhbiBjbGFzcz1cIlBTUERGS2l0LTZlZWtteDJyM3J6cG40OTU1N3ZkdDJlNXRqIFBTUERGS2l0LVRvb2wtQnV0dG9uLUljb24gXG4gICAgICAgIFBTUERGS2l0LVRvb2xiYXItQnV0dG9uLUljb24gUFNQREZLaXQtSWNvbiBQU1BERktpdC1JY29uLUxpbmtcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjI1XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI1IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTE0LjEyMTkgMTAuNTlDMTQuNDQ4MiAxMC45MTQzIDE0LjcwNzEgMTEuMjk5OSAxNC44ODM3IDExLjcyNDdDMTUuMDYwNCAxMi4xNDk0IDE1LjE1MTMgMTIuNjA0OSAxNS4xNTEzIDEzLjA2NUMxNS4xNTEzIDEzLjUyNSAxNS4wNjA0IDEzLjk4MDUgMTQuODgzNyAxNC40MDUyQzE0LjcwNzEgMTQuODMgMTQuNDQ4MiAxNS4yMTU2IDE0LjEyMTkgMTUuNTRMMTAuNTkxOSAxOS4wN0MxMC4yNjY4IDE5LjQwMzggOS44NzgwMSAxOS42NjkxIDkuNDQ4NjQgMTkuODUwM0M5LjAxOTI3IDIwLjAzMTUgOC41NTc5NiAyMC4xMjQ4IDguMDkxOTMgMjAuMTI0OEM3LjYyNTkgMjAuMTI0OCA3LjE2NDU5IDIwLjAzMTUgNi43MzUyMiAxOS44NTAzQzYuMzA1ODUgMTkuNjY5MSA1LjkxNzExIDE5LjQwMzggNS41OTE5MyAxOS4wN0M1LjI1ODEgMTguNzQ0OCA0Ljk5Mjc3IDE4LjM1NiA0LjgxMTYxIDE3LjkyNjdDNC42MzA0NSAxNy40OTczIDQuNTM3MTEgMTcuMDM2IDQuNTM3MTEgMTYuNTdDNC41MzcxMSAxNi4xMDM5IDQuNjMwNDUgMTUuNjQyNiA0LjgxMTYxIDE1LjIxMzNDNC45OTI3NyAxNC43ODM5IDUuMjU4MSAxNC4zOTUxIDUuNTkxOTMgMTQuMDdMNy40MTE5MyAxMi4zNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD5cbiAgICAgICAgICA8cGF0aCBkPVwiTTExLjMwMTkgMTMuNDA5OUMxMC45NzU2IDEzLjA4NTYgMTAuNzE2NyAxMi43IDEwLjU0MDEgMTIuMjc1MkMxMC4zNjM0IDExLjg1MDUgMTAuMjcyNSAxMS4zOTUgMTAuMjcyNSAxMC45MzQ5QzEwLjI3MjUgMTAuNDc0OSAxMC4zNjM0IDEwLjAxOTQgMTAuNTQwMSA5LjU5NDY3QzEwLjcxNjcgOS4xNjk5MiAxMC45NzU2IDguNzg0MjggMTEuMzAxOSA4LjQ1OTk0TDE0LjgzMTkgNC45Mjk5NEMxNS4xNTcxIDQuNTk2MTEgMTUuNTQ1OCA0LjMzMDc5IDE1Ljk3NTIgNC4xNDk2MkMxNi40MDQ1IDMuOTY4NDYgMTYuODY1OCAzLjg3NTEyIDE3LjMzMTkgMy44NzUxMkMxNy43OTc5IDMuODc1MTIgMTguMjU5MiAzLjk2ODQ2IDE4LjY4ODYgNC4xNDk2MkMxOS4xMTggNC4zMzA3OSAxOS41MDY3IDQuNTk2MTEgMTkuODMxOSA0LjkyOTk0QzIwLjE2NTcgNS4yNTUxMiAyMC40MzEgNS42NDM4NiAyMC42MTIyIDYuMDczMjNDMjAuNzkzNCA2LjUwMjYxIDIwLjg4NjcgNi45NjM5MSAyMC44ODY3IDcuNDI5OTRDMjAuODg2NyA3Ljg5NTk3IDIwLjc5MzQgOC4zNTcyOCAyMC42MTIyIDguNzg2NjVDMjAuNDMxIDkuMjE2MDMgMjAuMTY1NyA5LjYwNDc3IDE5LjgzMTkgOS45Mjk5NEwxOC4wMTE5IDExLjY0OTlcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48L3BhdGg%252BXG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvYnV0dG9uPmA7XG5cbiAgLy8gRGVmaW5lIGN1c3RvbSB0b29sYmFyIGl0ZW0gZm9yIGNyZWF0aW5nIGxpbmtlZCBoaWdobGlnaHRzXG4gIGNvbnN0IGhpZ2hsaWdodFdpdGhMaW5rID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwiaGlnaGxpZ2h0LWxpbmtcIixcbiAgICB0aXRsZTogXCJMaW5rXCIsXG4gICAgbm9kZTogYnV0dG9uTm9kZSxcbiAgICBvblByZXNzOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBHZXQgdGV4dCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IGluc3RhbmNlLmdldFRleHRTZWxlY3Rpb24oKTtcbiAgICAgIGNvbnN0IHsgZ2V0U2VsZWN0ZWRSZWN0c1BlclBhZ2UsIHN0YXJ0UGFnZUluZGV4IH0gPSBzZWxlY3RlZFRleHQ7XG5cbiAgICAgIC8vIEdldCByZWN0YW5nbGVzIGZvciBzZWxlY3RlZCB0ZXh0XG4gICAgICBjb25zdCBmaXJzdFBhZ2VTZWxlY3Rpb24gPSAoYXdhaXQgZ2V0U2VsZWN0ZWRSZWN0c1BlclBhZ2UoKSkuZ2V0KDApO1xuICAgICAgY29uc3QgeyByZWN0cywgcGFnZUluZGV4IH0gPSBmaXJzdFBhZ2VTZWxlY3Rpb247XG5cbiAgICAgIC8vIENyZWF0ZSBhZGp1c3RlZCByZWN0YW5nbGVzIGZvciBoaWdobGlnaHRcbiAgICAgIGNvbnN0IGhpZ2hsaWdodFJlY3RzID0gcmVjdHMubWFwKChyZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkUmVjdCA9IHJlY3QudHJhbnNsYXRlWSgtNSk7XG4gICAgICAgIHJldHVybiBhZGp1c3RlZFJlY3RcbiAgICAgICAgICAuc2V0KFwiaGVpZ2h0XCIsIHJlY3QuaGVpZ2h0IC0gMTApXG4gICAgICAgICAgLnNldChcInRvcFwiLCByZWN0LnRvcCArIDgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhZGp1c3RlZCByZWN0YW5nbGVzIGZvciB1bmRlcmxpbmVcbiAgICAgIGNvbnN0IHVuZGVybGluZVJlY3RzID0gcmVjdHMubWFwKChyZWN0KSA9PiB7XG4gICAgICAgIC8vIGFkanVzdCB0aGUgWSBwb3NpdGlvbiBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gY29uc3QgYWRqdXN0ZWRSZWN0ID0gcmVjdC50cmFuc2xhdGVZKC0zKTtcbiAgICAgICAgcmV0dXJuIHJlY3Quc2V0KFwiaGVpZ2h0XCIsIHJlY3QuaGVpZ2h0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgaGlnaGxpZ2h0XG4gICAgICBjb25zdCBoaWdobGlnaHQgPSBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuSGlnaGxpZ2h0QW5ub3RhdGlvbih7XG4gICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4LFxuICAgICAgICByZWN0czogaGlnaGxpZ2h0UmVjdHMsXG4gICAgICAgIGJvdW5kaW5nQm94OiBQU1BERktpdC5HZW9tZXRyeS5SZWN0LnVuaW9uKHJlY3RzKSxcbiAgICAgICAgY29sb3I6IFBTUERGS2l0LkNvbG9yLllFTExPVyxcbiAgICAgICAgYmxlbmRNb2RlOiBcIm11bHRpcGx5XCIsXG4gICAgICAgIG9wYWNpdHk6IDAuNSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgdW5kZXJsaW5lXG4gICAgICBjb25zdCB1bmRlcmxpbmUgPSBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuVW5kZXJsaW5lQW5ub3RhdGlvbih7XG4gICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4LFxuICAgICAgICByZWN0czogdW5kZXJsaW5lUmVjdHMsXG4gICAgICAgIGJvdW5kaW5nQm94OiBQU1BERktpdC5HZW9tZXRyeS5SZWN0LnVuaW9uKHJlY3RzKSxcbiAgICAgICAgY29sb3I6IFBTUERGS2l0LkNvbG9yLkJMVUUsXG4gICAgICAgIGJsZW5kTW9kZTogXCJtdWx0aXBseVwiLFxuICAgICAgICBvcGFjaXR5OiAwLjksXG4gICAgICB9KTtcblxuICAgICAgLy8gQ3JlYXRlIGxpbmtcbiAgICAgIGNvbnN0IGxpbmtBbm5vdGF0aW9uID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLkxpbmtBbm5vdGF0aW9uKHtcbiAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgIGJvdW5kaW5nQm94OiBQU1BERktpdC5HZW9tZXRyeS5SZWN0LnVuaW9uKHJlY3RzKSxcbiAgICAgICAgYWN0aW9uOiBuZXcgUFNQREZLaXQuQWN0aW9ucy5VUklBY3Rpb24oe1xuICAgICAgICAgIHVyaTogXCJodHRwczovL251dHJpZW50LmlvXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBib3JkZXJDb2xvcjogUFNQREZLaXQuQ29sb3IuVFJBTlNQQVJFTlQsXG4gICAgICAgIGJsZW5kTW9kZTogXCJtdWx0aXBseVwiLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhbGwgYW5ub3RhdGlvbnNcbiAgICAgIGF3YWl0IGluc3RhbmNlLmNyZWF0ZShbbGlua0Fubm90YXRpb24sIHVuZGVybGluZSwgaGlnaGxpZ2h0XSk7XG4gICAgfSxcbiAgfTtcblxuICAvLyBBZGQgY3VzdG9tdG9vbCB0byB0aGUgaW5saW5lIHRleHQgc2VsZWN0aW9uIHRvb2xiYXJcbiAgaW5zdGFuY2Uuc2V0SW5saW5lVGV4dFNlbGVjdGlvblRvb2xiYXJJdGVtcygodG9vbGJhck9wdGlvbnMsIHNlbGVjdGlvbikgPT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdEl0ZW1zLCBoYXNEZXNrdG9wTGF5b3V0IH0gPSB0b29sYmFyT3B0aW9ucztcbiAgICByZXR1cm4gWy4uLmRlZmF1bHRJdGVtcywgaGlnaGxpZ2h0V2l0aExpbmtdO1xuICB9KTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - - Add a custom toolbar button that, when clicked, highlights the selected text, underlines it, and attaches a link. — [Video](https://www.youtube.com/watch?v=e5X0KPGwFPI) - -- [Rotate PDF pages with custom toolbar buttons](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6Ii8vIExvYWQgUFNQREZLaXQgd2l0aCBzcGVjaWZpYyBjb25maWd1cmF0aW9uc1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgdG9vbGJhckl0ZW1zOiBbeyB0eXBlOiBcImxheW91dC1jb25maWdcIiB9LCB7IHR5cGU6IFwiZXhwb3J0LXBkZlwiIH1dLCAvLyBEZWZpbmUgdG9vbGJhciBpdGVtcyBpbmNsdWRpbmcgbGF5b3V0IGNvbmZpZyBhbmQgZXhwb3J0IFBERlxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gQ2FsbGJhY2sgZnVuY3Rpb24gZXhlY3V0ZWQgYWZ0ZXIgUFNQREZLaXQgaGFzIHN1Y2Nlc3NmdWxseSBsb2FkZWRcbiAgY29uc29sZS5sb2coXCJQU1BERktpdCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7IC8vIExvZyBhIG1lc3NhZ2UgdG8gaW5kaWNhdGUgc3VjY2Vzc2Z1bCBsb2FkaW5nXG5cbiAgLy8gRGVmaW5lIGEgY3VzdG9tIHRvb2xiYXIgYnV0dG9uIGZvciByb3RhdGluZyB0aGUgcGFnZSBjb3VudGVyY2xvY2t3aXNlXG4gIGNvbnN0IGl0ZW1fMSA9IHtcbiAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgIGlkOiBcIkFudGlDbG9ja3dpc2VcIixcbiAgICB0aXRsZTogXCJBbnRpQ2xvY2t3aXNlXCIsIC8vIEJ1dHRvbiB0aXRsZVxuICAgIGljb246IGA8c3BhbiBjbGFzcz1cIlBTUERGS2l0LTQ0MW1xNm0yZXdkNzZ2ZWU5NXY5ZnI3bXkyIFBTUERGS2l0LUxheW91dC1Db25maWctT3B0aW9uLVBhZ2UtUm90YXRpb24tTGVmdCBQU1BERktpdC1MYXlvdXQtQ29uZmlnLU9wdGlvblwiIHRpdGxlPVwiUm90YXRlIExlZnRcIiBhcmlhLWxhYmVsPVwiUm90YXRlIExlZnRcIiBpZD1cImRvd25zaGlmdC01LWl0ZW0tNVwiIHJvbGU9XCJvcHRpb25cIiBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcIj48c3BhbiBjbGFzcz1cIlBTUERGS2l0LTZlZWtteDJyM3J6cG40OTU1N3ZkdDJlNXRqIFBTUERGS2l0LTZmN3NhcnA3dHNhN3VtbjRmOTJ3dmoxYmZ2IFBTUERGS2l0LUxheW91dC1Db25maWctT3B0aW9uLUljb24gUFNQREZLaXQtSWNvbiBQU1BERktpdC1JY29uLUxheW91dENvbmZpZ1ZpZXdSb3RhdGVMZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMzZweDsgaGVpZ2h0OiAzNnB4O1wiPjxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZvY3VzYWJsZT1cImZhbHNlXCI%252BPHJlY3Qgb3BhY2l0eT1cIi4xNVwiIHk9XCIxXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjIyXCIgcng9XCIxLjI1XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcmVjdD48cmVjdCBvcGFjaXR5PVwiLjE1XCIgeD1cIi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMjNcIiBoZWlnaHQ9XCIyMVwiIHJ4PVwiLjc1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCI%252BPC9yZWN0PjxwYXRoIGQ9XCJNOSA2LjY1bDIuNDE1LTIuNDE1YS4wNS4wNSAwIDAgMSAuMDg1LjAzNnY0Ljc1OGEuMDUuMDUgMCAwIDEtLjA4NS4wMzZMOSA2LjY1elwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI%252BPC9wYXRoPjxwYXRoIGQ9XCJNMTIgMTkuNWE2LjUgNi41IDAgMSAwIDAtMTNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVwiLjY2XCIgZD1cIk04LjY0MSAxOC41NjZhNi41MzIgNi41MzIgMCAwIDEtMi4yMTQtMi4yMTlcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVwiLjMzXCIgZD1cIk01LjUgMTNjMC0uODg0LjE3Ni0xLjcyNi40OTYtMi40OTRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD48L3N2Zz48L3NwYW4%252BPC9zcGFuPmAsXG4gICAgb25QcmVzczogKGV2ZW50KSA9PiB7XG4gICAgICBpbnN0YW5jZS5hcHBseU9wZXJhdGlvbnMoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJyb3RhdGVQYWdlc1wiLCAvLyBSb3RhdGlvbiBvcGVyYXRpb25cbiAgICAgICAgICBwYWdlSW5kZXhlczogW2luc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4XSwgLy8gVGFyZ2V0IHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgICAgICByb3RhdGVCeTogLTkwLCAvLyBSb3RhdGUgY291bnRlcmNsb2Nrd2lzZSBieSA5MCBkZWdyZWVzXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGl0ZW1fMiA9IHtcbiAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgIGlkOiBcIkNsb2Nrd2lzZVwiLFxuICAgIHRpdGxlOiBcIkNsb2Nrd2lzZVwiLCAvLyBCdXR0b24gdGl0bGVcbiAgICBpY29uOiBgPHNwYW4gY2xhc3M9XCJQU1BERktpdC00NDFtcTZtMmV3ZDc2dmVlOTV2OWZyN215MiBQU1BERktpdC1MYXlvdXQtQ29uZmlnLU9wdGlvbi1QYWdlLVJvdGF0aW9uLVJpZ2h0IFBTUERGS2l0LUxheW91dC1Db25maWctT3B0aW9uXCIgdGl0bGU9XCJSb3RhdGUgUmlnaHRcIiBhcmlhLWxhYmVsPVwiUm90YXRlIFJpZ2h0XCIgaWQ9XCJkb3duc2hpZnQtNS1pdGVtLTZcIiByb2xlPVwib3B0aW9uXCIgYXJpYS1zZWxlY3RlZD1cImZhbHNlXCI%252BPHNwYW4gY2xhc3M9XCJQU1BERktpdC02ZWVrbXgycjNyenBuNDk1NTd2ZHQyZTV0aiBQU1BERktpdC02ZjdzYXJwN3RzYTd1bW40Zjkyd3ZqMWJmdiBQU1BERktpdC1MYXlvdXQtQ29uZmlnLU9wdGlvbi1JY29uIFBTUERGS2l0LUljb24gUFNQREZLaXQtSWNvbi1MYXlvdXRDb25maWdWaWV3Um90YXRlUmlnaHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cIndpZHRoOiAzNnB4OyBoZWlnaHQ6IDM2cHg7XCI%252BPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj48cmVjdCBvcGFjaXR5PVwiLjE1XCIgeT1cIjFcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEuMjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCI%252BPC9yZWN0PjxyZWN0IG9wYWNpdHk9XCIuMTVcIiB4PVwiLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIyM1wiIGhlaWdodD1cIjIxXCIgcng9XCIuNzVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIj48L3JlY3Q%252BPHBhdGggZD1cIk0xNSA2LjY1bC0yLjQxNS0yLjQxNWEuMDUuMDUgMCAwIDAtLjA4NS4wMzZ2NC43NThhLjA1LjA1IDAgMCAwIC4wODUuMDM2TDE1IDYuNjV6XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48L3BhdGg%252BPHBhdGggZD1cIk0xMiAxOS41YTYuNSA2LjUgMCAxIDEgMC0xM1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI%252BPC9wYXRoPjxwYXRoIG9wYWNpdHk9XCIuNjZcIiBkPVwiTTE1LjM1OSAxOC41NjZhNi41MzIgNi41MzIgMCAwIDAgMi4yMTQtMi4yMTlcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVwiLjMzXCIgZD1cIk0xOC41IDEzYTYuNDggNi40OCAwIDAgMC0uNDk2LTIuNDk0XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48L3BhdGg%252BPC9zdmc%252BPC9zcGFuPjwvc3Bhbj5gLFxuICAgIG9uUHJlc3M6IChldmVudCkgPT4ge1xuICAgICAgaW5zdGFuY2UuYXBwbHlPcGVyYXRpb25zKFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwicm90YXRlUGFnZXNcIiwgLy8gUm90YXRpb24gb3BlcmF0aW9uXG4gICAgICAgICAgcGFnZUluZGV4ZXM6IFtpbnN0YW5jZS52aWV3U3RhdGUuY3VycmVudFBhZ2VJbmRleF0sIC8vIFRhcmdldCB0aGUgY3VycmVudCBwYWdlXG4gICAgICAgICAgcm90YXRlQnk6IDkwLCAvLyBSb3RhdGUgY2xvY2t3aXNlIGJ5IDkwIGRlZ3JlZXNcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0sXG4gIH07XG5cbiAgLy8gQWRkIHRoZSBjdXN0b20gdG9vbGJhciBidXR0b25zIHRvIHRoZSBleGlzdGluZyB0b29sYmFyIGl0ZW1zXG4gIGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcygoaXRlbXMpID0%252BIHtcbiAgICBpdGVtcy5wdXNoKGl0ZW1fMSwgaXRlbV8yKTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH0pO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIGZvciBkb2N1bWVudCBjaGFuZ2Ugb3BlcmF0aW9uc1xuICBpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKFwiZG9jdW1lbnQuY2hhbmdlXCIsIChvcGVyYXRpb25zKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJEb2N1bWVudCBjaGFuZ2VkOlwiLCAuLi5vcGVyYXRpb25zKTsgLy8gTG9nIGRvY3VtZW50IG1vZGlmaWNhdGlvbnNcbiAgfSk7XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - - Add custom buttons in the toolbar to help rotate the current page clockwise or counterclockwise, while also logging any document changes. — [Video](https://www.youtube.com/watch?v=z51KF9KUzQI) - -- [Add redaction annotation to the annotation sidebar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwibW9kZSI6InN0YW5kYWxvbmUiLCJqcyI6Ii8vIFRoaXMgcGxheWdyb3VuZCBhZGRzIHJlZGFjdGlvbiBhbm5vdGF0aW9uIHN1cHBvcnQgYW5kIGEgdGV4dCByZWRhY3Rpb24gdG9vbC5cbi8vIE1hcmsgaXRlbXMgZm9yIHJlZGFjdGlvbiwgdGhlbiBvcGVuIHRoZSBBbm5vdGF0aW9ucyBzaWRlYmFyIHRvIHNlZSBhbmQgbmF2aWdhdGUgdG8gdGhlbSBieSBjbGlja2luZyBvbiB0aGVtXG5cblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG5cbiAgLy8gQ29uZmlndXJlIGluaXRpYWwgdmlldyBzdGF0ZSB3aXRoIGN1c3RvbSBzaWRlYmFyIG9wdGlvbnNcbiAgaW5pdGlhbFZpZXdTdGF0ZTogbmV3IFBTUERGS2l0LlZpZXdTdGF0ZSh7XG4gICAgc2lkZWJhck9wdGlvbnM6IHtcbiAgICAgIC8vIENvbmZpZ3VyZSBhbm5vdGF0aW9uIHNpZGViYXIgbW9kZVxuICAgICAgW1BTUERGS2l0LlNpZGViYXJNb2RlLkFOTk9UQVRJT05TXToge1xuICAgICAgICAvLyBJbmNsdWRlIGRlZmF1bHQgYW5ub3RhdGlvbiB0eXBlcyBwbHVzIHJlZGFjdGlvbiBhbm5vdGF0aW9uc1xuICAgICAgICBpbmNsdWRlQ29udGVudDogW1xuICAgICAgICAgIC4uLlBTUERGS2l0LmRlZmF1bHRBbm5vdGF0aW9uc1NpZGViYXJDb250ZW50LFxuICAgICAgICAgIFBTUERGS2l0LkFubm90YXRpb25zLlJlZGFjdGlvbkFubm90YXRpb24sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gQWRkIHJlZGFjdGlvbiB0ZXh0IGhpZ2hsaWdodGVyIHRvb2wgdG8gdGhlIHRvb2xiYXJcbiAgaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcykgPT4gW1xuICAgIC4uLml0ZW1zLFxuICAgIHsgdHlwZTogXCJyZWRhY3QtdGV4dC1oaWdobGlnaHRlclwiIH0sXG4gIF0pO1xuXG4gIC8vIExvZyBzdWNjZXNzIGFuZCBkb2N1bWVudGF0aW9uIGxpbmtzXG4gIGNvbnNvbGUubG9nKFwiUFNQREZLaXQgbG9hZGVkIVwiKTtcbiAgY29uc29sZS5sb2coXCJBUEkgZG9jczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vYXBpL3dlYi9cIik7XG4gIGNvbnNvbGUubG9nKFwiR3VpZGVzOiBodHRwczovL3BzcGRma2l0LmNvbS9ndWlkZXMvd2ViL1wiKTtcbn0pO1xuIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) - - Add redaction annotations to the sidebar view and append a redaction highlighter button to the toolbar. — [Video](https://www.youtube.com/watch?v=82cuTLHsKO8) - -- [Persistent line drawing mode with toggle via a custom toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiIvLyBEZWNsYXJlIGluc3RhbmNlIHZhcmlhYmxlIGZvciBQU1BERktpdFxubGV0IGluc3RhbmNlO1xuXG4vLyBUcmFjayB3aGV0aGVyIGxpbmUgY3JlYXRpb24gbW9kZSBpcyBlbmFibGVkXG5sZXQgaXNMaW5lQ3JlYXRpb25FbmFibGVkID0gZmFsc2U7XG5cbi8vIEN1c3RvbSB0b29sYmFyIGl0ZW0gZm9yIGFkZGluZyBjb250aW51b3VzIGxpbmUgYW5ub3RhdGlvbnNcbmNvbnN0IGxpbmVUb29sSXRlbSA9IHtcbiAgdHlwZTogXCJjdXN0b21cIixcbiAgaWQ6IFwiTGluZVRvb2xcIixcbiAgdGl0bGU6IFwiQWRkIExpbmVcIixcbiAgc2VsZWN0ZWQ6IGlzTGluZUNyZWF0aW9uRW5hYmxlZCxcbiAgb25QcmVzcygpIHtcbiAgICBpZiAoaXNMaW5lQ3JlYXRpb25FbmFibGVkKSB7XG4gICAgICAvLyBEZWFjdGl2YXRlIGxpbmUgY3JlYXRpb24gbW9kZVxuICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BXG4gICAgICAgIHZpZXdTdGF0ZS5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgbnVsbClcbiAgICAgICk7XG4gICAgICBpc0xpbmVDcmVhdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWN0aXZhdGUgbGluZSBjcmVhdGlvbiBtb2RlIGltbWVkaWF0ZWx5XG4gICAgICBpbnN0YW5jZS5zZXRWaWV3U3RhdGUoKHZpZXdTdGF0ZSkgPT5cbiAgICAgICAgdmlld1N0YXRlLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuU0hBUEVfTElORSlcbiAgICAgICk7XG4gICAgICBpc0xpbmVDcmVhdGlvbkVuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0b29sYmFyIGl0ZW0gc3RhdGVcbiAgICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoKGl0ZW1zKSA9PlxuICAgICAgaXRlbXMubWFwKChpdGVtKSA9PlxuICAgICAgICBpdGVtLmlkID09PSBcIkxpbmVUb29sXCJcbiAgICAgICAgICA%252FIHsgLi4uaXRlbSwgc2VsZWN0ZWQ6IGlzTGluZUNyZWF0aW9uRW5hYmxlZCB9XG4gICAgICAgICAgOiBpdGVtXG4gICAgICApXG4gICAgKTtcbiAgfSxcbn07XG5cbi8vIExvYWQgUFNQREZLaXQgKE51dHJpZW50IFdlYiBTREspXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIGVuYWJsZUhpc3Rvcnk6IHRydWUsXG4gIHRvb2xiYXJJdGVtczogUFNQREZLaXQuZGVmYXVsdFRvb2xiYXJJdGVtcy5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtLnR5cGUgPT09IFwic3BhY2VyXCIpIHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KFtpdGVtLCB7IHR5cGU6IFwidW5kb1wiIH0sIHsgdHlwZTogXCJyZWRvXCIgfV0pO1xuICAgIH1cbiAgICBpZiAoaXRlbS50eXBlID09PSBcImV4cG9ydC1wZGZcIikge1xuICAgICAgcmV0dXJuIGFjYy5jb25jYXQoW2l0ZW0sIGxpbmVUb29sSXRlbV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChbaXRlbV0pO1xuICAgIH1cbiAgfSwgW10pLFxufSkudGhlbigoX2luc3RhbmNlKSA9PiB7XG4gIGluc3RhbmNlID0gX2luc3RhbmNlO1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCB3aXRoIGNvbnRpbnVvdXMgbGluZSBhbm5vdGF0aW9uLiAtIEJ5IE5hcmFzaGltYW5cIik7XG5cbiAgLy8gUmUtZW5hYmxlIGludGVyYWN0aW9uIG1vZGUgYXV0b21hdGljYWxseSBhZnRlciBhbm5vdGF0aW9uIGNyZWF0aW9uXG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbm5vdGF0aW9ucy5jcmVhdGVcIiwgKGFubm90YXRpb25zKSA9PiB7XG4gICAgaWYgKCFpc0xpbmVDcmVhdGlvbkVuYWJsZWQpIHJldHVybjtcblxuICAgIGNvbnN0IGxpbmVDcmVhdGVkID0gYW5ub3RhdGlvbnMuc29tZShcbiAgICAgIChhbm5vdCkgPT4gYW5ub3QgaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5MaW5lQW5ub3RhdGlvblxuICAgICk7XG5cbiAgICBpZiAobGluZUNyZWF0ZWQpIHtcbiAgICAgIC8vIFNsaWdodCBkZWxheSBlbnN1cmVzIGludGVybmFsIHJlc2V0IGNvbXBsZXRlc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgICAgICAgIHZpZXdTdGF0ZS5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLlNIQVBFX0xJTkUpXG4gICAgICAgICk7XG4gICAgICB9LCA1MCk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - -- [Persistent text annotation mode via a custom toolbar toggle](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiIvLyBEZWNsYXJlIHRoZSBpbnN0YW5jZSB2YXJpYWJsZSBmb3IgUFNQREZLaXRcbmxldCBpbnN0YW5jZTtcblxuLy8gVHJhY2sgaWYgdGV4dCBhbm5vdGF0aW9uIGNvbnRpbnVvdXMgbW9kZSBpcyBhY3RpdmVcbmxldCBpc1RleHRDcmVhdGlvbkVuYWJsZWQgPSBmYWxzZTtcblxuLy8gQ3VzdG9tIHRvb2xiYXIgaXRlbSB0byB0b2dnbGUgY29udGludW91cyBUZXh0QW5ub3RhdGlvbiBtb2RlXG5jb25zdCB0ZXh0VG9vbEl0ZW0gPSB7XG4gIHR5cGU6IFwiY3VzdG9tXCIsXG4gIGlkOiBcIlRleHRUb29sXCIsXG4gIHRpdGxlOiBcIkFkZCBUZXh0XCIsXG4gIHNlbGVjdGVkOiBpc1RleHRDcmVhdGlvbkVuYWJsZWQsXG4gIG9uUHJlc3MoKSB7XG4gICAgaWYgKGlzVGV4dENyZWF0aW9uRW5hYmxlZCkge1xuICAgICAgLy8gV2hlbiBidXR0b24gdG9nZ2xlZCBPRkYsIGV4cGxpY2l0bHkgZGVhY3RpdmF0ZSBtb2RlXG4gICAgICBpbnN0YW5jZS5zZXRWaWV3U3RhdGUoKHZpZXdTdGF0ZSkgPT5cbiAgICAgICAgdmlld1N0YXRlLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBudWxsKVxuICAgICAgKTtcbiAgICAgIGlzVGV4dENyZWF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXaGVuIGJ1dHRvbiB0b2dnbGVkIE9OLCBleHBsaWNpdGx5IGFjdGl2YXRlIFRFWFQgbW9kZVxuICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BXG4gICAgICAgIHZpZXdTdGF0ZS5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLlRFWFQpXG4gICAgICApO1xuICAgICAgaXNUZXh0Q3JlYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoKGl0ZW1zKSA9PlxuICAgICAgaXRlbXMubWFwKChpdGVtKSA9PlxuICAgICAgICBpdGVtLmlkID09PSBcIlRleHRUb29sXCJcbiAgICAgICAgICA%252FIHsgLi4uaXRlbSwgc2VsZWN0ZWQ6IGlzVGV4dENyZWF0aW9uRW5hYmxlZCB9XG4gICAgICAgICAgOiBpdGVtXG4gICAgICApXG4gICAgKTtcbiAgfSxcbn07XG5cbi8vIExvYWQgTnV0cmllbnQgV2ViIFNES1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICBlbmFibGVIaXN0b3J5OiB0cnVlLFxuICB0b29sYmFySXRlbXM6IFBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMucmVkdWNlKChhY2MsIGl0ZW0pID0%252BIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSBcInNwYWNlclwiKSB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChbaXRlbSwgeyB0eXBlOiBcInVuZG9cIiB9LCB7IHR5cGU6IFwicmVkb1wiIH1dKTtcbiAgICB9XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJleHBvcnQtcGRmXCIpIHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KFtpdGVtLCB0ZXh0VG9vbEl0ZW1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFjYy5jb25jYXQoW2l0ZW1dKTtcbiAgICB9XG4gIH0sIFtdKSxcbn0pLnRoZW4oKF9pbnN0YW5jZSkgPT4ge1xuICBpbnN0YW5jZSA9IF9pbnN0YW5jZTtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQgd2l0aCBjb3JyZWN0IHRvZ2dsZSBsb2dpYy4gLSBCeSBOYXJhc2hpbWFuXCIpO1xuXG4gIC8vIExpc3RlbiBleHBsaWNpdGx5IGZvciB2aWV3U3RhdGUgY2hhbmdlc1xuICBpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKFwidmlld1N0YXRlLmNoYW5nZVwiLCAodmlld1N0YXRlKSA9PiB7XG4gICAgY29uc3QgY3VycmVudEludGVyYWN0aW9uTW9kZSA9IHZpZXdTdGF0ZS5pbnRlcmFjdGlvbk1vZGU7XG5cbiAgICBpZiAoY3VycmVudEludGVyYWN0aW9uTW9kZSA9PT0gbnVsbCAmJiBpc1RleHRDcmVhdGlvbkVuYWJsZWQpIHtcbiAgICAgIC8vIEVuc3VyZSBpbnRlcm5hbCByZXNldCAoYWZ0ZXIgdGV4dCBhbm5vdGF0aW9uIGNyZWF0aW9uKSB0cmlnZ2VycyBURVhUIG1vZGUgYWdhaW5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBET1VCTEUtQ0hFQ0sgYnV0dG9uIHN0YXRlIGJlZm9yZSByZWFjdGl2YXRpbmcgdG8gYXZvaWQgdW5pbnRlbmRlZCBhY3RpdmF0aW9uc1xuICAgICAgICBpZiAoaXNUZXh0Q3JlYXRpb25FbmFibGVkKSB7XG4gICAgICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2cykgPT5cbiAgICAgICAgICAgIHZzLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuVEVYVClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - -#### Text Comparison - -- [Text comparison using the `loadTextComparison` method](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6IlBTUERGS2l0LmxvYWRUZXh0Q29tcGFyaXNvbih7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgICAgICAgICBkb2N1bWVudEE6IFwiaHR0cHM6Ly9wdWJsaWMtc29sdXRpb25zLWVuZ2luZWVyaW5nLWJ1Y2tldC5zMy5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbS9kb2NzL3RleHQtY29tcGFyaXNvbi1hLnBkZlwiLFxuICAgICAgICBkb2N1bWVudEI6IFwiaHR0cHM6Ly9wdWJsaWMtc29sdXRpb25zLWVuZ2luZWVyaW5nLWJ1Y2tldC5zMy5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbS9kb2NzL3RleHQtY29tcGFyaXNvbi1iLnBkZlwiLFxuICAgICAgICB0b29sYmFySXRlbXM6IFtcbiAgICAgICAgICB7IHR5cGU6IFwicHJldi1jaGFuZ2VcIiB9LFxuICAgICAgICAgIHsgdHlwZTogXCJuZXh0LWNoYW5nZVwiIH0sXG4gICAgICAgICAgeyB0eXBlOiBcImNvbXBhcmlzb24tY2hhbmdlc1wiIH0sXG4gICAgICAgICAgeyB0eXBlOiBcInNjcm9sbC1sb2NrXCIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29tcGFyaXNvblNpZGViYXJDb25maWc6IHtcbiAgICAgICAgICBkaWZmQ29sb3JzOiB7XG4gICAgICAgICAgICBkZWxldGlvbkNvbG9yOiBuZXcgUFNQREZLaXQuQ29sb3IoeyByOiAyNTUsIGc6IDIxOCwgYjogMTg1IH0pLFxuICAgICAgICAgICAgaW5zZXJ0aW9uQ29sb3I6IG5ldyBQU1BERktpdC5Db2xvcih7IHI6IDIwMCwgZzogMjU1LCBiOiAyMDAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiTG9hZGVkIHN1Y2Nlc3NmdWxseSAtIGJ5IE5hcmFzaGltYW5cIilcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIn0%253D) - -- [Compare and highlight PDF text changes](https://github.com/jonaddams/nutrient-web-text-comparison-custom-ui) - - Compare two PDF documents by highlighting textual differences, synchronizing their views side-by-side, and displaying a sidebar listing the detected changes. - -- [Custom Text Comparison demo](https://nutrient-web-text-comparison-custom-ui.vercel.app/)) - -#### Viewer - -- [Show real-time zoom percentage in the toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gU2V0IHRoZSBkZWZhdWx0IHpvb20gbGV2ZWwgdG8gMTAwJSBvbiBsb2FkXG4gIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PiB2aWV3U3RhdGUuc2V0KFwiem9vbVwiLCAxKSk7XG5cbiAgLy8gQ3JlYXRlIGEgY3VzdG9tIHRvb2xiYXIgaXRlbSB0byBkaXNwbGF5IHpvb20gcGVyY2VudGFnZVxuICBjb25zdCB0b29sYmFySXRlbXMgPSBbXG4gICAge1xuICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgIHRpdGxlOiBcIjEwMCVcIiwgLy8gSW5pdGlhbCBkaXNwbGF5IGFzIDEwMCVcbiAgICAgIGlkOiBcInpvb20tZGlzcGxheVwiLCAvLyBVbmlxdWUgSUQgZm9yIHRoZSB6b29tIGRpc3BsYXkgaXRlbVxuICAgICAgZHJvcGRvd25Hcm91cDogXCJ6b29tR3JvdXBcIiwgLy8gR3JvdXAgaXQgd2l0aCBvdGhlciB6b29tIG9wdGlvbnMgaWYgbmVlZGVkXG4gICAgICBzZWxlY3RlZDogdHJ1ZSwgLy8gU2V0IGFzIHNlbGVjdGVkIGluaXRpYWxseVxuICAgICAgdG9vbHRpcDogXCJSZXNldCB0byAxMDAlXCIsIC8vIFRvb2x0aXAgd2hlbiBob3ZlcmVkXG4gICAgICBvblByZXNzOiAoKSA9PiB7XG4gICAgICAgIC8vIFJlc2V0IHpvb20gdG8gMTAwJSB3aGVuIGNsaWNrZWRcbiAgICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BIHZpZXdTdGF0ZS5zZXQoXCJ6b29tXCIsIDEpKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgXTtcblxuICAvLyBBZGQgdGhlIGN1c3RvbSB0b29sYmFyIGl0ZW0gdG8gdGhlIHRvb2xiYXJcbiAgaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcykgPT4gaXRlbXMuY29uY2F0KHRvb2xiYXJJdGVtcykpO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIHRvIHVwZGF0ZSB6b29tIGRpc3BsYXkgZHluYW1pY2FsbHlcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInZpZXdTdGF0ZS56b29tLmNoYW5nZVwiLCAoem9vbSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygem9vbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IE1hdGgucm91bmQoem9vbSAqIDEwMCkgKyBcIiVcIjsgLy8gQ29udmVydCB6b29tIGxldmVsIHRvIHBlcmNlbnRhZ2VcbiAgICAgIGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcygoaXRlbXMpID0%252BXG4gICAgICAgIGl0ZW1zLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgICBpdGVtLmlkID09PSBcInpvb20tZGlzcGxheVwiID8geyAuLi5pdGVtLCB0aXRsZTogcGVyY2VudGFnZSB9IDogaXRlbVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG4gIGNvbnNvbGUubG9nKFwiTnV0cmllbnQgdmlld2VyIGxvYWRlZCEgLSBieSBOYXJhc2hpbWFuXCIpO1xufSk7XG4ifQ%253D%253D) - -- [Zoom in/out with scroll](https://nutrient.io/playground?p=eyJ2IjoxLCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChpbnN0YW5jZT0%252Be2NvbnN0IE1JTl9aT09NPWluc3RhbmNlLm1pbmltdW1ab29tTGV2ZWwsTUFYX1pPT009aW5zdGFuY2UubWF4aW11bVpvb21MZXZlbDsvLyBjaGFuZ2UgYnkgMTAlIGZvciBlYWNoIHdoZWVsIGV2ZW50XG4vLyBtYXhpbXVtIHpvb20gbGV2ZWxcbi8vIE1haW50YWluIG91ciBvd24gem9vbSBzdGF0ZVxubGV0IGN1cnJlbnRab29tPTE7aW5zdGFuY2UuY29udGVudERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywoZnVuY3Rpb24oZXZlbnQpe1xuLy8gQ2FwdHVyZSBtb3VzZSBwb3NpdGlvblxuY29uc3QgbW91c2VYPWV2ZW50LmNsaWVudFgsbW91c2VZPWV2ZW50LmNsaWVudFksem9vbURpcmVjdGlvbj1ldmVudC5kZWx0YVk%252BMD8tMToxOy8vIC0xIGZvciB6b29tIG91dCwgMSBmb3Igem9vbSBpblxuY3VycmVudFpvb20rPS4wNSp6b29tRGlyZWN0aW9uLFxuLy8gRW5zdXJlIGN1cnJlbnRab29tIGlzIHdpdGhpbiB0aGUgZGVmaW5lZCByYW5nZVxuY3VycmVudFpvb209TWF0aC5tYXgoTUlOX1pPT00sTWF0aC5taW4oTUFYX1pPT00sY3VycmVudFpvb20pKTtjb25zdCB6b29tV2lkdGg9d2luZG93LmlubmVyV2lkdGgqY3VycmVudFpvb20sem9vbUhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHQqY3VycmVudFpvb20sbGVmdD1tb3VzZVgtem9vbVdpZHRoLzIsdG9wPW1vdXNlWS16b29tSGVpZ2h0LzIsYm91bmRpbmdCb3g9bmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe2xlZnQ6bGVmdCx0b3A6dG9wLHdpZHRoOnpvb21XaWR0aCxoZWlnaHQ6em9vbUhlaWdodH0pO2NvbnNvbGUubG9nKCdjdXJyZW50IFpvb206ICcrY3VycmVudFpvb20pLFxuLy8gVXBkYXRlIHRoZSB6b29tIGxldmVsIGluIHRoZSB2aWV3U3RhdGVcbmluc3RhbmNlLnNldFZpZXdTdGF0ZSgoc3RhdGU9PnN0YXRlLnNldCgnem9vbScsY3VycmVudFpvb20pKSksXG4vLyBJbnZva2UganVtcEFuZFpvb21Ub1JlY3Rcbmluc3RhbmNlLmp1bXBBbmRab29tVG9SZWN0KGluc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4LGJvdW5kaW5nQm94KSxcbi8vIFByZXZlbnQgZGVmYXVsdCB3aGVlbCBiZWhhdmlvclxuZXZlbnQucHJldmVudERlZmF1bHQoKX0pLHtwYXNzaXZlOiExfSl9KSk7In0%253D) - - Use the mouse wheel to zoom in or out from where the mouse is pointing. — [Video](https://www.youtube.com/watch?v=-2vSBsXXSZc) - -- [Create a blank A3 document](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6ImNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50LCAuLi5yZXN0IH0gPSBiYXNlT3B0aW9ucyxcbiAgUERGc3R1YiA9IGAlUERGLTEuMFxuMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4%252BZW5kb2JqXG4yIDAgb2JqPDwvVHlwZS9QYWdlcy9LaWRzWzMgMCBSIDQgMCBSIDUgMCBSIDYgMCBSIDcgMCBSXS9Db3VudCA1Pj5lbmRvYmpcbjMgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA4NDEuODkgMTE5MC41NV0%252BPmVuZG9ialxuNCAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDg0MS44OSAxMTkwLjU1XT4%252BZW5kb2JqXG41IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgODQxLjg5IDExOTAuNTVdPj5lbmRvYmpcbjYgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA4NDEuODkgMTE5MC41NV0%252BPmVuZG9ialxuNyAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDg0MS44OSAxMTkwLjU1XT4%252BZW5kb2JqXG54cmVmXG4wIDhcbjAwMDAwMDAwMDAgNjU1MzUgZlxuMDAwMDAwMDAxMCAwMDAwMCBuXG4wMDAwMDAwMDUzIDAwMDAwIG5cbjAwMDAwMDAxMDIgMDAwMDAgblxuMDAwMDAwMDE1MSAwMDAwMCBuXG4wMDAwMDAwMjAwIDAwMDAwIG5cbjAwMDAwMDAyNDkgMDAwMDAgblxuMDAwMDAwMDI5OCAwMDAwMCBuXG50cmFpbGVyPDwvU2l6ZSA4L1Jvb3QgMSAwIFI%252BPlxuc3RhcnR4cmVmXG4zNDdcbiVFT0ZcbmAsXG4gIHVpbnQ4YXJyYXkgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoUERGc3R1Yik7XG5QU1BERktpdC5sb2FkKHtcbiAgLi4ucmVzdCxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIGRvY3VtZW50OiB1aW50OGFycmF5LmJ1ZmZlcixcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiTnV0cmllbnQgbG9hZGVkISBieSBOYXJhc2hpbWFuXCIpO1xufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIn0%253D) - -- [Load a document from an S3 bucket as a URL and allow a linearized document](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6IlBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIGRvY3VtZW50OlxuICAgIFwiaHR0cHM6Ly9wdWJsaWMtc29sdXRpb25zLWVuZ2luZWVyaW5nLWJ1Y2tldC5zMy5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbS9kb2NzL0xpbmVhcml6ZWQtaU9TLVF1aWNrU3RhcnQtR3VpZGVzLnBkZlwiLFxuICBhbGxvd0xpbmVhcml6ZWRMb2FkaW5nOiB0cnVlLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cdCJ9) - -- [Use a custom button on the toolbar to add a blank page to the beginning of a document](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIn0sImpzIjoiUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgaXNBUFN0cmVhbVJlbmRlcmVkOiAoKSA9PiBmYWxzZSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICBpZDogXCJteS1idXR0b25cIixcbiAgICB0aXRsZTogXCJBZGQtUGFnZVwiLFxuICAgIG9uUHJlc3M6IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgUERGc3R1YiA9XG4gICAgICAgICAgXCIlUERGLTEuMFxcbjEgMCBvYmo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI%252BPmVuZG9iaiAyIDAgb2JqPDwvVHlwZS9QYWdlcy9LaWRzWzMgMCBSXS9Db3VudCAxPj5lbmRvYmogMyAwIG9iajw8L1R5cGUvUGFnZS9NZWRpYUJveFswIDAgNzUwIDEwMDBdPj5lbmRvYmpcXG54cmVmXFxuMCA0XFxuMDAwMDAwMDAwMCA2NTUzNSBmXFxuMDAwMDAwMDAxMCAwMDAwMCBuXFxuMDAwMDAwMDA1MyAwMDAwMCBuXFxuMDAwMDAwMDEwMiAwMDAwMCBuXFxudHJhaWxlcjw8L1NpemUgNC9Sb290IDEgMCBSPj5cXG5zdGFydHhyZWZcXG4xNDlcXG4lRU9GXCIsXG4gICAgICAgIHVpbnQ4YXJyYXkgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoUERGc3R1Yik7XG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3VpbnQ4YXJyYXkuYnVmZmVyXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiIH0pO1xuICAgICAgYXdhaXQgaW5zdGFuY2UuYXBwbHlPcGVyYXRpb25zKFtcbiAgICAgICAge1xuICAgICAgICAgIGJlZm9yZVBhZ2VJbmRleDogMCxcbiAgICAgICAgICBkb2N1bWVudDogYmxvYixcbiAgICAgICAgICB0cmVhdEltcG9ydGVkRG9jdW1lbnRBc09uZVBhZ2U6IGZhbHNlLFxuICAgICAgICAgIHR5cGU6IFwiaW1wb3J0RG9jdW1lbnRcIixcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0sXG4gIH07XG4gIGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcyhbXG4gICAgaXRlbSxcbiAgICB7XG4gICAgICB0eXBlOiBcImZvcm0tY3JlYXRvclwiLFxuICAgIH0sXG4gIF0pO1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IExvYWRlZCEgYnkgTmFyYXNoaW1hblwiKTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIn0%253D) - -- [Export selected pages in Document Editor](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tSnNFMWRTck9xTCIsImxheWVyIjoicmFuZG9tNTNzeVJEQ3gyQiJ9fSwianMiOiJjb25zdCBjdXN0b21JdGVtPXt0eXBlOidjdXN0b20nLGlkOidFeHBvcnRQREYnLHRpdGxlOidFeHBvcnQgU2VsZWN0ZWQgUGFnZXMnLG9uUHJlc3M6ZXZlbnQ9Pntcbi8vIEdldCB0aGUgcGFnZUlkcyBvZiB0aGUgcGFnZSBzZWxlY3RlZCBpbiB0aGUgRG9jdW1lbnQgRWRpdG9yXG5sZXQgc2VsZWN0ZWRQYWdlcz13aW5kb3cuaW5zdGFuY2UuY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5QU1BERktpdC1Eb2N1bWVudEVkaXRvci1UaHVtYm5haWxzLVBhZ2UtU2VsZWN0ZWQnKSxwYWdlc1RvRXhwb3J0PUFycmF5LmZyb20oc2VsZWN0ZWRQYWdlcykubWFwKChwYWdlPT5wYWdlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1pZCcpKSkubWFwKE51bWJlcikuc29ydCgoKGEsYik9PmEtYikpO1xuLy8gR2V0IHRoZSBkb2N1bWVudCBhcyBhIFBERiBBcnJheUJ1ZmZlci5cbmNvbnN0IG9wZXJhdGlvbnM9W3t0eXBlOidrZWVwUGFnZXMnLHBhZ2VJbmRleGVzOnBhZ2VzVG9FeHBvcnR9XTt3aW5kb3cuaW5zdGFuY2UuZXhwb3J0UERGV2l0aE9wZXJhdGlvbnMob3BlcmF0aW9ucykudGhlbigocGRmQXJyYXlCdWZmZXI9Pntcbi8vIFlvdSBjYW4gdGhlbiBzZW5kIHRoaXMgQXJyYXlCdWZmZXIgdG8geW91ciBzZXJ2ZXIsIHNhdmUgaXQsIG9yIHR1cm4gaXQgaW50byBhIEJsb2IgdG8gZG93bmxvYWQuXG5jb25zdCBibG9iPW5ldyBCbG9iKFtwZGZBcnJheUJ1ZmZlcl0se3R5cGU6J2FwcGxpY2F0aW9uL3BkZid9KSx1cmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSxsaW5rPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtsaW5rLmhyZWY9dXJsLGxpbmsuZG93bmxvYWQ9J2V4cG9ydGVkLnBkZicsbGluay5jbGljaygpLFxuLy8gUmVtZW1iZXIgdG8gcmV2b2tlIHRoZSBVUkwgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxuc2V0VGltZW91dCgoKCk9PlVSTC5yZXZva2VPYmplY3RVUkwodXJsKSksMTAwKX0pKSxjb25zb2xlLmxvZygnc2VsZWN0ZWQgcGFnZXMnKSxjb25zb2xlLmxvZyhwYWdlc1RvRXhwb3J0KX19LGRlZmF1bHRUb29sYmFySXRlbXM9UFNQREZLaXQuZGVmYXVsdERvY3VtZW50RWRpdG9yVG9vbGJhckl0ZW1zO1xuLy8gR2V0IHRoZSBkZWZhdWx0IHRvb2xiYXIgaXRlbXMuXG4vLyBBZGQgYSBjdXN0b20gaXRlbSB0byB0aGUgbGlzdC5cbmRlZmF1bHRUb29sYmFySXRlbXMucHVzaChjdXN0b21JdGVtKSxQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyxkb2N1bWVudEVkaXRvclRvb2xiYXJJdGVtczpkZWZhdWx0VG9vbGJhckl0ZW1zfSkudGhlbigoaW5zdGFuY2U9Pnt3aW5kb3cuaW5zdGFuY2U9aW5zdGFuY2V9KSk7IiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuXHQifQ%253D%253D) - - Add a new button in Document Editor to export selected pages from a document as a PDF. - -- [Regular expression (regex) search](https://nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImNvbnN0IGl0ZW09e3R5cGU6J2N1c3RvbScsaWQ6J215LWJ1dHRvbicsdGl0bGU6J015IEJ1dHRvbicsb25QcmVzczpldmVudD0%252Be2FsZXJ0KCdoZWxsbyBmcm9tIG15IGJ1dHRvbicpfX07dmFyIGluc3RhbmNlR2xvYmFsO1BTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zfSkudGhlbigoaW5zdGFuY2U9PntsZXQgbGFzdFNlYXJjaFRlcm09Jyc7aW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignc2VhcmNoLnRlcm1DaGFuZ2UnLChhc3luYyBldmVudD0%252Be1xuLy8gT3B0IG91dCBmcm9tIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLlxuZXZlbnQucHJldmVudERlZmF1bHQoKTtjb25zdHt0ZXJtOnRlcm19PWV2ZW50O1xuLy8gVXBkYXRlIHRoZSBzZWFyY2ggdGVybSBpbiB0aGUgc2VhcmNoIGJveC4gV2l0aG91dCB0aGlzIGxpbmUsXG4vLyB0aGUgc2VhcmNoIGJveCB3b3VsZCBzdGF5IGVtcHR5LlxuaW5zdGFuY2Uuc2V0U2VhcmNoU3RhdGUoKHN0YXRlPT5zdGF0ZS5zZXQoJ3Rlcm0nLHRlcm0pKSksbGFzdFNlYXJjaFRlcm09dGVybTtcbi8vIFBlcmZvcm0gYSBjdXN0b20gc2VhcmNoIGZvciB0aGUgdGVybS5cbmNvbnN0IHJlc3VsdHM9YXdhaXQgYXN5bmMgZnVuY3Rpb24odGVybSxpbnN0YW5jZSl7cmV0dXJuIGluc3RhbmNlLnNlYXJjaCh0ZXJtLHtzZWFyY2hUeXBlOlBTUERGS2l0LlNlYXJjaFR5cGUuUkVHRVh9KX0odGVybSxpbnN0YW5jZSk7XG4vLyBPdXIgcmVzdWx0cyBjb3VsZCByZXR1cm4gaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiBleHBlY3RlZC5cbi8vIExldCdzIG1ha2Ugc3VyZSBvbmx5IHJlc3VsdHMgbWF0Y2hpbmcgb3VyIGN1cnJlbnQgdGVybSBhcmUgYXBwbGllZC5cbmlmKHRlcm0hPT1sYXN0U2VhcmNoVGVybSlyZXR1cm47XG4vLyBGaW5hbGx5LCB3ZSBhcHBseSB0aGUgcmVzdWx0cy4gTm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBtb2RpZnlcbi8vIHRoZSBzZWFyY2ggc3RhdGUgZmlyc3QgYW5kIHRoZW4gcGFzcyB0aGUgbmV3IHN0YXRlXG4vLyB0byBgaW5zdGFuY2Uuc2V0U2VhcmNoU3RhdGVgLlxuY29uc3QgbmV3U3RhdGU9aW5zdGFuY2Uuc2VhcmNoU3RhdGUuc2V0KCdyZXN1bHRzJyxyZXN1bHRzKTtpbnN0YW5jZS5zZXRTZWFyY2hTdGF0ZShuZXdTdGF0ZSl9KSl9KSk7In0%253D) - -- [Print a single page](https://nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImNvbnN0IGl0ZW09e3R5cGU6J2N1c3RvbScsaWQ6J215LWJ1dHRvbicsdGl0bGU6J015IEJ1dHRvbicsb25QcmVzczpldmVudD0%252Be2FsZXJ0KCdoZWxsbyBmcm9tIG15IGJ1dHRvbicpfX07dmFyIGluc3RhbmNlR2xvYmFsO1BTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkssdG9vbGJhckl0ZW1zOlBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMucmVkdWNlKCgoYWNjLGl0ZW0pPT4nZXhwb3J0LXBkZic9PT1pdGVtLnR5cGU%252FYWNjLmNvbmNhdChbaXRlbSx7dHlwZTonY3VzdG9tJyxpZDonUHJpbnQnLHJlc3BvbnNpdmVHcm91cDonYW5ub3RhdGUnLFxuLy9pY29uOiBcImh0dHBzOi8vc3Znc2hhcmUuY29tL2kvcTB0LnN2Z1wiLFxuc2VsZWN0ZWQ6ITEsb25QcmVzcygpe2NvbnNvbGUubG9nKCdQcmludCcpLGNvbnNvbGUubG9nKCdjdXJyZW50IHBhZ2UgJyxpbnN0YW5jZUdsb2JhbC52aWV3U3RhdGUuY3VycmVudFBhZ2VJbmRleCk7Y29uc3Qgb3BlcmF0aW9ucz1be3R5cGU6J2tlZXBQYWdlcycscGFnZUluZGV4ZXM6W2luc3RhbmNlR2xvYmFsLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4XX1dO2luc3RhbmNlR2xvYmFsLmV4cG9ydFBERldpdGhPcGVyYXRpb25zKG9wZXJhdGlvbnMpLnRoZW4oKGZ1bmN0aW9uKGJ1ZmZlcil7XG4vL2J1ZmZlcjsgLy8gPT4gQXJyYXlCdWZmZXJcbmNvbnNvbGUubG9nKGJ1ZmZlcik7XG4vLyBDb252ZXJ0IGJ1ZmZlciBpbnRvIGEgQmxvYlxuY29uc3QgYmxvYj1uZXcgQmxvYihbYnVmZmVyXSx7dHlwZTonYXBwbGljYXRpb24vcGRmJ30pLG9iamVjdFVSTD1VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuLy8gQ3JlYXRlIG9iamVjdCBVUkxcbi8vIENvbnZlcnQgdGhlIFBERiBCbG9iIHRvIGEgZGF0YSBVUkxcbihcbi8vIERlZmluZSB0aGUgYmxvYlRvRGF0YVVSTCBmdW5jdGlvblxuZnVuY3Rpb24oYmxvYil7cmV0dXJuIG5ldyBQcm9taXNlKCgocmVzb2x2ZSxyZWplY3QpPT57Y29uc3QgcmVhZGVyPW5ldyBGaWxlUmVhZGVyO3JlYWRlci5vbmxvYWRlbmQ9KCk9PnJlc29sdmUocmVhZGVyLnJlc3VsdCkscmVhZGVyLm9uZXJyb3I9cmVqZWN0LHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpfSkpfSkoYmxvYikudGhlbigoZGF0YVVSTD0%252Be1xuLy8gTG9hZCB0aGUgUERGIGRhdGEgVVJMIGludG8gdGhlIGlmcmFtZVxuY29uc29sZS5sb2coJ25vdyBwcmludGluZycpLGNvbnNvbGUubG9nKGRvY3VtZW50KTtcbi8vIENyZWF0ZSBhbiBpZnJhbWUgYW5kIGFkZCBpdCB0byB0aGUgRE9NXG5jb25zdCBwZGZGcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtwZGZGcmFtZS5pZD0ncGRmLWZyYW1lJyxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBkZkZyYW1lKSxcbi8vIExvYWQgdGhlIFBERiBkYXRhIFVSTCBpbnRvIHRoZSBpZnJhbWVcbnBkZkZyYW1lLnNyYz1vYmplY3RVUkwsXG4vLyBXYWl0IHVudGlsIHRoZSBpZnJhbWUgaGFzIGxvYWRlZCBpdHMgY29udGVudCBiZWZvcmUgcHJpbnRpbmdcbnBkZkZyYW1lLm9ubG9hZD1mdW5jdGlvbigpe3BkZkZyYW1lLmNvbnRlbnRXaW5kb3cucHJpbnQoKX19KSl9KSl9LHRpdGxlOidQcmludCBzaW5nbGUgcGFnZSd9XSk6YWNjLmNvbmNhdChbaXRlbV0pKSxbXSl9KS50aGVuKChpbnN0YW5jZT0%252Be2luc3RhbmNlR2xvYmFsPWluc3RhbmNlLGNvbnNvbGUubG9nKCdQU1BERktpdCBsb2FkZWQhJyksY29uc29sZS5sb2coJ0FQSSBkb2NzOiBodHRwczovL3BzcGRma2l0LmNvbS9hcGkvd2ViLycpLGNvbnNvbGUubG9nKCdHdWlkZXM6IGh0dHBzOi8vcHNwZGZraXQuY29tL2d1aWRlcy93ZWIvJyl9KSk7IiwibW9kZSI6InN0YW5kYWxvbmUiLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tR0pXMEFya2V3dSIsImxheWVyIjoicmFuZG9tS1lDOFQ5b2lrciJ9fX0%253D). - - Add a print button that prints the currently viewed page of the document as a PDF when clicked. - -- [Restrict zoom level both ways](https://nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuXHQiLCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChpbnN0YW5jZT0%252Be2NvbnNvbGUubG9nKCdpbml0aWFsIHpvb206ICcsaW5zdGFuY2UuY3VycmVudFpvb21MZXZlbCksaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcigndmlld1N0YXRlLmNoYW5nZScsKChjdXJyZW50LHByZXZpb3VzKT0%252Be2N1cnJlbnQ%252FLnpvb208PTE%252FKGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcygoaXRlbXM9Pml0ZW1zLm1hcCgoaXRlbT0%252BKCd6b29tLW91dCc9PWl0ZW0udHlwZSYmKGl0ZW0uZGlzYWJsZWQ9ITApLGl0ZW0pKSkpKSxpbnN0YW5jZS5zZXRWaWV3U3RhdGUoKHZpZXdTdGF0ZT0%252Bdmlld1N0YXRlLnNldCgnem9vbScsMSkpKSk6aW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcz0%252BaXRlbXMubWFwKChpdGVtPT4oJ3pvb20tb3V0Jz09aXRlbS50eXBlJiYoaXRlbS5kaXNhYmxlZD0hMSksaXRlbSkpKSkpfSkpfSkpOyIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21wd2kwM3RHZGxZIiwibGF5ZXIiOiJyYW5kb205Sms3YzJMMEpzIn19LCJtb2RlIjoic3RhbmRhbG9uZSJ9) - -- [Extract text from cropped PDF pages](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21WRGg3ZVVBRWFBIiwibGF5ZXIiOiJyYW5kb21LZGV1a0FhZkJMIn19LCJqcyI6IlBTUERGS2l0Lk9wdGlvbnMuSUdOT1JFX0RPQ1VNRU5UX1BFUk1JU1NJT05TPSEwLFBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChpbnN0YW5jZT0%252Be1xuLy9WYXJpYWJsZXMgdG8gc2F2ZSB0aGUgY3JvcCBhcmVhIFJlY3QsIGFuZCB0aGUgcGFnZSBpbmRleCBmcm9tIHdoZXJlIGl0IHdhcyB0YWtlblxubGV0IGNyb3BBcmVhLGNyb3BQYWdlSW5kZXgsaXRlbT17aWQ6J215LWJ1dHRvbicsdGl0bGU6J2Nyb3AgcGFnZXMnLHR5cGU6J2N1c3RvbScsb25QcmVzczphc3luYyBldmVudD0%252Be2F3YWl0IGluc3RhbmNlLmV4cG9ydFBERldpdGhPcGVyYXRpb25zKFt7dHlwZTonY3JvcFBhZ2VzJyxwYWdlSW5kZXhlczpjcm9wUGFnZUluZGV4LC8vSSdtIHBhc3NpbmcgdGhlIHBhZ2UgaW5kZXggd2hlcmUgSSdtIGFwcGx5aW5nIHRoZSBjcm9wXG5jcm9wQm94OmNyb3BBcmVhfV0pLnRoZW4oKHRpdGxlQXJyQnVmPT57Y29uc29sZS50aW1lKCksUFNQREZLaXQubG9hZCh7Li4uYmFzZU9wdGlvbnMsZG9jdW1lbnQ6dGl0bGVBcnJCdWYsaGVhZGxlc3M6ITB9KS50aGVuKChhc3luYyB0eHRJbnN0YW5jZT0%252Be1xuLy9JIGFtIGFsc28gcGFzc2luZyB0aGlzIHBhZ2VJbmRleCBoZXJlIHRvIGVuc3VyZSBJIGdldCB0aGUgdGV4dCBmcm9tIHRoZSBjcm9wcGVkIHRleHRcbmNvbnN0IHRleHQ9KGF3YWl0IHR4dEluc3RhbmNlLnRleHRMaW5lc0ZvclBhZ2VJbmRleChjcm9wUGFnZUluZGV4KSkubWFwKChlPT5lLmNvbnRlbnRzKSkuam9pbignJyk7Y29uc29sZS5sb2codGV4dCksUFNQREZLaXQudW5sb2FkKHR4dEluc3RhbmNlKX0pKX0pKX19O1xuLy9NeSBjdXN0b20gdG9vbCB0byBhcHBseSB0aGUgb3BlcmF0aW9uIG9uIGNsaWNrXG4vL0hlcmUgSSBzZXQgdGhlIGN1c3RvbSB0b29sYmFyIGl0ZW1cbmluc3RhbmNlLnNldFRvb2xiYXJJdGVtcyhbe3R5cGU6J2RvY3VtZW50LWNyb3AnfSx7dHlwZTonem9vbS1vdXQnfSx7dHlwZTonem9vbS1pbid9LGl0ZW1dKSxcbi8vVGhlIGV2ZW50IGxpc3RlbmVyIHRvIGdldCB0aGUgY3JvcGJveCBhbmQgcGFnZWluZGV4IHZhbHVlc1xuaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignY3JvcEFyZWEuY2hhbmdlU3RvcCcsKGNyb3A9Pntjb25zdHtjcm9wQm94OmNyb3BCb3gscGFnZUluZGV4OnBhZ2VJbmRleH09Y3JvcDtjcm9wQXJlYT1jcm9wQm94LGNyb3BQYWdlSW5kZXg9cGFnZUluZGV4fSkpfSkpOyIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - - Add a custom “crop pages” button to the toolbar that crops a selected page and extracts its text after the crop operation is applied. - -- [Execute operations in headless mode before loading a document in the viewer](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLGhlYWRsZXNzOiEwfSkudGhlbigoYXN5bmMgaW5zdGFuY2U9Pntcbi8vQ29udmVydGluZyB0aGUgdG90YWwgcGFnZSBjb3VudCB0byBhbiBhcnJheSB0aGF0IEknbGwgbGF0ZXIgdXNlIHRvIHNwbGl0IHRoZSBmaWxlIGluIGhhbGZcbmNvbnN0IHBhZ2VJbmRleGVzPUFycmF5LmZyb20oe2xlbmd0aDppbnN0YW5jZS50b3RhbFBhZ2VDb3VudH0sKChfLGkpPT5pKSksZmlyc3RIYWxmPXBhZ2VJbmRleGVzLnNsaWNlKDAsTWF0aC5jZWlsKHBhZ2VJbmRleGVzLmxlbmd0aC8yKSksc2Vjb25kSGFsZj1wYWdlSW5kZXhlcy5zbGljZShNYXRoLmNlaWwocGFnZUluZGV4ZXMubGVuZ3RoLzIpKSxmaWxlQT1hd2FpdCBpbnN0YW5jZS5leHBvcnRQREZXaXRoT3BlcmF0aW9ucyhbe3R5cGU6J3JlbW92ZVBhZ2VzJyxwYWdlSW5kZXhlczpzZWNvbmRIYWxmfSxcbi8qIHtcbiAgICAgICAgdHlwZTogXCJwZXJmb3JtT2NyXCIsXG4gICAgICAgIHBhZ2VJbmRleGVzOiBmaXJzdEhhbGYsXG4gICAgICAgIGxhbmd1YWdlOiBcImVuZ2xpc2hcIixcbiAgICAgIH0sKi9cbi8vQWRkaW5nIGFuIEFubm90YXRpb24gdG8gdGhlIGZpcnN0IGhhbGYgdG8gc2hvdyB0aGF0IHRoZSBwcm9jZXNzZWQgZmlsZSBpcyB0aGUgb25lIGJlaW5nIGxvYWRlZFxue3R5cGU6J2FwcGx5SW5zdGFudEpzb24nLGluc3RhbnRKc29uOnthbm5vdGF0aW9uczpbe2Jib3g6WzEwMCwxNTAsMjAwLDc1XSxibGVuZE1vZGU6J25vcm1hbCcsY3JlYXRlZEF0OicxOTcwLTAxLTAxVDAwOjAwOjAwWicsaWQ6JzAxRjczR0o0UlBFTlRDTUZTQ0o1Q1NGVDVHJyxuYW1lOicwMUY3M0dKNFJQRU5UQ01GU0NKNUNTRlQ1Rycsb3BhY2l0eToxLHBhZ2VJbmRleDowLHN0cm9rZUNvbG9yOicjMjI5M0ZCJyxzdHJva2VXaWR0aDo1LHR5cGU6J3BzcGRma2l0L3NoYXBlL3JlY3RhbmdsZScsdXBkYXRlZEF0OicxOTcwLTAxLTAxVDAwOjAwOjAwWicsdjoxfV0sZm9ybWF0OidodHRwczovL3BzcGRma2l0LmNvbS9pbnN0YW50LWpzb24vdjEnfX1dKS50aGVuKChmaWxlPT5uZXcgQmxvYihbZmlsZV0se3R5cGU6J2FwcGxpY2F0aW9uL3BkZid9KSkpLGZpbGVCPWF3YWl0IGluc3RhbmNlLmV4cG9ydFBERldpdGhPcGVyYXRpb25zKFt7dHlwZToncmVtb3ZlUGFnZXMnLHBhZ2VJbmRleGVzOmZpcnN0SGFsZn1dKS50aGVuKChmaWxlPT5uZXcgQmxvYihbZmlsZV0se3R5cGU6J2FwcGxpY2F0aW9uL3BkZid9KSkpO2luc3RhbmNlLmV4cG9ydFBERldpdGhPcGVyYXRpb25zKFtcbi8vVGhlIG9yZGVyIG9mIHRoZSBvcGVyYXRpb25zIG1hdHRlcnNcbnt0eXBlOidpbXBvcnREb2N1bWVudCcsYmVmb3JlUGFnZUluZGV4Omluc3RhbmNlLnRvdGFsUGFnZUNvdW50LHRyZWF0SW1wb3J0ZWREb2N1bWVudEFzT25lUGFnZTohMSxkb2N1bWVudDpmaWxlQn0se3R5cGU6J2ltcG9ydERvY3VtZW50JyxiZWZvcmVQYWdlSW5kZXg6aW5zdGFuY2UudG90YWxQYWdlQ291bnQsdHJlYXRJbXBvcnRlZERvY3VtZW50QXNPbmVQYWdlOiExLGRvY3VtZW50OmZpbGVBfSx7dHlwZToncmVtb3ZlUGFnZXMnLHBhZ2VJbmRleGVzOnBhZ2VJbmRleGVzfV0pLnRoZW4oKHJlcz0%252Be2NvbnN0e2RvY3VtZW50OmRvY3VtZW50LC4uLnJlc3R9PWJhc2VPcHRpb25zO1xuLy9VbmxvYWRpbmcgdGhlIGhlYWRsZXNzIGluc3RhbmNlIHRvIGVuaGFuY2UgcGVyZm9ybWFjZVxuLy9JZiB5b3UnZCBsaWtlIHRvIG5vdGljZSB0aGUgZGlmZmVyZW50IGNvbW1lbnQgb3V0IHRoZSB1bmxvYWRcblBTUERGS2l0LnVubG9hZChpbnN0YW5jZSksXG4vL0xvYWRpbmcgdGhlIHJlc3VsdGluZyBQREZcblBTUERGS2l0LmxvYWQoey4uLnJlc3QsZG9jdW1lbnQ6cmVzLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KX0pKX0pKTsiLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - - Split a PDF document into two halves, add an annotation to the first half, and reassemble the document by importing both halves back together into a new PDF file. - -- [Save selected page from Document Editor](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIn0sImpzIjoiLy8gTG9hZCBQU1BERktpdCB3aXRoIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsIC8vIFNwcmVhZCB0aGUgYmFzZSBvcHRpb25zIHRvIHJldGFpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLCAvLyBTZXQgdGhlbWUgdG8gZGFyayBtb2RlIGZvciBiZXR0ZXIgdXNlciBleHBlcmllbmNlXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAvLyBTZXQgdGhlIGludGVyYWN0aW9uIG1vZGUgdG8gRE9DVU1FTlRfRURJVE9SXG4gIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgoc3RhdGUpID0%252BXG4gICAgc3RhdGUuc2V0KFwiaW50ZXJhY3Rpb25Nb2RlXCIsIFwiRE9DVU1FTlRfRURJVE9SXCIpXG4gICk7XG5cbiAgLy8gRGVmaW5lIGEgY3VzdG9tIHRvb2xiYXIgaXRlbSBmb3IgZXhwb3J0aW5nIHNlbGVjdGVkIHBhZ2VzXG4gIGNvbnN0IGN1c3RvbVRvb2xiYXJJdGVtID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsIC8vIERlZmluZSBhcyBhIGN1c3RvbSB0b29sYmFyIGl0ZW1cbiAgICBpZDogXCJjdXN0b20tc2F2ZS1hc1wiLCAvLyBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRvb2xiYXIgaXRlbVxuICAgIHRpdGxlOiBcIk15IEV4dHJhY3QgUGFnZXNcIiwgLy8gRGlzcGxheSB0aXRsZSBmb3IgdGhlIHRvb2xiYXIgaXRlbVxuICAgIGNsYXNzTmFtZTogXCJjdXN0b20tdG9vbGJhci1pdGVtXCIsIC8vIENTUyBjbGFzcyBmb3Igc3R5bGluZ1xuICAgIGljb246IFwiXCIsIC8vIFBsYWNlaG9sZGVyIGZvciBhbiBpY29uIChjYW4gYmUgY3VzdG9taXplZCBsYXRlcilcblxuICAgIC8vIEZ1bmN0aW9uIHRyaWdnZXJlZCB3aGVuIHRoZSB0b29sYmFyIGl0ZW0gaXMgY2xpY2tlZFxuICAgIG9uUHJlc3M6IGFzeW5jIChcbiAgICAgIGV2ZW50LFxuICAgICAge1xuICAgICAgICBzZXRPcGVyYXRpb25zOiBzZXRPcGVyYXRpb25zLCAvLyBGdW5jdGlvbiB0byBzZXQgb3BlcmF0aW9ucyBvbiBkb2N1bWVudFxuICAgICAgICBnZXRTZWxlY3RlZFBhZ2VJbmRleGVzOiBnZXRTZWxlY3RlZFBhZ2VJbmRleGVzLCAvLyBGdW5jdGlvbiB0byBnZXQgc2VsZWN0ZWQgcGFnZXNcbiAgICAgIH1cbiAgICApID0%252BIHtcbiAgICAgIC8vIEdldCBpbmRpY2VzIG9mIHNlbGVjdGVkIHBhZ2VzXG4gICAgICBjb25zdCBzZWxlY3RlZFBhZ2VzSW5kZXggPSBnZXRTZWxlY3RlZFBhZ2VJbmRleGVzKCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQYWdlc0luZGV4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gcGFnZXMgc2VsZWN0ZWRcIik7IC8vIExvZyBhbiBlcnJvciBpZiBubyBwYWdlcyBhcmUgc2VsZWN0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coXCJTZWxlY3RlZCBwYWdlcyBpbmRpY2VzOiBcIiwgc2VsZWN0ZWRQYWdlc0luZGV4KTsgLy8gTG9nIHNlbGVjdGVkIHBhZ2UgaW5kZXhlc1xuXG4gICAgICAvLyBFeHBvcnQgdGhlIHNlbGVjdGVkIHBhZ2VzIGFzIGEgbmV3IFBERiBmaWxlXG4gICAgICBjb25zdCBmaWxlID0gYXdhaXQgaW5zdGFuY2UuZXhwb3J0UERGV2l0aE9wZXJhdGlvbnMoW1xuICAgICAgICB7IHR5cGU6IFwia2VlcFBhZ2VzXCIsIHBhZ2VJbmRleGVzOiBzZWxlY3RlZFBhZ2VzSW5kZXggfSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBDcmVhdGUgYSBCbG9iIG9iamVjdCBmb3IgdGhlIGV4cG9ydGVkIFBERlxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiIH0pO1xuICAgICAgY29uc29sZS5sb2coXCJCbG9iIERhdGE6IFwiLCBibG9iKTsgLy8gTG9nIGJsb2IgZGF0YVxuXG4gICAgICAvLyBEb3dubG9hZCB0aGUgZmlsZVxuICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgICAvLyBGb3IgSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2VcbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJsb2IsIFwic2VsZWN0ZWRwYWdlcy5wZGZcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgYS5ocmVmID0gb2JqZWN0VXJsO1xuICAgICAgICBhLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgYS5kb3dubG9hZCA9IFwic2VsZWN0ZWRwYWdlcy5wZGZcIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgICAgYS5jbGljaygpOyAvLyBTaW11bGF0ZSBhIGNsaWNrIGV2ZW50IHRvIHRyaWdnZXIgZG93bmxvYWRcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVcmwpOyAvLyBSZXZva2UgdGhlIG9iamVjdCBVUkxcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgYW5jaG9yIGVsZW1lbnRcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIC8vIFNldCBjdXN0b20gZG9jdW1lbnQgZWRpdG9yIHRvb2xiYXIgaXRlbXNcbiAgaW5zdGFuY2Uuc2V0RG9jdW1lbnRFZGl0b3JUb29sYmFySXRlbXMoW1xuICAgIHsgdHlwZTogXCJhZGRcIiB9LCAvLyBBZGQgYnV0dG9uIHRvIGluc2VydCBuZXcgZWxlbWVudHNcbiAgICBjdXN0b21Ub29sYmFySXRlbSwgLy8gQWRkIHRoZSBjdXN0b20gZXhwb3J0IHBhZ2VzIGJ1dHRvblxuICAgIHsgdHlwZTogXCJtb3ZlLWxlZnRcIiB9LCAvLyBNb3ZlIGVsZW1lbnRzIGxlZnRcbiAgICB7IHR5cGU6IFwibW92ZS1yaWdodFwiIH0sIC8vIE1vdmUgZWxlbWVudHMgcmlnaHRcbiAgICB7IHR5cGU6IFwiZHVwbGljYXRlXCIgfSwgLy8gRHVwbGljYXRlIHNlbGVjdGVkIGVsZW1lbnRzXG4gIF0pO1xuXG4gIGNvbnNvbGUubG9nKFwiTnV0cmllbnQgbG9hZGVkISBieSBOYXJhc2hpbWFuXCIpOyAvLyBMb2cgY29tcGxldGlvbiBvZiBzZXR1cFxufSk7XG4iLCJtb2RlIjoic3RhbmRhbG9uZSIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4uY3VzdG9tLXRvb2xiYXItaXRlbSB7XG4gIGhlaWdodDogMTAwJTtcbn1cbiJ9) - -- [Convert from text to speech](https://github.com/PSPDFKit/awesome-nutrient/tree/master/web/annotation/text-2-speech) - -- [Enable speech to text](https://github.com/PSPDFKit/awesome-nutrient/tree/master/web/annotation/speech-2-text) - - Enable speech-to-text synthesis to create text annotations. - -- [Detect when viewer UI is loaded](./web/viewer/detecting-when-the-viewer-UI-loads.md) - - Detect if the Web SDK Viewer has been loaded completely or not. - -- [Watermark documents in headless mode using Web SDK](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBoZWFkbGVzczogdHJ1ZSxcbiAgZGlzYWJsZVRleHRTZWxlY3Rpb246IHRydWUsXG59KS50aGVuKGFzeW5jIChpbnN0YW5jZSkgPT4ge1xuICBsZXQgd2F0ZXJtYXJrcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGluc3RhbmNlLnRvdGFsUGFnZUNvdW50IH0pLm1hcCgoXywgcGFnZUluZGV4KSA9PlxuICAgICAgICBpbnN0YW5jZS5wYWdlSW5mb0ZvckluZGV4KHBhZ2VJbmRleClcbiAgICAgIClcbiAgICApXG4gICkucmVkdWNlKChhY2MsIHBhZ2VJbmZvKSA9PiB7XG4gICAgY29uc3QgeyBpbmRleDogcGFnZUluZGV4LCByYXdQZGZCb3hlcyB9ID0gcGFnZUluZm8sXG4gICAgICB7IGNyb3BCb3ggfSA9IHJhd1BkZkJveGVzLFxuICAgICAgW2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodF0gPSBjcm9wQm94O1xuXG4gICAgY29uc3QgdG90YWxSb3dzID0gNDsgLy8gNCByb3dzXG4gICAgY29uc3QgdG90YWxDb2xzID0gMzsgLy8gMyBjb2x1bW5zXG4gICAgY29uc3QgdGV4dCA9IFwiQ09ORklERU5USUFMXCI7XG4gICAgY29uc3QgZm9udFNpemUgPSAxNDtcbiAgICBjb25zdCB0ZXh0V2lkdGggPSB3aWR0aCAqIDAuNDsgLy8gSW5jcmVhc2VkIHdpZHRoICg0MCUgb2YgcGFnZSB3aWR0aClcbiAgICBjb25zdCB0ZXh0SGVpZ2h0ID0gNTA7IC8vIEluY3JlYXNlZCBoZWlnaHQgZm9yIGJldHRlciB2aXNpYmlsaXR5XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0b3RhbFJvd3M7IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB0b3RhbENvbHM7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IHggPSAoY29sICsgMSkgKiAod2lkdGggLyAodG90YWxDb2xzICsgMSkpO1xuICAgICAgICBjb25zdCB5ID0gKHJvdyArIDEpICogKGhlaWdodCAvICh0b3RhbFJvd3MgKyAxKSk7XG5cbiAgICAgICAgYWNjLnB1c2goXG4gICAgICAgICAgbmV3IFBTUERGS2l0LkFubm90YXRpb25zLlRleHRBbm5vdGF0aW9uKHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4LFxuICAgICAgICAgICAgdGV4dDogeyBmb3JtYXQ6IFwicGxhaW5cIiwgdmFsdWU6IHRleHQgfSxcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgIGlzQm9sZDogdHJ1ZSxcbiAgICAgICAgICAgIGZvbnQ6IFwiSGVsdmV0aWNhXCIsXG4gICAgICAgICAgICBob3Jpem9udGFsQWxpZ246IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgICAgICAgICBsZWZ0OiB4IC0gdGV4dFdpZHRoIC8gMiwgLy8gQ2VudGVyIGhvcml6b250YWxseVxuICAgICAgICAgICAgICB0b3A6IHkgLSB0ZXh0SGVpZ2h0IC8gMiwgLy8gQ2VudGVyIHZlcnRpY2FsbHlcbiAgICAgICAgICAgICAgd2lkdGg6IHRleHRXaWR0aCArIDEwMCwgLy8gSW5jcmVhc2VkIHdpZHRoXG4gICAgICAgICAgICAgIGhlaWdodDogdGV4dEhlaWdodCArIDEwMCwgLy8gSW5jcmVhc2VkIGhlaWdodFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmb250Q29sb3I6IFBTUERGS2l0LkNvbG9yLkdSQVksXG4gICAgICAgICAgICByb3RhdGlvbjogMzAsIC8vIFNsaWdodCB0aWx0XG4gICAgICAgICAgICBsb2NrZWQ6IHRydWUsXG4gICAgICAgICAgICBsb2NrZWRDb250ZW50czogdHJ1ZSxcbiAgICAgICAgICAgIG9wYWNpdHk6IDAuMiwgLy8gVHJhbnNwYXJlbnQgd2F0ZXJtYXJrXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10pO1xuXG4gIGxldCB3YXRlcm1hcmtlZCA9IGF3YWl0IGluc3RhbmNlLmNyZWF0ZSh3YXRlcm1hcmtzKTtcbiAgY29uc3QgZmlsZWxhdHRlbmVkID0gYXdhaXQgaW5zdGFuY2UuYXBwbHlPcGVyYXRpb25zKFt7IHR5cGU6IFwiZmxhdHRlbkFubm90YXRpb25zXCIgfV0pOyAvLyBPcHRpb25hbDogRmxhdHRlbiB3YXRlcm1hcmtzXG4gICAgICBpZiAod2F0ZXJtYXJrZWQubGVuZ3RoID4gMClcbiAgICAgIHtcbiAgICAgICAgaW5zdGFuY2UuZXhwb3J0UERGKCkudGhlbigoYnVmZmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiIH0pO1xuICAgICAgICAvLyBPbmNlIHlvdSBnZXQgdGhlIGJsb2IgZGF0YSB5b3UgY2FuIHNhdmUgaXQgdG8gdGhlIGRlc2lnbmVkIGxvY2F0aW9uXG4gICAgICAgIC8vIEFsc28gcGFzcyB0aGUgYXBwcm9wcmlhdGUgZmlsZSBuYW1lLiBGb3IgZGVtbyBwdXJwb3NlLCBJIGFtIGRvd25sb2FkaW5nIHRoZSBmaWxlIHRvIHNob3cgdGhlIGZpbGUgaXMgd2F0ZXJtYWtlZCBpbiBoZWFkbGVzcyBtb2RlLiBcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBcImRvY3VtZW50LnBkZlwiO1xuICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKSB7XG4gICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJsb2IsIGZpbGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICBhLmhyZWYgPSBvYmplY3RVcmw7XG4gICAgICAgICAgYS5zdHlsZSA9IFwiZGlzcGxheTogbm9uZVwiO1xuICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlTmFtZTtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCk7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB9XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - -- [Track page time and log it in the custom sidebar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJzY2llbnRpZmljLnBkZiJ9LCJqcyI6ImxldCBwYWdlVGltZVNwZW50ID0ge307XG5sZXQgbGFzdFBhZ2VJbmRleCA9IG51bGw7XG5sZXQgbGFzdFBhZ2VFbnRlclRpbWUgPSBEYXRlLm5vdygpO1xubGV0IHNpZGViYXJDb250ZW50Tm9kZSA9IG51bGw7XG5sZXQgZmluYWxpemVkUGFnZXMgPSBuZXcgU2V0KCk7XG5cbmNvbnN0IHsgSW50ZXJmYWNlcywgY3JlYXRlQmxvY2ssIFJlY2lwZXMsIENvcmUgfSA9IFBTUERGS2l0LlVJO1xuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1c3RvbVVJKCkge1xuICByZXR1cm4ge1xuICAgIFtQU1BERktpdC5VSUVsZW1lbnQuU2lkZWJhcl06IHtcbiAgICAgIFtQU1BERktpdC5TaWRlYmFyTW9kZS5DVVNUT01dOiAoeyBjb250YWluZXJOb2RlIH0pID0%252BIHtcbiAgICAgICAgY29udGFpbmVyTm9kZS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgd3JhcHBlci5zdHlsZS5wYWRkaW5nID0gXCIxNnB4XCI7XG4gICAgICAgIHdyYXBwZXIuc3R5bGUuY29sb3IgPSBcIndoaXRlXCI7XG4gICAgICAgIHdyYXBwZXIuaW5uZXJIVE1MID0gYDxoMyBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEwcHg7XCI%252BIFRpbWUgU3BlbnQgcGVyIFBhZ2U8L2gzPmA7XG4gICAgICAgIHNpZGViYXJDb250ZW50Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoc2lkZWJhckNvbnRlbnROb2RlKTtcbiAgICAgICAgY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZCh3cmFwcGVyKTtcbiAgICAgICAgcmVuZGVyVGltZVNwZW50Q29udGVudCgpO1xuICAgICAgICByZXR1cm4geyBub2RlOiBjb250YWluZXJOb2RlIH07XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbmRlclRpbWVTcGVudENvbnRlbnQoKSB7XG4gIGlmICghc2lkZWJhckNvbnRlbnROb2RlKSByZXR1cm47XG4gIHNpZGViYXJDb250ZW50Tm9kZS5pbm5lckhUTUwgPSBcIlwiO1xuICBjb25zdCBzb3J0ZWQgPSBPYmplY3Qua2V5cyhwYWdlVGltZVNwZW50KS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGZvciAoY29uc3QgcGFnZSBvZiBzb3J0ZWQpIHtcbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgcC50ZXh0Q29udGVudCA9IGBQYWdlICR7K3BhZ2UgKyAxfTogJHtwYWdlVGltZVNwZW50W3BhZ2VdLnRvRml4ZWQoMil9c2A7XG4gICAgc2lkZWJhckNvbnRlbnROb2RlLmFwcGVuZENoaWxkKHApO1xuICB9XG59XG5cblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIHVpOiB7XG4gICAgW0ludGVyZmFjZXMuUHJpbWFyeVRvb2xiYXJdOiAoeyBwcm9wcywgaW5zdGFuY2UgfSkgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IGNyZWF0ZUJsb2NrKFJlY2lwZXMuUHJpbWFyeVRvb2xiYXIsIHByb3BzLCAoeyB1aSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpZGViYXIgPSB1aS5nZXRCbG9ja0J5SWQoXCJzaWRlYmFyXCIpO1xuICAgICAgICBpZiAoc2lkZWJhcikge1xuICAgICAgICAgIGNvbnN0IG5ld1NpZGViYXIgPSBjcmVhdGVCbG9jayhDb3JlLkJ1dHRvblNlbGVjdCwge1xuICAgICAgICAgICAgLi4uc2lkZWJhci5wcm9wcyxcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlOiAoa2V5KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChrZXkgPT09IFwic2lkZWJhci1jdXN0b21cIikge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodnMpID0%252BXG4gICAgICAgICAgICAgICAgICB2cy5zZXQoXCJzaWRlYmFyTW9kZVwiLCBQU1BERktpdC5TaWRlYmFyTW9kZS5DVVNUT00pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaWRlYmFyLnByb3BzLm9uU2VsZWN0aW9uQ2hhbmdlPy4oa2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgIC4uLnNpZGViYXIucHJvcHMuaXRlbXMsXG4gICAgICAgICAgICAgIHsgaWQ6IFwic2lkZWJhci1jdXN0b21cIiwgbGFiZWw6IFwiVGltZSBTcGVudCBpbiBlYWNoIFBhZ2VcIiB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB1aS5yZXBsYWNlKFwic2lkZWJhclwiLCBuZXdTaWRlYmFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1aS5jcmVhdGVDb21wb25lbnQoKTtcbiAgICAgIH0pLmNyZWF0ZUNvbXBvbmVudCgpLFxuICAgIH0pLFxuICB9LFxuICBpbml0aWFsVmlld1N0YXRlOiBuZXcgUFNQREZLaXQuVmlld1N0YXRlKHtcbiAgICBzaWRlYmFyTW9kZTogUFNQREZLaXQuU2lkZWJhck1vZGUuQ1VTVE9NLFxuICB9KSxcbiAgY3VzdG9tVUk6IGdlbmVyYXRlQ3VzdG9tVUkoKSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiTnV0cmllbnQgbG9hZGVkIC0gYnkgTmFyYXNoaW1hblwiKTtcbiAgbGFzdFBhZ2VJbmRleCA9IGluc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4O1xuXG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgXCJ2aWV3U3RhdGUuY3VycmVudFBhZ2VJbmRleC5jaGFuZ2VcIixcbiAgICAobmV3UGFnZUluZGV4KSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdGltZVNwZW50ID0gKG5vdyAtIGxhc3RQYWdlRW50ZXJUaW1lKSAvIDEwMDA7XG4gICAgICBpZiAobGFzdFBhZ2VJbmRleCAhPT0gbnVsbCAmJiAhZmluYWxpemVkUGFnZXMuaGFzKGxhc3RQYWdlSW5kZXgpKSB7XG4gICAgICAgIHBhZ2VUaW1lU3BlbnRbbGFzdFBhZ2VJbmRleF0gPVxuICAgICAgICAgIChwYWdlVGltZVNwZW50W2xhc3RQYWdlSW5kZXhdIHx8IDApICsgdGltZVNwZW50O1xuICAgICAgfVxuICAgICAgbGFzdFBhZ2VJbmRleCA9IG5ld1BhZ2VJbmRleDtcbiAgICAgIGxhc3RQYWdlRW50ZXJUaW1lID0gbm93O1xuXG4gICAgICByZW5kZXJUaW1lU3BlbnRDb250ZW50KCk7XG4gICAgfVxuICApO1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsICgpID0%252BIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWVTcGVudCA9IChub3cgLSBsYXN0UGFnZUVudGVyVGltZSkgLyAxMDAwO1xuICAgIGlmICghZmluYWxpemVkUGFnZXMuaGFzKGxhc3RQYWdlSW5kZXgpKSB7XG4gICAgICBwYWdlVGltZVNwZW50W2xhc3RQYWdlSW5kZXhdID1cbiAgICAgICAgKHBhZ2VUaW1lU3BlbnRbbGFzdFBhZ2VJbmRleF0gfHwgMCkgKyB0aW1lU3BlbnQ7XG4gICAgICBpZiAocGFnZVRpbWVTcGVudFtsYXN0UGFnZUluZGV4XSA%252BPSAzMCkge1xuICAgICAgICBmaW5hbGl6ZWRQYWdlcy5hZGQobGFzdFBhZ2VJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn0pO1xuIn0%253D) - -- [Generate different page sizes and detect page dimensions to show in the browser console](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6ImxldCBjdXJyZW50UGFnZVNpemU7XG5jb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCwgLi4ucmVzdCB9ID0gYmFzZU9wdGlvbnMsXG4gIFBERnN0dWIgPSBgJVBERi0xLjRcbjEgMCBvYmo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI%252BPmVuZG9ialxuMiAwIG9iajw8L1R5cGUvUGFnZXMvS2lkc1tcbiAgMyAwIFIgNCAwIFIgNSAwIFIgNiAwIFIgNyAwIFIgXG4gIDggMCBSIDkgMCBSIDEwIDAgUiAxMSAwIFIgMTIgMCBSIFxuICAxMyAwIFIgMTQgMCBSIDE1IDAgUiAxNiAwIFIgMTcgMCBSIFxuICAxOCAwIFIgMTkgMCBSIDIwIDAgUiAyMSAwIFIgMjIgMCBSIFxuICAyMyAwIFIgMjQgMCBSIDI1IDAgUiAyNiAwIFIgMjcgMCBSXG5dL0NvdW50IDI1Pj5lbmRvYmpcbjMgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCAyMzg0IDMzNzBdPj5lbmRvYmogICUgQTBcbjQgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCAxNjg0IDIzODRdPj5lbmRvYmogICUgQTFcbjUgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCAxMTkwIDE2ODRdPj5lbmRvYmogICUgQTJcbjYgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA4NDIgMTE5MF0%252BPmVuZG9iaiAgICUgQTNcbjcgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA1OTUgODQyXT4%252BZW5kb2JqICAgICUgQTRcbjggMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA0MjAgNTk1XT4%252BZW5kb2JqICAgICUgQTVcbjkgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCAyODM0IDQwMDhdPj5lbmRvYmogICUgQjBcbjEwIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMjAwNCAyODM0XT4%252BZW5kb2JqICUgQjFcbjExIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTQxNyAyMDA0XT4%252BZW5kb2JqICUgQjJcbjEyIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTAwMCAxNDE3XT4%252BZW5kb2JqICUgQjNcbjEzIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgNzA5IDEwMDBdPj5lbmRvYmogICUgQjRcbjE0IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMjU5OSAzNjc3XT4%252BZW5kb2JqICUgQzBcbjE1IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTgzNyAyNTk5XT4%252BZW5kb2JqICUgQzFcbjE2IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTI5OCAxODM3XT4%252BZW5kb2JqICUgQzJcbjE3IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgOTE4IDEyOThdPj5lbmRvYmogICUgQzNcbjE4IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgNjEyIDc5Ml0%252BPmVuZG9iaiAgICUgQU5TSSBBXG4xOSAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDc5MiAxMjI0XT4%252BZW5kb2JqICAlIEFOU0kgQlxuMjAgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCAxMjI0IDE1ODRdPj5lbmRvYmogJSBBTlNJIENcbjIxIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTU4NCAyNDQ4XT4%252BZW5kb2JqICUgQU5TSSBEXG4yMiAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDY0OCA4NjRdPj5lbmRvYmogICAlIEFSQ0ggQVxuMjMgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA4NjQgMTI5Nl0%252BPmVuZG9iaiAgJSBBUkNIIEJcbjI0IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTI5NiAxNzI4XT4%252BZW5kb2JqICUgQVJDSCBDXG4yNSAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDE3MjggMjU5Ml0%252BPmVuZG9iaiAlIEFSQ0ggRFxueHJlZlxuMCAyNlxuMDAwMDAwMDAwMCA2NTUzNSBmXG4wMDAwMDAwMDEwIDAwMDAwIG5cbjAwMDAwMDAwNTMgMDAwMDAgblxuMDAwMDAwMDEwMiAwMDAwMCBuXG4wMDAwMDAwMTUxIDAwMDAwIG5cbjAwMDAwMDAyMDAgMDAwMDAgblxuMDAwMDAwMDI0OSAwMDAwMCBuXG4wMDAwMDAwMjk4IDAwMDAwIG5cbjAwMDAwMDAzNTAgMDAwMDAgblxuMDAwMDAwMDQwMSAwMDAwMCBuXG4wMDAwMDAwNDUzIDAwMDAwIG5cbjAwMDAwMDA1MDUgMDAwMDAgblxuMDAwMDAwMDU1NyAwMDAwMCBuXG4wMDAwMDAwNjA5IDAwMDAwIG5cbjAwMDAwMDA2NjEgMDAwMDAgblxuMDAwMDAwMDcxMyAwMDAwMCBuXG4wMDAwMDAwNzY1IDAwMDAwIG5cbjAwMDAwMDA4MTcgMDAwMDAgblxuMDAwMDAwMDg2OSAwMDAwMCBuXG4wMDAwMDAwOTIxIDAwMDAwIG5cbjAwMDAwMDA5NzMgMDAwMDAgblxuMDAwMDAwMTAyNSAwMDAwMCBuXG4wMDAwMDAxMDc3IDAwMDAwIG5cbjAwMDAwMDExMjkgMDAwMDAgblxuMDAwMDAwMTE4MSAwMDAwMCBuXG4wMDAwMDAxMjMzIDAwMDAwIG5cbnRyYWlsZXI8PC9TaXplIDI2L1Jvb3QgMSAwIFI%252BPlxuc3RhcnR4cmVmXG4xMzAwXG4lJUVPRlxuYCxcbiAgdWludDhhcnJheSA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShQREZzdHViKTtcblxuLy8gTG9hZCBpbiBQU1BERktpdCBvciBOdXRyaWVudCBTREtcblBTUERGS2l0LmxvYWQoe1xuICAuLi5yZXN0LFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgZG9jdW1lbnQ6IHVpbnQ4YXJyYXkuYnVmZmVyLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIC0gYnkgTmFyYXNoaW1hblwiKTtcblxuICBpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKFxuICAgIFwidmlld1N0YXRlLmN1cnJlbnRQYWdlSW5kZXguY2hhbmdlXCIsXG4gICAgKHBhZ2VJbmRleCkgPT4ge1xuICAgICAgZ2V0UGFnZVNpemUocGFnZUluZGV4KTtcbiAgICB9XG4gICk7XG5cbiAgY29uc3QgZ2V0UGFnZVNpemUgPSBhc3luYyAocGFnZUluZGV4KSA9PiB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBsYWJlbCwgcm90YXRpb24gfSA9XG4gICAgICBpbnN0YW5jZS5wYWdlSW5mb0ZvckluZGV4KHBhZ2VJbmRleCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIldpZHRoOlwiLCB3aWR0aCk7XG4gICAgY29uc29sZS5sb2coXCJIZWlnaHQ6XCIsIGhlaWdodCk7XG4gICAgY29uc29sZS5sb2coXCJMYWJlbDpcIiwgbGFiZWwpO1xuICAgIGNvbnNvbGUubG9nKFwiUm90YXRpb246XCIsIHJvdGF0aW9uKTtcblxuICAgIGxldCBjdXJyZW50UGFnZVNpemUgPSBcIlVua25vd25cIjsgLy8gRGVmYXVsdCB2YWx1ZVxuXG4gICAgLy8gQS1TZXJpZXNcbiAgICBpZiAod2lkdGggPT09IDU5NSAmJiBoZWlnaHQgPT09IDg0MikgY3VycmVudFBhZ2VTaXplID0gXCJBNFwiO1xuICAgIGVsc2UgaWYgKHdpZHRoID09PSA4NDIgJiYgaGVpZ2h0ID09PSAxMTkwKSBjdXJyZW50UGFnZVNpemUgPSBcIkEzXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDExOTAgJiYgaGVpZ2h0ID09PSAxNjg0KSBjdXJyZW50UGFnZVNpemUgPSBcIkEyXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDE2ODQgJiYgaGVpZ2h0ID09PSAyMzg0KSBjdXJyZW50UGFnZVNpemUgPSBcIkExXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDIzODQgJiYgaGVpZ2h0ID09PSAzMzcwKSBjdXJyZW50UGFnZVNpemUgPSBcIkEwXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDQyMCAmJiBoZWlnaHQgPT09IDU5NSkgY3VycmVudFBhZ2VTaXplID0gXCJBNVwiO1xuXG4gICAgLy8gQi1TZXJpZXNcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gMjgzNCAmJiBoZWlnaHQgPT09IDQwMDgpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQjBcIjtcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gMjAwNCAmJiBoZWlnaHQgPT09IDI4MzQpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQjFcIjtcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gMTQxNyAmJiBoZWlnaHQgPT09IDIwMDQpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQjJcIjtcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gMTAwMCAmJiBoZWlnaHQgPT09IDE0MTcpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQjNcIjtcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gNzA5ICYmIGhlaWdodCA9PT0gMTAwMCkgY3VycmVudFBhZ2VTaXplID0gXCJCNFwiO1xuXG4gICAgLy8gQU5TSVxuICAgIGVsc2UgaWYgKHdpZHRoID09PSA2MTIgJiYgaGVpZ2h0ID09PSA3OTIpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQU5TSSBBXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDc5MiAmJiBoZWlnaHQgPT09IDEyMjQpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQU5TSSBCXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDEyMjQgJiYgaGVpZ2h0ID09PSAxNTg0KSBjdXJyZW50UGFnZVNpemUgPSBcIkFOU0kgQ1wiO1xuICAgIGVsc2UgaWYgKHdpZHRoID09PSAxNTg0ICYmIGhlaWdodCA9PT0gMjQ0OCkgY3VycmVudFBhZ2VTaXplID0gXCJBTlNJIERcIjtcblxuICAgIC8vIEFSQ0hcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gNjQ4ICYmIGhlaWdodCA9PT0gODY0KSBjdXJyZW50UGFnZVNpemUgPSBcIkFSQ0ggQVwiO1xuICAgIGVsc2UgaWYgKHdpZHRoID09PSA4NjQgICYmIGhlaWdodCA9PT0gMTI5NikgY3VycmVudFBhZ2VTaXplID0gXCJBUkNIIEJcIjtcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gMTI5NiAmJiBoZWlnaHQgPT09IDE3MjgpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQVJDSCBDXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDE3MjggJiYgaGVpZ2h0ID09PSAyNTkyKSBjdXJyZW50UGFnZVNpemUgPSBcIkFSQ0ggRFwiO1xuXG4gICAgY29uc29sZS5sb2coXCJDdXJyZW50IFBhZ2UgU2l6ZTpcIiwgY3VycmVudFBhZ2VTaXplKTtcbiAgfTtcblxuICBpZiAoaW5zdGFuY2Uudmlld1N0YXRlLmN1cnJlbnRQYWdlSW5kZXggPT09IDApIHtcbiAgICBnZXRQYWdlU2l6ZSgwKTtcbiAgfVxufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIn0%253D) - -- [Overlay a YouTube video on a PDF](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmljb25fdGV4dCB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGglM0QlMjIyNSUyMiBoZWlnaHQlM0QlMjIyNSUyMiB2aWV3Qm94JTNEJTIyMCUyMDAlMjAyNSUyMDI1JTIyIGZpbGwlM0QlMjIlMjNGRkZGRkYlMjIgeG1sbnMlM0QlMjJodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTIyJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC43NSUyMiBkJTNEJTIyTTEuNzA2NzkgMjAuNTY4TDMuNDc0NzkgMjIuMzM1TDIuMDU5NzkgMjMuNzVDMS44NzIyNiAyMy45Mzc1IDEuNjE3OTUgMjQuMDQyOCAxLjM1Mjc5IDI0LjA0MjhDMS4wODc2MiAyNC4wNDI4IDAuODMzMzE0IDIzLjkzNzUgMC42NDU3ODcgMjMuNzVMMC4yOTI3ODYgMjMuMzk2QzAuMTA1MzE1IDIzLjIwODUgMCAyMi45NTQyIDAgMjIuNjg5QzAgMjIuNDIzOCAwLjEwNTMxNSAyMi4xNjk1IDAuMjkyNzg2IDIxLjk4MkwxLjcwNjc5IDIwLjU2OFolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NwYXRoIGQlM0QlMjJNOC45MjQ3OSA1LjkyOTk5TDguMjE0NzkgNi42Mjk5OUMzLjI2NDc5IDExLjYzIDMuNjI0NzkgMTYuODkgMy42MjQ3OSAxNi44OUwyLjA0NDc5IDE4LjQ4QzEuOTI4MzggMTguNTk2MSAxLjgzNjAyIDE4LjczNCAxLjc3MyAxOC44ODU5QzEuNzA5OTkgMTkuMDM3OCAxLjY3NzU1IDE5LjIwMDYgMS42Nzc1NSAxOS4zNjVDMS42Nzc1NSAxOS41Mjk0IDEuNzA5OTkgMTkuNjkyMiAxLjc3MyAxOS44NDQxQzEuODM2MDIgMTkuOTk1OSAxLjkyODM4IDIwLjEzMzkgMi4wNDQ3OSAyMC4yNUwzLjc5NDc5IDIyQzMuOTEwOSAyMi4xMTY0IDQuMDQ4ODQgMjIuMjA4OCA0LjIwMDcgMjIuMjcxOEM0LjM1MjU2IDIyLjMzNDggNC41MTUzNyAyMi4zNjcyIDQuNjc5NzkgMjIuMzY3MkM0Ljg0NDIgMjIuMzY3MiA1LjAwNzAxIDIyLjMzNDggNS4xNTg4NyAyMi4yNzE4QzUuMzEwNzMgMjIuMjA4OCA1LjQ0ODY3IDIyLjExNjQgNS41NjQ3OSAyMkw3LjE1NDc5IDIwLjQxQzcuMTU0NzkgMjAuNDEgMTIuNDY0OCAyMC43NyAxNy40MTQ4IDE1LjgyTDE4LjExNDggMTUuMTElMjIgc3Ryb2tlJTNEJTIyYmxhY2slMjIgc3Ryb2tlLW1pdGVybGltaXQlM0QlMjIxMCUyMiBzdHJva2UtbGluZWNhcCUzRCUyMnJvdW5kJTIyLyUzRSUzQ3BhdGggb3BhY2l0eSUzRCUyMjAuMzMlMjIgZCUzRCUyMk0xNi43MDY4IDE1LjgyNkw4LjIyMTggNy4zNDFMNi44MDc4IDguNzU1TDE1LjI5MjggMTcuMjRMMTYuNzA2OCAxNS44MjZaJTIyIGZpbGwlM0QlMjIlMjNGODI0MDAlMjIvJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC41JTIyIGQlM0QlMjJNNi45Mzk4MSAxOS45MzFMNC4xMTA4MSAxNy4xMDNMMy40MDM4MSAxNy44MUw2LjIzMjgxIDIwLjYzOEw2LjkzOTgxIDE5LjkzMVolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NjaXJjbGUgY3glM0QlMjIxOC4wNDQ4JTIyIGN5JTNEJTIyNiUyMiByJTNEJTIyNiUyMiBmaWxsJTNEJTIyJTIzRjgyNDAwJTIyLyUzRSUzQy9zdmclM0VcIilcbiAgICBuby1yZXBlYXQgY2VudGVyO1xufVxuXG4uaWNvbl9zaWduYXR1cmUge1xuICB3aWR0aDogNTBweDtcbiAgaGVpZ2h0OiA1MHB4O1xuICBiYWNrZ3JvdW5kOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZvY3VzYWJsZT1cImZhbHNlXCI%252BPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNy4zMzcgMTlIMmEyIDIgMCAwIDEtMi0yVjdhMiAyIDAgMCAxIDItMmgyMGEyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0yIDJoLTkuMzUxYy0uMi42OTgtLjQyIDEuMzUzLS42NTUgMS45MzYtLjI5My43My0uNjI0IDEuMzg2LS45OTMgMS44NzItLjM0MS40NS0uODU2Ljk0Mi0xLjU0Ni45NDItLjgxNiAwLTEuMjktLjYzNy0xLjUzNi0xLjE0NS0uMjY0LS41NDUtLjQxOS0xLjIzNS0uNTAzLTEuOTA1YTExLjE4MiAxMS4xODIgMCAwIDEtLjA3OS0xLjdaTTIgNi41aDIwYS41LjUgMCAwIDEgLjUuNXYxMGEuNS41IDAgMCAxLS41LjVoLTguOTY0YTM1LjAyIDM1LjAyIDAgMCAwIC4zNzgtMS44NzJjLjE2NC0uOTQ3LjI4OC0xLjkwMi4zNjEtMi44MDZhMTIuNjI3IDEyLjYyNyAwIDAgMSAxLjU3My0uODg0bC4wNTYuMTQzLjEyOC4zMjVjLjExNC4yODQuMjY0LjYzLjQ1NC45MTEuMTYxLjI0LjUxNy42ODMgMS4xMDUuNjgzIDEuMDM1IDAgMS44OS0uNTkgMi40OS0xLjM4Ni42LS43OTcgMS4wMDMtMS44NjIgMS4xNjItMy4wMTFhLjc1Ljc1IDAgMSAwLTEuNDg2LS4yMDZjLS4xMzIuOTUtLjQ1NyAxLjc2LS44NzQgMi4zMTQtLjM3LjQ5LS43NjguNzMtMS4xNDUuNzhsLS4wMDgtLjAxMWEzLjcxIDMuNzEgMCAwIDEtLjMwNy0uNjM2bC0uMDk4LS4yNDhhMTEuOTMzIDExLjkzMyAwIDAgMC0uMjI4LS41NTcgMi4xNjIgMi4xNjIgMCAwIDAtLjIyNC0uMzkyYy0uMDYyLS4wODMtLjMwNC0uMzk3LS43MzctLjM5N2EuNzUuNzUgMCAwIDAtLjI3LjA1IDExLjkgMTEuOSAwIDAgMC0xLjUxNy43MjNjLS4wMDItLjI1MS0uMDEtLjQ5My0uMDIzLS43MjQtLjA0NC0uNzM0LS4xNTUtMS40MjItLjM4Mi0xLjk1LS4yMjMtLjUyLS42NjctMS4wOTktMS40NDQtMS4wOTktLjUyIDAtMS4yMTUuMjE3LTEuOS40ODYtLjcxOC4yODItMS41MzkuNjctMi4zNTggMS4xLTEuNjIzLjg1My0zLjMyMiAxLjkxNy00LjIzOSAyLjcyN2EuNzUuNzUgMCAxIDAgLjk5NCAxLjEyNGMuNzgtLjY5IDIuMzUzLTEuNjg4IDMuOTQzLTIuNTIzYTIzLjE4IDIzLjE4IDAgMCAxIDIuMjEtMS4wMzJjLjY0Ni0uMjU1IDEuMDg4LS4zNjggMS4zMS0uMzhhLjY5LjY5IDAgMCAxIC4xMDYuMTg4Yy4xMjUuMjkyLjIyMi43NzYuMjYyIDEuNDQ5LjAzLjQ4LjAyNyAxLjAyMy0uMDAyIDEuNjA5LS41MjQuMzc3LTEuMDMuNzg1LTEuNTA2IDEuMjA3LTEuMzU4IDEuMjA3LTIuNTI3IDIuNTk2LTMuMTMxIDMuODQzYTIuNTYzIDIuNTYzIDAgMCAwLS4xNjMuNDUySDJhLjUuNSAwIDAgMS0uNS0uNVY3YS41LjUgMCAwIDEgLjUtLjVaTTExLjA4NCAxOWMtLjE1Mi40OTYtLjMxNC45Ni0uNDgyIDEuMzc3LS4yNy42NzUtLjU0MyAxLjE5Mi0uNzk2IDEuNTI2LS4xODMuMjQtLjI5OS4zMTUtLjM0My4zMzctLjAzNS0uMDI3LS4xMDQtLjEwMi0uMTk0LS4yODgtLjE2Mi0uMzM1LS4yOS0uODQyLS4zNjQtMS40MzlBOS42NzggOS42NzggMCAwIDEgOC44MzggMTloMi4yNDZabS40MS0xLjVIOS4xNDJjLjUxOC0uOTY0IDEuNDgtMi4xMTMgMi42NzUtMy4xNzQuMTA1LS4wOTQuMjEyLS4xODYuMzItLjI3OGEzMi40MTUgMzIuNDE1IDAgMCAxLS42NDMgMy40NTJabS40NDItOC43N3MuMDA2LjAwMi4wMTYuMDEyYy0uMDExLS4wMDUtLjAxNi0uMDEtLjAxNi0uMDExWk05LjQ4OCAyMi4yNTdzLS4wMDMgMC0uMDA4LS4wMDNjLjAwNi4wMDEuMDA4LjAwMi4wMDguMDAzWm03LjgxMS05LjY5LS4wMS0uMDEuMDEuMDFaXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiPjwvcGF0aD48L3N2Zz4nKVxuICAgIG5vLXJlcGVhdCBjZW50ZXI7XG59XG4iLCJqcyI6IlBTUERGS2l0LmxvYWQoeyAuLi5iYXNlT3B0aW9ucywgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUksgfSkudGhlbihcbiAgKGluc3RhbmNlKSA9PiB7XG4gICAgY29uc3QgdmlkZW9XaWRnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgLy8gQ29ycmVjdGVkIHRlbXBsYXRlIHN0cmluZyB1c2FnZVxuICAgIHZpZGVvV2lkZ2V0LmlubmVySFRNTCA9IGBcbiAgICAgIDxpZnJhbWUgd2lkdGg9XCI1MDBcIiBoZWlnaHQ9XCIzNzVcIlxuICAgICAgICBzcmM9XCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC80SEVYdnJUWXBZQVwiXG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgIGFsbG93ZnVsbHNjcmVlbj5cbiAgICAgIDwvaWZyYW1lPlxuICAgIGA7XG5cbiAgICBjb25zdCBpdGVtID0gbmV3IFBTUERGS2l0LkN1c3RvbU92ZXJsYXlJdGVtKHtcbiAgICAgIGlkOiBcInZpZGVvLWluc3RydWN0aW9uc1wiLFxuICAgICAgbm9kZTogdmlkZW9XaWRnZXQsXG4gICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICBwb3NpdGlvbjogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlBvaW50KHsgeDogNTAsIHk6IDIwMCB9KVxuICAgIH0pO1xuXG4gICAgaW5zdGFuY2Uuc2V0Q3VzdG9tT3ZlcmxheUl0ZW0oaXRlbSk7XG4gIH1cbik7XG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) - -- [Custom overlay with an MP4/HTML5 video on PDF](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmljb25fdGV4dCB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGglM0QlMjIyNSUyMiBoZWlnaHQlM0QlMjIyNSUyMiB2aWV3Qm94JTNEJTIyMCUyMDAlMjAyNSUyMDI1JTIyIGZpbGwlM0QlMjIlMjNGRkZGRkYlMjIgeG1sbnMlM0QlMjJodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTIyJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC43NSUyMiBkJTNEJTIyTTEuNzA2NzkgMjAuNTY4TDMuNDc0NzkgMjIuMzM1TDIuMDU5NzkgMjMuNzVDMS44NzIyNiAyMy45Mzc1IDEuNjE3OTUgMjQuMDQyOCAxLjM1Mjc5IDI0LjA0MjhDMS4wODc2MiAyNC4wNDI4IDAuODMzMzE0IDIzLjkzNzUgMC42NDU3ODcgMjMuNzVMMC4yOTI3ODYgMjMuMzk2QzAuMTA1MzE1IDIzLjIwODUgMCAyMi45NTQyIDAgMjIuNjg5QzAgMjIuNDIzOCAwLjEwNTMxNSAyMi4xNjk1IDAuMjkyNzg2IDIxLjk4MkwxLjcwNjc5IDIwLjU2OFolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NwYXRoIGQlM0QlMjJNOC45MjQ3OSA1LjkyOTk5TDguMjE0NzkgNi42Mjk5OUMzLjI2NDc5IDExLjYzIDMuNjI0NzkgMTYuODkgMy42MjQ3OSAxNi44OUwyLjA0NDc5IDE4LjQ4QzEuOTI4MzggMTguNTk2MSAxLjgzNjAyIDE4LjczNCAxLjc3MyAxOC44ODU5QzEuNzA5OTkgMTkuMDM3OCAxLjY3NzU1IDE5LjIwMDYgMS42Nzc1NSAxOS4zNjVDMS42Nzc1NSAxOS41Mjk0IDEuNzA5OTkgMTkuNjkyMiAxLjc3MyAxOS44NDQxQzEuODM2MDIgMTkuOTk1OSAxLjkyODM4IDIwLjEzMzkgMi4wNDQ3OSAyMC4yNUwzLjc5NDc5IDIyQzMuOTEwOSAyMi4xMTY0IDQuMDQ4ODQgMjIuMjA4OCA0LjIwMDcgMjIuMjcxOEM0LjM1MjU2IDIyLjMzNDggNC41MTUzNyAyMi4zNjcyIDQuNjc5NzkgMjIuMzY3MkM0Ljg0NDIgMjIuMzY3MiA1LjAwNzAxIDIyLjMzNDggNS4xNTg4NyAyMi4yNzE4QzUuMzEwNzMgMjIuMjA4OCA1LjQ0ODY3IDIyLjExNjQgNS41NjQ3OSAyMkw3LjE1NDc5IDIwLjQxQzcuMTU0NzkgMjAuNDEgMTIuNDY0OCAyMC43NyAxNy40MTQ4IDE1LjgyTDE4LjExNDggMTUuMTElMjIgc3Ryb2tlJTNEJTIyYmxhY2slMjIgc3Ryb2tlLW1pdGVybGltaXQlM0QlMjIxMCUyMiBzdHJva2UtbGluZWNhcCUzRCUyMnJvdW5kJTIyLyUzRSUzQ3BhdGggb3BhY2l0eSUzRCUyMjAuMzMlMjIgZCUzRCUyMk0xNi43MDY4IDE1LjgyNkw4LjIyMTggNy4zNDFMNi44MDc4IDguNzU1TDE1LjI5MjggMTcuMjRMMTYuNzA2OCAxNS44MjZaJTIyIGZpbGwlM0QlMjIlMjNGODI0MDAlMjIvJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC41JTIyIGQlM0QlMjJNNi45Mzk4MSAxOS45MzFMNC4xMTA4MSAxNy4xMDNMMy40MDM4MSAxNy44MUw2LjIzMjgxIDIwLjYzOEw2LjkzOTgxIDE5LjkzMVolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NjaXJjbGUgY3glM0QlMjIxOC4wNDQ4JTIyIGN5JTNEJTIyNiUyMiByJTNEJTIyNiUyMiBmaWxsJTNEJTIyJTIzRjgyNDAwJTIyLyUzRSUzQy9zdmclM0VcIilcbiAgICBuby1yZXBlYXQgY2VudGVyO1xufVxuXG4uaWNvbl9zaWduYXR1cmUge1xuICB3aWR0aDogNTBweDtcbiAgaGVpZ2h0OiA1MHB4O1xuICBiYWNrZ3JvdW5kOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZvY3VzYWJsZT1cImZhbHNlXCI%252BPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNy4zMzcgMTlIMmEyIDIgMCAwIDEtMi0yVjdhMiAyIDAgMCAxIDItMmgyMGEyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0yIDJoLTkuMzUxYy0uMi42OTgtLjQyIDEuMzUzLS42NTUgMS45MzYtLjI5My43My0uNjI0IDEuMzg2LS45OTMgMS44NzItLjM0MS40NS0uODU2Ljk0Mi0xLjU0Ni45NDItLjgxNiAwLTEuMjktLjYzNy0xLjUzNi0xLjE0NS0uMjY0LS41NDUtLjQxOS0xLjIzNS0uNTAzLTEuOTA1YTExLjE4MiAxMS4xODIgMCAwIDEtLjA3OS0xLjdaTTIgNi41aDIwYS41LjUgMCAwIDEgLjUuNXYxMGEuNS41IDAgMCAxLS41LjVoLTguOTY0YTM1LjAyIDM1LjAyIDAgMCAwIC4zNzgtMS44NzJjLjE2NC0uOTQ3LjI4OC0xLjkwMi4zNjEtMi44MDZhMTIuNjI3IDEyLjYyNyAwIDAgMSAxLjU3My0uODg0bC4wNTYuMTQzLjEyOC4zMjVjLjExNC4yODQuMjY0LjYzLjQ1NC45MTEuMTYxLjI0LjUxNy42ODMgMS4xMDUuNjgzIDEuMDM1IDAgMS44OS0uNTkgMi40OS0xLjM4Ni42LS43OTcgMS4wMDMtMS44NjIgMS4xNjItMy4wMTFhLjc1Ljc1IDAgMSAwLTEuNDg2LS4yMDZjLS4xMzIuOTUtLjQ1NyAxLjc2LS44NzQgMi4zMTQtLjM3LjQ5LS43NjguNzMtMS4xNDUuNzhsLS4wMDgtLjAxMWEzLjcxIDMuNzEgMCAwIDEtLjMwNy0uNjM2bC0uMDk4LS4yNDhhMTEuOTMzIDExLjkzMyAwIDAgMC0uMjI4LS41NTcgMi4xNjIgMi4xNjIgMCAwIDAtLjIyNC0uMzkyYy0uMDYyLS4wODMtLjMwNC0uMzk3LS43MzctLjM5N2EuNzUuNzUgMCAwIDAtLjI3LjA1IDExLjkgMTEuOSAwIDAgMC0xLjUxNy43MjNjLS4wMDItLjI1MS0uMDEtLjQ5My0uMDIzLS43MjQtLjA0NC0uNzM0LS4xNTUtMS40MjItLjM4Mi0xLjk1LS4yMjMtLjUyLS42NjctMS4wOTktMS40NDQtMS4wOTktLjUyIDAtMS4yMTUuMjE3LTEuOS40ODYtLjcxOC4yODItMS41MzkuNjctMi4zNTggMS4xLTEuNjIzLjg1My0zLjMyMiAxLjkxNy00LjIzOSAyLjcyN2EuNzUuNzUgMCAxIDAgLjk5NCAxLjEyNGMuNzgtLjY5IDIuMzUzLTEuNjg4IDMuOTQzLTIuNTIzYTIzLjE4IDIzLjE4IDAgMCAxIDIuMjEtMS4wMzJjLjY0Ni0uMjU1IDEuMDg4LS4zNjggMS4zMS0uMzhhLjY5LjY5IDAgMCAxIC4xMDYuMTg4Yy4xMjUuMjkyLjIyMi43NzYuMjYyIDEuNDQ5LjAzLjQ4LjAyNyAxLjAyMy0uMDAyIDEuNjA5LS41MjQuMzc3LTEuMDMuNzg1LTEuNTA2IDEuMjA3LTEuMzU4IDEuMjA3LTIuNTI3IDIuNTk2LTMuMTMxIDMuODQzYTIuNTYzIDIuNTYzIDAgMCAwLS4xNjMuNDUySDJhLjUuNSAwIDAgMS0uNS0uNVY3YS41LjUgMCAwIDEgLjUtLjVaTTExLjA4NCAxOWMtLjE1Mi40OTYtLjMxNC45Ni0uNDgyIDEuMzc3LS4yNy42NzUtLjU0MyAxLjE5Mi0uNzk2IDEuNTI2LS4xODMuMjQtLjI5OS4zMTUtLjM0My4zMzctLjAzNS0uMDI3LS4xMDQtLjEwMi0uMTk0LS4yODgtLjE2Mi0uMzM1LS4yOS0uODQyLS4zNjQtMS40MzlBOS42NzggOS42NzggMCAwIDEgOC44MzggMTloMi4yNDZabS40MS0xLjVIOS4xNDJjLjUxOC0uOTY0IDEuNDgtMi4xMTMgMi42NzUtMy4xNzQuMTA1LS4wOTQuMjEyLS4xODYuMzItLjI3OGEzMi40MTUgMzIuNDE1IDAgMCAxLS42NDMgMy40NTJabS40NDItOC43N3MuMDA2LjAwMi4wMTYuMDEyYy0uMDExLS4wMDUtLjAxNi0uMDEtLjAxNi0uMDExWk05LjQ4OCAyMi4yNTdzLS4wMDMgMC0uMDA4LS4wMDNjLjAwNi4wMDEuMDA4LjAwMi4wMDguMDAzWm03LjgxMS05LjY5LS4wMS0uMDEuMDEuMDFaXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiPjwvcGF0aD48L3N2Zz4nKVxuICAgIG5vLXJlcGVhdCBjZW50ZXI7XG59XG4iLCJqcyI6IlBTUERGS2l0LmxvYWQoeyAuLi5iYXNlT3B0aW9ucywgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUksgfSkudGhlbihcbiAgKGluc3RhbmNlKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJOdXRyaWVudCBMb2FkZWQgLSBieSBOYXJhc2hpbWFuXCIpO1xuXG4gICAgY29uc3QgdmlkZW9XaWRnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIC8vIFVzaW5nIDx2aWRlbz4gaW5zdGVhZCBvZiA8aWZyYW1lPiBmb3IgSFRNTDUgVmlkZW9zXG4gICAgdmlkZW9XaWRnZXQuaW5uZXJIVE1MID0gYFxuICAgICAgPHZpZGVvIHdpZHRoPVwiNTAwXCIgaGVpZ2h0PVwiMzc1XCIgY29udHJvbHM%252BXG4gICAgICAgIDxzb3VyY2Ugc3JjPVwiaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9odG1sL21vdl9iYmIubXA0XCIgdHlwZT1cInZpZGVvL21wNFwiPlxuICAgICAgICBZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdmlkZW8gdGFnLlxuICAgICAgPC92aWRlbz5cbiAgICBgO1xuXG4gICAgY29uc3QgaXRlbSA9IG5ldyBQU1BERktpdC5DdXN0b21PdmVybGF5SXRlbSh7XG4gICAgICBpZDogXCJ2aWRlby1pbnN0cnVjdGlvbnNcIixcbiAgICAgIG5vZGU6IHZpZGVvV2lkZ2V0LFxuICAgICAgcGFnZUluZGV4OiAwLFxuICAgICAgcG9zaXRpb246IG5ldyBQU1BERktpdC5HZW9tZXRyeS5Qb2ludCh7IHg6IDUwLCB5OiAyMDAgfSksXG4gICAgfSk7XG5cbiAgICBpbnN0YW5jZS5zZXRDdXN0b21PdmVybGF5SXRlbShpdGVtKTtcbiAgfVxuKTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) - -- [Extract text from each page and count the number of words](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIn0sImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4iLCJqcyI6IlBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG59KS50aGVuKGFzeW5jIChpbnN0YW5jZSkgPT4ge1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IExvYWRlZCAtIGJ5IE5hcmFzaGltYW5cIik7XG4gIC8vIEluaXRpYWxpemUgYW4gZW1wdHkgYXJyYXkgdG8gc3RvcmUgdGV4dCBmb3IgZWFjaCBwYWdlXG4gIGxldCBwYWdldGV4dCA9IFtdO1xuICBjb25zdCB0b3RhbFBhZ2VzID0gaW5zdGFuY2UudG90YWxQYWdlQ291bnQ7XG4gIGNvbnNvbGUubG9nKGBUb3RhbCBwYWdlczogJHt0b3RhbFBhZ2VzfWApO1xuXG4gIC8vIExvb3AgdGhyb3VnaCBlYWNoIHBhZ2UgdG8gZXh0cmFjdCB0ZXh0XG4gIGZvciAobGV0IHBhZ2VJbmRleCA9IDA7IHBhZ2VJbmRleCA8IHRvdGFsUGFnZXM7IHBhZ2VJbmRleCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCB0aGUgdGV4dCBsaW5lcyBmb3IgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgY29uc3QgdGV4dExpbmVzID0gYXdhaXQgaW5zdGFuY2UudGV4dExpbmVzRm9yUGFnZUluZGV4KHBhZ2VJbmRleCk7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHQgZm9yIHRoaXMgcGFnZSBpZiBpdCdzIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAoIXBhZ2V0ZXh0W3BhZ2VJbmRleF0pIHtcbiAgICAgICAgcGFnZXRleHRbcGFnZUluZGV4XSA9IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmNhdGVuYXRlIGFsbCB0aGUgdGV4dCBsaW5lcyBmb3IgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgdGV4dExpbmVzLmZvckVhY2goKHRleHRMaW5lKSA9PiB7XG4gICAgICAgIHBhZ2V0ZXh0W3BhZ2VJbmRleF0gKz0gdGV4dExpbmUuY29udGVudHMgKyBcIiBcIjsgLy8gQWRkIHNwYWNlIGJldHdlZW4gbGluZXNcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgd29yZCBjb3VudCBmb3IgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgY29uc3Qgd29yZENvdW50ID0gcGFnZXRleHRbcGFnZUluZGV4XS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG5cbiAgICAgIC8vIExvZyB0aGUgZXh0cmFjdGVkIHRleHQgYW5kIHdvcmQgY291bnQgZm9yIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgIC8vY29uc29sZS5sb2coYFBhZ2UgJHtwYWdlSW5kZXggKyAxfTpgKTtcbiAgICAgIC8vY29uc29sZS5sb2cocGFnZXRleHRbcGFnZUluZGV4XSk7XG4gICAgICBjb25zb2xlLmxvZyhgV29yZCBDb3VudCBmb3IgUGFnZSAke3BhZ2VJbmRleCArIDF9OiAke3dvcmRDb3VudH1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coYEVycm9yIHJldHJpZXZpbmcgdGV4dCBmb3IgcGFnZSAke3BhZ2VJbmRleCArIDF9OmAsIGVycm9yKTtcbiAgICB9XG4gIH1cbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) - -- [Video overlay with drag and resize](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6ImNvbnN0IFBERnN0dWIgPSBgJVBERi0xLjBcbjEgMCBvYmo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI%252BPmVuZG9ialxuMiAwIG9iajw8L1R5cGUvUGFnZXMvS2lkc1szIDAgUl0vQ291bnQgMT4%252BZW5kb2JqXG4zIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgNTk1LjI4IDg0MS44OV0%252BPmVuZG9ialxueHJlZlxuMCA0XG4wMDAwMDAwMDAwIDY1NTM1IGZcbjAwMDAwMDAwMTAgMDAwMDAgblxuMDAwMDAwMDA1MyAwMDAwMCBuXG4wMDAwMDAwMTAyIDAwMDAwIG5cbnRyYWlsZXI8PC9TaXplIDQvUm9vdCAxIDAgUj4%252BXG5zdGFydHhyZWZcbjE1MVxuJSVFT0ZcbmA7XG5cbmNvbnN0IHVpbnQ4YXJyYXkgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoUERGc3R1Yik7XG5cblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgZG9jdW1lbnQ6IHVpbnQ4YXJyYXkuYnVmZmVyLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiTnVyaWVudCBsb2FkZWQhIC0gYnkgTmFyYXNoaW1hblwiKTtcblxuICBjb25zdCB2aWRlb1dpZGdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHZpZGVvV2lkZ2V0LnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICB2aWRlb1dpZGdldC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBpZD1cImRyYWctaGFuZGxlXCIgc3R5bGU9XCJcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAzMHB4O1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIFwiPlxuICAgICAgRHJhZyB0byBtb3ZlXG4gICAgPC9kaXY%252BXG4gICAgPHZpZGVvIGlkPVwidmlkZW8tZWxlbWVudFwiIHdpZHRoPVwiNTAwXCIgaGVpZ2h0PVwiMzc1XCIgY29udHJvbHM%252BXG4gICAgICA8c291cmNlIHNyYz1cImh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vaHRtbC9tb3ZfYmJiLm1wNFwiIHR5cGU9XCJ2aWRlby9tcDRcIj5cbiAgICAgIFlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB2aWRlbyB0YWcuXG4gICAgPC92aWRlbz5cbiAgICA8ZGl2IGlkPVwicmVzaXplLWhhbmRsZVwiIHN0eWxlPVwiXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIHdpZHRoOiA0MHB4O1xuICAgICAgaGVpZ2h0OiA0MHB4O1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQpO1xuICAgICAgY3Vyc29yOiBzZS1yZXNpemU7XG4gICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgXCI%252BLi48L2Rpdj5cbiAgYDtcblxuICBsZXQgY3VycmVudFBvc2l0aW9uID0gbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlBvaW50KHsgeDogMTAsIHk6IDEwIH0pO1xuICBsZXQgY3VycmVudFdpZHRoID0gNTAwO1xuICBsZXQgY3VycmVudEhlaWdodCA9IDM3NTtcblxuICBjb25zdCB2aWRlb092ZXJsYXkgPSBuZXcgUFNQREZLaXQuQ3VzdG9tT3ZlcmxheUl0ZW0oe1xuICAgIGlkOiBcInZpZGVvLXdpZGdldFwiLFxuICAgIG5vZGU6IHZpZGVvV2lkZ2V0LFxuICAgIHBhZ2VJbmRleDogMCxcbiAgICBwb3NpdGlvbjogY3VycmVudFBvc2l0aW9uLFxuICB9KTtcblxuICBpbnN0YW5jZS5zZXRDdXN0b21PdmVybGF5SXRlbSh2aWRlb092ZXJsYXkpO1xuXG4gIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gIGxldCBpc1Jlc2l6aW5nID0gZmFsc2U7XG4gIGxldCBkcmFnU3RhcnRYID0gMDtcbiAgbGV0IGRyYWdTdGFydFkgPSAwO1xuICBsZXQgaW5pdGlhbFBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XG4gIGxldCBpbml0aWFsU2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuXG4gIGNvbnN0IGRyYWdIYW5kbGUgPSB2aWRlb1dpZGdldC5xdWVyeVNlbGVjdG9yKFwiI2RyYWctaGFuZGxlXCIpO1xuICBjb25zdCByZXNpemVIYW5kbGUgPSB2aWRlb1dpZGdldC5xdWVyeVNlbGVjdG9yKFwiI3Jlc2l6ZS1oYW5kbGVcIik7XG4gIGNvbnN0IHZpZGVvRWxlbWVudCA9IHZpZGVvV2lkZ2V0LnF1ZXJ5U2VsZWN0b3IoXCIjdmlkZW8tZWxlbWVudFwiKTtcblxuICBkcmFnSGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgKGUpID0%252BIHtcbiAgICBpc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICBkcmFnU3RhcnRYID0gZS5jbGllbnRYO1xuICAgIGRyYWdTdGFydFkgPSBlLmNsaWVudFk7XG4gICAgaW5pdGlhbFBvc2l0aW9uID0geyB4OiBjdXJyZW50UG9zaXRpb24ueCwgeTogY3VycmVudFBvc2l0aW9uLnkgfTtcblxuICAgIGRyYWdIYW5kbGUuc3R5bGUuYmFja2dyb3VuZCA9IFwicmdiYSgwLCAxMDAsIDIwMCwgMC44KVwiO1xuICAgIGRyYWdIYW5kbGUudGV4dENvbnRlbnQgPSBcIk1vdmluZy4uLlwiO1xuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9KTtcblxuICByZXNpemVIYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoZSkgPT4ge1xuICAgIGlzUmVzaXppbmcgPSB0cnVlO1xuICAgIGRyYWdTdGFydFggPSBlLmNsaWVudFg7XG4gICAgZHJhZ1N0YXJ0WSA9IGUuY2xpZW50WTtcbiAgICBpbml0aWFsU2l6ZSA9IHsgd2lkdGg6IGN1cnJlbnRXaWR0aCwgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0IH07XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCAoZSkgPT4ge1xuICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBkZWx0YVggPSBlLmNsaWVudFggLSBkcmFnU3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZS5jbGllbnRZIC0gZHJhZ1N0YXJ0WTtcblxuICAgICAgY29uc3QgbmV3WCA9IE1hdGgubWF4KDAsIGluaXRpYWxQb3NpdGlvbi54ICsgZGVsdGFYKTtcbiAgICAgIGNvbnN0IG5ld1kgPSBNYXRoLm1heCgwLCBpbml0aWFsUG9zaXRpb24ueSArIGRlbHRhWSk7XG5cbiAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IG5ldyBQU1BERktpdC5HZW9tZXRyeS5Qb2ludCh7IHg6IG5ld1gsIHk6IG5ld1kgfSk7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRPdmVybGF5ID0gbmV3IFBTUERGS2l0LkN1c3RvbU92ZXJsYXlJdGVtKHtcbiAgICAgICAgaWQ6IFwidmlkZW8td2lkZ2V0XCIsXG4gICAgICAgIG5vZGU6IHZpZGVvV2lkZ2V0LFxuICAgICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICAgIHBvc2l0aW9uOiBjdXJyZW50UG9zaXRpb24sXG4gICAgICB9KTtcblxuICAgICAgaW5zdGFuY2Uuc2V0Q3VzdG9tT3ZlcmxheUl0ZW0odXBkYXRlZE92ZXJsYXkpO1xuICAgIH0gZWxzZSBpZiAoaXNSZXNpemluZykge1xuICAgICAgY29uc3QgZGVsdGFYID0gZS5jbGllbnRYIC0gZHJhZ1N0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGUuY2xpZW50WSAtIGRyYWdTdGFydFk7XG5cbiAgICAgIGN1cnJlbnRXaWR0aCA9IE1hdGgubWF4KDIwMCwgaW5pdGlhbFNpemUud2lkdGggKyBkZWx0YVgpO1xuICAgICAgY3VycmVudEhlaWdodCA9IE1hdGgubWF4KDE1MCwgaW5pdGlhbFNpemUuaGVpZ2h0ICsgZGVsdGFZKTtcblxuICAgICAgdmlkZW9FbGVtZW50LndpZHRoID0gY3VycmVudFdpZHRoO1xuICAgICAgdmlkZW9FbGVtZW50LmhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCAoKSA9PiB7XG4gICAgaWYgKGlzRHJhZ2dpbmcpIHtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgZHJhZ0hhbmRsZS5zdHlsZS5iYWNrZ3JvdW5kID0gXCJyZ2JhKDAsIDAsIDAsIDAuNylcIjtcbiAgICAgIGRyYWdIYW5kbGUudGV4dENvbnRlbnQgPSBcIiBEcmFnIHRvIG1vdmVcIjtcblxuICAgICAgY29uc29sZS5sb2coXCJWaWRlbyBtb3ZlZCB0bzpcIiwgY3VycmVudFBvc2l0aW9uKTtcbiAgICB9XG4gICAgaWYgKGlzUmVzaXppbmcpIHtcbiAgICAgIGlzUmVzaXppbmcgPSBmYWxzZTtcbiAgICAgIGNvbnNvbGUubG9nKFwiVmlkZW8gcmVzaXplZCB0bzpcIiwgY3VycmVudFdpZHRoLCBcInhcIiwgY3VycmVudEhlaWdodCk7XG4gICAgfVxuICB9KTtcblxuICBkcmFnSGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIChlKSA9PiB7XG4gICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgZHJhZ1N0YXJ0WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgZHJhZ1N0YXJ0WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgaW5pdGlhbFBvc2l0aW9uID0geyB4OiBjdXJyZW50UG9zaXRpb24ueCwgeTogY3VycmVudFBvc2l0aW9uLnkgfTtcblxuICAgIGRyYWdIYW5kbGUuc3R5bGUuYmFja2dyb3VuZCA9IFwicmdiYSgwLCAxMDAsIDIwMCwgMC44KVwiO1xuICAgIGRyYWdIYW5kbGUudGV4dENvbnRlbnQgPSBcIk1vdmluZy4uLlwiO1xuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9KTtcblxuICByZXNpemVIYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgKGUpID0%252BIHtcbiAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICBpc1Jlc2l6aW5nID0gdHJ1ZTtcbiAgICBkcmFnU3RhcnRYID0gdG91Y2guY2xpZW50WDtcbiAgICBkcmFnU3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICBpbml0aWFsU2l6ZSA9IHsgd2lkdGg6IGN1cnJlbnRXaWR0aCwgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0IH07XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCAoZSkgPT4ge1xuICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IHRvdWNoLmNsaWVudFggLSBkcmFnU3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gdG91Y2guY2xpZW50WSAtIGRyYWdTdGFydFk7XG5cbiAgICAgIGNvbnN0IG5ld1ggPSBNYXRoLm1heCgwLCBpbml0aWFsUG9zaXRpb24ueCArIGRlbHRhWCk7XG4gICAgICBjb25zdCBuZXdZID0gTWF0aC5tYXgoMCwgaW5pdGlhbFBvc2l0aW9uLnkgKyBkZWx0YVkpO1xuXG4gICAgICBjdXJyZW50UG9zaXRpb24gPSBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUG9pbnQoeyB4OiBuZXdYLCB5OiBuZXdZIH0pO1xuXG4gICAgICBjb25zdCB1cGRhdGVkT3ZlcmxheSA9IG5ldyBQU1BERktpdC5DdXN0b21PdmVybGF5SXRlbSh7XG4gICAgICAgIGlkOiBcInZpZGVvLXdpZGdldFwiLFxuICAgICAgICBub2RlOiB2aWRlb1dpZGdldCxcbiAgICAgICAgcGFnZUluZGV4OiAwLFxuICAgICAgICBwb3NpdGlvbjogY3VycmVudFBvc2l0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIGluc3RhbmNlLnNldEN1c3RvbU92ZXJsYXlJdGVtKHVwZGF0ZWRPdmVybGF5KTtcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAoaXNSZXNpemluZykge1xuICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCBkZWx0YVggPSB0b3VjaC5jbGllbnRYIC0gZHJhZ1N0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IHRvdWNoLmNsaWVudFkgLSBkcmFnU3RhcnRZO1xuXG4gICAgICBjdXJyZW50V2lkdGggPSBNYXRoLm1heCgyNTAsIGluaXRpYWxTaXplLndpZHRoICsgZGVsdGFYKTtcbiAgICAgIGN1cnJlbnRIZWlnaHQgPSBNYXRoLm1heCgyMDAsIGluaXRpYWxTaXplLmhlaWdodCArIGRlbHRhWSk7XG5cbiAgICAgIHZpZGVvRWxlbWVudC53aWR0aCA9IGN1cnJlbnRXaWR0aDtcbiAgICAgIHZpZGVvRWxlbWVudC5oZWlnaHQgPSBjdXJyZW50SGVpZ2h0O1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgKCkgPT4ge1xuICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICBkcmFnSGFuZGxlLnN0eWxlLmJhY2tncm91bmQgPSBcInJnYmEoMCwgMCwgMCwgMC43KVwiO1xuICAgICAgZHJhZ0hhbmRsZS50ZXh0Q29udGVudCA9IFwiRHJhZyB0byBtb3ZlXCI7XG4gICAgfVxuICAgIGlmIChpc1Jlc2l6aW5nKSB7XG4gICAgICBpc1Jlc2l6aW5nID0gZmFsc2U7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) - -- [Multi Tab Support](https://github.com/PSPDFKit/awesome-nutrient/tree/master/web/viewer/multi-tab) - -#### Document Editor - -- [Drag and drop files to import in Document Editor](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiIvLyBEcmFnIGFuZCBkcm9wIFBERnMgaW4gZG9jdW1lbnQgZWRpdG9yIGZvb3RlciB0byBpbXBvcnRcblxubGV0IF9pbnN0YW5jZTtcbmxldCBmaWxlQXJyYXk7XG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgX2luc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgLy8gQWRkIGEgY3VzdG9tIGRvY3VtZW50IGVkaXRvciBmb290ZXIgaXRlbVxuICBpbnN0YW5jZS5zZXREb2N1bWVudEVkaXRvckZvb3Rlckl0ZW1zKChpdGVtcykgPT4ge1xuICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBub2RlIGZvciBkcmFnIGFuZCBkcm9wXG4gICAgY29uc3QgZHJvcFpvbmVOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkcm9wWm9uZU5vZGUuaW5uZXJIVE1MID0gXCJEcm9wIFBERiBoZXJlXCI7XG5cbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgY2FuY2VsIGJ1dHRvblxuICAgIGNvbnN0IGNhbmNlbEluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLnR5cGUgPT09IFwiY2FuY2VsXCIpO1xuXG4gICAgLy8gQ3JlYXRlIG91ciBjdXN0b20gaXRlbVxuICAgIGNvbnN0IGN1c3RvbUl0ZW0gPSB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgaWQ6IFwicGRmLWRyb3Atem9uZVwiLFxuICAgICAgbm9kZTogZHJvcFpvbmVOb2RlLFxuICAgICAgb25QcmVzczogKGV2ZW50LCB7IHNldE9wZXJhdGlvbnMgfSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkRyb3Agem9uZSBjbGlja2VkXCIpO1xuICAgICAgICBpZiAoZmlsZUFycmF5KSB7XG4gICAgICAgICAgc2V0T3BlcmF0aW9ucyhcbiAgICAgICAgICAgIChvcGVyYXRpb25zKSA9PlxuICAgICAgICAgICAgICBvcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW1wb3J0RG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICBiZWZvcmVQYWdlSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgdHJlYXRJbXBvcnRlZERvY3VtZW50QXNPbmVQYWdlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudDogZmlsZUFycmF5LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGZpbGVBcnJheSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWxlcnQoXCJEcmFnIGEgZmlsZSB0byBpbXBvcnRcIik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSB0aGUgc3BhY2VyIGRpdnMgdGhhdCBtaWdodCBiZSB0YWtpbmcgdXAgc3BhY2VcbiAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PlxuICAgICAgICAhKFxuICAgICAgICAgIGl0ZW0udHlwZSA9PT0gXCJjdXN0b21cIiAmJlxuICAgICAgICAgICFpdGVtLmlkICYmXG4gICAgICAgICAgaXRlbS5ub2RlICYmXG4gICAgICAgICAgaXRlbS5ub2RlLmNsYXNzTmFtZSAmJlxuICAgICAgICAgIGl0ZW0ubm9kZS5jbGFzc05hbWUuaW5jbHVkZXMoXCJCYXNlbGluZVVJLUJveFwiKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIC8vIEluc2VydCB0aGUgY3VzdG9tIGl0ZW0gYWZ0ZXIgdGhlIGNhbmNlbCBidXR0b25cbiAgICBpZiAoY2FuY2VsSW5kZXggIT09IC0xKSB7XG4gICAgICBpdGVtcy5zcGxpY2UoY2FuY2VsSW5kZXggKyAxLCAwLCBjdXN0b21JdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXMudW5zaGlmdChjdXN0b21JdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH0pO1xuXG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgXCJ2aWV3U3RhdGUuY2hhbmdlXCIsXG4gICAgKHZpZXdTdGF0ZSwgcHJldmlvdXNWaWV3U3RhdGUpID0%252BIHtcbiAgICAgIGlmIChcbiAgICAgICAgdmlld1N0YXRlLmdldChcImludGVyYWN0aW9uTW9kZVwiKSA9PT1cbiAgICAgICAgUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLkRPQ1VNRU5UX0VESVRPUlxuICAgICAgKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRyb3BQZGZIZXJlTm9kZSA9XG4gICAgICAgICAgICBpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNwZGYtZHJvcC16b25lXCIpO1xuICAgICAgICAgIGlmIChkcm9wUGRmSGVyZU5vZGUpIHtcbiAgICAgICAgICAgIC8vIEluIHBsYWluIEphdmFTY3JpcHQsIHdlIGNhbiBqdXN0IGNoZWNrIGlmIHRoZSBlbGVtZW50IGV4aXN0c1xuICAgICAgICAgICAgZHJvcFBkZkhlcmVOb2RlLnN0eWxlLnBhZGRpbmcgPSBcIjhweCAxNnB4XCI7XG4gICAgICAgICAgICBkcm9wUGRmSGVyZU5vZGUuc3R5bGUubWFyZ2luID0gXCIwIDEwcHhcIjtcbiAgICAgICAgICAgIGRyb3BQZGZIZXJlTm9kZS5zdHlsZS5ib3JkZXIgPVxuICAgICAgICAgICAgICBcIjJweCBkYXNoZWQgdmFyKC0tYnVpLWNvbG9yLXRleHQtcHJpbWFyeSlcIjtcbiAgICAgICAgICAgIGRyb3BQZGZIZXJlTm9kZS5zdHlsZS5iYWNrZ3JvdW5kID1cbiAgICAgICAgICAgICAgXCJ2YXIoLS1idWktY29sb3ItYmFja2dyb3VuZC1zZWNvbmRhcnktc3VidGxlKVwiO1xuICAgICAgICAgICAgZHJvcFBkZkhlcmVOb2RlLnN0eWxlLmNvbG9yID0gXCJ2YXIoLS1idWktY29sb3ItdGV4dC1wcmltYXJ5KVwiO1xuICAgICAgICAgICAgZHJvcFBkZkhlcmVOb2RlLnN0eWxlLmJvcmRlclJhZGl1cyA9IFwiNHB4XCI7XG4gICAgICAgICAgICBkcm9wUGRmSGVyZU5vZGUuc3R5bGUuZmxleEdyb3cgPSBcIjEwXCI7XG4gICAgICAgICAgICBkcm9wUGRmSGVyZU5vZGUuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSBcImNlbnRlclwiO1xuICAgICAgICAgICAgaGFuZGxlRHJhZ0FuZERyb3AoZHJvcFBkZkhlcmVOb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfVxuICApO1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCFcIik7XG4gIGNvbnNvbGUubG9nKFwiQVBJIGRvY3M6IGh0dHBzOi8vd3d3Lm51dHJpZW50LmlvL2FwaS93ZWIvXCIpO1xuICBjb25zb2xlLmxvZyhcIkd1aWRlczogaHR0cHM6Ly93d3cubnV0cmllbnQuaW8vZ3VpZGVzL3dlYi9cIik7XG59KTtcblxuLy8gRnVuY3Rpb24gdG8gaGFuZGxlIGZpbGUgcHJvY2Vzc2luZ1xuZnVuY3Rpb24gaGFuZGxlRmlsZXMoZmlsZXMpIHtcbiAgY29uc29sZS5sb2coZmlsZXMpO1xuXG4gIC8vIEZpbmQgYW5kIGNsaWNrIHRoZSBidXR0b24gZWxlbWVudFxuICBpZiAoX2luc3RhbmNlICYmIF9pbnN0YW5jZS5jb250ZW50RG9jdW1lbnQpIHtcbiAgICBjb25zdCBkcm9wWm9uZUVsZW1lbnQgPVxuICAgICAgX2luc3RhbmNlLmNvbnRlbnREb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBkZi1kcm9wLXpvbmVcIik7XG4gICAgaWYgKGRyb3Bab25lRWxlbWVudCkge1xuICAgICAgLy8gUHJvY2VzcyBmaWxlcyBhcyBiZWZvcmVcbiAgICAgIEFycmF5LmZyb20oZmlsZXMpLmZvckVhY2goKGZpbGUpID0%252BIHtcbiAgICAgICAgZmlsZUFycmF5ID0gZmlsZTtcbiAgICAgICAgLy8gU2ltdWxhdGUgYSBjbGljayBvbiB0aGUgZWxlbWVudFxuICAgICAgICBkcm9wWm9uZUVsZW1lbnQuY2xpY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBGdW5jdGlvbiB0byBhZGQgZHJhZyBhbmQgZHJvcCBjYXBhYmlsaXRpZXMgdG8gbm9kZXNcbmZ1bmN0aW9uIGhhbmRsZURyYWdBbmREcm9wKGRyb3Bab25lKSB7XG4gIC8vIFByZXZlbnQgZGVmYXVsdCBiZWhhdmlvciBvbiBkcmFnb3ZlciBhbmQgZHJhZ2VudGVyIHRvIGFsbG93IGRyb3BcbiAgZHJvcFpvbmUuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy8gT3B0aW9uYWw6IEFkZCBhIHZpc3VhbCBjdWUgKGUuZy4sIGNoYW5nZSBiYWNrZ3JvdW5kIGNvbG9yKVxuICAgIGRyb3Bab25lLnN0eWxlLmJvcmRlciA9XG4gICAgICBcIjJweCBkYXNoZWQgdmFyKC0tYnVpLWNvbG9yLXN1cHBvcnQtc3VjY2Vzcy1tZWRpdW0pXCI7XG4gIH0pO1xuXG4gIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnZW50ZXJcIiwgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBPcHRpb25hbDogSGlnaGxpZ2h0IHRoZSBkcm9wIHpvbmVcbiAgICBkcm9wWm9uZS5zdHlsZS5ib3JkZXIgPVxuICAgICAgXCIycHggZGFzaGVkIHZhcigtLWJ1aS1jb2xvci1zdXBwb3J0LXN1Y2Nlc3MtbWVkaXVtKVwiO1xuICB9KTtcblxuICAvLyBSZXZlcnQgdmlzdWFsIGN1ZXMgd2hlbiB0aGUgZHJhZ2dlZCBmaWxlIGxlYXZlcyB0aGUgZHJvcCB6b25lXG4gIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnbGVhdmVcIiwgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBSZXNldCBzdHlsaW5nIHdoZW4gbm8gbG9uZ2VyIGRyYWdnaW5nIG92ZXJcbiAgICBkcm9wWm9uZS5zdHlsZS5ib3JkZXIgPSBcIjJweCBkYXNoZWQgdmFyKC0tYnVpLWNvbG9yLXRleHQtcHJpbWFyeSlcIjtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIHRoZSBkcm9wIGV2ZW50XG4gIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoXCJkcm9wXCIsIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBDbGVhciBhbnkgdmlzdWFsIGN1ZXMgYWRkZWQgZHVyaW5nIGRyYWdcbiAgICBkcm9wWm9uZS5zdHlsZS5ib3JkZXIgPSBcIjJweCBkYXNoZWQgdmFyKC0tYnVpLWNvbG9yLXRleHQtcHJpbWFyeSlcIjtcblxuICAgIC8vIEFjY2VzcyB0aGUgZHJvcHBlZCBmaWxlcyBmcm9tIHRoZSBEYXRhVHJhbnNmZXIgb2JqZWN0XG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgLy8gUHJvY2VzcyB0aGUgZmlsZShzKVxuICAgIGhhbmRsZUZpbGVzKGZpbGVzKTtcbiAgfSk7XG59XG4ifQ%253D%253D) - -- [Copy and paste pages after a selected page in Document Editor](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiIvLyBDb3B5IHRoZSBzZWxlY3RlZCBwYWdlcyBhbmQgdGhlbiBwYXN0ZSB0aG9zZSBwYWdlcyBcbi8vIGFmdGVyIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFnZSBpbiBkb2N1bWVudCBlZGl0b3IgdXNpbmcgY3VzdG9tIGJ1dHRvbnMgaW4gdG9vbGJhclxuXG5sZXQgX2luc3RhbmNlO1xuLy8gR2V0IHRoZSBkZWZhdWx0IHRvb2xiYXIgaXRlbXNcbmNvbnN0IGRlZmF1bHRUb29sYmFySXRlbXMgPSBQU1BERktpdC5kZWZhdWx0RG9jdW1lbnRFZGl0b3JUb29sYmFySXRlbXM7XG5sZXQgY29waWVkUGFnZXNCdWZmZXIgPSBudWxsO1xubGV0IGNvcGllZFBhZ2VzID0gW107XG5cbi8vIENyZWF0ZSBhIGN1c3RvbSBjb3B5IGJ1dHRvblxuY29uc3QgY29weUJ1dHRvbiA9IHtcbiAgdHlwZTogXCJjdXN0b21cIixcbiAgaWQ6IFwiY29weS1wYWdlc1wiLFxuICB0aXRsZTogXCJDb3B5IFBhZ2VzXCIsXG4gIG9uUHJlc3M6IGFzeW5jIChldmVudCwgeyBnZXRTZWxlY3RlZFBhZ2VJbmRleGVzLCBzZXRPcGVyYXRpb25zIH0pID0%252BIHtcbiAgICBjb25zdCBzZWxlY3RlZFBhZ2VJbmRleGVzID0gZ2V0U2VsZWN0ZWRQYWdlSW5kZXhlcygpO1xuICAgIGlmIChzZWxlY3RlZFBhZ2VJbmRleGVzLmxlbmd0aCA%252BIDApIHtcbiAgICAgIC8vIEV4cG9ydCB0aGUgc2VsZWN0ZWQgcGFnZXMgYXMgYSBuZXcgZG9jdW1lbnRcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImtlZXBQYWdlc1wiLFxuICAgICAgICAgIHBhZ2VJbmRleGVzOiBzZWxlY3RlZFBhZ2VJbmRleGVzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRXhwb3J0IG9ubHkgdGhlIHNlbGVjdGVkIHBhZ2VzXG4gICAgICAgIGNvcGllZFBhZ2VzQnVmZmVyID0gYXdhaXQgX2luc3RhbmNlLmV4cG9ydFBERldpdGhPcGVyYXRpb25zKG9wZXJhdGlvbnMpO1xuICAgICAgICBjb3BpZWRQYWdlcyA9IHNlbGVjdGVkUGFnZUluZGV4ZXM7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRXhwb3J0ZWQgcGFnZXM6XCIsIHNlbGVjdGVkUGFnZUluZGV4ZXMpO1xuICAgICAgICBzZXRPcGVyYXRpb25zKChvcGVyYXRpb25zKSA9PiBvcGVyYXRpb25zLCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBleHBvcnRpbmcgcGFnZXM6XCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWxlcnQoXCJQbGVhc2Ugc2VsZWN0IHBhZ2VzIHRvIGNvcHkhXCIpO1xuICAgIH1cbiAgfSxcbn07XG5cbi8vIENyZWF0ZSBhIGN1c3RvbSBwYXN0ZSBidXR0b25cbmNvbnN0IHBhc3RlQnV0dG9uID0ge1xuICB0eXBlOiBcImN1c3RvbVwiLFxuICBpZDogXCJwYXN0ZS1wYWdlc1wiLFxuICB0aXRsZTogXCJQYXN0ZSBQYWdlc1wiLFxuICBvblByZXNzOiBhc3luYyAoZXZlbnQsIHsgc2V0T3BlcmF0aW9ucywgZ2V0U2VsZWN0ZWRQYWdlSW5kZXhlcyB9KSA9PiB7XG4gICAgaWYgKCFjb3BpZWRQYWdlc0J1ZmZlcikge1xuICAgICAgYWxlcnQoXCJZb3UgaGF2ZW4ndCBjb3BpZWQgYW55IHBhZ2VzIHlldCEhIVwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFBhZ2VJbmRleGVzID0gZ2V0U2VsZWN0ZWRQYWdlSW5kZXhlcygpO1xuXG4gICAgLy8gQ2hlY2sgaWYgbXVsdGlwbGUgcGFnZXMgYXJlIHNlbGVjdGVkXG4gICAgaWYgKHNlbGVjdGVkUGFnZUluZGV4ZXMubGVuZ3RoID4gMSkge1xuICAgICAgYWxlcnQoXG4gICAgICAgIFwiUGxlYXNlIHNlbGVjdCBvbmx5IG9uZSBwYWdlIHRvIHBhc3RlIGFmdGVyLCBvciBubyBwYWdlcyB0byBwYXN0ZSBhdCB0aGUgZW5kLlwiXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB3aGVyZSB0byBpbnNlcnQgdGhlIHBhZ2VzXG4gICAgY29uc3QgYWZ0ZXJQYWdlSW5kZXggPVxuICAgICAgc2VsZWN0ZWRQYWdlSW5kZXhlcy5sZW5ndGggPT09IDFcbiAgICAgICAgPyBzZWxlY3RlZFBhZ2VJbmRleGVzWzBdXG4gICAgICAgIDogX2luc3RhbmNlLnRvdGFsUGFnZUNvdW50IC0gMTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSBibG9iIGZyb20gdGhlIGNvcGllZCBwYWdlcyBidWZmZXJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgRmlsZShcbiAgICAgICAgW2NvcGllZFBhZ2VzQnVmZmVyXSxcbiAgICAgICAgYENvcGllZCBwYWdlcyAke2NvcGllZFBhZ2VzXG4gICAgICAgICAgLm1hcCgocGFnZUluZGV4KSA9PiBwYWdlSW5kZXggKyAxKVxuICAgICAgICAgIC50b1N0cmluZygpfWAsXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBzZXRPcGVyYXRpb25zKFxuICAgICAgICAob3BlcmF0aW9ucykgPT5cbiAgICAgICAgICBvcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJpbXBvcnREb2N1bWVudFwiLFxuICAgICAgICAgICAgYWZ0ZXJQYWdlSW5kZXg6IGFmdGVyUGFnZUluZGV4LFxuICAgICAgICAgICAgdHJlYXRJbXBvcnRlZERvY3VtZW50QXNPbmVQYWdlOiBmYWxzZSxcbiAgICAgICAgICAgIGRvY3VtZW50OiBibG9iLFxuICAgICAgICAgIH0pLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgY29waWVkUGFnZXMgPSBbXTtcbiAgICAgIGNvcGllZFBhZ2VzQnVmZmVyID0gbnVsbDtcbiAgICAgIGNvbnNvbGUubG9nKFwiUGFnZXMgcGFzdGVkIGFmdGVyIHBhZ2UgaW5kZXg6XCIsIGFmdGVyUGFnZUluZGV4KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHBhc3RpbmcgcGFnZXM6XCIsIGVycm9yKTtcbiAgICB9XG4gIH0sXG59O1xuXG4vLyBBZGQgdGhlIGN1c3RvbSBidXR0b25zIHRvIHRoZSB0b29sYmFyIGl0ZW1zXG5kZWZhdWx0VG9vbGJhckl0ZW1zLnB1c2goY29weUJ1dHRvbiwgcGFzdGVCdXR0b24pO1xuXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBkb2N1bWVudEVkaXRvclRvb2xiYXJJdGVtczogZGVmYXVsdFRvb2xiYXJJdGVtcyxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIF9pbnN0YW5jZSA9IGluc3RhbmNlO1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCFcIik7XG4gIGNvbnNvbGUubG9nKFwiQVBJIGRvY3M6IGh0dHBzOi8vd3d3Lm51dHJpZW50LmlvL2FwaS93ZWIvXCIpO1xuICBjb25zb2xlLmxvZyhcIkd1aWRlczogaHR0cHM6Ly93d3cubnV0cmllbnQuaW8vZ3VpZGVzL3dlYi9cIik7XG59KTtcbiJ9) - -## Nutrient DWS (Document Web Services) API - -- **[DWS and Web SDK integration](https://github.com/PSPDFKit/awesome-nutrient/dws/README.md)** — An example integration of Nutrient DWS API and Nutrient Web SDK demonstrating PDF viewing (in Nutrient Web SDK UI) and table extraction capabilities using Nutrient DWS APIs in a React-Vite web application. - -## .NET — Coming Soon - -## Design System - -- [Baseline UI](https://www.nutrient.io/baseline-ui/) - - A set of customizable and accessible React components. - -- [Add a custom button to the main toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImNvbnN0e2NyZWF0ZUJsb2NrOmNyZWF0ZUJsb2NrLEludGVyZmFjZXM6SW50ZXJmYWNlcyxSZWNpcGVzOlJlY2lwZXMsQ29yZTpDb3JlfT1QU1BERktpdC5VSTtQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLHVpOntcbi8vdGhpcyBjb21wbGV0ZXMgYW4gZXhhbXBsZSBkb25lIGluIHZpcnR1YWwgQlVJIHdvcmtzaG9wIHdpdGggUml0ZXNoXG5bSW50ZXJmYWNlcy5QcmltYXJ5VG9vbGJhcl06KHtwcm9wczpwcm9wc30pPT4oe2NvbnRlbnQ6Y3JlYXRlQmxvY2soUmVjaXBlcy5QcmltYXJ5VG9vbGJhcixwcm9wcywoKHt1aTp1aX0pPT57Y29uc3QgY3VzdG9tQnV0dG9uPWNyZWF0ZUJsb2NrKENvcmUuQWN0aW9uQnV0dG9uLHtsYWJlbDonY3VzdG9tLWJ1dHRvbicsdmFyaWFudDondG9vbGJhcid9KTtyZXR1cm4gdWkuaW5zZXJ0QWZ0ZXIoJ3BhbicsY3VzdG9tQnV0dG9uKSx1aS5jcmVhdGVDb21wb25lbnQoKX0pKS5jcmVhdGVDb21wb25lbnQoKX0pfX0pLnRoZW4oKGluc3RhbmNlPT57Y29uc29sZS5sb2coJ1BTUERGS2l0IGxvYWRlZCEnKSxjb25zb2xlLmxvZygnQVBJIGRvY3M6IGh0dHBzOi8vcHNwZGZraXQuY29tL2FwaS93ZWIvJyksY29uc29sZS5sb2coJ0d1aWRlczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vZ3VpZGVzL3dlYi8nKX0pKTsifQ%253D%253D) - - How to add a custom button to the main toolbar. - -- [Customize toolbar dropdown items to appear as independent buttons in toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFt7IHR5cGU6IFwibGluZVwiLCBkcm9wZG93bkdyb3VwOiBcInR3b1wiICB9LCB7dHlwZTogXCJhcnJvd1wiLCBkcm9wZG93bkdyb3VwOiBcIm9uZVwiIH1dXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xufSk7XG4ifQ%253D%253D) - - How to customize the default dropdown elements that appear in a dropdown as individual buttons in the toolbar. - -- [Change the label of thumbnails in the thumbnails sidebar to a string](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImNvbnN0e2NyZWF0ZUJsb2NrOmNyZWF0ZUJsb2NrLEludGVyZmFjZXM6SW50ZXJmYWNlcyxSZWNpcGVzOlJlY2lwZXMsQ29yZTpDb3JlfT1QU1BERktpdC5VSTtQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLHVpOntcbi8vdGhpcyBjb21wbGV0ZXMgYW4gZXhhbXBsZSBkb25lIGluIHZpcnR1YWwgQlVJIHdvcmtzaG9wIHdpdGggUml0ZXNoXG5bSW50ZXJmYWNlcy5UaHVtYm5haWxzXTooe3Byb3BzOnByb3BzfSk9Pih7Y29udGVudDpjcmVhdGVCbG9jayhSZWNpcGVzLlRodW1ibmFpbHMscHJvcHMsKCh7dWk6dWl9KT0%252Be2NvbnN0IHRodW1ibmFpbHM9dWkuZ2V0QmxvY2tCeUlkKCdib2R5Jykse3Byb3BzOnByb3BzfT10aHVtYm5haWxzLHVwZGF0ZWRJdGVtcz1wcm9wcy5pdGVtcy5tYXAoKGl0ZW09Pih7Li4uaXRlbSxsYWJlbDpgUGFnZTogJHtpdGVtLmxhYmVsfWB9KSkpO3JldHVybiB0aHVtYm5haWxzLnNldFByb3AoJ2l0ZW1zJyx1cGRhdGVkSXRlbXMpLHVpLmNyZWF0ZUNvbXBvbmVudCgpfSkpLmNyZWF0ZUNvbXBvbmVudCgpfSl9fSkudGhlbigoaW5zdGFuY2U9Pntjb25zb2xlLmxvZygnUFNQREZLaXQgbG9hZGVkIScpLGNvbnNvbGUubG9nKCdBUEkgZG9jczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vYXBpL3dlYi8nKSxjb25zb2xlLmxvZygnR3VpZGVzOiBodHRwczovL3BzcGRma2l0LmNvbS9ndWlkZXMvd2ViLycpfSkpOyJ9) - - Learn how to change the thumbnails label in the thumbnail sidebar to custom strings. - -- [Change/cancel button in the Document Editor modal variant](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImNvbnN0e2NyZWF0ZUJsb2NrOmNyZWF0ZUJsb2NrLEludGVyZmFjZXM6SW50ZXJmYWNlcyxSZWNpcGVzOlJlY2lwZXMsQ29yZTpDb3JlfT1QU1BERktpdC5VSTtQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLHVpOntcbi8vdGhpcyBjb21wbGV0ZXMgYW4gZXhhbXBsZSBkb25lIGluIHZpcnR1YWwgQlVJIHdvcmtzaG9wIHdpdGggUml0ZXNoXG5bSW50ZXJmYWNlcy5Eb2N1bWVudEVkaXRvcl06KHtwcm9wczpwcm9wc30pPT4oe2NvbnRlbnQ6Y3JlYXRlQmxvY2soUmVjaXBlcy5Eb2N1bWVudEVkaXRvcixwcm9wcywoKHt1aTp1aX0pPT4odWkuZ2V0QmxvY2tCeUlkKCdjYW5jZWwnKS5zZXRQcm9wKCd2YXJpYW50JywnZXJyb3InKSx1aS5jcmVhdGVDb21wb25lbnQoKSkpKS5jcmVhdGVDb21wb25lbnQoKX0pfX0pLnRoZW4oKGluc3RhbmNlPT57Y29uc29sZS5sb2coJ1BTUERGS2l0IGxvYWRlZCEnKSxjb25zb2xlLmxvZygnQVBJIGRvY3M6IGh0dHBzOi8vcHNwZGZraXQuY29tL2FwaS93ZWIvJyksY29uc29sZS5sb2coJ0d1aWRlczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vZ3VpZGVzL3dlYi8nKX0pKTsifQ%253D%253D) - - Make the cancel button in the the Document Editor dialog red. - -- [Display and change a custom state in the Create Signature modal](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImxldCBjb3VudD0wO2Z1bmN0aW9uIGNvdW50ZXIoKXtjb3VudCsrfWNvbnN0e2NyZWF0ZUJsb2NrOmNyZWF0ZUJsb2NrLEludGVyZmFjZXM6SW50ZXJmYWNlcyxSZWNpcGVzOlJlY2lwZXMsQ29yZTpDb3JlfT1QU1BERktpdC5VSTtQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLHVpOntbSW50ZXJmYWNlcy5DcmVhdGVTaWduYXR1cmVdOih7cHJvcHM6cHJvcHN9KT0%252BKHtjb250ZW50OmNyZWF0ZUJsb2NrKFJlY2lwZXMuQ3JlYXRlU2lnbmF0dXJlLHByb3BzLCgoe3VpOnVpLHN0YXRlOnN0YXRlfSk9Pihcbi8vIEN1c3RvbWlzYXRpb24gY29kZSBnb2VzIGhlcmVcbnVpLmluc2VydEFmdGVyKCd0aXRsZScsY3JlYXRlQmxvY2soQ29yZS5BY3Rpb25CdXR0b24se2xhYmVsOnN0YXRlLmdldCgnY2xpY2tDb3VudCcpPz9jb3VudCx2YXJpYW50OidzdWNjZXNzJ30pKSx1aS5pbnNlcnRBZnRlcigndGl0bGUnLGNyZWF0ZUJsb2NrKENvcmUuQWN0aW9uQnV0dG9uLHtsYWJlbDonSW5jcmVtZW50JyxvblByZXNzOigpPT57Y291bnRlcigpLC8vIEluY3JlbWVudCBhbmQgbG9nIHRoZSBjb3VudGVyXG5zdGF0ZS5zZXQoJ2NsaWNrQ291bnQnLGNvdW50KX0sdmFyaWFudDonc2Vjb25kYXJ5JywnYXJpYS1sYWJlbCc6J0luY3JlbWVudCd9KSksdWkuY3JlYXRlQ29tcG9uZW50KCkpKSkuY3JlYXRlQ29tcG9uZW50KCl9KX19KS50aGVuKChpbnN0YW5jZT0%252Be2NvbnNvbGUubG9nKCdQU1BERktpdCBsb2FkZWQhJyksY29uc29sZS5sb2coJ0FQSSBkb2NzOiBodHRwczovL3BzcGRma2l0LmNvbS9hcGkvd2ViLycpLGNvbnNvbGUubG9nKCdHdWlkZXM6IGh0dHBzOi8vcHNwZGZraXQuY29tL2d1aWRlcy93ZWIvJyl9KSk7In0%253D) - - Add a custom button in the Create Signature modal that changes a custom state. - -## AI - -- [AI Assistant](https://github.com/PSPDFKit/ai-document-assistant-demo) - - Nutrient AI Assistant demo, which showcases how to interact with PDFs using natural language commands powered by AI and integrated with Nutrient Web SDK. - -## Document Authoring - -- [Document generator with Vanilla JavaScript](./web/document-generator-vanillajs/) - - A fully functional step-by-step document generator that brings the user from a template to a PDF document, where they get to make modifications every step of the way. Demonstrates the combined capabilities of Nutrient Document Authoring and Web SDKs. - -## iOS - -- [iOS Catalog](https://github.com/PSPDFKit/pspdfkit-ios-catalog) - - A wide variety of examples showcasing what Nutrient iOS SDK can do. Clone it and play with it. - -## Android - -- [Android Catalog](https://github.com/PSPDFKit/pspdfkit-android-catalog) - - A wide variety of examples showcasing what Nutrient Android SDK can do. Clone it and play with it. - -## Windows -- [Using Nutrient Web SDK in WinUI3 app](/windows/pspdfkit-with-winui3) - - Learn how to use Web SDK in a WinUI3 app or any app that supports WebView2. - -## Cross-Platform - -- [React Native Catalog](https://github.com/PSPDFKit/react-native/tree/master/samples/Catalog) - - A diverse range of examples showcasing what Nutrient React Native SDK is capable of. Clone the repository and explore its features firsthand. - -- [MAUI Catalog](https://github.com/PSPDFKit/pspdfkit-maui-catalog) - - A diverse range of examples showcasing what Nutrient MAUI SDK is capable of. Clone the repository and explore its features. - -- [Flutter sample](https://github.com/PSPDFKit/pspdfkit-flutter/tree/master/example) - - Discover a practical example showcasing the power of Nutrient Flutter SDK. - -- [.NET for Android sample](https://github.com/PSPDFKit/dotnet-pdf-library-for-android/tree/main/samples) - - Learn how to use C# bindings for Nutrient Android SDK. - -- [.NET for iOS sample](https://github.com/PSPDFKit/dotnet-pdf-library-for-ios/tree/main/Samples) - - Learn how to use C# bindings for Nutrient iOS SDK. +# Awesome Nutrient + + + +[](https://awesome.re) +[](https://discord.gg/Z754Pfb8bD) +[](./playground/) + +This repository contains examples built with [Nutrient](https://www.nutrient.io/). These examples are provided for inspiration and learning. Read [the disclaimer](./DISCLAIMER.md) or [reach out if you have questions](https://support.nutrient.io/hc/en-us/requests/new). + +--- + +## 🚀 Quick Start + +**New to Nutrient?** Start with the [official getting started guide](https://www.nutrient.io/getting-started/). + +**Want to try examples?** Choose your path: +- **Interactive Playground**: Try code snippets directly in your browser +- **Local Examples**: Clone and run complete projects on your machine +- **Official Catalogs**: Explore comprehensive SDK capabilities + +--- + +## 📦 Web SDK Examples + +### Official Example Catalog +The [Example Catalog](https://github.com/PSPDFKit/pspdfkit-web-examples-catalog) showcases core Web SDK capabilities. [Try them online](https://web-examples.our.services.nutrient-powered.io/). + +### Framework Integration Examples +- [React](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/react) +- [Angular](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/angular) +- [Next.js](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/nextjs) +- [Nuxt.js](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/nuxtjs) + +### Interactive Playground Snippets +Try these code snippets directly in your browser — [Browse All →](./playground/README.md) + +| Category | Description | Link | +|----------|-------------|------| +| **Annotations** | Add, customize, and manage PDF annotations | [View Examples](./playground/web-annotations.md) | +| **Redaction** | Permanently remove sensitive content | [View Examples](./playground/web-redaction.md) | +| **Signing** | Electronic and digital signatures | [View Examples](./playground/web-signing.md) | +| **Forms** | PDF form filling and management | [View Examples](./playground/web-forms.md) | +| **Form Creator** | Create and customize PDF forms | [View Examples](./playground/web-form-creator.md) | +| **Viewer** | PDF viewing and navigation | [View Examples](./playground/web-viewer.md) | +| **Document Editor** | Page manipulation and editing | [View Examples](./playground/web-document-editor.md) | +| **Comments** | Collaborative commenting workflows | [View Examples](./playground/web-comments.md) | +| **Content Editor** | Direct PDF content editing | [View Examples](./playground/web-content-editor.md) | +| **Toolbars & Menus** | UI customization and toolbar configuration | [View Examples](./playground/web-toolbars-menus.md) | +| **Text Comparison** | Compare document versions | [View Examples](./playground/web-text-comparison.md) | + +### Local Runnable Examples +Clone and run these complete examples on your machine: + +| Category | Examples | Quick Access | +|----------|----------|--------------| +| **Annotations** | 9 examples including comment-annotations, redact-one-by-one, text-2-speech | [Browse →](./web/annotation/README.md) | +| **Signing** | 3 examples including sign-here-upgraded, digital signatures | [Browse →](./web/signing/README.md) | +| **Document Editor** | Page extraction and manipulation | [Browse →](./web/document-editor/README.md) | +| **Viewer** | Multi-tab viewer | [Browse →](./web/viewer/README.md) | +| **Miscellaneous** | Analytics integrations (Mixpanel) | [Browse →](./web/miscellaneous/README.md) | + +--- + +## 🌐 Document Services + +### Document Engine +Server-side PDF processing and manipulation: +- [AWS ECS Deployment with Terraform](./document-engine/de-aws-ecs-terraform) +- [Orbstack Kubernetes Deployment](./document-engine/de-orbstack-kubernetes) + +### Document Web Services (DWS) +- [DWS and Web SDK Integration](./dws/README.md) — React-Vite app demonstrating PDF viewing and table extraction with DWS APIs + +--- + +## 🎨 Design System & UI Customization + +- [Baseline UI](https://www.nutrient.io/baseline-ui/) — Customizable and accessible React components +- [Add custom button to toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImNvbnN0e2NyZWF0ZUJsb2NrOmNyZWF0ZUJsb2NrLEludGVyZmFjZXM6SW50ZXJmYWNlcyxSZWNpcGVzOlJlY2lwZXMsQ29yZTpDb3JlfT1QU1BERktpdC5VSTtQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLHVpOntcbi8vdGhpcyBjb21wbGV0ZXMgYW4gZXhhbXBsZSBkb25lIGluIHZpcnR1YWwgQlVJIHdvcmtzaG9wIHdpdGggUml0ZXNoXG5bSW50ZXJmYWNlcy5QcmltYXJ5VG9vbGJhcl06KHtwcm9wczpwcm9wc30pPT4oe2NvbnRlbnQ6Y3JlYXRlQmxvY2soUmVjaXBlcy5QcmltYXJ5VG9vbGJhcixwcm9wcywoKHt1aTp1aX0pPT57Y29uc3QgY3VzdG9tQnV0dG9uPWNyZWF0ZUJsb2NrKENvcmUuQWN0aW9uQnV0dG9uLHtsYWJlbDonY3VzdG9tLWJ1dHRvbicsdmFyaWFudDondG9vbGJhcid9KTtyZXR1cm4gdWkuaW5zZXJ0QWZ0ZXIoJ3BhbicsY3VzdG9tQnV0dG9uKSx1aS5jcmVhdGVDb21wb25lbnQoKX0pKS5jcmVhdGVDb21wb25lbnQoKX0pfX0pLnRoZW4oKGluc3RhbmNlPT57Y29uc29sZS5sb2coJ1BTUERGS2l0IGxvYWRlZCEnKSxjb25zb2xlLmxvZygnQVBJIGRvY3M6IGh0dHBzOi8vcHNwZGZraXQuY29tL2FwaS93ZWIvJyksY29uc29sZS5sb2coJ0d1aWRlczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vZ3VpZGVzL3dlYi8nKX0pKTsifQ%253D%253D) +- [Customize toolbar dropdown items](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFt7IHR5cGU6IFwibGluZVwiLCBkcm9wZG93bkdyb3VwOiBcInR3b1wiICB9LCB7dHlwZTogXCJhcnJvd1wiLCBkcm9wZG93bkdyb3VwOiBcIm9uZVwiIH1dXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xufSk7XG4ifQ%253D%253D) +- [Change thumbnails sidebar labels](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImNvbnN0e2NyZWF0ZUJsb2NrOmNyZWF0ZUJsb2NrLEludGVyZmFjZXM6SW50ZXJmYWNlcyxSZWNpcGVzOlJlY2lwZXMsQ29yZTpDb3JlfT1QU1BERktpdC5VSTtQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLHVpOntcbi8vdGhpcyBjb21wbGV0ZXMgYW4gZXhhbXBsZSBkb25lIGluIHZpcnR1YWwgQlVJIHdvcmtzaG9wIHdpdGggUml0ZXNoXG5bSW50ZXJmYWNlcy5UaHVtYm5haWxzXTooe3Byb3BzOnByb3BzfSk9Pih7Y29udGVudDpjcmVhdGVCbG9jayhSZWNpcGVzLlRodW1ibmFpbHMscHJvcHMsKCh7dWk6dWl9KT0%252Be2NvbnN0IHRodW1ibmFpbHM9dWkuZ2V0QmxvY2tCeUlkKCdib2R5Jykse3Byb3BzOnByb3BzfT10aHVtYm5haWxzLHVwZGF0ZWRJdGVtcz1wcm9wcy5pdGVtcy5tYXAoKGl0ZW09Pih7Li4uaXRlbSxsYWJlbDpgUGFnZTogJHtpdGVtLmxhYmVsfWB9KSkpO3JldHVybiB0aHVtYm5haWxzLnNldFByb3AoJ2l0ZW1zJyx1cGRhdGVkSXRlbXMpLHVpLmNyZWF0ZUNvbXBvbmVudCgpfSkpLmNyZWF0ZUNvbXBvbmVudCgpfSl9fSkudGhlbigoaW5zdGFuY2U9Pntjb25zb2xlLmxvZygnUFNQREZLaXQgbG9hZGVkIScpLGNvbnNvbGUubG9nKCdBUEkgZG9jczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vYXBpL3dlYi8nKSxjb25zb2xlLmxvZygnR3VpZGVzOiBodHRwczovL3BzcGRma2l0LmNvbS9ndWlkZXMvd2ViLycpfSkpOyJ9) +- [Customize Document Editor modal buttons](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImNvbnN0e2NyZWF0ZUJsb2NrOmNyZWF0ZUJsb2NrLEludGVyZmFjZXM6SW50ZXJmYWNlcyxSZWNpcGVzOlJlY2lwZXMsQ29yZTpDb3JlfT1QU1BERktpdC5VSTtQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLHVpOntcbi8vdGhpcyBjb21wbGV0ZXMgYW4gZXhhbXBsZSBkb25lIGluIHZpcnR1YWwgQlVJIHdvcmtzaG9wIHdpdGggUml0ZXNoXG5bSW50ZXJmYWNlcy5Eb2N1bWVudEVkaXRvcl06KHtwcm9wczpwcm9wc30pPT4oe2NvbnRlbnQ6Y3JlYXRlQmxvY2soUmVjaXBlcy5Eb2N1bWVudEVkaXRvcixwcm9wcywoKHt1aTp1aX0pPT4odWkuZ2V0QmxvY2tCeUlkKCdjYW5jZWwnKS5zZXRQcm9wKCd2YXJpYW50JywnZXJyb3InKSx1aS5jcmVhdGVDb21wb25lbnQoKSkpKS5jcmVhdGVDb21wb25lbnQoKX0pfX0pLnRoZW4oKGluc3RhbmNlPT57Y29uc29sZS5sb2coJ1BTUERGS2l0IGxvYWRlZCEnKSxjb25zb2xlLmxvZygnQVBJIGRvY3M6IGh0dHBzOi8vcHNwZGZraXQuY29tL2FwaS93ZWIvJyksY29uc29sZS5sb2coJ0d1aWRlczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vZ3VpZGVzL3dlYi8nKX0pKTsifQ%253D%253D) +- [Custom state in signature modal](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImxldCBjb3VudD0wO2Z1bmN0aW9uIGNvdW50ZXIoKXtjb3VudCsrfWNvbnN0e2NyZWF0ZUJsb2NrOmNyZWF0ZUJsb2NrLEludGVyZmFjZXM6SW50ZXJmYWNlcyxSZWNpcGVzOlJlY2lwZXMsQ29yZTpDb3JlfT1QU1BERktpdC5VSTtQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLHVpOntbSW50ZXJmYWNlcy5DcmVhdGVTaWduYXR1cmVdOih7cHJvcHM6cHJvcHN9KT0%252BKHtjb250ZW50OmNyZWF0ZUJsb2NrKFJlY2lwZXMuQ3JlYXRlU2lnbmF0dXJlLHByb3BzLCgoe3VpOnVpLHN0YXRlOnN0YXRlfSk9Pihcbi8vIEN1c3RvbWlzYXRpb24gY29kZSBnb2VzIGhlcmVcbnVpLmluc2VydEFmdGVyKCd0aXRsZScsY3JlYXRlQmxvY2soQ29yZS5BY3Rpb25CdXR0b24se2xhYmVsOnN0YXRlLmdldCgnY2xpY2tDb3VudCcpPz9jb3VudCx2YXJpYW50OidzdWNjZXNzJ30pKSx1aS5pbnNlcnRBZnRlcigndGl0bGUnLGNyZWF0ZUJsb2NrKENvcmUuQWN0aW9uQnV0dG9uLHtsYWJlbDonSW5jcmVtZW50JyxvblByZXNzOigpPT57Y291bnRlcigpLC8vIEluY3JlbWVudCBhbmQgbG9nIHRoZSBjb3VudGVyXG5zdGF0ZS5zZXQoJ2NsaWNrQ291bnQnLGNvdW50KX0sdmFyaWFudDonc2Vjb25kYXJ5JywnYXJpYS1sYWJlbCc6J0luY3JlbWVudCd9KSksdWkuY3JlYXRlQ29tcG9uZW50KCkpKSkuY3JlYXRlQ29tcG9uZW50KCl9KX19KS50aGVuKChpbnN0YW5jZT0%252Be2NvbnNvbGUubG9nKCdQU1BERktpdCBsb2FkZWQhJyksY29uc29sZS5sb2coJ0FQSSBkb2NzOiBodHRwczovL3BzcGRma2l0LmNvbS9hcGkvd2ViLycpLGNvbnNvbGUubG9nKCdHdWlkZXM6IGh0dHBzOi8vcHNwZGZraXQuY29tL2d1aWRlcy93ZWIvJyl9KSk7In0%253D) + +--- + +## 🤖 AI & Document Generation + +- [AI Document Assistant](https://github.com/PSPDFKit/ai-document-assistant-demo) — Natural language PDF interaction with AI +- [Document Generator (Vanilla JS)](./web/document-generator-vanillajs/) — Step-by-step PDF generation with Document Authoring SDK + +--- + +## 📱 Mobile SDKs + +### iOS +[iOS Catalog](https://github.com/PSPDFKit/pspdfkit-ios-catalog) — Comprehensive iOS SDK examples + +### Android +[Android Catalog](https://github.com/PSPDFKit/pspdfkit-android-catalog) — Comprehensive Android SDK examples + +--- + +## 💻 Desktop SDKs + +### Windows +[WinUI3 Integration](./windows/pspdfkit-with-winui3) — Using Web SDK in WinUI3 apps with WebView2 + +--- + +## 🔗 Cross-Platform SDKs + +| Platform | Example Repository | Description | +|----------|-------------------|-------------| +| **React Native** | [Catalog](https://github.com/PSPDFKit/react-native/tree/master/samples/Catalog) | Cross-platform mobile development | +| **MAUI** | [Catalog](https://github.com/PSPDFKit/pspdfkit-maui-catalog) | .NET Multi-platform App UI | +| **Flutter** | [Sample](https://github.com/PSPDFKit/pspdfkit-flutter/tree/master/example) | Flutter SDK integration | +| **.NET Android** | [Samples](https://github.com/PSPDFKit/dotnet-pdf-library-for-android/tree/main/samples) | C# bindings for Android | +| **.NET iOS** | [Samples](https://github.com/PSPDFKit/dotnet-pdf-library-for-ios/tree/main/Samples) | C# bindings for iOS | + +--- + +## 📚 Additional Resources + +- [Nutrient Documentation](https://www.nutrient.io/guides/) +- [Web SDK API Reference](https://www.nutrient.io/api/web/) +- [Support Portal](https://support.nutrient.io/hc/en-us/requests/new) +- [Discord Community](https://discord.gg/Z754Pfb8bD) + +--- + +## 📄 License & Disclaimer + +Examples in this repository are provided for inspiration and are **not officially supported**. +See [DISCLAIMER.md](./DISCLAIMER.md) for details. + +For production support, contact [Nutrient Support](https://support.nutrient.io/hc/en-us/requests/new). diff --git a/package.json b/package.json index c9877ba..74d3d81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "@biomejs/biome": "^2.2.4", + "@biomejs/biome": "^2.3.1", "@eslint/js": "^9.18.0", "husky": "^9.1.7", "lint-staged": "^15.4.1" diff --git a/playground/README.md b/playground/README.md new file mode 100644 index 0000000..1c711b6 --- /dev/null +++ b/playground/README.md @@ -0,0 +1,92 @@ +# 🎮 Interactive Playground Snippets + +> **Try these examples instantly in your browser** - No setup, no installation required! + +These are ready-to-run code snippets for the [Nutrient Web SDK](https://www.nutrient.io/web-sdk/) that you can open directly in the [Nutrient Playground](https://www.nutrient.io/playground). Each example demonstrates a specific feature with working code you can experiment with immediately. + +## 🚀 How to Use + +1. Click any example link below +2. The Nutrient Playground opens with the code pre-loaded +3. Modify the code and see changes instantly +4. Copy the code into your own project + +--- + +## 📋 Example Categories + +### 🎨 Annotations +[**View Annotations Examples**](./web-annotations.md) — Add, customize, and manage PDF annotations including watermarks, highlighting, and bulk operations. + +**Popular examples:** +- Watermark from text annotation +- Flatten annotation on creation +- Bulk delete all annotations +- Straighten freeform highlights + +--- + +### 🔒 Redaction +[**View Redaction Examples**](./web-redaction.md) — Permanently remove sensitive content from PDFs. + +--- + +### ✍️ Signing +[**View Signing Examples**](./web-signing.md) — Electronic and digital signatures for PDF documents. + +--- + +### 📝 Forms +[**View Forms Examples**](./web-forms.md) — PDF form filling and management. + +--- + +### 🎨 Form Creator +[**View Form Creator Examples**](./web-form-creator.md) — Create and customize interactive PDF forms. + +--- + +### 👁️ Viewer +[**View Viewer Examples**](./web-viewer.md) — PDF viewing, navigation, and display customization. + +--- + +### 📄 Document Editor +[**View Document Editor Examples**](./web-document-editor.md) — Page manipulation, extraction, and editing. + +--- + +### 💬 Comments +[**View Comments Examples**](./web-comments.md) — Collaborative commenting workflows. + +--- + +### ✏️ Content Editor +[**View Content Editor Examples**](./web-content-editor.md) — Direct PDF content editing capabilities. + +--- + +### 🎛️ Toolbars & Menus +[**View Toolbars & Menus Examples**](./web-toolbars-menus.md) — UI customization and toolbar configuration. + +--- + +### 🔍 Text Comparison +[**View Text Comparison Examples**](./web-text-comparison.md) — Compare document versions and track changes. + +--- + +## 💻 Want More? + +- **Full Projects**: For complete, runnable applications, see [/web](../../web) directory +- **Framework Integration**: [React](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/react), [Angular](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/angular), [Next.js](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/nextjs) +- **Documentation**: [Nutrient Guides](https://www.nutrient.io/guides/) +- **API Reference**: [Web SDK API](https://www.nutrient.io/api/web/) + +--- + +## 🤝 Need Help? + +- [Discord Community](https://discord.gg/Z754Pfb8bD) +- [Support Portal](https://support.nutrient.io/hc/en-us/requests/new) +- [Report Issues](https://github.com/PSPDFKit/awesome-nutrient/issues) diff --git a/playground/web-annotations.md b/playground/web-annotations.md new file mode 100644 index 0000000..e9cdfb5 --- /dev/null +++ b/playground/web-annotations.md @@ -0,0 +1,101 @@ +# Web SDK Examples: Annotations + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/annotation/README.md](../web/annotation/README.md). + +--- + +## Annotations + +- [Watermark from text annotation](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBkaXNhYmxlVGV4dFNlbGVjdGlvbjogdHJ1ZSxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIGxldCB3YXRlcm1hcmtzID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogaW5zdGFuY2UudG90YWxQYWdlQ291bnQgfSkubWFwKChfLCBwYWdlSW5kZXgpID0%252BXG4gICAgICAgIGluc3RhbmNlLnBhZ2VJbmZvRm9ySW5kZXgocGFnZUluZGV4KVxuICAgICAgKVxuICAgIClcbiAgKS5yZWR1Y2UoKGFjYywgcGFnZUluZm8pID0%252BIHtcbiAgICBjb25zdCB7IGluZGV4OiBwYWdlSW5kZXgsIHJhd1BkZkJveGVzIH0gPSBwYWdlSW5mbyxcbiAgICAgIHsgY3JvcEJveCB9ID0gcmF3UGRmQm94ZXMsXG4gICAgICBbbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0XSA9IGNyb3BCb3g7XG5cbiAgICBjb25zdCB0b3RhbFJvd3MgPSA0OyAvLyA0IHJvd3NcbiAgICBjb25zdCB0b3RhbENvbHMgPSAzOyAvLyAzIGNvbHVtbnNcbiAgICBjb25zdCB0ZXh0ID0gXCJDT05GSURFTlRJQUxcIjtcbiAgICBjb25zdCBmb250U2l6ZSA9IDE0O1xuICAgIGNvbnN0IHRleHRXaWR0aCA9IHdpZHRoICogMC40OyAvLyBJbmNyZWFzZWQgd2lkdGggKDQwJSBvZiBwYWdlIHdpZHRoKVxuICAgIGNvbnN0IHRleHRIZWlnaHQgPSA1MDsgLy8gSW5jcmVhc2VkIGhlaWdodCBmb3IgYmV0dGVyIHZpc2liaWxpdHlcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRvdGFsUm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHRvdGFsQ29sczsgY29sKyspIHtcbiAgICAgICAgY29uc3QgeCA9IChjb2wgKyAxKSAqICh3aWR0aCAvICh0b3RhbENvbHMgKyAxKSk7XG4gICAgICAgIGNvbnN0IHkgPSAocm93ICsgMSkgKiAoaGVpZ2h0IC8gKHRvdGFsUm93cyArIDEpKTtcblxuICAgICAgICBhY2MucHVzaChcbiAgICAgICAgICBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuVGV4dEFubm90YXRpb24oe1xuICAgICAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgICAgICB0ZXh0OiB7IGZvcm1hdDogXCJwbGFpblwiLCB2YWx1ZTogdGV4dCB9LFxuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgaXNCb2xkOiB0cnVlLFxuICAgICAgICAgICAgZm9udDogXCJIZWx2ZXRpY2FcIixcbiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICAgICAgICAgIGxlZnQ6IHggLSB0ZXh0V2lkdGggLyAyLCAvLyBDZW50ZXIgaG9yaXpvbnRhbGx5XG4gICAgICAgICAgICAgIHRvcDogeSAtIHRleHRIZWlnaHQgLyAyLCAvLyBDZW50ZXIgdmVydGljYWxseVxuICAgICAgICAgICAgICB3aWR0aDogdGV4dFdpZHRoICsgMTAwLCAvLyBJbmNyZWFzZWQgd2lkdGhcbiAgICAgICAgICAgICAgaGVpZ2h0OiB0ZXh0SGVpZ2h0ICsgMTAwLCAvLyBJbmNyZWFzZWQgaGVpZ2h0XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZvbnRDb2xvcjogUFNQREZLaXQuQ29sb3IuR1JBWSxcbiAgICAgICAgICAgIHJvdGF0aW9uOiAzMCwgLy8gU2xpZ2h0IHRpbHRcbiAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgb3BhY2l0eTogMC4yLCAvLyBUcmFuc3BhcmVudCB3YXRlcm1hcmtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG5cbiAgYXdhaXQgaW5zdGFuY2UuY3JlYXRlKHdhdGVybWFya3MpO1xuICBhd2FpdCBpbnN0YW5jZS5hcHBseU9wZXJhdGlvbnMoW3sgdHlwZTogXCJmbGF0dGVuQW5ub3RhdGlvbnNcIiB9XSk7IC8vIE9wdGlvbmFsOiBGbGF0dGVuIHdhdGVybWFya3NcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBMb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + + - Dynamically add watermark text annotations to PDF pages before flattening them into a document. — [Video](https://www.youtube.com/watch?v=A6ydoCpCKMI) + +- [Flatten annotation on annotation create](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6IlBTUERGS2l0LmxvYWQoeyAuLi5iYXNlT3B0aW9ucywgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUksgfSkudGhlbihcbiAgKGluc3RhbmNlKSA9PiB7XG4gICAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcImFubm90YXRpb25zLmNyZWF0ZVwiLCAoYW5ub3RhdGlvbnMpID0%252BIHtcbiAgICAgIC8vIEFzc3VtaW5nIHdlIHdhbnQgdG8gZmxhdHRlbiBhbm5vdGF0aW9ucyBvbiB0aGUgcGFnZSB3aGVyZSB0aGUgYW5ub3RhdGlvbiB3YXMgYWRkZWRcbiAgICAgIGNvbnN0IHBhZ2VJbmRleGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChhbm5vdGF0aW9ucy5tYXAoKGFubm90YXRpb24pID0%252BIGFubm90YXRpb24ucGFnZUluZGV4KSlcbiAgICAgICk7XG4gICAgICBpbnN0YW5jZVxuICAgICAgICAuYXBwbHlPcGVyYXRpb25zKFtcbiAgICAgICAgICB7IHR5cGU6IFwiZmxhdHRlbkFubm90YXRpb25zXCIsIHBhZ2VJbmRleGVzOiBwYWdlSW5kZXhlcyB9LFxuICAgICAgICBdKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBmbGF0dGVuIGFubm90YXRpb25zOlwiLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pLFxuICAgICAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cdCIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIn19) + +- [Remove inline text selection toolbar on text select](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBpbmxpbmVUZXh0U2VsZWN0aW9uVG9vbGJhckl0ZW1zOiAoXG4gICAgeyBkZWZhdWx0SXRlbXMsIGhhc0Rlc2t0b3BMYXlvdXQgfSxcbiAgICBzZWxlY3Rpb25cbiAgKSA9PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9LFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + +- [Bulk delete all annotations](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6Ii8vIEJ1bGsgZGVsZXRlIEFMTCBhbm5vdGF0aW9uc1xuUFNQREZLaXQubG9hZCh7XG5cdC4uLmJhc2VPcHRpb25zLFxuXHR0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSS1xufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcblx0Y29uc3QgaXRlbXMgPSBpbnN0YW5jZS50b29sYmFySXRlbXM7XG5cblx0Y29uc3QgZGVsZXRlQnV0dG9uID0ge1xuXHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0aWQ6IFwiZGVsZXRlLWFubm90YXRpb25zXCIsXG5cdFx0dGl0bGU6IFwiRGVsZXRlXCIsIC8vIG9yIFwiUmVtb3ZlXCJcblx0XHRvblByZXNzOiBhc3luYyAoKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBwYWdlc0Fubm90YXRpb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0QXJyYXkuZnJvbSh7IGxlbmd0aDogaW5zdGFuY2UudG90YWxQYWdlQ291bnQgfSkubWFwKChfLCBwYWdlSW5kZXgpID0%252BXG5cdFx0XHRcdFx0XHRpbnN0YW5jZS5nZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnN0IGFubm90YXRpb25JZHMgPSBwYWdlc0Fubm90YXRpb25zLmZsYXRNYXAoKHBhZ2VBbm5vdGF0aW9ucykgPT5cblx0XHRcdFx0XHRwYWdlQW5ub3RhdGlvbnMubWFwKChhbm5vdGF0aW9uKSA9PiBhbm5vdGF0aW9uLmlkKS50b0FycmF5KClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoYW5ub3RhdGlvbklkcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRjb25zb2xlLmluZm8oXCJObyBhbm5vdGF0aW9ucyB0byBkZWxldGUuXCIpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IGluc3RhbmNlLmRlbGV0ZShhbm5vdGF0aW9uSWRzKTtcblx0XHRcdFx0Y29uc29sZS5pbmZvKGBEZWxldGVkICR7YW5ub3RhdGlvbklkcy5sZW5ndGh9IGFubm90YXRpb25zLmApO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGRlbGV0ZSBhbm5vdGF0aW9uczpcIiwgZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcyhbLi4uaXRlbXMsIGRlbGV0ZUJ1dHRvbl0pO1xufSk7IiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIn19) + - After the viewer loads, it gathers annotations from every page, flattens their IDs, and deletes them in a single operation. It uses `totalPageCount` with `getAnnotations` and an async IIFE to run the cleanup immediately. + +- [Straighten freeform highlight](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6Ii8vIENvbnZlcnRzIGZyZWVmb3JtIGhpZ2hsaWdodCBhbm5vdGF0aW9ucyBpbnRvIHN0cmFpZ2h0LWxpbmUgaGlnaGxpZ2h0c1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIC8vIFRvIGVuYWJsZSwgYXV0by1zZWxlY3Rpb24gb2YgRnJlZWZvcm0gSGlnaGxpZ2h0ZXIgdG9vbCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAvLyBpbnN0YW5jZS5zZXRDdXJyZW50QW5ub3RhdGlvblByZXNldChcImhpZ2hsaWdodGVyXCIpO1xuICAvLyBpbnN0YW5jZS5zZXRWaWV3U3RhdGUoKHZpZXdTdGF0ZSkgPT5cbiAgLy8gICB2aWV3U3RhdGUuc2V0KFwiaW50ZXJhY3Rpb25Nb2RlXCIsIFBTUERGS2l0LkludGVyYWN0aW9uTW9kZS5JTkspXG4gIC8vICk7XG5cbiAgLy8gTGlzdGVuIGZvciBuZXcgYW5ub3RhdGlvbiBjcmVhdGlvbiBldmVudHNcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcImFubm90YXRpb25zLmNyZWF0ZVwiLCBhc3luYyAoYW5ub3RhdGlvbikgPT4ge1xuICAgIC8vIEV4dHJhY3QgcmVsZXZhbnQgcHJvcGVydGllcyBmcm9tIHRoZSBmaXJzdCBhbm5vdGF0aW9uXG4gICAgY29uc3QgeyBib3VuZGluZ0JveCwgcGFnZUluZGV4LCBjdXN0b21EYXRhLCBsaW5lV2lkdGgsIGxpbmVzIH0gPVxuICAgICAgYW5ub3RhdGlvbi5nZXQoMCk7XG5cbiAgICAvLyBTa2lwIHByb2Nlc3NpbmcgaWY6XG4gICAgLy8gMS4gQW5ub3RhdGlvbiB3YXMgYWxyZWFkeSBjcmVhdGVkIGZyb20gZnJlZWZvcm0gKHByZXZlbnRzIGluZmluaXRlIGxvb3ApXG4gICAgLy8gMi4gQ3VycmVudCBwcmVzZXQgaXMgbm90IGhpZ2hsaWdodGVyXG4gICAgaWYgKFxuICAgICAgY3VzdG9tRGF0YT8uaXNDcmVhdGVkRnJvbUZyZWVGb3JtIHx8XG4gICAgICBpbnN0YW5jZS5jdXJyZW50QW5ub3RhdGlvblByZXNldCAhPT0gXCJoaWdobGlnaHRlclwiXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBsaW5lcyB0byBwbGFpbiBKYXZhU2NyaXB0IGFycmF5IGFuZCBleHRyYWN0IHN0YXJ0L2VuZCBwb2ludHNcbiAgICBjb25zdCBvcmlnaW5hbExpbmVzID0gbGluZXMuZ2V0KDApLnRvSlMoKTtcbiAgICBjb25zdCBzdGFydEFuZEVuZFBvaW50cyA9IFtvcmlnaW5hbExpbmVzWzBdLCBvcmlnaW5hbExpbmVzLmF0KC0xKV07XG5cbiAgICAvLyBFeHRyYWN0IGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IHN0cmFpZ2h0IGxpbmVcbiAgICBjb25zdCB7IHg6IHN0YXJ0WCwgeTogc3RhcnRZIH0gPSBzdGFydEFuZEVuZFBvaW50c1swXTtcbiAgICBjb25zdCB7IHg6IGVuZFggfSA9IHN0YXJ0QW5kRW5kUG9pbnRzWzFdO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHN0cmFpZ2h0IGxpbmUgdXNpbmcgc3RhcnQgYW5kIGVuZCBwb2ludHNcbiAgICBjb25zdCBzdHJhaWdodExpbmUgPSBQU1BERktpdC5JbW11dGFibGUuTGlzdChbXG4gICAgICBQU1BERktpdC5JbW11dGFibGUuTGlzdChbXG4gICAgICAgIG5ldyBQU1BERktpdC5HZW9tZXRyeS5EcmF3aW5nUG9pbnQoeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9KSxcbiAgICAgICAgbmV3IFBTUERGS2l0Lkdlb21ldHJ5LkRyYXdpbmdQb2ludCh7IHg6IGVuZFgsIHk6IHN0YXJ0WSB9KSxcbiAgICAgIF0pLFxuICAgIF0pO1xuXG4gICAgLy8gQ3JlYXRlIG5ldyBoaWdobGlnaHQgYW5ub3RhdGlvbiB3aXRoIHN0cmFpZ2h0IGxpbmVcbiAgICBjb25zdCBoaWdobGlnaHQgPSBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuSW5rQW5ub3RhdGlvbih7XG4gICAgICBwYWdlSW5kZXgsXG4gICAgICBsaW5lczogc3RyYWlnaHRMaW5lLFxuICAgICAgbGluZVdpZHRoLFxuICAgICAgYm91bmRpbmdCb3gsXG4gICAgICBibGVuZE1vZGU6IFwibXVsdGlwbHlcIixcbiAgICAgIGN1c3RvbURhdGE6IHtcbiAgICAgICAgaXNDcmVhdGVkRnJvbUZyZWVGb3JtOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIG9wYWNpdHk6IDEsXG4gICAgICBzdHJva2VDb2xvcjogUFNQREZLaXQuQ29sb3IuWUVMTE9XLFxuICAgIH0pO1xuXG4gICAgLy8gTG9nIHRoZSBzZXJpYWxpemVkIGhpZ2hsaWdodCBhbm5vdGF0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICBjb25zb2xlLmxvZyhQU1BERktpdC5Bbm5vdGF0aW9ucy50b1NlcmlhbGl6YWJsZU9iamVjdChoaWdobGlnaHQpKTtcblxuICAgIC8vIFJlcGxhY2Ugb3JpZ2luYWwgZnJlZWZvcm0gYW5ub3RhdGlvbiB3aXRoIG5ldyBzdHJhaWdodCBoaWdobGlnaHRcbiAgICBhd2FpdCBpbnN0YW5jZS5kZWxldGUoYW5ub3RhdGlvbik7XG4gICAgYXdhaXQgaW5zdGFuY2UuY3JlYXRlKGhpZ2hsaWdodCk7XG4gIH0pO1xufSk7XG4ifQ%253D%253D) + - Convert freeform ink annotations into highlight annotations. — [Video](https://www.youtube.com/watch?v=dJuIdtBJdcA) + +- [Add ink stroke color preset to custom buttons](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tY3Y3ZGo5NW16SyIsImxheWVyIjoicmFuZG9tY1FhQXJpcFVjMiJ9fSwianMiOiIvKipcbiAqIEluaXRpYWxpemVzIFBTUERGS2l0IFZpZXdlciB3aXRoIGN1c3RvbSB0b29sYmFyIGl0ZW1zIGZvciByZWQgYW5kIGJsdWUgaW5rIGFubm90YXRpb25zXG4gKi9cblxuLy8gSW5pdGlhbGl6ZSBQU1BERktpdCB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gU1ZHIHRlbXBsYXRlIGZvciBwZW4gaWNvbiAtIHVzZWQgZm9yIGJvdGggcmVkIGFuZCBibHVlIHBlbnNcbiAgY29uc3QgUEVOX0lDT05fU1ZHID0gYFxuICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBcbiAgICAgICB3aWR0aD1cIjI0XCIgXG4gICAgICAgaGVpZ2h0PVwiMjRcIiBcbiAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgXG4gICAgICAgY2xhc3M9XCJiaSBiaS1wZW5cIiBcbiAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCI%252BXG4gICAgPHBhdGggZD1cIm0xMy40OTguNzk1LjE0OS0uMTQ5YTEuMjA3IDEuMjA3IDAgMSAxIDEuNzA3IDEuNzA4bC0uMTQ5LjE0OGExLjUgMS41IDAgMCAxLS4wNTkgMi4wNTlMNC44NTQgMTQuODU0YS41LjUgMCAwIDEtLjIzMy4xMzFsLTQgMWEuNS41IDAgMCAxLS42MDYtLjYwNmwxLTRhLjUuNSAwIDAgMSAuMTMxLS4yMzJsOS42NDItOS42NDJhLjUuNSAwIDAgMC0uNjQyLjA1Nkw2Ljg1NCA0Ljg1NGEuNS41IDAgMSAxLS43MDgtLjcwOEw5LjQ0Ljg1NEExLjUgMS41IDAgMCAxIDExLjUuNzk2YTEuNSAxLjUgMCAwIDEgMS45OTgtLjAwMXptLS42NDQuNzY2YS41LjUgMCAwIDAtLjcwNyAwTDEuOTUgMTEuNzU2bC0uNzY0IDMuMDU3IDMuMDU3LS43NjRMMTQuNDQgMy44NTRhLjUuNSAwIDAgMCAwLS43MDhsLTEuNTg1LTEuNTg1elwiLz5cbiAgPC9zdmc%252BYDtcblxuICAvLyBDcmVhdGVzIGEgcGVuIGljb24gRE9NIG5vZGUgd2l0aCBzcGVjaWZpZWQgY29sb3JcbiAgZnVuY3Rpb24gY3JlYXRlUGVuSWNvbk5vZGUoY29sb3IpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBub2RlLmlubmVySFRNTCA9IFBFTl9JQ09OX1NWRy5yZXBsYWNlKFwiY3VycmVudENvbG9yXCIsIGNvbG9yKTtcbiAgICBub2RlLnF1ZXJ5U2VsZWN0b3IoXCJwYXRoXCIpLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgY29sb3IpO1xuICAgIG5vZGUucXVlcnlTZWxlY3RvcihcInN2Z1wiKS5zdHlsZS5jb2xvciA9IGNvbG9yO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgLy8gQ3JlYXRlcyBhIGN1c3RvbSB0b29sYmFyIGl0ZW1cbiAgZnVuY3Rpb24gY3JlYXRlSW5rVG9vbGJhckl0ZW0odGl0bGUsIG5vZGUsIGNvbG9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICB0aXRsZSxcbiAgICAgIG5vZGUsXG4gICAgICBvblByZXNzOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW50ZXJhY3Rpb25Nb2RlIH0gPSBpbnN0YW5jZS52aWV3U3RhdGU7XG5cbiAgICAgICAgaWYgKGludGVyYWN0aW9uTW9kZSA9PT0gXCJJTktcIiB8fCBpbnRlcmFjdGlvbk1vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIGN1cnJlbnQgaW50ZXJhY3Rpb24gbW9kZVxuICAgICAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgICAgICAgICAgdmlld1N0YXRlLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBudWxsKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgaW5rIHByZXNldCB3aXRoIHNlbGVjdGVkIGNvbG9yXG4gICAgICAgICAgaW5zdGFuY2Uuc2V0QW5ub3RhdGlvblByZXNldHMoKHByZXNldHMpID0%252BICh7XG4gICAgICAgICAgICAuLi5wcmVzZXRzLFxuICAgICAgICAgICAgaW5rOiB7XG4gICAgICAgICAgICAgIC4uLnByZXNldHMuaW5rLFxuICAgICAgICAgICAgICBzdHJva2VDb2xvcjogY29sb3IsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIC8vIEVuYWJsZSBpbmsgbW9kZSB3aXRoIG5ldyBjb2xvclxuICAgICAgICAgIGluc3RhbmNlLnNldEN1cnJlbnRBbm5vdGF0aW9uUHJlc2V0KFwiaW5rXCIpO1xuICAgICAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgICAgICAgICAgdmlld1N0YXRlLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuSU5LKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGlvbiBtb2RlXG4gICAgICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BXG4gICAgICAgICAgICB2aWV3U3RhdGUuc2V0KFwiaW50ZXJhY3Rpb25Nb2RlXCIsIG51bGwpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQ3JlYXRlIHBlbiBpY29uIG5vZGVzIGZvciBlYWNoIGNvbG9yXG4gIGNvbnN0IHJlZFBlbk5vZGUgPSBjcmVhdGVQZW5JY29uTm9kZShcInJlZFwiKTtcbiAgY29uc3QgYmx1ZVBlbk5vZGUgPSBjcmVhdGVQZW5JY29uTm9kZShcImJsdWVcIik7XG5cbiAgLy8gQ3JlYXRlIHRvb2xiYXIgaXRlbXMgZm9yIHJlZCBhbmQgYmx1ZSBpbmtcbiAgY29uc3QgcmVkSW5rVG9vbCA9IGNyZWF0ZUlua1Rvb2xiYXJJdGVtKFxuICAgIFwiUmVkIElua1wiLFxuICAgIHJlZFBlbk5vZGUsXG4gICAgUFNQREZLaXQuQ29sb3IuUkVEXG4gICk7XG4gIGNvbnN0IGJsdWVJbmtUb29sID0gY3JlYXRlSW5rVG9vbGJhckl0ZW0oXG4gICAgXCJCbHVlIElua1wiLFxuICAgIGJsdWVQZW5Ob2RlLFxuICAgIFBTUERGS2l0LkNvbG9yLkJMVUVcbiAgKTtcblxuICAvLyBBZGQgY3VzdG9tIHRvb2xzIHRvIHRvb2xiYXIgbmV4dCB0byB0aGUgZGVmYXVsdCBpbmsgdG9vbFxuICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoKGl0ZW1zKSA9PlxuICAgIGl0ZW1zLnJlZHVjZShcbiAgICAgICh0b29sYmFyLCBpdGVtKSA9PlxuICAgICAgICBpdGVtLnR5cGUgPT09IFwiaW5rXCJcbiAgICAgICAgICA%252FIFsuLi50b29sYmFyLCBpdGVtLCByZWRJbmtUb29sLCBibHVlSW5rVG9vbF1cbiAgICAgICAgICA6IFsuLi50b29sYmFyLCBpdGVtXSxcbiAgICAgIFtdXG4gICAgKVxuICApO1xufSk7XG4ifQ%253D%253D) + - Customize the toolbar to add two custom ink annotation buttons — one for red ink and one for blue ink — alongside the default ink annotation tool. — [Video](https://www.youtube.com/watch?v=5c1Djroucjk) + +- [Custom outlines for shape annotations](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLfSkudGhlbigoaW5zdGFuY2U9PntpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKCdwYWdlLnByZXNzJywoYXN5bmMgZXZlbnQ9Pntjb25zdHtwb2ludDpwb2ludCxwYWdlSW5kZXg6cGFnZUluZGV4LG5hdGl2ZUV2ZW50Om5hdGl2ZUV2ZW50fT1ldmVudCxhbm5vdGF0aW9uPShhd2FpdCBpbnN0YW5jZS5nZXRBbm5vdGF0aW9ucygwKSkuZmluZCgoYW5ub3RhdGlvbj0%252Be2NvbnN0IG91dGVyUmVjdD1hbm5vdGF0aW9uLmJvdW5kaW5nQm94Lmdyb3coMzApLGlubmVyUmVjdD1hbm5vdGF0aW9uLmJvdW5kaW5nQm94Lmdyb3coLTMwKTtyZXR1cm4gb3V0ZXJSZWN0LmlzUG9pbnRJbnNpZGUocG9pbnQpJiYhaW5uZXJSZWN0LmlzUG9pbnRJbnNpZGUocG9pbnQpfSkpLGlzU2VsZWN0PWluc3RhbmNlLmdldFNlbGVjdGVkQW5ub3RhdGlvbnMoKTthbm5vdGF0aW9uJiYhaXNTZWxlY3QmJihuYXRpdmVFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxzZXRUaW1lb3V0KCgoKT0%252BaW5zdGFuY2Uuc2V0U2VsZWN0ZWRBbm5vdGF0aW9ucyhhbm5vdGF0aW9uLmlkKSksMCkpfSkpfSkpOyIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4uUFNQREZLaXQtU2hhcGUtQW5ub3RhdGlvbntcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLlBTUERGS2l0LVNoYXBlLUFubm90YXRpb246bm90KDpoYXMoc3ZnIGVsbGlwc2UpKTo6YWZ0ZXJ7XG4gICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxLjI1cmVtO1xuICBib3R0b206IDEuMjVyZW07XG4gIGxlZnQ6IDEuMjVyZW07XG4gIHJpZ2h0OiAxLjI1cmVtO1xuICBvdXRsaW5lOiAxcHggc29saWQgcmVkICFpbXBvcnRhbnQ7XG59XG5cbi5QU1BERktpdC1TaGFwZS1Bbm5vdGF0aW9uOmhhcyhzdmcgZWxsaXBzZSk6OmFmdGVye1xuICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICBjb250ZW50OiBcIlwiO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMS4yNXJlbTtcbiAgYm90dG9tOiAxLjI1cmVtO1xuICBsZWZ0OiAxLjI1cmVtO1xuICByaWdodDogMS4yNXJlbTtcbiAgb3V0bGluZTogMXB4IHNvbGlkIHJlZCAhaW1wb3J0YW50O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG5cbi5QU1BERktpdC1TaGFwZS1Bbm5vdGF0aW9uOjpiZWZvcmUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICBjb250ZW50OiBcIlwiO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLTI1cHg7XG4gIGJvdHRvbTogLTI1cHg7XG4gIGxlZnQ6IC0yNXB4O1xuICByaWdodDogLTI1cHg7XG4gIG91dGxpbmU6IDJweCBzb2xpZCBwaW5rO1xufVxuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + - Customize shape annotations by adding an outline. — [Video](https://www.youtube.com/watch?v=9MFHv_CDwKU) + +- [Customize annotation creators](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiJsZXQgYWxsU3RhbXBzPVtdLGNyZWF0b3JzPVsnVHJpc3RhJywnRWxpJywnQWxleCcsJ1BhdicsJ0NocmlzJ107UFNQREZLaXQubG9hZCh7Li4uYmFzZU9wdGlvbnMsdGhlbWU6UFNQREZLaXQuVGhlbWUuREFSSyxjdXN0b21SZW5kZXJlcnM6e319KS50aGVuKChpbnN0YW5jZT0%252Be2NvbnN0IHNlbGVjdE5vZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7c2VsZWN0Tm9kZS5pbm5lckhUTUw9Y3JlYXRvcnMubWFwKChjcmVhdG9yPT5gPG9wdGlvbiB2YWx1ZT1cIiR7Y3JlYXRvcn1cIj4ke2NyZWF0b3J9PC9vcHRpb24%252BYCkpLFxuLy9saXN0ZW5pbmcgdG8gb25DaGFuZ2UgZXZlbnRzIHRvIHVwZGF0ZSB0aGUgZm9udCBmYW1pbHkgYWNjb3JkaW5nbHlcbnNlbGVjdE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoYXN5bmMgZXZlbnQ9Pntjb25zb2xlLmxvZyhgU2VsZWN0ZWQgb3B0aW9uOiAke2V2ZW50LnRhcmdldC52YWx1ZX1gKSxpbnN0YW5jZS5zZXRDdXN0b21SZW5kZXJlcnMoe0Fubm90YXRpb246KHthbm5vdGF0aW9uOmFubm90YXRpb259KT0%252BZXZlbnQudGFyZ2V0LnZhbHVlPT09YW5ub3RhdGlvbi5jcmVhdG9yTmFtZT97bm9kZTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxhcHBlbmQ6ITF9Om51bGx9KX0pKTtcbi8vQ3VzdG9tIFRvb2xiYXIgSXRlbVxuY29uc3QgZmlsdGVyPXt0eXBlOidjdXN0b20nLGlkOidteS1idXR0b24nLG5vZGU6c2VsZWN0Tm9kZX07aW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKFt7dHlwZTonc3BhY2VyJ30sZmlsdGVyLHt0eXBlOidzcGFjZXInfV0pLGluc3RhbmNlLnNldEFubm90YXRpb25DcmVhdG9yTmFtZSgnU2FzaGEnKTtmb3IobGV0IGk9MDtpPDU7KytpKWFsbFN0YW1wc1tpXT1uZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuU3RhbXBBbm5vdGF0aW9uKHtwYWdlSW5kZXg6MCxpZDpQU1BERktpdC5nZW5lcmF0ZUluc3RhbnRJZCgpLHN0YW1wVHlwZTonQ3VzdG9tJyx0aXRsZTpgU1RBTVAtJHtpfWAsY29sb3I6UFNQREZLaXQuQ29sb3IuQkxBQ0ssYm91bmRpbmdCb3g6bmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe2xlZnQ6aT4wP2FsbFN0YW1wc1tpLTFdLmJvdW5kaW5nQm94LmxlZnQrNTA6MTAwLHRvcDoxMDAsd2lkdGg6NTAsaGVpZ2h0OjUwfSksY3JlYXRvck5hbWU6Y3JlYXRvcnNbaV19KTtcbi8vY3JlYXRpbmcgYWxsIHRoZSBzdGFtcHNcbmluc3RhbmNlLmNyZWF0ZShhbGxTdGFtcHMpfSkpOyIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cdC5jaGVja2JveC1kcm9wZG93biB7XG4gICAgd2lkdGg6IDIwMHB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7XG4gICAgcGFkZGluZzogMTBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi8qIERpc3BsYXkgQ1NTIGFycm93IHRvIHRoZSByaWdodCBvZiB0aGUgZHJvcGRvd24gdGV4dCAqL1xuLmNoZWNrYm94LWRyb3Bkb3duOmFmdGVyIHtcbiAgICBjb250ZW50OicnO1xuICAgIGhlaWdodDogMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDA7XG4gICAgYm9yZGVyOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogIzAwMDtcbiAgICB0b3A6IDUwJTtcbiAgICByaWdodDogMTBweDtcbiAgICBtYXJnaW4tdG9wOiAtM3B4O1xufVxuXG4vKiBSZXZlcnNlIHRoZSBDU1MgYXJyb3cgd2hlbiB0aGUgZHJvcGRvd24gaXMgYWN0aXZlICovXG4uY2hlY2tib3gtZHJvcGRvd24uaXMtYWN0aXZlOmFmdGVyIHtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAwO1xuICAgIGJvcmRlci10b3AtY29sb3I6ICNmZmY7XG4gICAgbWFyZ2luLXRvcDogLTlweDtcbn1cblxuLmNoZWNrYm94LWRyb3Bkb3duLWxpc3Qge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMTAwJTsgLyogYWxpZ24gdGhlIGRyb3Bkb3duIHJpZ2h0IGJlbG93IHRoZSBkcm9wZG93biB0ZXh0ICovXG4gICAgYm9yZGVyOiBpbmhlcml0O1xuICAgIGJvcmRlci10b3A6IG5vbmU7XG4gICAgbGVmdDogLTFweDsgLyogYWxpZ24gdGhlIGRyb3Bkb3duIHRvIHRoZSBsZWZ0ICovXG4gICAgcmlnaHQ6IC0xcHg7IC8qIGFsaWduIHRoZSBkcm9wZG93biB0byB0aGUgcmlnaHQgKi9cbiAgICBvcGFjaXR5OiAwOyAvKiBoaWRlIHRoZSBkcm9wZG93biAqL1xuICAgXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjRzIGVhc2UtaW4tb3V0O1xuICAgIGhlaWdodDogMTAwcHg7XG4gICAgb3ZlcmZsb3c6IHNjcm9sbDtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7IC8qIGF2b2lkIG1vdXNlIGNsaWNrIGV2ZW50cyBpbnNpZGUgdGhlIGRyb3Bkb3duICovXG59XG4uaXMtYWN0aXZlIC5jaGVja2JveC1kcm9wZG93bi1saXN0IHtcbiAgICBvcGFjaXR5OiAxOyAvKiBkaXNwbGF5IHRoZSBkcm9wZG93biAqL1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOyAvKiBtYWtlIHN1cmUgdGhhdCB0aGUgdXNlciBzdGlsbCBjYW4gc2VsZWN0IGNoZWNrYm94ZXMgKi9cbn1cblxuLmNoZWNrYm94LWRyb3Bkb3duLWxpc3QgbGkgbGFiZWwge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBzaWx2ZXI7XG4gICAgcGFkZGluZzogMTBweDtcbiAgIFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2Utb3V0O1xufVxuXG4uY2hlY2tib3gtZHJvcGRvd24tbGlzdCBsaSBsYWJlbDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzU1NTtcbiAgICBjb2xvcjogd2hpdGU7XG59XG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + - Create and customize stamp annotations with multiple creators. — [Video](https://www.youtube.com/watch?v=etJAe9bJzic) + +- [Prevent dragging of annotations](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChpbnN0YW5jZT0%252Be2luc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLnByZXNzJywoZXZlbnQ9Pntjb25zdHthbm5vdGF0aW9uOmFubm90YXRpb24sbmF0aXZlRXZlbnQ6bmF0aXZlRXZlbnR9PWV2ZW50O1xuLy9oYW5kbGluZyBzcGVjaWFsIGNhc2UgZm9yIFRleHQgQW5ub3RhdGlvbnNcbnJldHVybiBudWxsIT09aW5zdGFuY2UuZ2V0U2VsZWN0ZWRBbm5vdGF0aW9ucygpJiZhbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuVGV4dEFubm90YXRpb24%252FaW5zdGFuY2Uuc2V0RWRpdGluZ0Fubm90YXRpb24oYW5ub3RhdGlvbix7YXV0b1NlbGVjdFRleHQ6ITF9KTpcbi8vSGFuZGxpbmcgc3BlY2lhbCBjYXNlIGZvciBOb3RlcyBzbGlnaGx0eSBkaWZmZXJlbnQgdGhhbiBUZXh0IEFubm90YXRpb25zXG5hbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuTm90ZUFubm90YXRpb24%252FKGV2ZW50LnByZXZlbnREZWZhdWx0KCksaW5zdGFuY2Uuc2V0RWRpdGluZ0Fubm90YXRpb24oYW5ub3RhdGlvbix7YXV0b1NlbGVjdFRleHQ6ITF9KSk6XG4vL2lnbm9yaW5nIEZvcm1zIGFuZCBMaW5rcyB0byBhbGxvdyBkZWZhdWx0IGZvY3VzIGFuZCByZWRpcmVjdCBiZWhhdmlvcnMgcmVzcGVjdGl2ZWx5XG5hbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuV2lkZ2V0QW5ub3RhdGlvbnx8YW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBTUERGS2l0LkFubm90YXRpb25zLkxpbmtBbm5vdGF0aW9uP3ZvaWQgMDooXG4vL3ByZXZlbnRpbmcgZHJhZ2dpbmcgZm9yIHRoZSByZXN0IG9mIEFubm90YXRpb24gVHlwZXNcbmV2ZW50LnByZXZlbnREZWZhdWx0KCksaW5zdGFuY2Uuc2V0U2VsZWN0ZWRBbm5vdGF0aW9ucyhhbm5vdGF0aW9uKSl9KSx7Y2FwdHVyZTohMH0pfSkpOyIsIm1vZGUiOiJzdGFuZGFsb25lIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) + - Allow special behavior for text and note annotations, while preserving default behaviors for forms and links, and restrict dragging for other annotation types. + +- [Restrict dragging and editing ink annotations and signatures](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb211cWlpT202ZU5xIiwibGF5ZXIiOiJyYW5kb21QRzRBRkxwbGM2In19LCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChhc3luYyBpbnN0YW5jZT0%252Be2NvbnN0IGFubm90YXRpb249bmV3IFBTUERGS2l0LkFubm90YXRpb25zLklua0Fubm90YXRpb24oe3BhZ2VJbmRleDowLGlzU2lnbmF0dXJlOiEwLGxpbmVzOlBTUERGS2l0LkltbXV0YWJsZS5MaXN0KFtQU1BERktpdC5JbW11dGFibGUuTGlzdChbbmV3IFBTUERGS2l0Lkdlb21ldHJ5LkRyYXdpbmdQb2ludCh7eDo1LHk6NX0pLG5ldyBQU1BERktpdC5HZW9tZXRyeS5EcmF3aW5nUG9pbnQoe3g6OTUseTo5NX0pXSksUFNQREZLaXQuSW1tdXRhYmxlLkxpc3QoW25ldyBQU1BERktpdC5HZW9tZXRyeS5EcmF3aW5nUG9pbnQoe3g6OTUseTo1fSksbmV3IFBTUERGS2l0Lkdlb21ldHJ5LkRyYXdpbmdQb2ludCh7eDo1LHk6OTV9KV0pXSksYm91bmRpbmdCb3g6bmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe2xlZnQ6MCx0b3A6MCx3aWR0aDoxMDAsaGVpZ2h0OjEwMH0pfSk7YXdhaXQgaW5zdGFuY2UuY3JlYXRlKGFubm90YXRpb24pLGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLnByZXNzJywoZXZlbnQ9Pntjb25zdHthbm5vdGF0aW9uOmFubm90YXRpb24sbmF0aXZlRXZlbnQ6bmF0aXZlRXZlbnR9PWV2ZW50O2NvbnNvbGUubG9nKGluc3RhbmNlLmdldFNlbGVjdGVkQW5ub3RhdGlvbnMoKSksbnVsbCE9PWluc3RhbmNlLmdldFNlbGVjdGVkQW5ub3RhdGlvbnMoKSYmYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBTUERGS2l0LkFubm90YXRpb25zLklua0Fubm90YXRpb24mJmFubm90YXRpb24uaXNTaWduYXR1cmUmJihldmVudC5wcmV2ZW50RGVmYXVsdCgpLGluc3RhbmNlLnNldFNlbGVjdGVkQW5ub3RhdGlvbnMoYW5ub3RhdGlvbikpfSkpfSkpOyIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cbi5QU1BERktpdC1SZXNpemUtQW5jaG9yIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXHQifQ%253D%253D) + - Prevent users from editing or dragging ink annotations and ink signatures, but allow them to delete them. + +- [Programmatically create a comment thread](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiIvL3NldCB1c2VyIG5hbWUgZnJvbSBhIGxvZ2luIG9yIGF1dGhlbnRpY2F0aW9uXG5jb25zdCB1c2VybmFtZT0nT21hcic7UFNQREZLaXQubG9hZCh7Li4uYmFzZU9wdGlvbnMsdGhlbWU6UFNQREZLaXQuVGhlbWUuREFSSyx0b29sYmFySXRlbXM6W3t0eXBlOidjb21tZW50J31dfSkudGhlbigoaW5zdGFuY2U9Pntjb25zdCBhbm5vdGF0aW9uPW5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5Db21tZW50TWFya2VyQW5ub3RhdGlvbih7aWQ6J3Rlc3QnLHBhZ2VJbmRleDowLGJvdW5kaW5nQm94Om5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHt0b3A6MTAwLGxlZnQ6MTAwLHdpZHRoOjEwLGhlaWdodDoxMH0pLGN1c3RvbURhdGE6e2NpcmNsZUlkOidteS1jaXJjbGUnfX0pLGNvbW1lbnQ9bmV3IFBTUERGS2l0LkNvbW1lbnQoe2lkOidjb21tZW50SWQnLHJvb3RJZDondGVzdCcscGFnZUluZGV4OjAsdGV4dDp7Zm9ybWF0OidwbGFpbicsdmFsdWU6J0hlbGxvJ319KTtpbnN0YW5jZS5zZXRBbm5vdGF0aW9uQ3JlYXRvck5hbWUoJ09tYXInKSxpbnN0YW5jZS5jcmVhdGUoW2Fubm90YXRpb24sY29tbWVudF0pLGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLmNyZWF0ZScsKGFubm90YXRpb25zPT57Y29uc29sZS5sb2coYW5ub3RhdGlvbnMuZ2V0KDApLnRvSlMoKSl9KSl9KSk7IiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) + - Programmatically add a comment marker annotation and an associated comment while setting the annotation creator’s name. — [Video](https://www.youtube.com/watch?v=zaan1UNYlZ8) + +- [Open URL from image annotation](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxufSkudGhlbihhc3luYyhpbnN0YW5jZSkgPT4ge1xuIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vcHNwZGZraXQuY29tL2Fzc2V0cy9pbWFnZXMvZGlhZ29uYWwtZmxpZ2h0LWNhcmRzLTdkOTk3Njk5LnBuZ1wiKTtcbmNvbnN0IGJsb2IgPSBhd2FpdCByZXF1ZXN0LmJsb2IoKTtcbmNvbnN0IGltYWdlQXR0YWNobWVudElkID0gYXdhaXQgaW5zdGFuY2UuY3JlYXRlQXR0YWNobWVudChibG9iKTtcbmNvbnN0IGFubm90YXRpb24gPSBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuSW1hZ2VBbm5vdGF0aW9uKHtcbiAgcGFnZUluZGV4OiAwLFxuICBjb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgaW1hZ2VBdHRhY2htZW50SWQsXG4gIGRlc2NyaXB0aW9uOiBcIkV4YW1wbGUgSW1hZ2UgQW5ub3RhdGlvblwiLFxuICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgIGxlZnQ6IDEwLFxuICAgIHRvcDogMjAsXG4gICAgd2lkdGg6IDE1MCxcbiAgICBoZWlnaHQ6IDE1MCxcbiAgfSksXG4gIGFjdGlvbjogbmV3IFBTUERGS2l0LkFjdGlvbnMuVVJJQWN0aW9uKHt1cmk6IFwiaHR0cHM6Ly9wc3BkZmtpdC5jb20vYXNzZXRzL2ltYWdlcy9sb2dvcy9wc3BkZmtpdC0zY2NkODI1My5zdmdcIn0pXG59KTtcbmF3YWl0IGluc3RhbmNlLmNyZWF0ZShhbm5vdGF0aW9uKVxufSk7XG5cdCJ9) + +- [Display highlighted text in annotation sidebar](https://playground.pspdfkit.com/?p=eyJ2IjoxLCJtb2RlIjoic3RhbmRhbG9uZSIsImpzIjoibGV0IGluc3RhbmNlPW51bGw7Y29uc3QgY3VzdG9tVUlDb25maWd1cmF0aW9uPXtbUFNQREZLaXQuVUlFbGVtZW50LlNpZGViYXJdOntbUFNQREZLaXQuU2lkZWJhck1vZGUuQU5OT1RBVElPTlNdOih7Y29udGFpbmVyTm9kZTpjb250YWluZXJOb2RlfSk9Pih7bm9kZTpjb250YWluZXJOb2RlLG9uUmVuZGVySXRlbTooe2l0ZW06YW5ub3RhdGlvbixpdGVtQ29udGFpbmVyTm9kZTppdGVtQ29udGFpbmVyTm9kZX0pPT57YW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBTUERGS2l0LkFubm90YXRpb25zLkhpZ2hsaWdodEFubm90YXRpb24mJmluc3RhbmNlLmdldFRleHRGcm9tUmVjdHMoYW5ub3RhdGlvbi5wYWdlSW5kZXgsYW5ub3RhdGlvbi5yZWN0cykudGhlbigodGV4dD0%252Be2l0ZW1Db250YWluZXJOb2RlLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLnRleHRDb250ZW50PXRleHR9KSl9fSl9fTtQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLGN1c3RvbVVJOmN1c3RvbVVJQ29uZmlndXJhdGlvbixpbml0aWFsVmlld1N0YXRlOm5ldyBQU1BERktpdC5WaWV3U3RhdGUoe3NpZGViYXJNb2RlOlBTUERGS2l0LlNpZGViYXJNb2RlLkFOTk9UQVRJT05TfSl9KS50aGVuKChfaW5zdGFuY2U9PihpbnN0YW5jZT1faW5zdGFuY2UsY29uc29sZS5sb2coJ1BTUERGS2l0IGZvciBXZWIgc3VjY2Vzc2Z1bGx5IGxvYWRlZCEhJyxpbnN0YW5jZSksaW5zdGFuY2UpKSk7Iiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYiLCJqd3QiOnsicGVybWlzc2lvbnMiOlsicmVhZC1kb2N1bWVudCIsIndyaXRlIl0sInVzZXJJZCI6InJhbmRvbXZ1bllZQjlENjciLCJsYXllciI6InJhbmRvbVlqSnMwTnZNZVAifX0sImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cdCJ9) + - Customize the annotation sidebar to display highlighted text and allow annotation editing (except for signatures). — [Video](https://www.youtube.com/watch?v=Fs1eeMrkXEQ) + +- [Log the print activity in the sidebar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmljb25fdGV4dCB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGglM0QlMjIyNSUyMiBoZWlnaHQlM0QlMjIyNSUyMiB2aWV3Qm94JTNEJTIyMCUyMDAlMjAyNSUyMDI1JTIyIGZpbGwlM0QlMjIlMjNGRkZGRkYlMjIgeG1sbnMlM0QlMjJodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTIyJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC43NSUyMiBkJTNEJTIyTTEuNzA2NzkgMjAuNTY4TDMuNDc0NzkgMjIuMzM1TDIuMDU5NzkgMjMuNzVDMS44NzIyNiAyMy45Mzc1IDEuNjE3OTUgMjQuMDQyOCAxLjM1Mjc5IDI0LjA0MjhDMS4wODc2MiAyNC4wNDI4IDAuODMzMzE0IDIzLjkzNzUgMC42NDU3ODcgMjMuNzVMMC4yOTI3ODYgMjMuMzk2QzAuMTA1MzE1IDIzLjIwODUgMCAyMi45NTQyIDAgMjIuNjg5QzAgMjIuNDIzOCAwLjEwNTMxNSAyMi4xNjk1IDAuMjkyNzg2IDIxLjk4MkwxLjcwNjc5IDIwLjU2OFolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NwYXRoIGQlM0QlMjJNOC45MjQ3OSA1LjkyOTk5TDguMjE0NzkgNi42Mjk5OUMzLjI2NDc5IDExLjYzIDMuNjI0NzkgMTYuODkgMy42MjQ3OSAxNi44OUwyLjA0NDc5IDE4LjQ4QzEuOTI4MzggMTguNTk2MSAxLjgzNjAyIDE4LjczNCAxLjc3MyAxOC44ODU5QzEuNzA5OTkgMTkuMDM3OCAxLjY3NzU1IDE5LjIwMDYgMS42Nzc1NSAxOS4zNjVDMS42Nzc1NSAxOS41Mjk0IDEuNzA5OTkgMTkuNjkyMiAxLjc3MyAxOS44NDQxQzEuODM2MDIgMTkuOTk1OSAxLjkyODM4IDIwLjEzMzkgMi4wNDQ3OSAyMC4yNUwzLjc5NDc5IDIyQzMuOTEwOSAyMi4xMTY0IDQuMDQ4ODQgMjIuMjA4OCA0LjIwMDcgMjIuMjcxOEM0LjM1MjU2IDIyLjMzNDggNC41MTUzNyAyMi4zNjcyIDQuNjc5NzkgMjIuMzY3MkM0Ljg0NDIgMjIuMzY3MiA1LjAwNzAxIDIyLjMzNDggNS4xNTg4NyAyMi4yNzE4QzUuMzEwNzMgMjIuMjA4OCA1LjQ0ODY3IDIyLjExNjQgNS41NjQ3OSAyMkw3LjE1NDc5IDIwLjQxQzcuMTU0NzkgMjAuNDEgMTIuNDY0OCAyMC43NyAxNy40MTQ4IDE1LjgyTDE4LjExNDggMTUuMTElMjIgc3Ryb2tlJTNEJTIyYmxhY2slMjIgc3Ryb2tlLW1pdGVybGltaXQlM0QlMjIxMCUyMiBzdHJva2UtbGluZWNhcCUzRCUyMnJvdW5kJTIyLyUzRSUzQ3BhdGggb3BhY2l0eSUzRCUyMjAuMzMlMjIgZCUzRCUyMk0xNi43MDY4IDE1LjgyNkw4LjIyMTggNy4zNDFMNi44MDc4IDguNzU1TDE1LjI5MjggMTcuMjRMMTYuNzA2OCAxNS44MjZaJTIyIGZpbGwlM0QlMjIlMjNGODI0MDAlMjIvJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC41JTIyIGQlM0QlMjJNNi45Mzk4MSAxOS45MzFMNC4xMTA4MSAxNy4xMDNMMy40MDM4MSAxNy44MUw2LjIzMjgxIDIwLjYzOEw2LjkzOTgxIDE5LjkzMVolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NjaXJjbGUgY3glM0QlMjIxOC4wNDQ4JTIyIGN5JTNEJTIyNiUyMiByJTNEJTIyNiUyMiBmaWxsJTNEJTIyJTIzRjgyNDAwJTIyLyUzRSUzQy9zdmclM0VcIilcbiAgICBuby1yZXBlYXQgY2VudGVyO1xufVxuIiwianMiOiJsZXQgcHJpbnRIaXN0b3J5ID0gW107XG5sZXQgaW5zdGFuY2UgPSBudWxsO1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50RGF0ZVRpbWUoKSB7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgeWVhcjogJ251bWVyaWMnLFxuICAgIG1vbnRoOiAnbG9uZycsXG4gICAgZGF5OiAnbnVtZXJpYycsXG4gICAgaG91cjogJzItZGlnaXQnLFxuICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgIHNlY29uZDogJzItZGlnaXQnLFxuICAgIGhvdXIxMjogdHJ1ZVxuICB9O1xuICByZXR1cm4gbm93LnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tVVMnLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gbG9nUHJpbnRBY3Rpdml0eSgpIHtcbiAgY29uc29sZS5sb2coJ0xvZ2dpbmcgcHJpbnQgYWN0aXZpdHknKTtcbiAgY29uc3QgcHJpbnRUaW1lID0gZ2V0Q3VycmVudERhdGVUaW1lKCk7XG4gIGNvbnN0IHByaW50RW50cnkgPSBgUHJpbnRlZCBvbiAke3ByaW50VGltZX1gO1xuICBcbiAgcHJpbnRIaXN0b3J5LnVuc2hpZnQocHJpbnRFbnRyeSk7XG4gIFxuICBpZiAocHJpbnRIaXN0b3J5Lmxlbmd0aCA%252BIDEwKSB7XG4gICAgcHJpbnRIaXN0b3J5ID0gcHJpbnRIaXN0b3J5LnNsaWNlKDAsIDEwKTtcbiAgfVxuICBcbiAgY29uc29sZS5sb2coJ1ByaW50IGhpc3RvcnkgdXBkYXRlZDonLCBwcmludEhpc3RvcnkpO1xuICB1cGRhdGVDdXN0b21VSSgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDdXN0b21VSSgpIHtcbiAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuICBcbiAgY29uc3QgY3VzdG9tVUkgPSB7XG4gICAgW051dHJpZW50Vmlld2VyLlVJRWxlbWVudC5TaWRlYmFyXToge1xuICAgICAgW051dHJpZW50Vmlld2VyLlNpZGViYXJNb2RlLkNVU1RPTV06ICh7IGNvbnRhaW5lck5vZGUgfSkgPT4ge1xuICAgICAgICAvLyBDbGVhciB0aGUgY29udGFpbmVyXG4gICAgICAgIGNvbnRhaW5lck5vZGUuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG1haW5Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBtYWluQ29udGFpbmVyLnN0eWxlLnBhZGRpbmcgPSBcIjIwcHhcIjtcbiAgICAgICAgbWFpbkNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcbiAgICAgICAgbWFpbkNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcbiAgICAgICAgXG4gICAgICAgIC8vIFByaW50IGFjdGl2aXR5IHRpdGxlXG4gICAgICAgIGNvbnN0IHByaW50VGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDRcIik7XG4gICAgICAgIHByaW50VGl0bGUuaW5uZXJUZXh0ID0gXCJQcmludCBBY3Rpdml0eSBMb2dcIjtcbiAgICAgICAgcHJpbnRUaXRsZS5zdHlsZS5tYXJnaW4gPSBcIjAgMCAxNXB4IDBcIjtcbiAgICAgICAgcHJpbnRUaXRsZS5zdHlsZS5jb2xvciA9IFwiI2ZmZlwiO1xuICAgICAgICBcbiAgICAgICAgLy8gSGlzdG9yeSBsaXN0IGNvbnRhaW5lclxuICAgICAgICBjb25zdCBoaXN0b3J5TGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGhpc3RvcnlMaXN0LnN0eWxlLm1heEhlaWdodCA9IFwiNDAwcHhcIjtcbiAgICAgICAgaGlzdG9yeUxpc3Quc3R5bGUub3ZlcmZsb3dZID0gXCJhdXRvXCI7XG4gICAgICAgIFxuICAgICAgICBpZiAocHJpbnRIaXN0b3J5Lmxlbmd0aCA%252BIDApIHtcbiAgICAgICAgICBwcmludEhpc3RvcnkuZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoaXN0b3J5SXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZjhmOWZhXCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5ib3JkZXIgPSBcIjFweCBzb2xpZCAjZGVlMmU2XCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIjRweFwiO1xuICAgICAgICAgICAgaGlzdG9yeUl0ZW0uc3R5bGUucGFkZGluZyA9IFwiMTBweFwiO1xuICAgICAgICAgICAgaGlzdG9yeUl0ZW0uc3R5bGUubWFyZ2luQm90dG9tID0gXCI4cHhcIjtcbiAgICAgICAgICAgIGhpc3RvcnlJdGVtLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5jb2xvciA9IFwiIzMzM1wiO1xuICAgICAgICAgICAgY29uc3QgcHJpbnROdW1iZXIgPSBwcmludEhpc3RvcnkubGVuZ3RoIC0gaW5kZXg7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5pbm5lckhUTUwgPSBgPHN0cm9uZz5QcmludCAjJHtwcmludE51bWJlcn08L3N0cm9uZz48YnI%252BJHtlbnRyeX1gO1xuICAgICAgICAgICAgaGlzdG9yeUxpc3QuYXBwZW5kQ2hpbGQoaGlzdG9yeUl0ZW0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vSGlzdG9yeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgbm9IaXN0b3J5LmlubmVyVGV4dCA9IFwiTm8gcHJpbnQgYWN0aXZpdHkgeWV0XCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLmNvbG9yID0gXCIjNmM3NTdkXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLmZvbnRTdHlsZSA9IFwiaXRhbGljXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLnRleHRBbGlnbiA9IFwiY2VudGVyXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLnBhZGRpbmcgPSBcIjIwcHhcIjtcbiAgICAgICAgICBoaXN0b3J5TGlzdC5hcHBlbmRDaGlsZChub0hpc3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBtYWluQ29udGFpbmVyLmFwcGVuZENoaWxkKHByaW50VGl0bGUpO1xuICAgICAgICBtYWluQ29udGFpbmVyLmFwcGVuZENoaWxkKGhpc3RvcnlMaXN0KTtcbiAgICAgICAgY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChtYWluQ29udGFpbmVyKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7IG5vZGU6IGNvbnRhaW5lck5vZGUgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgXG4gIGluc3RhbmNlLnNldEN1c3RvbVVJQ29uZmlndXJhdGlvbihjdXN0b21VSSk7XG59XG5cbmZ1bmN0aW9uIHNldHVwUHJpbnRFdmVudExpc3RlbmVycygpIHtcbiAgY29uc29sZS5sb2coJ1NldHRpbmcgdXAgcHJpbnQgZXZlbnQgbGlzdGVuZXJzJyk7XG4gIFxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JlcHJpbnQnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ0JlZm9yZSBwcmludCBldmVudCBkZXRlY3RlZCcpO1xuICAgIGxvZ1ByaW50QWN0aXZpdHkoKTtcbiAgfSk7XG4gIFxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYWZ0ZXJwcmludCcsICgpID0%252BIHtcbiAgICBjb25zb2xlLmxvZygnQWZ0ZXIgcHJpbnQgZXZlbnQgZGV0ZWN0ZWQnKTtcbiAgfSk7XG4gIFxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LmtleSA9PT0gJ3AnKSB7XG4gICAgICBjb25zb2xlLmxvZygnUHJpbnQga2V5Ym9hcmQgc2hvcnRjdXQgZGV0ZWN0ZWQnKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsb2dQcmludEFjdGl2aXR5KCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfSk7XG59XG5cbk51dHJpZW50Vmlld2VyLmxvYWQoeyBcbiAgLi4uYmFzZU9wdGlvbnMsIFxuICB0aGVtZTogTnV0cmllbnRWaWV3ZXIuVGhlbWUuREFSSyxcbiAgZW5hYmxlSGlzdG9yeTogdHJ1ZSxcbiAgZW5hYmxlQ2xpcGJvYXJkQWN0aW9uczogdHJ1ZSxcbn0pLnRoZW4oKGluc3RhbmNlUmVmKSA9PiB7XG4gIGNvbnNvbGUubG9nKCdOdXRyaWVudFZpZXdlciBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIGluc3RhbmNlID0gaW5zdGFuY2VSZWY7XG4gIHdpbmRvdy5pbnN0YW5jZSA9IGluc3RhbmNlUmVmO1xuICBcbiAgLy8gU2V0IHVwIHRoZSBjdXN0b20gVUlcbiAgY29uc3QgY3VzdG9tVUkgPSB7XG4gICAgW051dHJpZW50Vmlld2VyLlVJRWxlbWVudC5TaWRlYmFyXToge1xuICAgICAgW051dHJpZW50Vmlld2VyLlNpZGViYXJNb2RlLkNVU1RPTV06ICh7IGNvbnRhaW5lck5vZGUgfSkgPT4ge1xuICAgICAgICAvLyBDbGVhciB0aGUgY29udGFpbmVyXG4gICAgICAgIGNvbnRhaW5lck5vZGUuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG1haW5Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBtYWluQ29udGFpbmVyLnN0eWxlLnBhZGRpbmcgPSBcIjIwcHhcIjtcbiAgICAgICAgbWFpbkNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcbiAgICAgICAgbWFpbkNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcbiAgICAgICAgXG4gICAgICAgIC8vIFByaW50IGFjdGl2aXR5IHRpdGxlXG4gICAgICAgIGNvbnN0IHByaW50VGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDRcIik7XG4gICAgICAgIHByaW50VGl0bGUuaW5uZXJUZXh0ID0gXCJQcmludCBBY3Rpdml0eSBMb2dcIjtcbiAgICAgICAgcHJpbnRUaXRsZS5zdHlsZS5tYXJnaW4gPSBcIjAgMCAxNXB4IDBcIjtcbiAgICAgICAgcHJpbnRUaXRsZS5zdHlsZS5jb2xvciA9IFwiI2ZmZlwiO1xuICAgICAgICBcbiAgICAgICAgLy8gSGlzdG9yeSBsaXN0IGNvbnRhaW5lclxuICAgICAgICBjb25zdCBoaXN0b3J5TGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGhpc3RvcnlMaXN0LnN0eWxlLm1heEhlaWdodCA9IFwiNDAwcHhcIjtcbiAgICAgICAgaGlzdG9yeUxpc3Quc3R5bGUub3ZlcmZsb3dZID0gXCJhdXRvXCI7XG4gICAgICAgIFxuICAgICAgICBpZiAocHJpbnRIaXN0b3J5Lmxlbmd0aCA%252BIDApIHtcbiAgICAgICAgICBwcmludEhpc3RvcnkuZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoaXN0b3J5SXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZjhmOWZhXCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5ib3JkZXIgPSBcIjFweCBzb2xpZCAjZGVlMmU2XCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIjRweFwiO1xuICAgICAgICAgICAgaGlzdG9yeUl0ZW0uc3R5bGUucGFkZGluZyA9IFwiMTBweFwiO1xuICAgICAgICAgICAgaGlzdG9yeUl0ZW0uc3R5bGUubWFyZ2luQm90dG9tID0gXCI4cHhcIjtcbiAgICAgICAgICAgIGhpc3RvcnlJdGVtLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5zdHlsZS5jb2xvciA9IFwiIzMzM1wiO1xuICAgICAgICAgICAgY29uc3QgcHJpbnROdW1iZXIgPSBwcmludEhpc3RvcnkubGVuZ3RoIC0gaW5kZXg7XG4gICAgICAgICAgICBoaXN0b3J5SXRlbS5pbm5lckhUTUwgPSBgPHN0cm9uZz5QcmludCAjJHtwcmludE51bWJlcn08L3N0cm9uZz48YnI%252BJHtlbnRyeX1gO1xuICAgICAgICAgICAgaGlzdG9yeUxpc3QuYXBwZW5kQ2hpbGQoaGlzdG9yeUl0ZW0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vSGlzdG9yeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgbm9IaXN0b3J5LmlubmVyVGV4dCA9IFwiTm8gcHJpbnQgYWN0aXZpdHkgeWV0XCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLmNvbG9yID0gXCIjNmM3NTdkXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLmZvbnRTdHlsZSA9IFwiaXRhbGljXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLnRleHRBbGlnbiA9IFwiY2VudGVyXCI7XG4gICAgICAgICAgbm9IaXN0b3J5LnN0eWxlLnBhZGRpbmcgPSBcIjIwcHhcIjtcbiAgICAgICAgICBoaXN0b3J5TGlzdC5hcHBlbmRDaGlsZChub0hpc3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBtYWluQ29udGFpbmVyLmFwcGVuZENoaWxkKHByaW50VGl0bGUpO1xuICAgICAgICBtYWluQ29udGFpbmVyLmFwcGVuZENoaWxkKGhpc3RvcnlMaXN0KTtcbiAgICAgICAgY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChtYWluQ29udGFpbmVyKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7IG5vZGU6IGNvbnRhaW5lck5vZGUgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgXG4gIC8vIFNldCB0aGUgQ3VzdG9tIFVJXG4gIGluc3RhbmNlLnNldEN1c3RvbVVJQ29uZmlndXJhdGlvbihjdXN0b21VSSk7XG4gIFxuICAvLyBUaGUgU2lkZWJhciBDdXN0b20gQnV0dG9uIHdpdGggSWNvblxuICBjb25zdCBjdXN0b20gPSB7XG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICBpZDogXCJQcmludCBBY3Rpdml0eSBMb2dcIixcbiAgICB0aXRsZTogXCJQcmludCBBY3Rpdml0eSBMb2dcIixcbiAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgZHJvcGRvd25Hcm91cDogXCJzaWRlYmFyXCIsXG4gICAgaWNvbjogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwiY3VycmVudENvbG9yXCI%252BXG4gICAgICA8cGF0aCBkPVwiTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNSAxNEg3di0yaDd2MnptMy00SDd2LTJoMTB2MnptMC00SDdWN2gxMHYyelwiLz5cbiAgICA8L3N2Zz5gLFxuICAgIG9uUHJlc3M6IChldmVudCwgaWQpID0%252BIHtcbiAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgICAgICB2aWV3U3RhdGUuc2V0KFwic2lkZWJhck1vZGVcIiwgXCJDVVNUT01cIilcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbiAgXG4gIGNvbnN0IHRvb2xiYXJJdGVtcyA9IE51dHJpZW50Vmlld2VyLmRlZmF1bHRUb29sYmFySXRlbXMucmVkdWNlKFxuICAgIChhY2MsIGl0ZW0pID0%252BXG4gICAgICBcInNpZGViYXItdGh1bWJuYWlsc1wiID09PSBpdGVtLnR5cGVcbiAgICAgICAgPyBhY2MuY29uY2F0KFtpdGVtLCBjdXN0b21dKVxuICAgICAgICA6IGFjYy5jb25jYXQoW2l0ZW1dKSxcbiAgICBbXVxuICApO1xuICBcbiAgLy8gQWRkaW5nIGl0IHRvIHRoZSBzaWRlYmFyc1xuICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoWy4uLnRvb2xiYXJJdGVtc10pO1xuICBcbiAgLy8gU2V0IGluaXRpYWwgdmlldyB0byBjdXN0b20gc2lkZWJhclxuICBpbnN0YW5jZS5zZXRWaWV3U3RhdGUoXG4gICAgaW5zdGFuY2Uudmlld1N0YXRlLnNldChcInNpZGViYXJNb2RlXCIsIFwiQ1VTVE9NXCIpXG4gICk7XG4gIFxuICAvLyBTZXQgdXAgcHJpbnQgZXZlbnQgbGlzdGVuZXJzXG4gIHNldHVwUHJpbnRFdmVudExpc3RlbmVycygpO1xufSk7XG5cbmNvbnNvbGUubG9nKCdTY3JpcHQgbG9hZGVkLiBQcmludCBhY3Rpdml0eSB3aWxsIGJlIHRyYWNrZWQgYXV0b21hdGljYWxseS4nKTsiLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + +- [Hide link annotations tooltip](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6Ii8vY2hlY2sgQ1NTIFRhYiBmb3IgQ1NTIHNlbGVjdG9yXG4vL0hvdyB0byBhZGQgQ3VzdG9tIENTUyB0byBQU1BERktpdDogaHR0cHM6Ly9wc3BkZmtpdC5jb20vZ3VpZGVzL3dlYi9jdXN0b21pemluZy10aGUtaW50ZXJmYWNlL2Nzcy1jdXN0b21pemF0aW9uL1xuLy9QU1BERktpdCBDU1MgQ2xhc3NlczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vYXBpL3dlYi8jOn46dGV4dD1XaWRnZXRBbm5vdGF0aW9uQWRkaXRpb25hbEFjdGlvbnMtLENTUywtQW5ub3RhdGlvbiUyMFRvb2x0aXBcbi8qXG4gIC5QU1BERktpdC1MaW5rLUVkaXRvci1Qb3BvdmVyIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4qL1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgaW5pdGlhbFZpZXdTdGF0ZTogbmV3IFBTUERGS2l0LlZpZXdTdGF0ZSh7IGN1cnJlbnRQYWdlSW5kZXg6IDEgfSksXG59KS50aGVuKGFzeW5jIChpbnN0YW5jZSkgPT4ge1xuICBjb25zdCBsaW5rQW5ub3RhdGlvbiA9IGF3YWl0IGluc3RhbmNlLmdldEFubm90YXRpb25zKDEpO1xuICBpbnN0YW5jZS5zZXRTZWxlY3RlZEFubm90YXRpb25zKGxpbmtBbm5vdGF0aW9uKTtcbiAgY29uc29sZS5sb2coXCJQU1BERktpdCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7IC8vIExvZyBhIG1lc3NhZ2UgdG8gaW5kaWNhdGUgc3VjY2Vzc2Z1bCBsb2FkaW5nXG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4uUFNQREZLaXQtTGluay1FZGl0b3ItUG9wb3ZlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + - Hide the popover element when a link annotation is selected. — [Video](https://www.youtube.com/watch?v=_sCyG5hdG10) + +- [Toggle all Annotation to show/hide with a custom button in toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJsZXQgYW5ub3RhdGlvbnNIaWRkZW4gPSB0cnVlO1xuXG5OdXRyaWVudFZpZXdlci5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBOdXRyaWVudFZpZXdlci5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFsuLi5OdXRyaWVudFZpZXdlci5kZWZhdWx0VG9vbGJhckl0ZW1zXSxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IHRvZ2dsZUFubm90YXRpb25zQnV0dG9uID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwidG9nZ2xlLWFubm90YXRpb25zXCIsXG4gICAgdGl0bGU6IFwiVG9nZ2xlIEFubm90YXRpb25zXCIsXG4gICAgb25QcmVzczogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdFBhZ2VzID0gaW5zdGFuY2UudG90YWxQYWdlQ291bnQ7XG4gICAgICBjb25zb2xlLmxvZyhcIlRvdGFsIFBhZ2VzOiBcIiwgdFBhZ2VzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdFBhZ2VzOyBpKyspIHtcbiAgICAgICAgY29uc3QgYW5ubyA9IGF3YWl0IGluc3RhbmNlLmdldEFubm90YXRpb25zKGkpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIjIgLSBBbm5vdGF0aW9uczogXCIsIGFubm8pO1xuICAgICAgICBjb25zb2xlLmxvZyhcInRvdGFsIGFubm90YXRpb24gaW4gZWFjaCBwYWdlXCIsIGFubm8uc2l6ZSk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uc0hpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFubm8uZm9yRWFjaChhc3luYyAoYW5ubykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlYW5ubyA9IGFubm8uc2V0KFwibm9WaWV3XCIsIHRydWUpO1xuICAgICAgICAgICAgYXdhaXQgaW5zdGFuY2UudXBkYXRlKHVwZGF0ZWFubm8pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFubm8uZm9yRWFjaChhc3luYyAoYW5ubykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlYW5ubyA9IGFubm8uc2V0KFwibm9WaWV3XCIsIGZhbHNlKTtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbmNlLnVwZGF0ZSh1cGRhdGVhbm5vKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYW5ub3RhdGlvbnNIaWRkZW4gPSAhYW5ub3RhdGlvbnNIaWRkZW47XG4gICAgfSxcbiAgfTtcblxuICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoKGl0ZW1zKSA9PiB7XG4gICAgaXRlbXMucHVzaCh0b2dnbGVBbm5vdGF0aW9uc0J1dHRvbik7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9KTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + + + +- [Use custom renderers to display annotation information on hover](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIudG9vbHRpcCB7XG4gIHBvc2l0aW9uOiBpbmhlcml0O1xufVxuLnRvb2x0aXA6OmJlZm9yZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBvcGFjaXR5OiAxO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiA5O1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNzUpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGNvbG9yOiAjZmZmO1xuICBjb250ZW50OiBhdHRyKGRhdGEtYW5ub3RhdGlvbi1pZCk7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogNnB4IDEwcHg7XG4gIHRvcDogMjZweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLyogdGhlIGFuaW1hdGlvbnMgKi9cbi8qIGZhZGUgKi9cbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiZm9ybS5wZGYiLCJqd3QiOnsicGVybWlzc2lvbnMiOlsicmVhZC1kb2N1bWVudCIsIndyaXRlIl0sInVzZXJJZCI6InJhbmRvbWVvTzNmV1JaaWciLCJsYXllciI6InJhbmRvbVRYTVM2SkZuRk4ifX0sImpzIjoiLy8gSW5pdGlhbGl6ZSBQU1BERktpdCBWaWV3ZXIgaW5zdGFuY2VcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIGN1c3RvbVJlbmRlcmVyczoge1xuICAgIC8vIEN1c3RvbSByZW5kZXJlciBmb3IgYW5ub3RhdGlvbnMgdGhhdCBhZGRzIGludGVyYWN0aXZlIHRvb2x0aXBzLCB3aWxsIHNob3cgdGhlIGFubm90YXRpb24gSURcbiAgICBBbm5vdGF0aW9uKHsgYW5ub3RhdGlvbiB9KSB7XG4gICAgICBjb25zdCB0b29sdGlwQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgLy8gU2V0IHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYW5ub3RhdGlvblxuICAgICAgdG9vbHRpcENvbnRhaW5lci5kYXRhc2V0LmFubm90YXRpb25JZCA9IGFubm90YXRpb24uaWQ7XG5cbiAgICAgIC8vIEFwcGx5IHN0eWxlcyBmb3IgdG9vbHRpcCBjb250YWluZXJcbiAgICAgIHRvb2x0aXBDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIFNlZSBDU1MgdGFiIGZvciBtb3JlIHRvb2x0aXAgc3R5bGVzXG5cbiAgICAgIC8vIENyZWF0ZSBpbm5lciB0b29sdGlwIGVsZW1lbnQgd2l0aCBhbm5vdGF0aW9uIElEIGFzIHRpdGxlXG4gICAgICB0b29sdGlwQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGRhdGEtdGl0bGU9XCIke2Fubm90YXRpb24uaWR9XCI%252BPC9kaXY%252BYDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZTogdG9vbHRpcENvbnRhaW5lcixcbiAgICAgICAgYXBwZW5kOiB0cnVlLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gRGlzYWJsZSBhbm5vdGF0aW9uIGVkaXRpbmdcbiAgaW5zdGFuY2Uuc2V0RWRpdGFibGVBbm5vdGF0aW9uVHlwZXMoW10pO1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGFubm90YXRpb24gZWxlbWVudCBieSBJRFxuICBjb25zdCBnZXRBbm5vdGF0aW9uRWxlbWVudCA9IChhbm5vdGF0aW9uSWQpID0%252BIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBgLlBTUERGS2l0LUFubm90YXRpb25bZGF0YS1hbm5vdGF0aW9uLWlkPVwiJHthbm5vdGF0aW9uSWR9XCJdYFxuICAgICk7XG4gIH07XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGhhbmRsZSBhbm5vdGF0aW9uIGludGVyYWN0aW9uc1xuICBjb25zdCBoYW5kbGVBbm5vdGF0aW9uSW50ZXJhY3Rpb24gPSAoZXZlbnQsIGlzSG92ZXJpbmcpID0%252BIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hbm5vdGF0aW9uSWQ7XG5cbiAgICBpZiAoYW5ub3RhdGlvbklkKSB7XG4gICAgICBjb25zdCBhbm5vdGF0aW9uRWxlbWVudCA9IGdldEFubm90YXRpb25FbGVtZW50KGFubm90YXRpb25JZCk7XG5cbiAgICAgIGlmIChpc0hvdmVyaW5nKSB7XG4gICAgICAgIGFubm90YXRpb25FbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0b29sdGlwXCIsIFwiZmFkZVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFubm90YXRpb25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJ0b29sdGlwXCIsIFwiZmFkZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gQWRkIG1vdXNlb3ZlciBldmVudCBsaXN0ZW5lciBmb3Igc2hvd2luZyB0b29sdGlwc1xuICAvLyBodHRwczovL3d3dy5udXRyaWVudC5pby9hcGkvd2ViL1BTUERGS2l0LlRleHRDb21wYXJpc29uSW5zdGFuY2UuaHRtbCNhZGRFdmVudExpc3RlbmVyXG4gIGluc3RhbmNlLmNvbnRlbnREb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIChldmVudCkgPT5cbiAgICBoYW5kbGVBbm5vdGF0aW9uSW50ZXJhY3Rpb24oZXZlbnQsIHRydWUpXG4gICk7XG5cbiAgLy8gQWRkIG1vdXNlb3V0IGV2ZW50IGxpc3RlbmVyIGZvciBoaWRpbmcgdG9vbHRpcHNcbiAgaW5zdGFuY2UuY29udGVudERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCAoZXZlbnQpID0%252BXG4gICAgaGFuZGxlQW5ub3RhdGlvbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSlcbiAgKTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + - Enhance annotations by adding hover-based tooltips while preventing edits. — [Video](https://www.youtube.com/watch?v=drdvz12ntlE) + +- [Create highlight annotations programmatically from search](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJqcyI6Ii8vIExvYWQgUFNQREZLaXQgd2l0aCBkYXJrIHRoZW1lXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxufSkudGhlbihhc3luYyAoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gTGlzdCBvZiB0ZXJtcyB0byBzZWFyY2ggZm9yIGluIHRoZSBkb2N1bWVudFxuICBjb25zdCBuYW1lc0xpc3QgPSBbXCJwcmltYXRlXCIsIFwic2hlbGxmaXNoXCIsIFwibW9ua2V5XCIsIFwibWFjYXF1ZVwiXTtcblxuICAvLyBDcmVhdGVzIGFuIGFycmF5IG9mIHByb21pc2VzIHRoYXQgcmV0dXJuIHRoZSBzZWFyY2hSZXN1bHQgb2YgZWFjaCBzZWFyY2hcbiAgY29uc3QgYW5ub3RhdGlvbnMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuYW1lc0xpc3QubGVuZ3RoIH0pLm1hcCgoZWxlbWVudCwgaW5kZXgpID0%252BXG4gICAgICAgIGluc3RhbmNlLnNlYXJjaChuYW1lc0xpc3RbaW5kZXhdKVxuICAgICAgKVxuICAgICAgLy8gaHR0cHM6Ly93d3cubnV0cmllbnQuaW8vYXBpL3dlYi9QU1BERktpdC5JbnN0YW5jZS5odG1sI3NlYXJjaFxuICAgICAgLy8gaHR0cHM6Ly93d3cubnV0cmllbnQuaW8vYXBpL3dlYi9QU1BERktpdC5TZWFyY2hSZXN1bHQuaHRtbFxuICAgIClcbiAgKS5mbGF0TWFwKChzZWFyY2hSZXN1bHRzKSA9PlxuICAgIHNlYXJjaFJlc3VsdHMucmVkdWNlKChhY2MsIHNlYXJjaFJlc3VsdCkgPT4ge1xuICAgICAgLy8gRXh0cmFjdCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGZvdW5kIHRleHRcbiAgICAgIGNvbnN0IHsgcmVjdHNPblBhZ2UsIHBhZ2VJbmRleCB9ID0gc2VhcmNoUmVzdWx0O1xuXG4gICAgICAvLyBDcmVhdGUgYm91bmRpbmcgYm94IGZvciB0aGUgaGlnaGxpZ2h0XG4gICAgICBjb25zdCBiYm94ID0gbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3QocmVjdHNPblBhZ2VbMF0pO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgaGlnaGxpZ2h0IGFubm90YXRpb25cbiAgICAgIHJldHVybiBhY2MuY29uY2F0KFxuICAgICAgICBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuSGlnaGxpZ2h0QW5ub3RhdGlvbih7XG4gICAgICAgICAgaWQ6IFBTUERGS2l0LmdlbmVyYXRlSW5zdGFudElkKCksXG4gICAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgICAgYm91bmRpbmdCb3g6IGJib3gsXG4gICAgICAgICAgcmVjdHM6IHJlY3RzT25QYWdlLFxuICAgICAgICAgIGNvbG9yOiBQU1BERktpdC5Db2xvci5ZRUxMT1csXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sIFtdKVxuICApO1xuXG4gIC8vIEFwcGx5IGFsbCBoaWdobGlnaHQgYW5ub3RhdGlvbnMgdG8gdGhlIGRvY3VtZW50XG4gIGF3YWl0IGluc3RhbmNlLmNyZWF0ZShhbm5vdGF0aW9ucyk7XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) + - Search for specific text values in a document, create highlight annotations for the found text, and apply those annotations to the document. — [Video](https://www.youtube.com/watch?v=tzRcFwRbaE4) + +- [Use custom actions with the embedded PDF widget button](https://nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImxldCBnbG9iYWxJbnN0YW5jZTtcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuXG4gIC8vIENyZWF0ZSBhIG5ldyBidXR0b24gZm9ybSBmaWVsZC5cbiAgY29uc3Qgd2lkZ2V0ID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLldpZGdldEFubm90YXRpb24oe1xuICAgIGlkOiBQU1BERktpdC5nZW5lcmF0ZUluc3RhbnRJZCgpLFxuICAgIHBhZ2VJbmRleDogMCxcbiAgICBmb3JtRmllbGROYW1lOiBcIk15Rm9ybUZpZWxkXCIsXG4gICAgYm91bmRpbmdCb3g6IG5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHtcbiAgICAgIGxlZnQ6IDEwMCxcbiAgICAgIHRvcDogNzUsXG4gICAgICB3aWR0aDogMTUwLFxuICAgICAgaGVpZ2h0OiA0MCxcbiAgICB9KSxcbiAgICAvL2FkZGluZyB0aGUgY3VzdG9tIGRhdGEgdG8gY2hlY2sgbGF0ZXIgdGhhdCBpdCBpcyBhIGJ1dHRvblxuICAgIGN1c3RvbURhdGE6IHtcbiAgICAgIGlzQnV0dG9uOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vQnV0dG9uIEZvcm0gRmllbGRcbiAgY29uc3QgZm9ybUZpZWxkID0gbmV3IFBTUERGS2l0LkZvcm1GaWVsZHMuQnV0dG9uRm9ybUZpZWxkKHtcbiAgICBuYW1lOiBcIk15Rm9ybUZpZWxkXCIsXG4gICAgYW5ub3RhdGlvbklkczogbmV3IFBTUERGS2l0LkltbXV0YWJsZS5MaXN0KFt3aWRnZXQuaWRdKSxcbiAgICB2YWx1ZTogXCJUZXh0IHNob3duIGluIHRoZSBmb3JtIGZpZWxkXCIsXG4gICAgbGFiZWw6IFwiTXkgQnV0dG9uXCIsXG4gIH0pO1xuXG4gIC8vQ3JlYXRpbmcgdGhlIGJ1dHRvblxuICBpbnN0YW5jZS5jcmVhdGUoW3dpZGdldCwgZm9ybUZpZWxkXSk7XG5cbiAgLy9FdmVudCBsaXN0ZW5lciB0byBkZXRlY3QgdGhlIGFubm90YXRpb24gY2xpY2sgYW5kIGltcG9ydCBmaWxlIGlucHV0XG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbm5vdGF0aW9ucy5wcmVzc1wiLCAoZXZlbnQpID0%252BIHtcbiAgICBjb25zdCB7IGFubm90YXRpb24gfSA9IGV2ZW50XG4gICAgaWYgKGFubm90YXRpb24uY3VzdG9tRGF0YT8uaXNCdXR0b24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIilcbiAgICAgICAgaW5wdXQudHlwZSA9IFwiZmlsZVwiXG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQuZmlsZXNbMF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHR5cGUgfSA9IGV2ZW50LnRhcmdldC5maWxlc1swXVxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmNyZWF0ZUF0dGFjaG1lbnQobmV3IEJsb2IoW2V2ZW50LnRhcmdldC5maWxlc1swXV0sIHsgdHlwZSB9KSkudGhlbihpbWFnZUF0dGFjaG1lbnRJZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlQW5ub3RhdGlvbiA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5JbWFnZUFubm90YXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4OiBhbm5vdGF0aW9uLnBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kaW5nQm94OiBhbm5vdGF0aW9uLmJvdW5kaW5nQm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY3JlYXRlKGltYWdlQW5ub3RhdGlvbilcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pXG4gICAgICAgIGlucHV0LmNsaWNrKClcbiAgICB9XG59KVxufSk7XG4iLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tQ21zYzBOZXozQSIsImxheWVyIjoicmFuZG9tN244UDg0Q3pyUiJ9fSwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) + - Create a button form field, add an event listener to handle button clicks that trigger a file input for uploading images, and attach the selected image as an annotation in the document. — [Video](https://www.youtube.com/watch?v=ghmh4sjwUic) + +- [Prevent showing note annotation content on hover](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLfSkudGhlbigoaW5zdGFuY2U9PntpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywoZXZlbnQ9Pntjb25zdHt0YXJnZXQ6dGFyZ2V0fT1ldmVudCxub3RlSWNvbj10YXJnZXQ%252FLmNsb3Nlc3QoJy5QU1BERktpdC1Ob3RlLUFubm90YXRpb24tSWNvbi1Db21tZW50Jyk7bm90ZUljb24mJihpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignLlBTUERGS2l0LVBvcG92ZXItTm90ZS1Bbm5vdGF0aW9uJykuc3R5bGUuZGlzcGxheT0nbm9uZScpfSkse2NhcHR1cmU6ITB9KX0pKTsiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + - Add an event listener to hide the note annotation popover when the mouse is over the note icon. — [Video](https://www.youtube.com/watch?v=wspjZ_mjLBw) + +- [Link comments with annotations](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/comment-annotations) + - When an annotation is selected, a tooltip appears, allowing users to create a linked comment marker annotation. — [Video](https://www.youtube.com/watch?v=Gevho94VSmk) + +- [Create annotations from the clipboard](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/create-annotation-from-clipboard) + - Enable pasting content from the clipboard onto a PDF as a text or image annotation. — [Video](https://www.youtube.com/watch?v=1N3U0voT4Tc) + +- [Navigate annotations with a custom toolbar button](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/get-all-annotations-boundingBox) + - Get all annotation coordinates and seamlessly navigate with a custom “Next Annotation” button that highlights and jumps to each annotation. — [Video](https://www.youtube.com/watch?v=BprV9kSGBlU) + +- [Snip and save annotations as JPEG images](https://github.com/PSPDFKit/awesome-nutrient/tree/master/web/annotation/snipping-annotation) + - Snip the area covered by an annotation and save it as a JPEG image. — [Video](https://www.youtube.com/watch?v=QLSBa6X4tmU) + +- [Add a timestamp as a subtitle to a custom stamp](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJjb25zdCB7XG4gIGNyZWF0ZUJsb2NrOiBjcmVhdGVCbG9jayxcbiAgSW50ZXJmYWNlczogSW50ZXJmYWNlcyxcbiAgUmVjaXBlczogUmVjaXBlcyxcbiAgQ29yZTogQ29yZSxcbn0gPSBQU1BERktpdC5VSTtcbnZhciBzdGFtcEFubm90YXRpb25UZW1wbGF0ZXMgPSBQU1BERktpdC5kZWZhdWx0U3RhbXBBbm5vdGF0aW9uVGVtcGxhdGVzO1xuc3RhbXBBbm5vdGF0aW9uVGVtcGxhdGVzLnB1c2goXG4gIG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5TdGFtcEFubm90YXRpb24oe1xuICAgIHN0YW1wVHlwZTogXCJDdXN0b21cIixcbiAgICB0aXRsZTogXCJNeSBjdXN0b20gdGV4dFwiLFxuICAgIGNvbG9yOiBuZXcgUFNQREZLaXQuQ29sb3IoeyByOiAwLCBnOiAwLCBiOiA2NCB9KSxcbiAgICBzdWJ0aXRsZTogYE5hbWUgJHtuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygpfSAke25ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YCxcbiAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAzMDAsXG4gICAgICBoZWlnaHQ6IDEwMCxcbiAgICB9KSxcbiAgfSlcbiksXG4gIFBTUERGS2l0LmxvYWQoe1xuICAgIC4uLmJhc2VPcHRpb25zLFxuICAgIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICAgIHN0YW1wQW5ub3RhdGlvblRlbXBsYXRlczogc3RhbXBBbm5vdGF0aW9uVGVtcGxhdGVzLFxuICAgIHVpOiB7XG4gICAgICBbSW50ZXJmYWNlcy5TdGFtcHNMaXN0XTogKHsgaW5zdGFuY2U6IGluc3RhbmNlIH0pID0%252BIChcbiAgICAgICAgLy8gRXZlcnkgdGltZSBTdGFtcHMgTGlzdCBvcGVucywgd2Ugd2FudCB0byBzZXQgY29ycmVjdCBkYXRlIHRvIGN1c3RvbSBzdGFtcHNcbiAgICAgICAgaW5zdGFuY2Uuc2V0U3RhbXBBbm5vdGF0aW9uVGVtcGxhdGVzKCh0ZW1wbGF0ZXMpID0%252BXG4gICAgICAgICAgdGVtcGxhdGVzLm1hcCgodGVtcGxhdGUpID0%252BXG4gICAgICAgICAgICBcIkN1c3RvbVwiID09PSB0ZW1wbGF0ZS5zdGFtcFR5cGVcbiAgICAgICAgICAgICAgPyB0ZW1wbGF0ZS5zZXQoXCJzdWJ0aXRsZVwiLCBuZXcgRGF0ZShEYXRlLm5vdygpKS50b0xvY2FsZVN0cmluZygpKVxuICAgICAgICAgICAgICA6IHRlbXBsYXRlXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB7fVxuICAgICAgKSxcbiAgICB9LFxuICB9KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiUFNQREZLaXQgbG9hZGVkISBieSBOYXJhc2hpbWFuXCIpO1xuICB9KTtcbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIn0sIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + - Add a custom stamp annotation template with dynamic subtitle text (including the current date and time), and set up the UI to update the subtitle each time the stamps list is opened. — [Video](https://www.youtube.com/watch?v=TseqHd_MWcI) + +- [Add PDF file as custom stamp](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6IlBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCEgYnkgTmFyYXNoaW1hblwiKTtcblxuICBhc3luYyBmdW5jdGlvbiBvcGVuRmlsZURpYWxvZygpIHtcbiAgICBjb25zb2xlLmxvZyhcIk9wZW5pbmcgZmlsZSBkaWFsb2dcIik7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiZmlsZVwiO1xuICAgIGlucHV0LmFjY2VwdCA9IFwiLnBkZlwiOyAvLyBSZXN0cmljdCBmaWxlIHNlbGVjdGlvbiB0byBQREZzXG4gICAgaW5wdXQudmFsdWUgPSBcIlwiOyAvLyBDbGVhciB2YWx1ZSB0byBlbnN1cmUgb25jaGFuZ2UgdHJpZ2dlcnNcblxuICAgIGlucHV0Lm9uY2hhbmdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBmID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuXG4gICAgICBpZiAoIWYpIHJldHVybjtcblxuICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGFzeW5jIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vcGRmXCIgfSk7XG5cbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGF3YWl0IGluc3RhbmNlLmNyZWF0ZUF0dGFjaG1lbnQoYmxvYik7XG4gICAgICAgIGNvbnN0IHN0YW1wQW5ub3RhdGlvbiA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5JbWFnZUFubm90YXRpb24oe1xuICAgICAgICAgIHBhZ2VJbmRleDogMCxcbiAgICAgICAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9wZGZcIixcbiAgICAgICAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgICAgICAgbGVmdDogMTAwLFxuICAgICAgICAgICAgdG9wOiAxMDAsXG4gICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDAsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaW1hZ2VBdHRhY2htZW50SWQ6IGF0dGFjaG1lbnQsXG4gICAgICAgIH0pO1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGUoc3RhbXBBbm5vdGF0aW9uKTtcbiAgICAgIH07XG5cbiAgICAgIGZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZik7XG4gICAgfTtcblxuICAgIGlucHV0LmNsaWNrKCk7XG4gIH1cblxuICBjb25zdCBjdXN0b21GaWxlU3RhbXBJdGVtID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwiZmlsZS1zdGFtcC1idXR0b25cIixcbiAgICB0aXRsZTogXCJGaWxlIFN0YW1wXCIsXG4gICAgb25QcmVzczogKCkgPT4ge1xuICAgICAgb3BlbkZpbGVEaWFsb2coKTtcbiAgICB9LFxuICB9O1xuXG4gIGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcyhbY3VzdG9tRmlsZVN0YW1wSXRlbV0pO1xufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + +- [Add and count a checkmark annotation in the toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmljb25fdGV4dCB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJeU5DSWdhR1ZwWjJoMFBTSXlOQ0lnZG1sbGQwSnZlRDBpTUNBd0lESTBJREkwSWo0OGNHRjBhQ0JrUFNKTk1DQXhNUzQxTWpKc01TNDFOemd0TVM0Mk1qWWdOeTQzTXpRZ05DNDJNVGtnTVRNdU16TTFMVEV5TGpVeU5pQXhMak0xTXlBeExqTTFOQzB4TkNBeE9DNDJORFo2SWk4K1BDOXpkbWMrXCIpXG4gICAgbm8tcmVwZWF0IGNlbnRlcjtcbn1cbiIsImpzIjoiLy8gRGVjbGFyZSB0aGUgaW5zdGFuY2UgdmFyaWFibGUgZm9yIFBTUERGS2l0XG5sZXQgaW5zdGFuY2U7XG5cbi8vIFRyYWNrIHdoZXRoZXIgc3RhbXAgY3JlYXRpb24gbW9kZSBpcyBlbmFibGVkXG5sZXQgaXNTdGFtcENyZWF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuXG4vLyBGdW5jdGlvbiB0byBhZGQgYSBzdGFtcCBhbm5vdGF0aW9uIG9uIHRoZSBzZWxlY3RlZCBwYWdlXG5mdW5jdGlvbiBhZGRTdGFtcChldmVudCkge1xuICBjb25zdCBzdGFtcCA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5TdGFtcEFubm90YXRpb24oe1xuICAgIHBhZ2VJbmRleDogZXZlbnQucGFnZUluZGV4LFxuICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICBsZWZ0OiBldmVudC5wb2ludC54LFxuICAgICAgdG9wOiBldmVudC5wb2ludC55LFxuICAgICAgd2lkdGg6IDI1LFxuICAgICAgaGVpZ2h0OiAyNSxcbiAgICB9KSxcbiAgICBzdGFtcFR5cGU6IFwiQWNjZXB0ZWRcIixcbiAgfSk7XG4gIGluc3RhbmNlLmNyZWF0ZShzdGFtcCk7XG59XG5cbi8vIEN1c3RvbSB0b29sYmFyIGl0ZW0gZm9yIGFkZGluZyBzdGFtcHNcbmNvbnN0IGNvdW50ZXJJdGVtID0ge1xuICB0eXBlOiBcImN1c3RvbVwiLFxuICBpZDogXCJDb3VudGVyXCIsXG4gIC8vcmVzcG9uc2l2ZUdyb3VwOiBcImFubm90YXRlXCIsXG4gIGNsYXNzTmFtZTogXCJpY29uX3RleHRcIixcbiAgc2VsZWN0ZWQ6IGlzU3RhbXBDcmVhdGlvbkVuYWJsZWQsXG4gIG9uUHJlc3MoKSB7XG4gICAgLy8gVG9nZ2xlIGJldHdlZW4gZW5hYmxpbmcgYW5kIGRpc2FibGluZyBzdGFtcCBjcmVhdGlvbiBtb2RlXG4gICAgaWYgKGlzU3RhbXBDcmVhdGlvbkVuYWJsZWQpIHtcbiAgICAgIGluc3RhbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYWdlLnByZXNzXCIsIGFkZFN0YW1wKTtcbiAgICAgIGlzU3RhbXBDcmVhdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2UucHJlc3NcIiwgYWRkU3RhbXApO1xuICAgICAgaXNTdGFtcENyZWF0aW9uRW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRvb2xiYXIgaXRlbSB0byByZWZsZWN0IGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlXG4gICAgaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcykgPT5cbiAgICAgIGl0ZW1zLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgaXRlbS5pZCA9PT0gXCJDb3VudGVyXCJcbiAgICAgICAgICA%252FIHsgLi4uaXRlbSwgc2VsZWN0ZWQ6IGlzU3RhbXBDcmVhdGlvbkVuYWJsZWQgfVxuICAgICAgICAgIDogaXRlbVxuICAgICAgKVxuICAgICk7XG4gIH0sXG4gIC8vdGl0bGU6IFwiQ291bnRlclwiLFxufTtcblxuLy8gTG9hZCBQU1BERktpdCBhbmQgaW5pdGlhbGl6ZSB0b29sYmFyIGl0ZW1zIGluY2x1ZGluZyB0aGUgY3VzdG9tIHN0YW1wIHRvb2xcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdG9vbGJhckl0ZW1zOiBQU1BERktpdC5kZWZhdWx0VG9vbGJhckl0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJleHBvcnQtcGRmXCIpIHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KFtpdGVtLCBjb3VudGVySXRlbV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChbaXRlbV0pO1xuICAgIH1cbiAgfSwgW10pLFxufSkudGhlbihhc3luYyAoX2luc3RhbmNlKSA9PiB7XG4gIGluc3RhbmNlID0gX2luc3RhbmNlO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIHRvIGxvZyB0aGUgbnVtYmVyIG9mIGNvdW50ZXIgc3RhbXAgYW5ub3RhdGlvbnMgd2hlbmV2ZXIgYSBuZXcgYW5ub3RhdGlvbiBpcyBjcmVhdGVkXG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbm5vdGF0aW9ucy5jcmVhdGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiY291bnRlcjogXCIgKyAoYXdhaXQgZ2V0Q291bnRlckFubm90YXRpb25zKCkpKTtcbiAgfSk7XG5cbiAgLy8gRnVuY3Rpb24gdG8gY291bnQgYWxsIFwiQWNjZXB0ZWRcIiBzdGFtcCBhbm5vdGF0aW9ucyBhY3Jvc3MgYWxsIHBhZ2VzXG4gIGFzeW5jIGZ1bmN0aW9uIGdldENvdW50ZXJBbm5vdGF0aW9ucygpIHtcbiAgICBsZXQgYW5ub3RhdGlvbk9iamVjdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGluc3RhbmNlLnRvdGFsUGFnZUNvdW50IH0pLm1hcCgoXywgcGFnZUluZGV4KSA9PlxuICAgICAgICBpbnN0YW5jZS5nZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgpXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIEZpbHRlciBhbmQgY291bnQgb25seSBzdGFtcCBhbm5vdGF0aW9ucyBvZiB0eXBlIFwiQWNjZXB0ZWRcIlxuICAgIGFubm90YXRpb25PYmplY3RzID0gYW5ub3RhdGlvbk9iamVjdHMuZmxhdE1hcCgoYW5ub3RzKSA9PlxuICAgICAgYW5ub3RzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGFubm90KSA9PlxuICAgICAgICAgICAgYW5ub3QgaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5TdGFtcEFubm90YXRpb24gJiZcbiAgICAgICAgICAgIGFubm90LnN0YW1wVHlwZSA9PT0gXCJBY2NlcHRlZFwiXG4gICAgICAgIClcbiAgICAgICAgLnRvQXJyYXkoKVxuICAgICk7XG5cbiAgICByZXR1cm4gYW5ub3RhdGlvbk9iamVjdHMubGVuZ3RoO1xuICB9XG4gICAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIn0sIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + - Use a custom toolbar button for toggling stamp creation mode, allowing users to add "Accepted" stamp annotations on page press and track the total count of such annotations across a document. — [Video](https://www.youtube.com/watch?v=kaEmxWfG2bA) + +- [Strike through text using a line annotation and automatically add a text annotation above](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmljb25fdGV4dCB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjJhV1YzUW05NFBTSXdJREFnTkRnZ05EZ2lJR1JoZEdFdGJtRnRaVDBpVEdGNVpYSWdNU0lnYVdROUlreGhlV1Z5WHpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ1ptbHNiRDBpSXpBd01EQXdNQ0krUEdjZ2FXUTlJbE5XUjFKbGNHOWZZbWREWVhKeWFXVnlJaUJ6ZEhKdmEyVXRkMmxrZEdnOUlqQWlQand2Wno0OFp5QnBaRDBpVTFaSFVtVndiMTkwY21GalpYSkRZWEp5YVdWeUlpQnpkSEp2YTJVdGJHbHVaV05oY0QwaWNtOTFibVFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlQand2Wno0OFp5QnBaRDBpVTFaSFVtVndiMTlwWTI5dVEyRnljbWxsY2lJK0lEeGtaV1p6UGlBOGMzUjViR1UrSUM1amJITXRNU3dnTG1Oc2N5MHlJSHNnWm1sc2JEb2dibTl1WlRzZ2MzUnliMnRsT2lBak16VXpOVE0xT3lCemRISnZhMlV0YkdsdVpXTmhjRG9nY205MWJtUTdJSE4wY205clpTMTNhV1IwYURvZ01uQjRPeUI5SUM1amJITXRNU0I3SUhOMGNtOXJaUzFzYVc1bGFtOXBiam9nY205MWJtUTdJSDBnTG1Oc2N5MHlJSHNnYzNSeWIydGxMVzFwZEdWeWJHbHRhWFE2SURFd095QjlJRHd2YzNSNWJHVStJRHd2WkdWbWN6NGdQSFJwZEd4bFBqd3ZkR2wwYkdVK0lEeG5QaUE4Y0c5c2VXeHBibVVnWTJ4aGMzTTlJbU5zY3kweElpQndiMmx1ZEhNOUlqRWdNVEl1TXpFMElERXhJREl5TGpNeE5DQXlPUzR6T0RVZ01qa3VNemcxSURJeUxqTXhOQ0F4TVNBeE1pNHpNVFFnTVNJK1BDOXdiMng1YkdsdVpUNGdQSEJ2Ykhsc2FXNWxJR05zWVhOelBTSmpiSE10TWlJZ2NHOXBiblJ6UFNJeE1TQXlNaTR6TVRRZ01URXVOekEzSURFM0xqTTJOQ0F4Tmk0Mk5UY2dNVFl1TmpVM0lERTNMak0yTkNBeE1TNDNNRGNnTWpJdU16RTBJREV4SWo0OEwzQnZiSGxzYVc1bFBpQThiR2x1WlNCamJHRnpjejBpWTJ4ekxUSWlJSGd4UFNJeU1TNDJNRFkwTlNJZ2VESTlJakkxTGpnME9URWlJSGt4UFNJeU5TNDRORGt3TVNJZ2VUSTlJakl4TGpZd05qTTNJajQ4TDJ4cGJtVStJRHd2Wno0Z1BHeHBibVVnWTJ4aGMzTTlJbU5zY3kweUlpQjRNVDBpTkRZdU9EazVNellpSUhneVBTSXlOeTR4TURBek9DSWdlVEU5SWpNMkxqazVPVGcySWlCNU1qMGlNell1T1RrNU9EWWlQand2YkdsdVpUNGdQQzluUGp3dmMzWm5QZz09XCIpXG4gICAgbm8tcmVwZWF0IGNlbnRlcjtcbn1cbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIn0sImpzIjoiUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuTElHSFQsXG4gICAgZW5hYmxlUmljaFRleHQ6ICgpID0%252BIHRydWUsXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCEgLSBieSBOYXJhc2hpbWFuXCIpO1xuXG4gIC8vIERlZmluZSBhIGN1c3RvbSB0b29sYmFyIGJ1dHRvbiB0byBjcmVhdGUgYSBjdXN0b20tc3R5bGVkIGxpbmUgYW5ub3RhdGlvblxuICBjb25zdCBjdXN0b21Ub29sYmFySXRlbTEgPSBbXG4gICAge1xuICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgIGlkOiBcImZpbGxSZWN0QW5ub3RhdGlvblwiLFxuICAgICAgZHJvcGRvd25Hcm91cDogXCJmaWxsUmVjdEFubm90YXRpb25cIixcbiAgICAgIGNsYXNzTmFtZTogXCJpY29uX3RleHRcIixcbiAgICAgIG9uUHJlc3M6IGFzeW5jICgpID0%252BIHtcbiAgICAgICAgLy8gU2V0IGN1c3RvbSBhbm5vdGF0aW9uIHByZXNldCBiYXNlZCBvbiB0aGUgZGVmYXVsdCBsaW5lIHByZXNldFxuICAgICAgICBpbnN0YW5jZS5zZXRBbm5vdGF0aW9uUHJlc2V0cygocHJlc2V0cykgPT4gKHtcbiAgICAgICAgICAuLi5wcmVzZXRzLFxuICAgICAgICAgIGN1c3RvbUxpbmU6IHtcbiAgICAgICAgICAgIC4uLnByZXNldHMubGluZSwgLy8gQmFzZSBvbiBkZWZhdWx0IGxpbmUgcHJlc2V0XG4gICAgICAgICAgICBmaWxsQ29sb3I6IFBTUERGS2l0LkNvbG9yLkJMQUNLLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDAuNSxcbiAgICAgICAgICAgIHN0cm9rZUNvbG9yOiBQU1BERktpdC5Db2xvci5SRUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIC8vIEFwcGx5IHRoZSBjdXN0b20gcHJlc2V0XG4gICAgICAgIGluc3RhbmNlLnNldEN1cnJlbnRBbm5vdGF0aW9uUHJlc2V0KFwiY3VzdG9tTGluZVwiKTtcblxuICAgICAgICAvLyBTZXQgdGhlIGludGVyYWN0aW9uIG1vZGUgdG8gYWxsb3cgZHJhd2luZyBsaW5lIGFubm90YXRpb25zXG4gICAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgICAgICAgIHZpZXdTdGF0ZS5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLlNIQVBFX0xJTkUpXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0sXG4gIF07XG5cbiAgLy8gQWRkIHRoZSBjdXN0b20gdG9vbGJhciBidXR0b24gdG8gdGhlIGV4aXN0aW5nIHRvb2xiYXJcbiAgaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcykgPT4gaXRlbXMuY29uY2F0KGN1c3RvbVRvb2xiYXJJdGVtMSkpO1xuXG4gIC8vIExpc3RlbiBmb3IgY3JlYXRpb24gb2YgYW5ub3RhdGlvbnNcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcImFubm90YXRpb25zLmNyZWF0ZVwiLCBhc3luYyAoYW5ub3RhdGlvbnMpID0%252BIHtcbiAgICBmb3IgKGxldCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7XG4gICAgICAvLyBJZiB0aGUgY3JlYXRlZCBhbm5vdGF0aW9uIGlzIGEgTGluZUFubm90YXRpb25cbiAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuTGluZUFubm90YXRpb24pIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJMaW5lIGNyZWF0ZWQhXCIsIGFubm90YXRpb24pO1xuXG4gICAgICAgIGNvbnN0IGJveCA9IGFubm90YXRpb24uYm91bmRpbmdCb3g7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQm94OiBcIiwgYm94KTtcblxuICAgICAgICAvLyBEZWZpbmUgZGltZW5zaW9ucyBhbmQgcG9zaXRpb24gZm9yIHRoZSB0ZXh0IGFubm90YXRpb25cbiAgICAgICAgY29uc3QgdGV4dFdpZHRoID0gMjA7XG4gICAgICAgIGNvbnN0IHRleHRIZWlnaHQgPSAxNTtcbiAgICAgICAgY29uc3QgcGFkZGluZ0Fib3ZlID0gMTA7XG4gICAgICAgIGNvbnN0IHRlblBlcmNlbnQgPSBib3gud2lkdGggKiAwLjM7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBib3gucmlnaHQgLSB0ZW5QZXJjZW50O1xuICAgICAgICBjb25zdCB0b3AgPSBib3gudG9wIC0gdGV4dEhlaWdodCAtIHBhZGRpbmdBYm92ZTtcblxuICAgICAgICAvLyBDcmVhdGUgYSB0ZXh0IGFubm90YXRpb24ganVzdCBhYm92ZSB0aGUgbGluZVxuICAgICAgICBjb25zdCB0ZXh0QW5ub3RhdGlvbiA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5UZXh0QW5ub3RhdGlvbih7XG4gICAgICAgICAgcGFnZUluZGV4OiBhbm5vdGF0aW9uLnBhZ2VJbmRleCxcbiAgICAgICAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgIHdpZHRoOiB0ZXh0V2lkdGggKyAxMjAsIC8vIEFkanVzdGVkIHdpZHRoXG4gICAgICAgICAgICBoZWlnaHQ6IHRleHRIZWlnaHQsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZm9udDogXCJWZXJkYW5hXCIsXG4gICAgICAgICAgZm9udFNpemU6IDgsXG4gICAgICAgICAgZm9udENvbG9yOiBQU1BERktpdC5Db2xvci5SRUQsXG4gICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246IFwiY2VudGVyXCIsXG4gICAgICAgICAgdGV4dDoge1xuICAgICAgICAgICAgZm9ybWF0OiBcInBsYWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogXCJEb3VibGUgQ2xpY2sgaGVyZSB0byBjb21tZW50XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBJbnRlcmFjdGlvbk1vZGU6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgYW5ub3RhdGlvbiBpbiB0aGUgZG9jdW1lbnRcbiAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBpbnN0YW5jZS5jcmVhdGUodGV4dEFubm90YXRpb24pO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlRleHQgYW5ub3RhdGlvbiBwbGFjZWQgYWJvdmUgdGhlIGxpbmUuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59KTtcbiJ9) + +- [Cut, copy, and paste an annotation between pages](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBlbmFibGVDbGlwYm9hcmRBY3Rpb25zOiB0cnVlLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIC0gYnkgTmFyYXNoaW1hblwiKTtcblxuICAvLyBDbGlwYm9hcmQgYWN0aW9uc1xuICBjb25zdCBjb3B5ID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgdGl0bGU6IFwiQ29weVwiLFxuICAgIG9uUHJlc3M6IGFzeW5jICgpID0%252BIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gLyhNYWMpL2kudGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pXG4gICAgICAgID8gbmV3IEtleWJvYXJkRXZlbnQoXCJrZXlkb3duXCIsIHsga2V5OiBcImNcIiwgbWV0YUtleTogdHJ1ZSB9KVxuICAgICAgICA6IG5ldyBLZXlib2FyZEV2ZW50KFwia2V5ZG93blwiLCB7IGtleTogXCJjXCIsIGN0cmxLZXk6IHRydWUgfSk7XG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IHBhc3RlID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgdGl0bGU6IFwiUGFzdGVcIixcbiAgICBvblByZXNzOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IC8oTWFjKS9pLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxuICAgICAgICA%252FIG5ldyBLZXlib2FyZEV2ZW50KFwia2V5ZG93blwiLCB7IGtleTogXCJ2XCIsIG1ldGFLZXk6IHRydWUgfSlcbiAgICAgICAgOiBuZXcgS2V5Ym9hcmRFdmVudChcImtleWRvd25cIiwgeyBrZXk6IFwidlwiLCBjdHJsS2V5OiB0cnVlIH0pO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBjdXQgPSB7XG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICB0aXRsZTogXCJDdXRcIixcbiAgICBvblByZXNzOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IC8oTWFjKS9pLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxuICAgICAgICA%252FIG5ldyBLZXlib2FyZEV2ZW50KFwia2V5ZG93blwiLCB7IGtleTogXCJ4XCIsIG1ldGFLZXk6IHRydWUgfSlcbiAgICAgICAgOiBuZXcgS2V5Ym9hcmRFdmVudChcImtleWRvd25cIiwgeyBrZXk6IFwieFwiLCBjdHJsS2V5OiB0cnVlIH0pO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfSxcbiAgfTtcblxuICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoKGl0ZW1zKSA9PiB7XG4gICAgaXRlbXMucHVzaChjdXQpO1xuICAgIGl0ZW1zLnB1c2gocGFzdGUpO1xuICAgIGl0ZW1zLnB1c2goY29weSk7XG4gICAgaXRlbXMucHVzaCh7IHR5cGU6IFwiY29tbWVudFwiIH0pO1xuICAgIHJldHVybiBpdGVtcztcbiAgfSk7XG5cbiAgbGV0IGlzUHJvY2Vzc2luZ1Bhc3RlID0gZmFsc2U7ICAvLyBEZWNsYXJlZCBvdXRzaWRlIHRvIHBlcnNpc3QgYWNyb3NzIGV2ZW50c1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCBhc3luYyAoZXZlbnQpID0%252BIHtcbiAgICBpZiAoaXNQcm9jZXNzaW5nUGFzdGUpIHJldHVybjtcblxuICAgIGlzUHJvY2Vzc2luZ1Bhc3RlID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpdGVtcyA9IChldmVudC5jbGlwYm9hcmREYXRhIHx8IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YSkuaXRlbXM7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXNbMF07ICAvLyBPbmx5IHByb2Nlc3NpbmcgdGhlIGxhc3QgY2xpcGJvYXJkIGl0ZW1cblxuICAgICAgY29uc3QgY29udGVudF9UeXBlID0gaXRlbS50eXBlO1xuICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSBpbnN0YW5jZS52aWV3U3RhdGUuY3VycmVudFBhZ2VJbmRleDtcblxuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gXCJmaWxlXCIgJiYgaXRlbS50eXBlLnN0YXJ0c1dpdGgoXCJpbWFnZVwiKSkge1xuICAgICAgICBjb25zdCBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICAgICAgY29uc3QgaW1hZ2VBdHRhY2htZW50SWQgPSBhd2FpdCBpbnN0YW5jZS5jcmVhdGVBdHRhY2htZW50KGZpbGUpO1xuICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLkltYWdlQW5ub3RhdGlvbih7XG4gICAgICAgICAgcGFnZUluZGV4OiBjdXJyZW50UGFnZSxcbiAgICAgICAgICBjb250ZW50VHlwZTogY29udGVudF9UeXBlLFxuICAgICAgICAgIGltYWdlQXR0YWNobWVudElkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBhc3RlZCBJbWFnZSBBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgYm91bmRpbmdCb3g6IG5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHtcbiAgICAgICAgICAgIGxlZnQ6IDEwLFxuICAgICAgICAgICAgdG9wOiA1MCxcbiAgICAgICAgICAgIHdpZHRoOiAxNTAsXG4gICAgICAgICAgICBoZWlnaHQ6IDE1MCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IGluc3RhbmNlLmNyZWF0ZShhbm5vdGF0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5raW5kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGl0ZW0uZ2V0QXNTdHJpbmcoYXN5bmMgKHBhc3RlZFRleHQpID0%252BIHtcbiAgICAgICAgICBjb25zdCB0ZXh0QW5ub3RhdGlvbiA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5UZXh0QW5ub3RhdGlvbih7XG4gICAgICAgICAgICBwYWdlSW5kZXg6IGN1cnJlbnRQYWdlLFxuICAgICAgICAgICAgZm9udFNpemU6IDEwLFxuICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IFBTUERGS2l0LkNvbG9yLkdSRUVOLFxuICAgICAgICAgICAgZm9udENvbG9yOiBQU1BERktpdC5Db2xvci5CTFVFLFxuICAgICAgICAgICAgdGV4dDoge1xuICAgICAgICAgICAgICBmb3JtYXQ6IFwicGxhaW5cIixcbiAgICAgICAgICAgICAgdmFsdWU6IHBhc3RlZFRleHQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm91bmRpbmdCb3g6IG5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHtcbiAgICAgICAgICAgICAgbGVmdDogMTAsXG4gICAgICAgICAgICAgIHRvcDogNTAsXG4gICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG4gICAgICAgICAgICAgIGhlaWdodDogNTAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhd2FpdCBpbnN0YW5jZS5jcmVhdGUodGV4dEFubm90YXRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiVW5zdXBwb3J0ZWQgY2xpcGJvYXJkIGl0ZW1cIik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzUHJvY2Vzc2luZ1Bhc3RlID0gZmFsc2U7XG4gICAgfVxuICB9KTtcbn0pO1xuIn0%253D) + +- [Drop stamp annotations from the toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJsZXQgc2VsZWN0ZWRTdGFtcCA9IG51bGxcbmxldCBpbnN0YW5jZSA9IG51bGxcblxuZnVuY3Rpb24gdXBkYXRlQ3Vyc29yKGluc3RhbmNlKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGluc3RhbmNlLmNvbnRlbnREb2N1bWVudC5ob3N0O1xuICBpZiAoc2VsZWN0ZWRTdGFtcCkge1xuICAgIGNvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSAnbW92ZSc7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgfVxufVxuXG4vLyBGdW5jdGlvbiB0byBhcHBseSBzdGFtcCB0byB0aGUgY3VycmVudGx5IHZpc2libGUgcGFnZVxuYXN5bmMgZnVuY3Rpb24gYXBwbHlTdGFtcFRvQ3VycmVudFBhZ2UoaW5zdGFuY2UsIHN0YW1wVHlwZSwgdG9wID0gNTAsIGxlZnQgPSA1MCwgd2lkdGggPSAxNTAsIGhlaWdodCA9IDUwKSB7XG4gIC8vIEdldCB0aGUgY3VycmVudCBwYWdlIGluZGV4IGZyb20gdGhlIHZpZXcgc3RhdGVcbiAgY29uc3QgY3VycmVudFBhZ2VJbmRleCA9IGluc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4O1xuXG4gIGNvbnN0IHN0YW1wID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLlN0YW1wQW5ub3RhdGlvbih7XG4gICAgcGFnZUluZGV4OiBjdXJyZW50UGFnZUluZGV4LFxuICAgIHN0YW1wVHlwZTogc3RhbXBUeXBlLFxuICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICBsZWZ0OiBsZWZ0IC0gd2lkdGggLyAyLFxuICAgICAgdG9wOiB0b3AgLSBoZWlnaHQgLyAyLFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgfSksXG4gIH0pO1xuXG4gIC8vIENyZWF0ZSB0aGUgc3RhbXAgYW5ub3RhdGlvblxuICBhd2FpdCBpbnN0YW5jZS5jcmVhdGUoc3RhbXApO1xufVxuXG4vLyBGdW5jdGlvbiB0byByZW1vdmUgc3RhbXAgYW5ub3RhdGlvbnMgZnJvbSB0aGUgY3VycmVudCBwYWdlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVTdGFtcEZyb21DdXJyZW50UGFnZSgpIHtcbiAgY29uc3QgY3VycmVudFBhZ2VJbmRleCA9IGluc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4O1xuXG4gIC8vIEdldCBhbGwgYW5ub3RhdGlvbnMgb24gdGhlIGN1cnJlbnQgcGFnZVxuICBjb25zdCBhbm5vdGF0aW9ucyA9IGF3YWl0IGluc3RhbmNlLmdldEFubm90YXRpb25zKGN1cnJlbnRQYWdlSW5kZXgpO1xuXG4gIC8vIEZpbHRlciBmb3Igc3RhbXAgYW5ub3RhdGlvbnMgb25seVxuICBjb25zdCBzdGFtcEFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuZmlsdGVyKFxuICAgIChhbm5vdGF0aW9uKSA9PiBhbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuU3RhbXBBbm5vdGF0aW9uXG4gICk7XG4gIGF3YWl0IGluc3RhbmNlLmRlbGV0ZShzdGFtcEFubm90YXRpb25zKTtcbn1cblxuY29uc3QgY3VzdG9tU3RhbXBJdGVtcyA9IFtcbiAge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwibm8tc3RhbXBcIixcbiAgICB0aXRsZTogXCJObyBTdGFtcFwiLFxuICAgIGRyb3Bkb3duR3JvdXA6IFwiY3VzdG9tLXN0YW1wc1wiLFxuICAgIG9uUHJlc3M6ICgpID0%252BIHJlbW92ZVN0YW1wRnJvbUN1cnJlbnRQYWdlKCksXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgIGlkOiBcInN0YW1wLWFwcHJvdmVkXCIsXG4gICAgdGl0bGU6IFwiQXBwcm92ZWQgU3RhbXBcIixcbiAgICBkcm9wZG93bkdyb3VwOiBcImN1c3RvbS1zdGFtcHNcIixcbiAgICBvblByZXNzOiAoKSA9PiB7XG4gICAgICBzZWxlY3RlZFN0YW1wID0gXCJBcHByb3ZlZFwiO1xuICAgICAgdXBkYXRlQ3Vyc29yKGluc3RhbmNlKTtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICBpZDogXCJzdGFtcC1yZWplY3RlZFwiLFxuICAgIHRpdGxlOiBcIlJlamVjdGVkIFN0YW1wXCIsXG4gICAgZHJvcGRvd25Hcm91cDogXCJjdXN0b20tc3RhbXBzXCIsXG4gICAgb25QcmVzczogKCkgPT4ge1xuICAgICAgc2VsZWN0ZWRTdGFtcCA9IFwiUmVqZWN0ZWRcIjtcbiAgICAgIHVwZGF0ZUN1cnNvcihpbnN0YW5jZSk7XG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwic3RhbXAtZHJhZnRcIixcbiAgICB0aXRsZTogXCJEcmFmdCBTdGFtcFwiLFxuICAgIGRyb3Bkb3duR3JvdXA6IFwiY3VzdG9tLXN0YW1wc1wiLFxuICAgIG9uUHJlc3M6ICgpID0%252BIHtcbiAgICAgIHNlbGVjdGVkU3RhbXAgPSBcIkRyYWZ0XCI7XG4gICAgICB1cGRhdGVDdXJzb3IoaW5zdGFuY2UpO1xuICAgIH0sXG4gIH0sXG5dO1xuXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMuY29uY2F0KGN1c3RvbVN0YW1wSXRlbXMpXG59KS50aGVuKChfaW5zdGFuY2UpID0%252BIHtcbiAgaW5zdGFuY2UgPSBfaW5zdGFuY2VcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2UucHJlc3NcIiwgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkU3RhbXApIHtcbiAgICAgIGF3YWl0IGFwcGx5U3RhbXBUb0N1cnJlbnRQYWdlKF9pbnN0YW5jZSwgc2VsZWN0ZWRTdGFtcCwgZXZlbnQucG9pbnQueSwgZXZlbnQucG9pbnQueCk7XG4gICAgICBzZWxlY3RlZFN0YW1wID0gbnVsbDsgLy8gUmVzZXQgYWZ0ZXIgYXBwbHlpbmdcbiAgICAgIHVwZGF0ZUN1cnNvcihfaW5zdGFuY2UpO1xuICAgIH1cbiAgfSk7XG59KTsifQ%253D%253D) + +- [Custom rendering of link annotations with pins](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFt7dHlwZTogJ2xpbmsnLCBkcm9wZG93bkdyb3VwOiAndHdvJ31dLFxuICBjdXN0b21SZW5kZXJlcnM6IHtcbiAgICBBbm5vdGF0aW9uOiAoeyBhbm5vdGF0aW9uIH0pID0%252BIHtcbiAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuTGlua0Fubm90YXRpb24pIHtcbiAgICAgICAgLy8gQ3JlYXRlIG91ciBwaW4gZWxlbWVudFxuICAgICAgICBjb25zdCBwaW5Ob2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgcGluTm9kZS5pbm5lckhUTUwgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGNsYXNzPVwiYmkgYmktcGluXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNC4xNDYuMTQ2QS41LjUgMCAwIDEgNC41IDBoN2EuNS41IDAgMCAxIC41LjVjMCAuNjgtLjM0MiAxLjE3NC0uNjQ2IDEuNDc5LS4xMjYuMTI1LS4yNS4yMjQtLjM1NC4yOTh2NC40MzFsLjA3OC4wNDhjLjIwMy4xMjcuNDc2LjMxNC43NTEuNTU1QzEyLjM2IDcuNzc1IDEzIDguNTI3IDEzIDkuNWEuNS41IDAgMCAxLS41LjVoLTR2NC41YzAgLjI3Ni0uMjI0IDEuNS0uNSAxLjVzLS41LTEuMjI0LS41LTEuNVYxMGgtNGEuNS41IDAgMCAxLS41LS41YzAtLjk3My42NC0xLjcyNSAxLjE3LTIuMTg5QTYgNiAwIDAgMSA1IDYuNzA4VjIuMjc3YTMgMyAwIDAgMS0uMzU0LS4yOThDNC4zNDIgMS42NzQgNCAxLjE3OSA0IC41YS41LjUgMCAwIDEgLjE0Ni0uMzU0bTEuNTggMS40MDgtLjAwMi0uMDAxem0tLjAwMi0uMDAxLjAwMi4wMDFBLjUuNSAwIDAgMSA2IDJ2NWEuNS41IDAgMCAxLS4yNzYuNDQ3aC0uMDAybC0uMDEyLjAwNy0uMDU0LjAzYTUgNSAwIDAgMC0uODI3LjU4Yy0uMzE4LjI3OC0uNTg1LjU5Ni0uNzI1LjkzNmg3Ljc5MmMtLjE0LS4zNC0uNDA3LS42NTgtLjcyNS0uOTM2YTUgNSAwIDAgMC0uODgxLS42MWwtLjAxMi0uMDA2aC0uMDAyQS41LjUgMCAwIDEgMTAgN1YyYS41LjUgMCAwIDEgLjI5NS0uNDU4IDEuOCAxLjggMCAwIDAgLjM1MS0uMjcxYy4wOC0uMDguMTU1LS4xNy4yMTQtLjI3MUg1LjE0cS4wOTEuMTUuMjE0LjI3MWExLjggMS44IDAgMCAwIC4zNy4yODJcIi8%252BXG4gICAgICAgIDwvc3ZnPmA7XG5cbiAgICAgICAgLy8gU3R5bGUgZm9yIHRvcC1jZW50ZXIgb3ZlcmxheVxuICAgICAgICBPYmplY3QuYXNzaWduKHBpbk5vZGUuc3R5bGUsIHtcbiAgICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICAgIHRvcDogXCItNDAlXCIsXG4gICAgICAgICAgbGVmdDogXCI1MCVcIixcbiAgICAgICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWCgtNTAlKVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBwaW5Ob2RlLFxuICAgICAgICAgIGFwcGVuZDogdHJ1ZSAvLyBSZXBsYWNlIHRoZSBlbnRpcmUgbm90ZSBhbm5vdGF0aW9uIFVJLlxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIFJlbmRlciB0aGUgZGVmYXVsdCBVSS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pLnRoZW4oYXN5bmMoaW5zdGFuY2UpID0%252BIHsgfSk7XG4ifQ%253D%253D) + +- [Skip the Delete confirmation popup dialog for annotations](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6Ii8vVGl0bGU6IFNraXAgdGhlIERlbGV0ZSBjb25maXJtYXRpb24gcG9wLXVwIGRpYWxvZyBmb3IgQW5ub3RhdGlvbnNcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAvLyBTa2lwIGFubm90YXRpb24gZGVsZXRlIGNvbmZpcm1hdGlvbiBwb3B1cFxuICBpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKFwiYW5ub3RhdGlvbnMud2lsbENoYW5nZVwiLCAoZXZlbnQpID0%252BIHtcbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZGVsZXRlIHN0YXJ0IGFjdGlvblxuICAgIGlmIChldmVudC5yZWFzb24gPT09IFBTUERGS2l0LkFubm90YXRpb25zV2lsbENoYW5nZVJlYXNvbi5ERUxFVEVfU1RBUlQpIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgYW5ub3RhdGlvbiBpbW1lZGlhdGVseVxuICAgICAgaW5zdGFuY2UuZGVsZXRlKGV2ZW50LmFubm90YXRpb25zLmdldCgwKSk7XG4gICAgICAvLyBDbGljayB0aGUgY2FuY2VsIGJ1dHRvbiB0byBwcmV2ZW50IHRoZSBkaWFsb2cgZnJvbSBzaG93aW5nXG4gICAgICBpbnN0YW5jZS5jb250ZW50RG9jdW1lbnRcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCIuUFNQREZLaXQtQ29uZmlybS1EaWFsb2ctQnV0dG9uLUNhbmNlbFwiKVxuICAgICAgICAuY2xpY2soKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifX0%253D) + - This hook listens for the annotation deletion start event and immediately deletes the targeted annotation. It then clicks the dialog’s Cancel button to suppress the confirmation UI. The result is a seamless delete action with no popup interrupting the workflow + diff --git a/playground/web-comments.md b/playground/web-comments.md new file mode 100644 index 0000000..e9bfd5c --- /dev/null +++ b/playground/web-comments.md @@ -0,0 +1,21 @@ +# Web SDK Examples: Comments + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/annotation/README.md](../web/annotation/README.md). + +--- + +## Comments + +- [Set annotation creator name](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiIvL3NldCB1c2VyIG5hbWUgZnJvbSBhIGxvZ2luIG9yIGF1dGhlbnRpY2F0aW9uXG5jb25zdCB1c2VybmFtZSA9IFwiSm9obiBTbWl0aFwiO1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgdG9vbGJhckl0ZW1zOiBbeyB0eXBlOiBcImNvbW1lbnRcIiB9XSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGluc3RhbmNlLnNldEFubm90YXRpb25DcmVhdG9yTmFtZShcIkpvaG4gU21pdGhcIik7XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) + - Set an annotation creator’s name, ensuring any annotations — including comments — made by that user are attributed to them. — [Video](https://www.youtube.com/watch?v=1VJzTbdY_F0) + +- [Link comments with annotations](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/comment-annotations) + +- [Add custom buttons for customizing comments](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/comments-status) + - Customize the comments popover by adding custom actions, like approve and reject, allowing users to manage comments efficiently. — [Video](https://www.youtube.com/watch?v=lVbuW7gMuVg) + +- [Clean up empty comment threads and highlights](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6Ii8vIENsZWFuIFVwIEVtcHR5IENvbW1lbnQgVGhyZWFkcyBhbmQgSGlnaGxpZ2h0c1xubGV0IG9ic2VydmVyID0gbnVsbDtcbmxldCBoYXNCZWVuRWRpdGVkID0gZmFsc2U7XG5cbk51dHJpZW50Vmlld2VyLmxvYWQoe1xuXHQuLi5iYXNlT3B0aW9ucyxcblx0dGhlbWU6IE51dHJpZW50Vmlld2VyLlRoZW1lLkRBUkssXG5cdHRvb2xiYXJJdGVtczogW1xuXHRcdC4uLk51dHJpZW50Vmlld2VyLmRlZmF1bHRUb29sYmFySXRlbXMsXG5cdFx0eyB0eXBlOiBcImNvbW1lbnRcIiB9LFxuXHRdLFxuXHR1aToge1xuXHRcdGNvbW1lbnRUaHJlYWQ6IHtcblx0XHRcdGVkaXRvcjogKGluc3RhbmNlLCB0aHJlYWRJZCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHJlbmRlcjogKHBhcmFtcykgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gVXNlIGRlZmF1bHQgZWRpdG9yIFVJIGJ5IHJldHVybmluZyBudWxsXG5cdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9uTW91bnQ6IChyb290SWQpID0%252BIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGBIZWFkZXIgbW91bnRlZCB3aXRoIHJvb3RJZDogJHtyb290SWR9YCk7XG5cblx0XHRcdFx0XHRcdC8vIEVuc3VyZSBhIHNpbmdsZSBvYnNlcnZlciBpbnN0YW5jZSBwZXIgdmlld2VyIGluc3RhbmNlXG5cdFx0XHRcdFx0XHRpZiAoIW9ic2VydmVyKSB7XG5cdFx0XHRcdFx0XHRcdG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgY29udGFpbmVyO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hhcmFjdGVyRGF0YVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciB0ZXh0IG5vZGVzLCB1c2UgcGFyZW50RWxlbWVudCB0byBnZXQgdG8gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGFpbmVyID0gbXV0YXRpb24udGFyZ2V0Py5wYXJlbnRFbGVtZW50Py5jbG9zZXN0Py4oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YC5CYXNlbGluZVVJLUVkaXRvci1SaWNoRWRpdG9yRWRpdGluZ0FyZWFgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3IgZWxlbWVudCBub2RlcywgdXNlIGNsb3Nlc3QgZGlyZWN0bHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGFpbmVyID0gbXV0YXRpb24udGFyZ2V0Py5jbG9zZXN0Py4oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YC5CYXNlbGluZVVJLUVkaXRvci1SaWNoRWRpdG9yRWRpdGluZ0FyZWFgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb250YWluZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGV4dENvbnRlbnQgPSBjb250YWluZXIudGV4dENvbnRlbnQ%252FLnRyaW0oKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgaGFzUmVhbENvbnRlbnQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCEhdGV4dENvbnRlbnQgJiYgIXRleHRDb250ZW50LmluY2x1ZGVzKFwiQWRkIHlvdXIgY29tbWVudFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aGFzQmVlbkVkaXRlZCA9IGhhc1JlYWxDb250ZW50O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkVkaXRvciBzdGF0ZTpcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRoYXNSZWFsQ29udGVudCA%252FIFwiaGFzIGNvbnRlbnRcIiA6IFwiZW1wdHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBGaW5kIHRoZSBjb3JyZWN0IGVkaXRvciBjb250YWluZXIgZm9yIHRoaXMgdGhyZWFkLCBwcmVmZXIgc2NvcGVkIHNlbGVjdG9yXG5cdFx0XHRcdFx0XHRjb25zdCBjb250YWluZXIgPVxuXHRcdFx0XHRcdFx0XHRpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3Rvcihcblx0XHRcdFx0XHRcdFx0XHRgW2RhdGEtcm9vdC1pZD1cIiR7cm9vdElkfVwiXSAuQmFzZWxpbmVVSS1FZGl0b3ItUmljaEVkaXRvckVkaXRpbmdBcmVhYFxuXHRcdFx0XHRcdFx0XHQpIHx8XG5cdFx0XHRcdFx0XHRcdGluc3RhbmNlLmNvbnRlbnREb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0XHRcdGAuQmFzZWxpbmVVSS1FZGl0b3ItUmljaEVkaXRvckVkaXRpbmdBcmVhYFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoY29udGFpbmVyKSB7XG5cdFx0XHRcdFx0XHRcdG9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyLCB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hpbGRMaXN0OiB0cnVlLCAgICAgICAgLy8gV2F0Y2ggZm9yIGFkZGVkL3JlbW92ZWQgY2hpbGQgbm9kZXNcblx0XHRcdFx0XHRcdFx0XHRhdHRyaWJ1dGVzOiB0cnVlLCAgICAgICAgLy8gV2F0Y2ggZm9yIGF0dHJpYnV0ZSBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0c3VidHJlZTogdHJ1ZSwgICAgICAgICAgIC8vIFdhdGNoIGRlc2NlbmRhbnRzIHRvb1xuXHRcdFx0XHRcdFx0XHRcdGNoYXJhY3RlckRhdGE6IHRydWUsICAgICAvLyBUcmFjayB0ZXh0IHVwZGF0ZXNcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvblVubW91bnQ6IGFzeW5jIChyb290SWQpID0%252BIHtcblx0XHRcdFx0XHRcdC8vIFNhZmVseSBkaXNjb25uZWN0IG9ic2VydmVyIGZvciB0aGlzIGxpZmVjeWNsZTsga2VlcCBpbnN0YW5jZS1zY29wZWQgc3RhdGVcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdG9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIHt9XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGBIZWFkZXIgdW5tb3VudGVkIHdpdGggcm9vdElkOiAke3Jvb3RJZH1gKTtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgYXJlIGNvbW1lbnRzIGluIHRoaXMgdGhyZWFkIG9yIHRoZSBlZGl0b3IgaGFkIGNvbnRlbnQsIGRvIG5vdGhpbmdcblx0XHRcdFx0XHRcdGNvbnN0IGhhc0NvbW1lbnRzID0gKGF3YWl0IGluc3RhbmNlLmdldENvbW1lbnRzKCkpLmZpbmQoXG5cdFx0XHRcdFx0XHRcdChjb21tZW50KSA9PiBjb21tZW50LnJvb3RJZCA9PT0gcm9vdElkXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0aWYgKCEhaGFzQ29tbWVudHMgfHwgaGFzQmVlbkVkaXRlZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBSZXNldCBlZGl0IGZsYWcgZm9yIG5leHQgbGlmZWN5Y2xlXG5cdFx0XHRcdFx0XHRcdGhhc0JlZW5FZGl0ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBObyBjb21tZW50cyBhbmQgZWRpdG9yIHN0YXllZCBlbXB0eTogcmVtb3ZlIHRoZSBsaW5nZXJpbmcgbWFya2VyIGFubm90YXRpb25cblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiRGVsZXRpbmcgbGluZ2VyaW5nIGFubm90YXRpb24gLSBlZGl0b3IgaXMgZW1wdHlcIik7XG5cdFx0XHRcdFx0XHRjb25zdCB7IGN1cnJlbnRQYWdlSW5kZXggfSA9IGluc3RhbmNlLnZpZXdTdGF0ZTtcblx0XHRcdFx0XHRcdGNvbnN0IGxpbmdlcmluZ0NvbW1lbnRNYXJrZXIgPSAoYXdhaXQgaW5zdGFuY2UuZ2V0QW5ub3RhdGlvbnMoY3VycmVudFBhZ2VJbmRleCkpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoKGFubm90YXRpb24pID0%252BIGFubm90YXRpb24uaWQgPT09IHJvb3RJZCk7XG5cblx0XHRcdFx0XHRcdGlmIChsaW5nZXJpbmdDb21tZW50TWFya2VyLmxlbmd0aCA%252BIDApIHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgaW5zdGFuY2UuZGVsZXRlKGxpbmdlcmluZ0NvbW1lbnRNYXJrZXIpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBSZXNldCBmb3IgbmV4dCBtb3VudFxuXHRcdFx0XHRcdFx0aGFzQmVlbkVkaXRlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuXHQvLyBFU0MgaGFuZGxpbmc6IGRlbGV0ZSB0ZW1wb3JhcnkgbWFya2VycyBvciBjYW5jZWwgZW1wdHkgdGhyZWFkIHJvb3RzXG5cdGNvbnN0IGlzSUUxMSA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIlRyaWRlbnQvXCIpID4gLTE7XG5cblx0aW5zdGFuY2UuY29udGVudERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XCJrZXlkb3duXCIsXG5cdFx0a2V5RG93bkhhbmRsZXIsXG5cdFx0aXNJRTExID8geyBjYXB0dXJlOiB0cnVlIH0gOiB0cnVlXG5cdCk7XG5cblx0YXN5bmMgZnVuY3Rpb24ga2V5RG93bkhhbmRsZXIoZXZlbnQpIHtcblx0XHRpZiAoZXZlbnQua2V5ICE9PSBcIkVzY2FwZVwiKSByZXR1cm47XG5cblx0XHRjb25zdCBzZWxlY3RlZCA9IGluc3RhbmNlLmdldFNlbGVjdGVkQW5ub3RhdGlvbnMoKTtcblx0XHRjb25zdCBzZWxlY3RlZEZpcnN0ID0gc2VsZWN0ZWQ%252FLmdldD8uKDApO1xuXHRcdGlmICghc2VsZWN0ZWRGaXJzdCkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgY29tbWVudHMgPSBhd2FpdCBpbnN0YW5jZS5nZXRDb21tZW50cygpO1xuXHRcdGNvbnN0IGNvbW1lbnRzQ3JlYXRlZCA9IGNvbW1lbnRzLnNvbWUoXG5cdFx0XHQoY29tbWVudCkgPT4gY29tbWVudD8ucm9vdElkID09PSBzZWxlY3RlZEZpcnN0LmlkXG5cdFx0KTtcblxuXHRcdGNvbnN0IGlzQ29tbWVudE1hcmtlciA9XG5cdFx0XHRzZWxlY3RlZEZpcnN0IGluc3RhbmNlb2YgTnV0cmllbnRWaWV3ZXIuQW5ub3RhdGlvbnMuQ29tbWVudE1hcmtlckFubm90YXRpb247XG5cblx0XHQvLyBEZWxldGUgaWY6XG5cdFx0Ly8gLSBBIG5vbi1yb290IGNvbW1lbnQgbWFya2VyIGlzIHNlbGVjdGVkLCBvclxuXHRcdC8vIC0gQSByb290IG1hcmtlciBpcyBzZWxlY3RlZCBidXQgbm8gY29tbWVudHMgd2VyZSBjcmVhdGVkIHlldFxuXHRcdGNvbnN0IHNob3VsZERlbGV0ZSA9XG5cdFx0XHQoIXNlbGVjdGVkRmlyc3Q%252FLmlzQ29tbWVudFRocmVhZFJvb3QgJiYgaXNDb21tZW50TWFya2VyKSB8fFxuXHRcdFx0KCFjb21tZW50c0NyZWF0ZWQgJiYgc2VsZWN0ZWRGaXJzdD8uaXNDb21tZW50VGhyZWFkUm9vdCk7XG5cblx0XHRpZiAoc2hvdWxkRGVsZXRlKSB7XG5cdFx0XHRhd2FpdCBpbnN0YW5jZS5kZWxldGUoc2VsZWN0ZWQpO1xuXHRcdH1cblx0fVxufSk7IiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cblx0Iiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifX0%253D) + - Prevent stray comment markers when someone opens a thread but no longer wants it. If no real text is entered and no comments are posted, the yellow highlight/marker is auto-removed when the editor closes, keeping pages tidy. Press Escape to instantly clear temporary markers while drafting + diff --git a/playground/web-content-editor.md b/playground/web-content-editor.md new file mode 100644 index 0000000..1d17f56 --- /dev/null +++ b/playground/web-content-editor.md @@ -0,0 +1,12 @@ +# Web SDK Examples: Content Editor + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/document-editor/README.md](../web/document-editor/README.md). + +--- + +## Content Editor + +- [Content Editor state change listener](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6IlBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIHRvb2xiYXJJdGVtczogWy4uLlBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMsIHsgdHlwZTogXCJjb250ZW50LWVkaXRvclwiIH1dLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIC0gYnkgTmFyYXNoaW1hblwiKTtcblxuICBsZXQgaXNDb250ZW50RWRpdG9yQWN0aXZlID0gZmFsc2U7XG4gIGxldCBjbGlja0xpc3RlbmVyQWRkZWQgPSBmYWxzZTtcblxuICAvLyBGdW5jdGlvbiB0byBhZGQgYnV0dG9uIGNsaWNrIGRldGVjdGlvblxuICBmdW5jdGlvbiBhZGRCdXR0b25DbGlja0RldGVjdGlvbigpIHtcbiAgICBpZiAoIWluc3RhbmNlLmNvbnRlbnREb2N1bWVudCB8fCBjbGlja0xpc3RlbmVyQWRkZWQpIHJldHVybjtcbiAgICBcbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXIgdG8gZGV0ZWN0IGJ1dHRvbiBjbGlja3MgaW4gY29udGVudCBlZGl0b3JcbiAgICBpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKCFpc0NvbnRlbnRFZGl0b3JBY3RpdmUpIHJldHVybjtcbiAgICAgIFxuICAgICAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbicpO1xuICAgICAgaWYgKCFidXR0b24pIHJldHVybjtcbiAgICAgIFxuICAgICAgY29uc3QgYnV0dG9uVGV4dCA9IGJ1dHRvbi50ZXh0Q29udGVudCB8fCBidXR0b24uaW5uZXJUZXh0IHx8ICcnO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBmb3IgQ2FuY2VsIGJ1dHRvblxuICAgICAgaWYgKGJ1dHRvblRleHQudHJpbSgpID09PSAnQ2FuY2VsJykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkNhbmNlbCBidXR0b24gY2xpY2tlZFwiKTtcbiAgICAgICAgLy8gWW91IGNhbiBhZGQgeW91ciBsb2dpYyBoZXJlXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZvciBTYXZlICYgQ2xvc2UgYnV0dG9uXG4gICAgICBpZiAoYnV0dG9uVGV4dC5pbmNsdWRlcygnU2F2ZScpICYmIGJ1dHRvblRleHQuaW5jbHVkZXMoJ0Nsb3NlJykpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJTYXZlICYgQ2xvc2UgYnV0dG9uIGNsaWNrZWRcIik7XG4gICAgICAgIC8vIFlvdXIgY2FuIGFkZCB5dW9yIGxvZ2ljIGhlcmVcbiAgICAgIH1cbiAgICB9LCB0cnVlKTtcbiAgICBcbiAgICBjbGlja0xpc3RlbmVyQWRkZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gTW9uaXRvciB2aWV3IHN0YXRlIGNoYW5nZXNcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInZpZXdTdGF0ZS5jaGFuZ2VcIiwgKHZpZXdTdGF0ZSwgcHJldmlvdXNWaWV3U3RhdGUpID0%252BIHtcbiAgICBjb25zdCBjdXJyZW50TW9kZSA9IHZpZXdTdGF0ZS50b0pTKCkuaW50ZXJhY3Rpb25Nb2RlO1xuICAgIGNvbnN0IHByZXZpb3VzTW9kZSA9IHByZXZpb3VzVmlld1N0YXRlLnRvSlMoKS5pbnRlcmFjdGlvbk1vZGU7XG4gICAgXG4gICAgaWYgKGN1cnJlbnRNb2RlID09PSBcIkNPTlRFTlRfRURJVE9SXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ29udGVudCBFZGl0b3Igb3BlbmVkXCIpO1xuICAgICAgaXNDb250ZW50RWRpdG9yQWN0aXZlID0gdHJ1ZTtcbiAgICAgIFxuICAgICAgLy8gQWRkIGJ1dHRvbiBjbGljayBkZXRlY3Rpb25cbiAgICAgIHNldFRpbWVvdXQoYWRkQnV0dG9uQ2xpY2tEZXRlY3Rpb24sIDUwMCk7XG4gICAgICBcbiAgICB9IGVsc2UgaWYgKHByZXZpb3VzTW9kZSA9PT0gXCJDT05URU5UX0VESVRPUlwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNvbnRlbnQgRWRpdG9yIGNsb3NlZFwiKTtcbiAgICAgIGlzQ29udGVudEVkaXRvckFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG59KTsiLCJtb2RlIjoic3RhbmRhbG9uZSIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4ifQ%253D%253D) + diff --git a/playground/web-document-editor.md b/playground/web-document-editor.md new file mode 100644 index 0000000..736be31 --- /dev/null +++ b/playground/web-document-editor.md @@ -0,0 +1,14 @@ +# Web SDK Examples: Document Editor + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/document-editor/README.md](../web/document-editor/README.md). + +--- + +## Document Editor + +- [Drag and drop files to import in Document Editor](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiIvLyBEcmFnIGFuZCBkcm9wIFBERnMgaW4gZG9jdW1lbnQgZWRpdG9yIGZvb3RlciB0byBpbXBvcnRcblxubGV0IF9pbnN0YW5jZTtcbmxldCBmaWxlQXJyYXk7XG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgX2luc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgLy8gQWRkIGEgY3VzdG9tIGRvY3VtZW50IGVkaXRvciBmb290ZXIgaXRlbVxuICBpbnN0YW5jZS5zZXREb2N1bWVudEVkaXRvckZvb3Rlckl0ZW1zKChpdGVtcykgPT4ge1xuICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBub2RlIGZvciBkcmFnIGFuZCBkcm9wXG4gICAgY29uc3QgZHJvcFpvbmVOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkcm9wWm9uZU5vZGUuaW5uZXJIVE1MID0gXCJEcm9wIFBERiBoZXJlXCI7XG5cbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgY2FuY2VsIGJ1dHRvblxuICAgIGNvbnN0IGNhbmNlbEluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLnR5cGUgPT09IFwiY2FuY2VsXCIpO1xuXG4gICAgLy8gQ3JlYXRlIG91ciBjdXN0b20gaXRlbVxuICAgIGNvbnN0IGN1c3RvbUl0ZW0gPSB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgaWQ6IFwicGRmLWRyb3Atem9uZVwiLFxuICAgICAgbm9kZTogZHJvcFpvbmVOb2RlLFxuICAgICAgb25QcmVzczogKGV2ZW50LCB7IHNldE9wZXJhdGlvbnMgfSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkRyb3Agem9uZSBjbGlja2VkXCIpO1xuICAgICAgICBpZiAoZmlsZUFycmF5KSB7XG4gICAgICAgICAgc2V0T3BlcmF0aW9ucyhcbiAgICAgICAgICAgIChvcGVyYXRpb25zKSA9PlxuICAgICAgICAgICAgICBvcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW1wb3J0RG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICBiZWZvcmVQYWdlSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgdHJlYXRJbXBvcnRlZERvY3VtZW50QXNPbmVQYWdlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudDogZmlsZUFycmF5LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGZpbGVBcnJheSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWxlcnQoXCJEcmFnIGEgZmlsZSB0byBpbXBvcnRcIik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSB0aGUgc3BhY2VyIGRpdnMgdGhhdCBtaWdodCBiZSB0YWtpbmcgdXAgc3BhY2VcbiAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PlxuICAgICAgICAhKFxuICAgICAgICAgIGl0ZW0udHlwZSA9PT0gXCJjdXN0b21cIiAmJlxuICAgICAgICAgICFpdGVtLmlkICYmXG4gICAgICAgICAgaXRlbS5ub2RlICYmXG4gICAgICAgICAgaXRlbS5ub2RlLmNsYXNzTmFtZSAmJlxuICAgICAgICAgIGl0ZW0ubm9kZS5jbGFzc05hbWUuaW5jbHVkZXMoXCJCYXNlbGluZVVJLUJveFwiKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIC8vIEluc2VydCB0aGUgY3VzdG9tIGl0ZW0gYWZ0ZXIgdGhlIGNhbmNlbCBidXR0b25cbiAgICBpZiAoY2FuY2VsSW5kZXggIT09IC0xKSB7XG4gICAgICBpdGVtcy5zcGxpY2UoY2FuY2VsSW5kZXggKyAxLCAwLCBjdXN0b21JdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXMudW5zaGlmdChjdXN0b21JdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH0pO1xuXG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgXCJ2aWV3U3RhdGUuY2hhbmdlXCIsXG4gICAgKHZpZXdTdGF0ZSwgcHJldmlvdXNWaWV3U3RhdGUpID0%252BIHtcbiAgICAgIGlmIChcbiAgICAgICAgdmlld1N0YXRlLmdldChcImludGVyYWN0aW9uTW9kZVwiKSA9PT1cbiAgICAgICAgUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLkRPQ1VNRU5UX0VESVRPUlxuICAgICAgKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRyb3BQZGZIZXJlTm9kZSA9XG4gICAgICAgICAgICBpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNwZGYtZHJvcC16b25lXCIpO1xuICAgICAgICAgIGlmIChkcm9wUGRmSGVyZU5vZGUpIHtcbiAgICAgICAgICAgIC8vIEluIHBsYWluIEphdmFTY3JpcHQsIHdlIGNhbiBqdXN0IGNoZWNrIGlmIHRoZSBlbGVtZW50IGV4aXN0c1xuICAgICAgICAgICAgZHJvcFBkZkhlcmVOb2RlLnN0eWxlLnBhZGRpbmcgPSBcIjhweCAxNnB4XCI7XG4gICAgICAgICAgICBkcm9wUGRmSGVyZU5vZGUuc3R5bGUubWFyZ2luID0gXCIwIDEwcHhcIjtcbiAgICAgICAgICAgIGRyb3BQZGZIZXJlTm9kZS5zdHlsZS5ib3JkZXIgPVxuICAgICAgICAgICAgICBcIjJweCBkYXNoZWQgdmFyKC0tYnVpLWNvbG9yLXRleHQtcHJpbWFyeSlcIjtcbiAgICAgICAgICAgIGRyb3BQZGZIZXJlTm9kZS5zdHlsZS5iYWNrZ3JvdW5kID1cbiAgICAgICAgICAgICAgXCJ2YXIoLS1idWktY29sb3ItYmFja2dyb3VuZC1zZWNvbmRhcnktc3VidGxlKVwiO1xuICAgICAgICAgICAgZHJvcFBkZkhlcmVOb2RlLnN0eWxlLmNvbG9yID0gXCJ2YXIoLS1idWktY29sb3ItdGV4dC1wcmltYXJ5KVwiO1xuICAgICAgICAgICAgZHJvcFBkZkhlcmVOb2RlLnN0eWxlLmJvcmRlclJhZGl1cyA9IFwiNHB4XCI7XG4gICAgICAgICAgICBkcm9wUGRmSGVyZU5vZGUuc3R5bGUuZmxleEdyb3cgPSBcIjEwXCI7XG4gICAgICAgICAgICBkcm9wUGRmSGVyZU5vZGUuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSBcImNlbnRlclwiO1xuICAgICAgICAgICAgaGFuZGxlRHJhZ0FuZERyb3AoZHJvcFBkZkhlcmVOb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfVxuICApO1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCFcIik7XG4gIGNvbnNvbGUubG9nKFwiQVBJIGRvY3M6IGh0dHBzOi8vd3d3Lm51dHJpZW50LmlvL2FwaS93ZWIvXCIpO1xuICBjb25zb2xlLmxvZyhcIkd1aWRlczogaHR0cHM6Ly93d3cubnV0cmllbnQuaW8vZ3VpZGVzL3dlYi9cIik7XG59KTtcblxuLy8gRnVuY3Rpb24gdG8gaGFuZGxlIGZpbGUgcHJvY2Vzc2luZ1xuZnVuY3Rpb24gaGFuZGxlRmlsZXMoZmlsZXMpIHtcbiAgY29uc29sZS5sb2coZmlsZXMpO1xuXG4gIC8vIEZpbmQgYW5kIGNsaWNrIHRoZSBidXR0b24gZWxlbWVudFxuICBpZiAoX2luc3RhbmNlICYmIF9pbnN0YW5jZS5jb250ZW50RG9jdW1lbnQpIHtcbiAgICBjb25zdCBkcm9wWm9uZUVsZW1lbnQgPVxuICAgICAgX2luc3RhbmNlLmNvbnRlbnREb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBkZi1kcm9wLXpvbmVcIik7XG4gICAgaWYgKGRyb3Bab25lRWxlbWVudCkge1xuICAgICAgLy8gUHJvY2VzcyBmaWxlcyBhcyBiZWZvcmVcbiAgICAgIEFycmF5LmZyb20oZmlsZXMpLmZvckVhY2goKGZpbGUpID0%252BIHtcbiAgICAgICAgZmlsZUFycmF5ID0gZmlsZTtcbiAgICAgICAgLy8gU2ltdWxhdGUgYSBjbGljayBvbiB0aGUgZWxlbWVudFxuICAgICAgICBkcm9wWm9uZUVsZW1lbnQuY2xpY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBGdW5jdGlvbiB0byBhZGQgZHJhZyBhbmQgZHJvcCBjYXBhYmlsaXRpZXMgdG8gbm9kZXNcbmZ1bmN0aW9uIGhhbmRsZURyYWdBbmREcm9wKGRyb3Bab25lKSB7XG4gIC8vIFByZXZlbnQgZGVmYXVsdCBiZWhhdmlvciBvbiBkcmFnb3ZlciBhbmQgZHJhZ2VudGVyIHRvIGFsbG93IGRyb3BcbiAgZHJvcFpvbmUuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy8gT3B0aW9uYWw6IEFkZCBhIHZpc3VhbCBjdWUgKGUuZy4sIGNoYW5nZSBiYWNrZ3JvdW5kIGNvbG9yKVxuICAgIGRyb3Bab25lLnN0eWxlLmJvcmRlciA9XG4gICAgICBcIjJweCBkYXNoZWQgdmFyKC0tYnVpLWNvbG9yLXN1cHBvcnQtc3VjY2Vzcy1tZWRpdW0pXCI7XG4gIH0pO1xuXG4gIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnZW50ZXJcIiwgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBPcHRpb25hbDogSGlnaGxpZ2h0IHRoZSBkcm9wIHpvbmVcbiAgICBkcm9wWm9uZS5zdHlsZS5ib3JkZXIgPVxuICAgICAgXCIycHggZGFzaGVkIHZhcigtLWJ1aS1jb2xvci1zdXBwb3J0LXN1Y2Nlc3MtbWVkaXVtKVwiO1xuICB9KTtcblxuICAvLyBSZXZlcnQgdmlzdWFsIGN1ZXMgd2hlbiB0aGUgZHJhZ2dlZCBmaWxlIGxlYXZlcyB0aGUgZHJvcCB6b25lXG4gIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnbGVhdmVcIiwgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBSZXNldCBzdHlsaW5nIHdoZW4gbm8gbG9uZ2VyIGRyYWdnaW5nIG92ZXJcbiAgICBkcm9wWm9uZS5zdHlsZS5ib3JkZXIgPSBcIjJweCBkYXNoZWQgdmFyKC0tYnVpLWNvbG9yLXRleHQtcHJpbWFyeSlcIjtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIHRoZSBkcm9wIGV2ZW50XG4gIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoXCJkcm9wXCIsIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBDbGVhciBhbnkgdmlzdWFsIGN1ZXMgYWRkZWQgZHVyaW5nIGRyYWdcbiAgICBkcm9wWm9uZS5zdHlsZS5ib3JkZXIgPSBcIjJweCBkYXNoZWQgdmFyKC0tYnVpLWNvbG9yLXRleHQtcHJpbWFyeSlcIjtcblxuICAgIC8vIEFjY2VzcyB0aGUgZHJvcHBlZCBmaWxlcyBmcm9tIHRoZSBEYXRhVHJhbnNmZXIgb2JqZWN0XG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgLy8gUHJvY2VzcyB0aGUgZmlsZShzKVxuICAgIGhhbmRsZUZpbGVzKGZpbGVzKTtcbiAgfSk7XG59XG4ifQ%253D%253D) + +- [Copy and paste pages after a selected page in Document Editor](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiIvLyBDb3B5IHRoZSBzZWxlY3RlZCBwYWdlcyBhbmQgdGhlbiBwYXN0ZSB0aG9zZSBwYWdlcyBcbi8vIGFmdGVyIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFnZSBpbiBkb2N1bWVudCBlZGl0b3IgdXNpbmcgY3VzdG9tIGJ1dHRvbnMgaW4gdG9vbGJhclxuXG5sZXQgX2luc3RhbmNlO1xuLy8gR2V0IHRoZSBkZWZhdWx0IHRvb2xiYXIgaXRlbXNcbmNvbnN0IGRlZmF1bHRUb29sYmFySXRlbXMgPSBQU1BERktpdC5kZWZhdWx0RG9jdW1lbnRFZGl0b3JUb29sYmFySXRlbXM7XG5sZXQgY29waWVkUGFnZXNCdWZmZXIgPSBudWxsO1xubGV0IGNvcGllZFBhZ2VzID0gW107XG5cbi8vIENyZWF0ZSBhIGN1c3RvbSBjb3B5IGJ1dHRvblxuY29uc3QgY29weUJ1dHRvbiA9IHtcbiAgdHlwZTogXCJjdXN0b21cIixcbiAgaWQ6IFwiY29weS1wYWdlc1wiLFxuICB0aXRsZTogXCJDb3B5IFBhZ2VzXCIsXG4gIG9uUHJlc3M6IGFzeW5jIChldmVudCwgeyBnZXRTZWxlY3RlZFBhZ2VJbmRleGVzLCBzZXRPcGVyYXRpb25zIH0pID0%252BIHtcbiAgICBjb25zdCBzZWxlY3RlZFBhZ2VJbmRleGVzID0gZ2V0U2VsZWN0ZWRQYWdlSW5kZXhlcygpO1xuICAgIGlmIChzZWxlY3RlZFBhZ2VJbmRleGVzLmxlbmd0aCA%252BIDApIHtcbiAgICAgIC8vIEV4cG9ydCB0aGUgc2VsZWN0ZWQgcGFnZXMgYXMgYSBuZXcgZG9jdW1lbnRcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImtlZXBQYWdlc1wiLFxuICAgICAgICAgIHBhZ2VJbmRleGVzOiBzZWxlY3RlZFBhZ2VJbmRleGVzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRXhwb3J0IG9ubHkgdGhlIHNlbGVjdGVkIHBhZ2VzXG4gICAgICAgIGNvcGllZFBhZ2VzQnVmZmVyID0gYXdhaXQgX2luc3RhbmNlLmV4cG9ydFBERldpdGhPcGVyYXRpb25zKG9wZXJhdGlvbnMpO1xuICAgICAgICBjb3BpZWRQYWdlcyA9IHNlbGVjdGVkUGFnZUluZGV4ZXM7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRXhwb3J0ZWQgcGFnZXM6XCIsIHNlbGVjdGVkUGFnZUluZGV4ZXMpO1xuICAgICAgICBzZXRPcGVyYXRpb25zKChvcGVyYXRpb25zKSA9PiBvcGVyYXRpb25zLCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBleHBvcnRpbmcgcGFnZXM6XCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWxlcnQoXCJQbGVhc2Ugc2VsZWN0IHBhZ2VzIHRvIGNvcHkhXCIpO1xuICAgIH1cbiAgfSxcbn07XG5cbi8vIENyZWF0ZSBhIGN1c3RvbSBwYXN0ZSBidXR0b25cbmNvbnN0IHBhc3RlQnV0dG9uID0ge1xuICB0eXBlOiBcImN1c3RvbVwiLFxuICBpZDogXCJwYXN0ZS1wYWdlc1wiLFxuICB0aXRsZTogXCJQYXN0ZSBQYWdlc1wiLFxuICBvblByZXNzOiBhc3luYyAoZXZlbnQsIHsgc2V0T3BlcmF0aW9ucywgZ2V0U2VsZWN0ZWRQYWdlSW5kZXhlcyB9KSA9PiB7XG4gICAgaWYgKCFjb3BpZWRQYWdlc0J1ZmZlcikge1xuICAgICAgYWxlcnQoXCJZb3UgaGF2ZW4ndCBjb3BpZWQgYW55IHBhZ2VzIHlldCEhIVwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFBhZ2VJbmRleGVzID0gZ2V0U2VsZWN0ZWRQYWdlSW5kZXhlcygpO1xuXG4gICAgLy8gQ2hlY2sgaWYgbXVsdGlwbGUgcGFnZXMgYXJlIHNlbGVjdGVkXG4gICAgaWYgKHNlbGVjdGVkUGFnZUluZGV4ZXMubGVuZ3RoID4gMSkge1xuICAgICAgYWxlcnQoXG4gICAgICAgIFwiUGxlYXNlIHNlbGVjdCBvbmx5IG9uZSBwYWdlIHRvIHBhc3RlIGFmdGVyLCBvciBubyBwYWdlcyB0byBwYXN0ZSBhdCB0aGUgZW5kLlwiXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB3aGVyZSB0byBpbnNlcnQgdGhlIHBhZ2VzXG4gICAgY29uc3QgYWZ0ZXJQYWdlSW5kZXggPVxuICAgICAgc2VsZWN0ZWRQYWdlSW5kZXhlcy5sZW5ndGggPT09IDFcbiAgICAgICAgPyBzZWxlY3RlZFBhZ2VJbmRleGVzWzBdXG4gICAgICAgIDogX2luc3RhbmNlLnRvdGFsUGFnZUNvdW50IC0gMTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSBibG9iIGZyb20gdGhlIGNvcGllZCBwYWdlcyBidWZmZXJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgRmlsZShcbiAgICAgICAgW2NvcGllZFBhZ2VzQnVmZmVyXSxcbiAgICAgICAgYENvcGllZCBwYWdlcyAke2NvcGllZFBhZ2VzXG4gICAgICAgICAgLm1hcCgocGFnZUluZGV4KSA9PiBwYWdlSW5kZXggKyAxKVxuICAgICAgICAgIC50b1N0cmluZygpfWAsXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBzZXRPcGVyYXRpb25zKFxuICAgICAgICAob3BlcmF0aW9ucykgPT5cbiAgICAgICAgICBvcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJpbXBvcnREb2N1bWVudFwiLFxuICAgICAgICAgICAgYWZ0ZXJQYWdlSW5kZXg6IGFmdGVyUGFnZUluZGV4LFxuICAgICAgICAgICAgdHJlYXRJbXBvcnRlZERvY3VtZW50QXNPbmVQYWdlOiBmYWxzZSxcbiAgICAgICAgICAgIGRvY3VtZW50OiBibG9iLFxuICAgICAgICAgIH0pLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgY29waWVkUGFnZXMgPSBbXTtcbiAgICAgIGNvcGllZFBhZ2VzQnVmZmVyID0gbnVsbDtcbiAgICAgIGNvbnNvbGUubG9nKFwiUGFnZXMgcGFzdGVkIGFmdGVyIHBhZ2UgaW5kZXg6XCIsIGFmdGVyUGFnZUluZGV4KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHBhc3RpbmcgcGFnZXM6XCIsIGVycm9yKTtcbiAgICB9XG4gIH0sXG59O1xuXG4vLyBBZGQgdGhlIGN1c3RvbSBidXR0b25zIHRvIHRoZSB0b29sYmFyIGl0ZW1zXG5kZWZhdWx0VG9vbGJhckl0ZW1zLnB1c2goY29weUJ1dHRvbiwgcGFzdGVCdXR0b24pO1xuXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBkb2N1bWVudEVkaXRvclRvb2xiYXJJdGVtczogZGVmYXVsdFRvb2xiYXJJdGVtcyxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIF9pbnN0YW5jZSA9IGluc3RhbmNlO1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCFcIik7XG4gIGNvbnNvbGUubG9nKFwiQVBJIGRvY3M6IGh0dHBzOi8vd3d3Lm51dHJpZW50LmlvL2FwaS93ZWIvXCIpO1xuICBjb25zb2xlLmxvZyhcIkd1aWRlczogaHR0cHM6Ly93d3cubnV0cmllbnQuaW8vZ3VpZGVzL3dlYi9cIik7XG59KTtcbiJ9) + diff --git a/playground/web-form-creator.md b/playground/web-form-creator.md new file mode 100644 index 0000000..749263b --- /dev/null +++ b/playground/web-form-creator.md @@ -0,0 +1,17 @@ +# Web SDK Examples: Form Creator + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/annotation/README.md](../web/annotation/README.md). + +--- + +## Form Creator + +- [Prevent creating widgets outside of page bounds](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiIvLyBHbG9iYWwgdmFyaWFibGUgdG8gc3RvcmUgdGhlIFBTUERGS2l0IGluc3RhbmNlIGZvciB1c2UgYWNyb3NzIGZ1bmN0aW9uc1xubGV0IGdsb2JhbEluc3RhbmNlO1xuXG4vLyBJbml0aWFsaXplIFBTUERGS2l0IHdpdGggY29uZmlndXJhdGlvblxuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgLy8gQWRkIGZvcm0gY3JlYXRvciB0b29sIHRvIHRoZSB0b29sYmFyXG4gIHRvb2xiYXJJdGVtczogW3sgdHlwZTogXCJmb3JtLWNyZWF0b3JcIiB9XSxcblxuICAvLyBIYW5kbGVyIHRoYXQgcnVucyB3aGVuIGEgdXNlciBzdGFydHMgY3JlYXRpbmcgYSB3aWRnZXQgYW5ub3RhdGlvbiAobGlrZSBhIHNpZ25hdHVyZSBmaWVsZClcbiAgb25XaWRnZXRBbm5vdGF0aW9uQ3JlYXRpb25TdGFydDogKGFubm90YXRpb24sIGZvcm1GaWVsZCkgPT4ge1xuICAgIC8vIERlc3RydWN0dXJlIHRoZSBhbm5vdGF0aW9uIHByb3BlcnRpZXMgd2UgbmVlZFxuICAgIGNvbnN0IHsgYm91bmRpbmdCb3gsIHBhZ2VJbmRleCB9ID0gYW5ub3RhdGlvbjtcblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgY3VycmVudCBwYWdlXG4gICAgY29uc3QgeyBoZWlnaHQsIHdpZHRoIH0gPSBnbG9iYWxJbnN0YW5jZS5wYWdlSW5mb0ZvckluZGV4KHBhZ2VJbmRleCk7XG5cbiAgICAvLyBDcmVhdGUgYSByZWN0YW5nbGUgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgcGFnZVxuICAgIGNvbnN0IHBhZ2VSZWN0ID0gbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgdG9wOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGFubm90YXRpb24ncyBib3VuZGluZyBib3ggaXMgZnVsbHkgaW5zaWRlIHRoZSBwYWdlXG4gICAgaWYgKHBhZ2VSZWN0LmlzUmVjdEluc2lkZShib3VuZGluZ0JveCkpIHtcbiAgICAgIC8vIElmIGluc2lkZSBwYWdlIGJvdW5kcywgYWxsb3cgY3JlYXRpb24gYnkgcmV0dXJuaW5nIHRoZSBhbm5vdGF0aW9uIGFuZCBmb3JtIGZpZWxkXG4gICAgICByZXR1cm4geyBhbm5vdGF0aW9uLCBmb3JtRmllbGQgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgb3V0c2lkZSBwYWdlIGJvdW5kcywgc2hvdyBlcnJvciBhbmQgcHJldmVudCBjcmVhdGlvblxuICAgICAgYWxlcnQoXCJDYW5ub3QgY3JlYXRlIGFubm90YXRpb24gLSBvdXRzaWRlIG9mIGJvdW5kc1wiKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIC8vIFN0b3JlIGluc3RhbmNlIGdsb2JhbGx5IGZvciBsYXRlciB1c2VcbiAgZ2xvYmFsSW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAvLyBMb2cgc3VjY2VzcyBtZXNzYWdlcyBhbmQgaGVscGZ1bCBkb2N1bWVudGF0aW9uIGxpbmtzXG4gIGNvbnNvbGUubG9nKFwiUFNQREZLaXQgbG9hZGVkIVwiKTtcbiAgY29uc29sZS5sb2coXCJBUEkgZG9jczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vYXBpL3dlYi9cIik7XG4gIGNvbnNvbGUubG9nKFwiR3VpZGVzOiBodHRwczovL3BzcGRma2l0LmNvbS9ndWlkZXMvd2ViL1wiKTtcbn0pO1xuIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbi5QU1BERktpdC1Bbm5vdGF0aW9uLUZsYWdzLVBvcG92ZXIge1xuICBkaXNwbGF5OiBub25lO1xuICBjdXJzb3I6IG5vbmU7XG59XG5cbi5UaHVtYm5haWwtSXMtUmVhZCB7XG4gIGNvbnRlbnQ6IHVybCgvYXNzZXRzL2ltYWdlcy9pY29ucy9tb25vL2NoZWNrbWFyay1jNDJiMGQ1Mi5zdmcpO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHJpZ2h0OiAyMiU7XG4gIHRvcDogMTElO1xuICBvcGFjaXR5OiAxICFpbXBvcnRhbnQ7XG59XG4uUFNQREZLaXQtU2lkZWJhci1UaHVtYm5haWxzLVBhZ2UtU2VsZWN0ZWRcbiAgLlBTUERGS2l0LVNpZGViYXItVGh1bWJuYWlscy1QYWdlLUltYWdlIHtcbiAgYm94LXNoYWRvdzogMCAwIDAgNHB4IGxhdmVuZGVyO1xufVxuXG4uUFNQREZLaXQtU2lkZWJhci1UaHVtYm5haWxzLVBhZ2UtU2VsZWN0ZWRcbiAgLlBTUERGS2l0LVNpZGViYXItVGh1bWJuYWlscy1QYWdlLUxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogbGF2ZW5kZXI7XG59XG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + +- [Visual alignment techniques for form elements](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIuZ3JpZC1vdmVybGF5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiA5OTk5O1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoMGRlZywgYmxhY2sgMXB4LCB0cmFuc3BhcmVudCAxcHgpLFxuICAgIGxpbmVhci1ncmFkaWVudCg5MGRlZywgYmxhY2sgMXB4LCB0cmFuc3BhcmVudCAxcHgpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDUwcHggNTBweDtcbn1cbiIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiZm9ybS5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFsuLi5QU1BERktpdC5kZWZhdWx0VG9vbGJhckl0ZW1zLCB7IHR5cGU6IFwiZm9ybS1jcmVhdG9yXCIgfV0sXG59KS50aGVuKGFzeW5jIChpbnN0YW5jZSkgPT4ge1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IExvYWRlZCAtIGJ5IE5hcmFzaGltYW5cIik7XG4gIGNvbnN0IHBhZ2VJbmRleCA9IGluc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4O1xuICBjb25zdCBwYWdlSW5mbyA9IGF3YWl0IGluc3RhbmNlLnBhZ2VJbmZvRm9ySW5kZXgocGFnZUluZGV4KTtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlSW5mbztcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBcImFubm90YXRpb25zLmZvY3VzXCIsXG4gICAgZnVuY3Rpb24gKGFubm90YXRpb25Gb2N1c0V2ZW50KSB7XG4gICAgICBhdHRhY2hHcmlkT3ZlcmxheVRvZ2dsZShpbnN0YW5jZSwgd2lkdGgsIGhlaWdodCwgcGFnZUluZGV4KTtcbiAgICB9XG4gICk7XG5cbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2UucHJlc3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5zdGFuY2UucmVtb3ZlQ3VzdG9tT3ZlcmxheUl0ZW0oXCJncmlkLW92ZXJsYXlcIik7XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH0sIDUwKTtcbiAgfSk7XG59KTtcblxuZnVuY3Rpb24gYXR0YWNoR3JpZE92ZXJsYXlUb2dnbGUoaW5zdGFuY2UsIHdpZHRoLCBoZWlnaHQsIHBhZ2VJbmRleCkge1xuICB0cnkge1xuICAgIGluc3RhbmNlLnJlbW92ZUN1c3RvbU92ZXJsYXlJdGVtKFwiZ3JpZC1vdmVybGF5XCIpO1xuICB9IGNhdGNoIChfKSB7fVxuICBjb25zdCBncmlkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgZ3JpZC5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuICBncmlkLnN0eWxlLmhlaWdodCA9IGhlaWdodCArIFwicHhcIjtcbiAgZ3JpZC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XG4gIGdyaWQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgxOCwwLDE4LDAuMSkgMXB4LCB0cmFuc3BhcmVudCAwLjFweCksXG4gICAgICBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDE4LDAsMTgsMC4xKSAxcHgsIHRyYW5zcGFyZW50IDAuMXB4KWA7XG4gIGdyaWQuc3R5bGUuYmFja2dyb3VuZFNpemUgPSBgMjVweCAyNXB4YDtcbiAgZ3JpZC5zdHlsZS56SW5kZXggPSBcIi0xXCI7XG5cbiAgY29uc3Qgb3ZlcmxheUl0ZW0gPSBuZXcgUFNQREZLaXQuQ3VzdG9tT3ZlcmxheUl0ZW0oe1xuICAgIGlkOiBcImdyaWQtb3ZlcmxheVwiLFxuICAgIG5vZGU6IGdyaWQsXG4gICAgcGFnZUluZGV4LFxuICAgIHBvc2l0aW9uOiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUG9pbnQoeyB4OiAwLCB5OiAwIH0pLFxuICB9KTtcblxuICBpbnN0YW5jZS5zZXRDdXN0b21PdmVybGF5SXRlbShvdmVybGF5SXRlbSk7XG59XG4ifQ%253D%253D) + - In Form Creator mode, enable overlay grid lines to provide visual guidance for precise alignment of form elements. + +- [Replace the default form creator menu with custom buttons](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLlBTUERGS2l0LUZvcm0tQ3JlYXRvci1Ub29sYmFyIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB0b29sYmFySXRlbXM6IFsuLi5QU1BERktpdC5kZWZhdWx0VG9vbGJhckl0ZW1zLCB7IHR5cGU6IFwiZm9ybS1jcmVhdG9yXCIgfV0sXG59KS50aGVuKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IExvYWRlZCAtIGJ5IE5hcmFzaGltYW5cIik7XG4gIGF0dGFjaEZvcm1DcmVhdG9yTGlzdGVuZXIoaW5zdGFuY2UpO1xufSk7XG5cbmZ1bmN0aW9uIGF0dGFjaEZvcm1DcmVhdG9yTGlzdGVuZXIoaW5zdGFuY2UpIHtcbiAgdmFyIGRvYyA9IGluc3RhbmNlLmNvbnRlbnREb2N1bWVudDtcbiAgdmFyIGJ1dHRvbiA9IGRvYy5xdWVyeVNlbGVjdG9yKFwiLlBTUERGS2l0LVRvb2xiYXItQnV0dG9uLUZvcm0tQ3JlYXRvclwiKTtcbiAgaWYgKCFidXR0b24pIHJldHVybjtcblxuICB2YXIgT1ZFUkxBWV9JRCA9IFwiZm9ybS1jcmVhdG9yLWZsb2F0aW5nXCI7XG5cbiAgZnVuY3Rpb24gcmVuZGVyRmxvYXRpbmcoKSB7XG4gICAgdmFyIG9sZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKE9WRVJMQVlfSUQpO1xuICAgIGlmIChvbGQpIG9sZC5yZW1vdmUoKTtcblxuICAgIGlmIChidXR0b24uZ2V0QXR0cmlidXRlKFwiYXJpYS1wcmVzc2VkXCIpICE9PSBcInRydWVcIikgcmV0dXJuO1xuXG4gICAgdmFyIG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIG92ZXJsYXkuaWQgPSBPVkVSTEFZX0lEO1xuICAgIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9XG4gICAgICBcInBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtnYXA6NHB4O1wiICtcbiAgICAgIFwiYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNyk7cGFkZGluZzo4cHg7Ym9yZGVyLXJhZGl1czo0cHg7XCIgK1xuICAgICAgXCJmb250LWZhbWlseTpzYW5zLXNlcmlmO2NvbG9yOndoaXRlO3otaW5kZXg6MTAwMDA7XCI7XG5cbiAgICB2YXIgbW9kZXMgPSBbXG4gICAgICB7IGxhYmVsOiBcIkJ1dHRvblwiLCBtb2RlOiBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuQlVUVE9OX1dJREdFVCB9LFxuICAgICAgeyBsYWJlbDogXCJUZXh0XCIsIG1vZGU6IFBTUERGS2l0LkludGVyYWN0aW9uTW9kZS5URVhUX1dJREdFVCB9LFxuICAgICAgeyBsYWJlbDogXCJDaGVja2JveFwiLCBtb2RlOiBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuQ0hFQ0tCT1hfV0lER0VUIH0sXG4gICAgICB7IGxhYmVsOiBcIlJhZGlvXCIsIG1vZGU6IFBTUERGS2l0LkludGVyYWN0aW9uTW9kZS5SQURJT19CVVRUT05fV0lER0VUIH0sXG4gICAgICB7IGxhYmVsOiBcIkNvbWJvXCIsIG1vZGU6IFBTUERGS2l0LkludGVyYWN0aW9uTW9kZS5DT01CT19CT1hfV0lER0VUIH0sXG4gICAgICB7IGxhYmVsOiBcIkxpc3RcIiwgbW9kZTogUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLkxJU1RfQk9YX1dJREdFVCB9LFxuICAgICAgeyBsYWJlbDogXCJTaWduYXR1cmVcIiwgbW9kZTogUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLlNJR05BVFVSRV9XSURHRVQgfSxcbiAgICAgIHsgbGFiZWw6IFwiRGF0ZVwiLCBtb2RlOiBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuREFURV9XSURHRVQgfSxcbiAgICBdO1xuICAgIG1vZGVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gaXRlbS5sYWJlbDtcbiAgICAgIGJ0bi5zdHlsZS5wYWRkaW5nID0gXCI0cHggOHB4XCI7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKGZ1bmN0aW9uICh2cykge1xuICAgICAgICAgIHJldHVybiB2cy5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgaXRlbS5tb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIG92ZXJsYXkuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgICB9KTtcblxuICAgIHZhciB0b29sYmFyID0gZG9jLnF1ZXJ5U2VsZWN0b3IoXCIuUFNQREZLaXQtVG9vbGJhclwiKTtcbiAgICBpZiAoIXRvb2xiYXIpIHJldHVybjtcbiAgICB2YXIgciA9IHRvb2xiYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgb3ZlcmxheS5zdHlsZS50b3AgPSByLmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgXCJweFwiO1xuICAgIG92ZXJsYXkuc3R5bGUubGVmdCA9IHIubGVmdCArIHdpbmRvdy5zY3JvbGxYICsgXCJweFwiO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcbiAgfVxuXG4gIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgIHNldFRpbWVvdXQocmVuZGVyRmxvYXRpbmcsIDApO1xuICB9KTtcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4LmNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dChyZW5kZXJGbG9hdGluZywgMCk7XG4gIH0pO1xufVxuIn0%253D) + diff --git a/playground/web-forms.md b/playground/web-forms.md new file mode 100644 index 0000000..18630ba --- /dev/null +++ b/playground/web-forms.md @@ -0,0 +1,30 @@ +# Web SDK Examples: Forms + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/annotation/README.md](../web/annotation/INDEX.md). + +--- + +## Forms + +- [Add a user role dropdown to signature form fields](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJsZXQgaW5zdGFuY2U7UFNQREZLaXQubG9hZCh7Li4uYmFzZU9wdGlvbnMsdGhlbWU6UFNQREZLaXQuVGhlbWUuREFSSyx0b29sYmFySXRlbXM6Wy4uLlBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMse3R5cGU6J2Zvcm0tY3JlYXRvcid9XX0pLnRoZW4oKGk9PntpbnN0YW5jZT1pO1xuLy9UaGlzIGlzIHRoZSBVc2VyIFJvbGUgU2VsZWN0IEVsZW1lbnRcbmxldCBodG1sPSc8ZGl2IGNsYXNzPVwiUFNQREZLaXQtNzFoNjVhc3g5azg1bWRuczRuOGoya3QzYWdcIj48ZGl2PjxkaXYgY2xhc3M9XCJQU1BERktpdC00cTZyZjQ3cmhxaHJwbTlnZGZlZnh0N3F4YVwiPjxsYWJlbCBjbGFzcz1cIlBTUERGS2l0LW50MTJhZHR0YnliNTJhd3NnajJwdnVjeHlcIj5Bc3NpZ24gVG8gVXNlcjogPHNlbGVjdCBpZD1cInVzZXJSb2xlc1wiIGNsYXNzPVwiUFNQREZLaXQtMzhjanB2eHNhZHVwbTI1aDJxeXhhN241Z2QgUFNQREZLaXQtM3lqdTJ1Mjc3ODM0Y3kzZ2FocjJyNXB4d2EgUFNQREZLaXQtRm9ybS1DcmVhdG9yLUVkaXRvci1Gb3JtLUZpZWxkLU5hbWVcIj48b3B0aW9uIHZhbHVlPVwibm9uZVwiIHNlbGVjdGVkIGRpc2FibGVkIGhpZGRlbj5zZWxlY3Qgcm9sZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJMYW5kbG9yZFwiPkxhbmRsb3JkPC9vcHRpb24%252BPG9wdGlvbiB2YWx1ZT1cIlRlbmFudFwiPlRlbmFudDwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw%252BPC9kaXY%252BPC9kaXY%252BPC9kaXY%252BJztcbi8vRXZlbnQgbGlzdGVuZXIgdG8gY2hlY2sgd2hlaHRlciB0aGUgY2xpY2tlZCBhbm5vdGF0aW9uIGlzIGEgU2lnbmF0dXJlIFdpZGdldFxuaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignYW5ub3RhdGlvbnMucHJlc3MnLChhc3luYyBldmVudD0%252Be2NvbnN0e2Fubm90YXRpb246YW5ub3RhdGlvbn09ZXZlbnQsdXNlclJvbGU9YW5ub3RhdGlvbi5jdXN0b21EYXRhPy51c2VyUm9sZSxmb3JtRmllbGRzPWF3YWl0IGluc3RhbmNlLmdldEZvcm1GaWVsZHMoKSxmb3JtRmllbGQ9Zm9ybUZpZWxkcy5nZXQoZm9ybUZpZWxkcy5tYXAoKGU9PmUubmFtZSkpLmluZGV4T2YoYW5ub3RhdGlvbi5mb3JtRmllbGROYW1lKSk7XG4vL0lmIGl0J3MgYSBzaWduYXR1cmUgd2lkZ2V0IEkgYWN0aXZhdGUgdGhlIEZvcm0gQ3JlYXRvciBNb2RlXG5pZihhbm5vdGF0aW9uJiZmb3JtRmllbGQgaW5zdGFuY2VvZiBQU1BERktpdC5Gb3JtRmllbGRzLlNpZ25hdHVyZUZvcm1GaWVsZCl7aW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGU9PnZpZXdTdGF0ZS5zZXQoJ2ludGVyYWN0aW9uTW9kZScsUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLkZPUk1fQ1JFQVRPUikpKSxcbi8vU2V0dGluZyB0aGUgY2xpY2tlZCBBbm5vdGF0aW9uIGFzIHRoZSBzZWxlY3RlZCBBbm5vdGF0aW9uXG4vL1NlYXJjaGluZyBmb3IgdGhlIFByb3BlcnR5IEV4cGFuZG8gQ29udHJvbCBXaWRnZXQgd2hlcmUgSSdsbCBpbnNlcnQgdGhlIFNlbGVjdCBFbGVtZW50XG5pbnN0YW5jZS5zZXRTZWxlY3RlZEFubm90YXRpb24oYW5ub3RhdGlvbi5pZCk7Y29uc3QgZXhwYW5kb0NvbnRyb2w9aW5zdGFuY2UuY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5QU1BERktpdC1FeHBhbmRvLUNvbnRyb2wnKTtcbi8vSWYgdGhlIEFubm90YXRpb24gaGFzIHVzZXJSb2xlcywgdGhlbiBJJ2xsIHNldCB0aGUgdXNlciByb2xlIGZvciB0aGUgY3VycmVudCB1c2VyOyBvdGhlcndpc2UgZGlzcGxheSB0aGUgc2VsZWN0IG1lbnVcbnVzZXJSb2xlPyhleHBhbmRvQ29udHJvbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZUJlZ2luJyxodG1sKSxpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3VzZXJSb2xlcyBvcHRpb25bdmFsdWU9Jyt1c2VyUm9sZSsnXScpLnNldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCEwKSxjb25zb2xlLmxvZyhpbnN0YW5jZS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3VzZXJSb2xlcyBvcHRpb25bdmFsdWU9VGVuYW50XScpKSk6ZXhwYW5kb0NvbnRyb2wuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVCZWdpbicsaHRtbCl9fSkpLFxuLy9FdmVudCBsaXN0ZW5lciB0byBkZWFjdGl2YXRlIHRoZSBGb3JtIENyZWF0b3Igb25jZSBJIGNsaWNrIGRvbmUgb3Igb3V0c2lkZSB0aGUgc2VsZWN0ZWQgU2lnbmF0dXJlIFdpZGdldFxuaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignYW5ub3RhdGlvblNlbGVjdGlvbi5jaGFuZ2UnLChhbm5vdGF0aW9uPT57XG4vL0lmIHRoZSBhbm5vdGF0aW9uIGlzIG5vdCBzZWxlY3RlZCwgSSBkZWFjdGl2YXRlIHRoZSBGb3JtIENyZWF0b3IgTW9kZVxuYW5ub3RhdGlvbnx8J0ZPUk1fQ1JFQVRPUichPWluc3RhbmNlLnZpZXdTdGF0ZS5pbnRlcmFjdGlvbk1vZGU%252FYW5ub3RhdGlvbiYmJ0ZPUk1fQ1JFQVRPUic9PWluc3RhbmNlLnZpZXdTdGF0ZS5pbnRlcmFjdGlvbk1vZGUmJlxuLy9PdGhlcndpc2UsIEkgdXBkYXRlIHRoZSB1c2VyUm9sZSB2YWx1ZVxuc2V0VGltZW91dCgoKCk9Pntjb25zdCBzZWxlY3RlZFJvbGU9aW5zdGFuY2UuY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN1c2VyUm9sZXMnKTtzZWxlY3RlZFJvbGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoZXZlbnQ9Pntjb25zdHt2YWx1ZTp2YWx1ZX09ZXZlbnQudGFyZ2V0LHVzZXJSb2xlPWFubm90YXRpb24uc2V0KCdjdXN0b21EYXRhJyx7dXNlclJvbGU6dmFsdWV9KTtpbnN0YW5jZS51cGRhdGUodXNlclJvbGUpLHNlbGVjdGVkUm9sZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgoKT0%252Be30pKX0pLCExKX0pLDApOmluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlPT52aWV3U3RhdGUuc2V0KCdpbnRlcmFjdGlvbk1vZGUnLG51bGwpKSl9KSksXG4vKlRoaXMgZXZlbnQgbGlzdGVuZXIgaXMganVzdCB0byBkZW1vbnN0cmF0ZSB0aGUgY29ycmVjdCBhbm5vdGF0aW9uIGlzIGdldHRpbmcgXG4gICAgdXBkYXRlZCB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlXG4gICovXG5pbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKCdhbm5vdGF0aW9ucy51cGRhdGUnLChhbm5vdGF0aW9uPT57Y29uc3R7Y3VzdG9tRGF0YTpjdXN0b21EYXRhfT1hbm5vdGF0aW9uLmdldCgwKTtjb25zb2xlLmxvZyhgVXNlciBSb2xlOiAke2N1c3RvbURhdGE%252FLnVzZXJSb2xlfSBmb3IgQW5ub3RhdGlvbjogJHthbm5vdGF0aW9uLmdldCgwKS5pZH1gKX0pKX0pKTsiLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + - Enhance form creator mode by adding a custom dropdown to assign user roles to signature fields. This demo focuses on UI enhancements, dynamically displaying the dropdown when a signature field is selected. — [Video](https://www.youtube.com/watch?v=F3jx7kWNnMI) + +- [Add custom form fields](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tRmt1NE5hekZ6YiIsImxheWVyIjoicmFuZG9tOWZQd2puWDJMdiJ9fSwianMiOiJjb25zdCB1cGRhdGVJbnRlcmF0aXZlID0gKGluc3RhbmNlKSA9PiB7XG4gIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgIHZpZXdTdGF0ZS5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLkZPUk1fQ1JFQVRPUilcbiAgKTtcbiAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BXG4gICAgdmlld1N0YXRlLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuVEVYVF9XSURHRVQpXG4gICk7XG59O1xubGV0IGJ1dHRvbk5hbWU7XG5jb25zdCBmaWVsZHMgPSB7XG4gIG5hbWU6IHsgbmFtZTogXCJjdXN0b21lcl9uYW1lXCIsIHZhbHVlOiBcIkN1c3RvbWVyIG5hbWUgZmllbGRcIiB9LFxuICBlbWFpbDogeyBuYW1lOiBcImN1c3RvbWVyX2VtYWlsXCIsIHZhbHVlOiBcIkN1c3RvbWVyIGVtYWlsIGZpZWxkXCIgfSxcbn07XG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBvbldpZGdldEFubm90YXRpb25DcmVhdGlvblN0YXJ0OiAoYW5ub3RhdGlvbiwgZm9ybUZpZWxkKSA9PiB7XG4gICAgY29uc3QgcmFuZG9tU3RyID0gUFNQREZLaXQuZ2VuZXJhdGVJbnN0YW50SWQoKVxuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uOiBhbm5vdGF0aW9uXG4gICAgICAgIC5zZXQoJ2Zvcm1GaWVsZE5hbWUnLCBgJHtmaWVsZHNbYnV0dG9uTmFtZV0ubmFtZX0tJHtyYW5kb21TdHJ9YClcbiAgICAgICAgLnNldCgnY3VzdG9tRGF0YScsIHtjdXN0b21lckZpZWxkOiB0cnVlfSksXG4gICAgICBmb3JtRmllbGQ6IGZvcm1GaWVsZFxuICAgICAgICAuc2V0KCduYW1lJywgYCR7ZmllbGRzW2J1dHRvbk5hbWVdLm5hbWV9LSR7cmFuZG9tU3RyfWApXG4gICAgICAgIC5zZXQoJ3ZhbHVlJywgZmllbGRzW2J1dHRvbk5hbWVdLnZhbHVlKVxuICAgIH1cbiAgfSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIC8vVGhpcyBidXR0b24gY3JlYXRlcyBhIEZvcm0gRmllbGQgYW5kIFdpZGdldCBwcm9ncmFtbWF0aWNhbGx5XG5cbiAgaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKFtcbiAgICB7IHR5cGU6IFwic3BhY2VyXCIgfSxcbiAgICB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgaWQ6IFwibmFtZVwiLFxuICAgICAgdGl0bGU6IFwiQ3VzdG9tZXIgTmFtZVwiLFxuICAgICAgb25QcmVzczogKGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIEhlcmUgSSdtIHNldHRpbmcgdGhlIGludGVyYWN0aW9uIG1vZGUgdG8gRm9ybSBEZXNpZ25lciBNb2RlIHdpdGggaXRzIHRvb2xcbiAgICAgICAgYnV0dG9uTmFtZSA9IFwibmFtZVwiO1xuICAgICAgICB1cGRhdGVJbnRlcmF0aXZlKGluc3RhbmNlKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgaWQ6IFwiZW1haWxcIixcbiAgICAgIHRpdGxlOiBcIkN1c3RvbWVyIEVtYWlsXCIsXG4gICAgICBvblByZXNzOiAoZXZlbnQpID0%252BIHtcbiAgICAgICAgYnV0dG9uTmFtZSA9IFwiZW1haWxcIjtcbiAgICAgICAgLy8gSGVyZSBJJ20gc2V0dGluZyB0aGUgaW50ZXJhY3Rpb24gbW9kZSB0byBGb3JtIERlc2lnbmVyIE1vZGUgd2l0aCBpdHMgdG9vbFxuICAgICAgICB1cGRhdGVJbnRlcmF0aXZlKGluc3RhbmNlKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiBcImZvcm0tY3JlYXRvclwiLFxuICAgIH0sXG4gIF0pO1xufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLlBTUERGS2l0LUZvcm0tQ3JlYXRvci1FZGl0b3ItRm9ybS1GaWVsZC1OYW1lIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmUgaW1wb3J0YW50O1xuICBvcGFjaXR5OiAwLjUgIWltcG9ydGFudDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxuLlBTUERGS2l0LUZvcm0tQ3JlYXRvci1FZGl0b3ItRGVsZXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + - Dynamically create form fields with unique IDs and custom data when a user interacts with a toolbar button. — [Video](https://www.youtube.com/watch?v=42kpjqLoVYo) + +- [Add name to signature field](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6Ii8vIEdsb2JhbCB2YXJpYWJsZSB0byBzdG9yZSB0aGUgUFNQREZLaXQgaW5zdGFuY2VcbmxldCBnbG9iYWxJbnN0YW5jZTtcblxuLy8gU2V0IHRoZSBkZWZhdWx0IHVzZXJuYW1lIGZvciBhbm5vdGF0aW9uc1xuY29uc3QgdXNlcjEgPSBcIk51dHJpZW50XCI7XG5jb25zdCB1c2VyMiA9IFwiUFNQREZLaXRcIjtcblxuLy8gRnVuY3Rpb24gdG8gcmVuZGVyIGN1c3RvbSBhbm5vdGF0aW9uIGFwcGVhcmFuY2VcbmNvbnN0IGFubm90YXRpb25SZW5kZXJlciA9ICh7IGFubm90YXRpb24gfSkgPT4ge1xuICAvLyBEb24ndCBzaG93IHRoZSBjcmVhdG9yJ3MgbmFtZSBpZiBpdCdzIG5vdCBzZXQgb3IgaXMgZW1wdHkuXG4gIGlmICghYW5ub3RhdGlvbi5jcmVhdG9yTmFtZSB8fCBhbm5vdGF0aW9uLmNyZWF0b3JOYW1lLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gbnVsbDtcblxuICAvLyBDcmVhdGUgYSBjb250YWluZXIgZWxlbWVudCB0byBkaXNwbGF5IHRoZSBhdXRob3IncyBuYW1lXG4gIGNvbnN0IGF1dGhvckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAvLyBDaGVjayBpZiB0aGUgYW5ub3RhdGlvbiBpcyBhIFdpZGdldEFubm90YXRpb24gKGUuZy4sIHNpZ25hdHVyZSBmaWVsZClcbiAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5XaWRnZXRBbm5vdGF0aW9uKSB7XG4gICAgKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFJldHJpZXZlIHRoZSBmb3JtIGZpZWxkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvblxuICAgICAgY29uc3QgZmllbGQgPSAoYXdhaXQgZ2xvYmFsSW5zdGFuY2UuZ2V0Rm9ybUZpZWxkcygpKS5maW5kKFxuICAgICAgICAoZmYpID0%252BXG4gICAgICAgICAgZmYgaW5zdGFuY2VvZiBQU1BERktpdC5Gb3JtRmllbGRzLlNpZ25hdHVyZUZvcm1GaWVsZCAmJlxuICAgICAgICAgIGZmLm5hbWUgPT09IGFubm90YXRpb24uZm9ybUZpZWxkTmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgYW55IG90aGVyIG92ZXJsYXBwaW5nIHNpZ25hdHVyZSBhbm5vdGF0aW9ucyBleGlzdFxuICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdTaWduYXR1cmUgPVxuICAgICAgICBhd2FpdCBnbG9iYWxJbnN0YW5jZS5nZXRPdmVybGFwcGluZ0Fubm90YXRpb25zKGFubm90YXRpb24pO1xuXG4gICAgICAvLyBJZiB0aGUgZmllbGQgZXhpc3RzIGFuZCBubyBvdmVybGFwcGluZyBzaWduYXR1cmVzLCBhZGQgdGhlIGNyZWF0b3IncyBuYW1lXG4gICAgICBpZiAoZmllbGQgJiYgb3ZlcmxhcHBpbmdTaWduYXR1cmUuc2l6ZSA9PT0gMCkge1xuICAgICAgICBhdXRob3JMYWJlbC5jbGFzc0xpc3QuYWRkKGBuYW1lLWxhYmVsLSR7YW5ub3RhdGlvbi5pZH1gKTtcblxuICAgICAgICAvLyBBZGQgdGhlIGFubm90YXRpb24ncyBhdXRob3IgbmFtZSBhcyB0ZXh0XG4gICAgICAgIGF1dGhvckxhYmVsLmFwcGVuZENoaWxkKFxuICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGFubm90YXRpb24uY3JlYXRvck5hbWUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGNyZWF0ZWQgbm9kZS5cbiAgICAgIG5vZGU6IGF1dGhvckxhYmVsLFxuICAgICAgLy8gQXBwZW5kIHRvIHRoZSBhbm5vdGF0aW9uJ3MgYXBwZWFyYW5jZSBpbnN0ZWFkIG9mIHJlcGxhY2luZyBpdC5cbiAgICAgIGFwcGVuZDogdHJ1ZSxcbiAgICAgIC8vIEFsbG93IHpvb21pbmcgdG8gc2NhbGUgdGhlIGFubm90YXRpb24gcHJvcGVybHkuXG4gICAgICBub1pvb206IGZhbHNlLFxuICAgIH07XG4gIH1cbn07XG5cbi8vIExvYWQgUFNQREZLaXQgd2l0aCBjdXN0b20gY29uZmlndXJhdGlvblxuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLCAvLyBTcHJlYWQgdGhlIGJhc2UgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLCAvLyBBcHBseSBkYXJrIHRoZW1lIHRvIHRoZSB2aWV3ZXJcbiAgY3VzdG9tUmVuZGVyZXJzOiB7IEFubm90YXRpb246IGFubm90YXRpb25SZW5kZXJlciB9LCAvLyBBcHBseSB0aGUgY3VzdG9tIGFubm90YXRpb24gcmVuZGVyZXJcbiAgaXNFZGl0YWJsZUFubm90YXRpb246IGZ1bmN0aW9uIChhbm5vdGF0aW9uKSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGFubm90YXRpb24gaXMgYSBzaWduYXR1cmVcbiAgICByZXR1cm4gIWFubm90YXRpb24uaXNTaWduYXR1cmU7IC8vIFJldHVybiB0cnVlIGlmIGl0J3Mgbm90IGEgc2lnbmF0dXJlLCBmYWxzZSBvdGhlcndpc2VcbiAgfSxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIC8vIFN0b3JlIHRoZSBpbnN0YW5jZSBnbG9iYWxseSBmb3IgbGF0ZXIgdXNlXG4gIGdsb2JhbEluc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgLy8gQ3JlYXRlIHRoZSBmaXJzdCB3aWRnZXQgYW5ub3RhdGlvbiAoc2lnbmF0dXJlIGZpZWxkKVxuICBjb25zdCB3aWRnZXQxID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLldpZGdldEFubm90YXRpb24oe1xuICAgIGlkOiBQU1BERktpdC5nZW5lcmF0ZUluc3RhbnRJZCgpLCAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGFubm90YXRpb25cbiAgICBwYWdlSW5kZXg6IDAsIC8vIFBsYWNlIGl0IG9uIHRoZSBmaXJzdCBwYWdlXG4gICAgYm91bmRpbmdCb3g6IG5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHtcbiAgICAgIGxlZnQ6IDEwMCxcbiAgICAgIHRvcDogMzAwLFxuICAgICAgd2lkdGg6IDE1MCxcbiAgICAgIGhlaWdodDogNzUsXG4gICAgfSksIC8vIERlZmluZSBhbm5vdGF0aW9uIHNpemUgYW5kIHBvc2l0aW9uXG4gICAgZm9ybUZpZWxkTmFtZTogXCJmb3JtMVwiLCAvLyBBc3NpZ24gYSBmb3JtIGZpZWxkIG5hbWVcbiAgICBjdXN0b21EYXRhOiB7IGlzSW5pdGlhbHM6IGZhbHNlIH0sIC8vIEN1c3RvbSBmbGFnIChub3QgaW5pdGlhbHMpXG4gICAgY3JlYXRvck5hbWU6IHVzZXIxLCAvLyBTZXQgdGhlIGNyZWF0b3IncyBuYW1lXG4gIH0pO1xuXG4gIC8vIENyZWF0ZSB0aGUgZmlyc3Qgc2lnbmF0dXJlIGZvcm0gZmllbGQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3aWRnZXRcbiAgY29uc3QgZm9ybUZpZWxkMSA9IG5ldyBQU1BERktpdC5Gb3JtRmllbGRzLlNpZ25hdHVyZUZvcm1GaWVsZCh7XG4gICAgbmFtZTogXCJmb3JtMVwiLCAvLyBTZXQgdGhlIGZvcm0gZmllbGQgbmFtZVxuICAgIGFubm90YXRpb25JZHM6IG5ldyBQU1BERktpdC5JbW11dGFibGUuTGlzdChbd2lkZ2V0MS5pZF0pLCAvLyBMaW5rIGFubm90YXRpb24gdG8gdGhlIGZvcm0gZmllbGRcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBzZWNvbmQgd2lkZ2V0IGFubm90YXRpb24gKHNpZ25hdHVyZSBmaWVsZClcbiAgY29uc3Qgd2lkZ2V0MiA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5XaWRnZXRBbm5vdGF0aW9uKHtcbiAgICBpZDogUFNQREZLaXQuZ2VuZXJhdGVJbnN0YW50SWQoKSwgLy8gR2VuZXJhdGUgYSB1bmlxdWUgSUQgZm9yIHRoZSBhbm5vdGF0aW9uXG4gICAgcGFnZUluZGV4OiAwLCAvLyBQbGFjZSBpdCBvbiB0aGUgZmlyc3QgcGFnZVxuICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICBsZWZ0OiAzNTUsXG4gICAgICB0b3A6IDMwMCxcbiAgICAgIHdpZHRoOiAxNTAsXG4gICAgICBoZWlnaHQ6IDc1LFxuICAgIH0pLCAvLyBEZWZpbmUgYW5ub3RhdGlvbiBzaXplIGFuZCBwb3NpdGlvblxuICAgIGZvcm1GaWVsZE5hbWU6IFwiZm9ybTJcIiwgLy8gQXNzaWduIGEgZm9ybSBmaWVsZCBuYW1lXG4gICAgY3VzdG9tRGF0YTogeyBpc0luaXRpYWxzOiB0cnVlIH0sIC8vIEN1c3RvbSBmbGFnICh0aGlzIGlzIGZvciBpbml0aWFscylcbiAgICBjcmVhdG9yTmFtZTogdXNlcjIsIC8vIFNldCB0aGUgY3JlYXRvcidzIG5hbWVcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBzZWNvbmQgc2lnbmF0dXJlIGZvcm0gZmllbGQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3aWRnZXRcbiAgY29uc3QgZm9ybUZpZWxkMiA9IG5ldyBQU1BERktpdC5Gb3JtRmllbGRzLlNpZ25hdHVyZUZvcm1GaWVsZCh7XG4gICAgbmFtZTogXCJmb3JtMlwiLCAvLyBTZXQgdGhlIGZvcm0gZmllbGQgbmFtZVxuICAgIGFubm90YXRpb25JZHM6IG5ldyBQU1BERktpdC5JbW11dGFibGUuTGlzdChbd2lkZ2V0Mi5pZF0pLCAvLyBMaW5rIGFubm90YXRpb24gdG8gdGhlIGZvcm0gZmllbGRcbiAgfSk7XG5cbiAgLy8gQWRkIGJvdGggd2lkZ2V0cyBhbmQgZm9ybSBmaWVsZHMgdG8gdGhlIFBTUERGS2l0IGluc3RhbmNlXG4gIGF3YWl0IGluc3RhbmNlLmNyZWF0ZShbd2lkZ2V0MSwgZm9ybUZpZWxkMSwgd2lkZ2V0MiwgZm9ybUZpZWxkMl0pO1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCEgYnkgTmFyYXNoaW1hblwiKTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuW2NsYXNzKj1cIm5hbWUtbGFiZWxcIl0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuXG4ubmFtZS1sYWJlbC1mYWRlb3V0IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiJ9) + - Create signature form fields and display the creator’s name next to them. — [Video](https://www.youtube.com/watch?v=-LeAvQTuUFg) + +- [Add custom database form fields](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tMTU2VGZzUkY1QSIsImxheWVyIjoicmFuZG9tYVRtalpzcjNyQiJ9fSwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLfSkudGhlbigoaW5zdGFuY2U9PntsZXQgZm9ybURlc2lnbk1vZGU9ITE7aW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcz0%252BWy4uLml0ZW1zLHt0eXBlOidmb3JtLWNyZWF0b3InfV0pKSxpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKCd2aWV3U3RhdGUuY2hhbmdlJywoKHZpZXdTdGF0ZSxwcmV2aW91c1ZpZXdTdGF0ZSk9Pntmb3JtRGVzaWduTW9kZT0hMD09PXZpZXdTdGF0ZS5mb3JtRGVzaWduTW9kZX0pKSxpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKCdhbm5vdGF0aW9ucy5jcmVhdGUnLChjcmVhdGVkQW5ub3RhdGlvbnM9PntpZighMD09PWZvcm1EZXNpZ25Nb2RlKXtsZXQgZm9ybU1vZGFsPWluc3RhbmNlLmNvbnRlbnREb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuUFNQREZLaXQtRm9ybS1DcmVhdG9yLUVkaXRvcicpWzBdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXSxuZXdCdXR0b24xPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuLy8gU2V0IHNvbWUgcHJvcGVydGllcyBmb3IgdGhlIGJ1dHRvblxubmV3QnV0dG9uMS5pbm5lckhUTUw9J0RCIEZpZWxkIDEnLG5ld0J1dHRvbjEuaWQ9J25ld0J1dHRvbklkJyxcbi8vIEFkZCBhbiBvbmNsaWNrIGV2ZW50IHRvIHRoZSBidXR0b25cbm5ld0J1dHRvbjEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLChmdW5jdGlvbigpe2xldCB1cGRhdGVkQW5ub3Q9Y3JlYXRlZEFubm90YXRpb25zLl90YWlsLmFycmF5WzBdLnNldCgnY3VzdG9tRGF0YScse2RiRmllbGQ6JzEnfSk7aW5zdGFuY2UudXBkYXRlKHVwZGF0ZWRBbm5vdCksY29uc29sZS5sb2coJ1VwZGF0ZWQgQW5ub3RhdGlvbicpLGNvbnNvbGUubG9nKHVwZGF0ZWRBbm5vdCl9KSk7XG4vLyBDcmVhdGUgYSBuZXcgYnV0dG9uIGVsZW1lbnRcbmxldCBuZXdCdXR0b24yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuLy8gU2V0IHNvbWUgcHJvcGVydGllcyBmb3IgdGhlIGJ1dHRvblxubmV3QnV0dG9uMi5pbm5lckhUTUw9J0RCIEZpZWxkIDInLG5ld0J1dHRvbjIuaWQ9J25ld0J1dHRvbklkJyxuZXdCdXR0b24yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoZnVuY3Rpb24oKXtsZXQgdXBkYXRlZEFubm90PWNyZWF0ZWRBbm5vdGF0aW9ucy5fdGFpbC5hcnJheVswXS5zZXQoJ2N1c3RvbURhdGEnLHtkYkZpZWxkOicyJ30pO2luc3RhbmNlLnVwZGF0ZSh1cGRhdGVkQW5ub3QpLGNvbnNvbGUubG9nKCdVcGRhdGVkIEFubm90YXRpb24nKSxjb25zb2xlLmxvZyh1cGRhdGVkQW5ub3QpfSkpLGZvcm1Nb2RhbC5hcHBlbmRDaGlsZChuZXdCdXR0b24xKSxmb3JtTW9kYWwuYXBwZW5kQ2hpbGQobmV3QnV0dG9uMil9fSkpfSkpOyIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + - Modify the form creation modal to include buttons for mapping input fields to database fields, allowing users to update the form’s custom data. — [Video](https://www.youtube.com/watch?v=RppsQeOCfis) + +- [Iterate over form fields and widgets and output their properties](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChhc3luYyBpbnN0YW5jZT0%252Be1xuLy8gUmV0cmlldmUgYWxsIGZvcm0gZmllbGRzLlxuY29uc3QgZm9ybUZpZWxkcz1hd2FpdCBpbnN0YW5jZS5nZXRGb3JtRmllbGRzKCksd2lkZ2V0QW5ub3RhdGlvbnM9KGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oe2xlbmd0aDppbnN0YW5jZS50b3RhbFBhZ2VDb3VudH0pLm1hcCgoYXN5bmMoXyxwYWdlSW5kZXgpPT4oYXdhaXQgaW5zdGFuY2UuZ2V0QW5ub3RhdGlvbnMocGFnZUluZGV4KSkuZmlsdGVyKChpdD0%252BaXQgaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5XaWRnZXRBbm5vdGF0aW9uKSkpKSkpLmZsYXRNYXAoKHBhZ2VBbm5vdGF0aW9ucz0%252BcGFnZUFubm90YXRpb25zLnRvQXJyYXkoKSkpO1xuLy8gUmV0cmlldmUgYWxsIHdpZGdldCBhbm5vdGF0aW9ucyBpbiB0aGUgZG9jdW1lbnQuXG5mb3JtRmllbGRzLmZsYXRNYXAoKGZvcm1GaWVsZD0%252Be1xuLy8gVXBkYXRlIGFsbCB3aWRnZXRzIGJhc2VkIG9uIHRoZSBmb3JtIGZpZWxkIHZhbHVlLlxud2lkZ2V0QW5ub3RhdGlvbnMuZmlsdGVyKChhbm5vdGF0aW9uPT5mb3JtRmllbGQuYW5ub3RhdGlvbklkcy5jb250YWlucyhhbm5vdGF0aW9uLmlkKSkpLm1hcCgod2lkZ2V0PT5jb25zb2xlLmxvZygnTmFtZTonK2Zvcm1GaWVsZC5uYW1lKydcXG4nLCdWYWx1ZTonK2Zvcm1GaWVsZC52YWx1ZSsnXFxuJywnUmVjdDonK3dpZGdldC5ib3VuZGluZ0JveCsnXFxuJywnUGFnZUluZGV4Oicrd2lkZ2V0LnBhZ2VJbmRleCkpKX0pKX0pKTsiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + +- [Set radio button and checkbox values](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIn0sIm1vZGUiOiJzdGFuZGFsb25lIiwianMiOiIvLyBMb2FkIFBTUERGS2l0IHdpdGggc3BlY2lmaWMgY29uZmlndXJhdGlvbnNcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucywgLy8gU3ByZWFkIHRoZSBiYXNlIG9wdGlvbnMgdG8gcmV0YWluIGRlZmF1bHQgY29uZmlndXJhdGlvbnNcblxuICB0b29sYmFySXRlbXM6IFtcbiAgICAuLi5QU1BERktpdC5kZWZhdWx0VG9vbGJhckl0ZW1zLCAvLyBJbmNsdWRlIGRlZmF1bHQgdG9vbGJhciBpdGVtc1xuICAgIHsgdHlwZTogXCJmb3JtLWNyZWF0b3JcIiB9LCAvLyBBZGQgYSBmb3JtIGNyZWF0b3IgdG9vbCB0byB0aGUgdG9vbGJhclxuICBdLFxufSlcbiAgLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQgc3VjY2Vzc2Z1bGx5ISBieSBOYXJhc2hpbWFuXCIpOyAvLyBMb2cgc3VjY2VzcyBtZXNzYWdlXG5cbiAgICAvLyBSZXRyaWV2ZSBhbGwgZm9ybSBmaWVsZHMgYW5kIHVwZGF0ZSB0aGUgdmFsdWUgb2YgcmFkaW8gYnV0dG9uc1xuICAgIChhd2FpdCBpbnN0YW5jZS5nZXRGb3JtRmllbGRzKCkpLmZvckVhY2goKGZvcm1GaWVsZCkgPT4ge1xuICAgICAgaWYgKGZvcm1GaWVsZCBpbnN0YW5jZW9mIFBTUERGS2l0LkZvcm1GaWVsZHMuUmFkaW9CdXR0b25Gb3JtRmllbGQpIHtcbiAgICAgICAgLy8gU2V0IHRoZSByYWRpbyBidXR0b24gdmFsdWUgdG8gXCJZZXNcIlxuICAgICAgICBpbnN0YW5jZS5zZXRGb3JtRmllbGRWYWx1ZXMoeyBbZm9ybUZpZWxkLm5hbWVdOiBcIlllc1wiIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gR2V0IGFsbCBmb3JtIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnRcbiAgICBjb25zdCBmb3JtRmllbGRzID0gYXdhaXQgaW5zdGFuY2UuZ2V0Rm9ybUZpZWxkcygpO1xuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBmb3JtIGZpZWxkcyB0byBmaW5kIGNoZWNrYm94ZXNcbiAgICBmb3IgKGNvbnN0IGZvcm1GaWVsZCBvZiBmb3JtRmllbGRzKSB7XG4gICAgICBpZiAoZm9ybUZpZWxkIGluc3RhbmNlb2YgUFNQREZLaXQuRm9ybUZpZWxkcy5DaGVja0JveEZvcm1GaWVsZCkge1xuICAgICAgICAvLyBDaGVjayB0aGUgY2hlY2tib3ggYnkgc2V0dGluZyBpdHMgdmFsdWUgdG8gXCJZZXNcIlxuICAgICAgICBhd2FpdCBpbnN0YW5jZS5zZXRGb3JtRmllbGRWYWx1ZXMoe1xuICAgICAgICAgIFtmb3JtRmllbGQubmFtZV06IFBTUERGS2l0LkltbXV0YWJsZS5MaXN0KFtcIlllc1wiXSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBDaGVja2JveCBDaGVja2VkIHdpdGggdmFsdWVzIHllczogJHtmb3JtRmllbGQubmFtZX0gLT4gXCJZZXNcImBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIC5jYXRjaCgoZXJyb3IpID0%252BIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgbG9hZGluZyBOdXRyaWVudDpcIiwgZXJyb3IpOyAvLyBMb2cgYW55IGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBQU1BERktpdCBsb2FkaW5nXG4gIH0pO1xuIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) + - Use custom configurations to automatically set values for radio buttons and checkboxes in a PDF form. — [Video](https://www.youtube.com/watch?v=JjCYGL2ff74) + +- [Highlight all required fields](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb203Q1FKbkZwdVFWIiwibGF5ZXIiOiJyYW5kb21lNXNocEtoSHdsIn19LCJqcyI6Ii8vIFZhcmlhYmxlIHRvIHN0b3JlIHJlcXVpcmVkIGZvcm0gZmllbGRzXG5sZXQgcmVxdWlyZWRGb3JtRmllbGRzO1xuXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuXG4gIC8vIERlZmluZSBjdXN0b20gcmVuZGVyZXJzIGZvciBhbm5vdGF0aW9uc1xuICBjdXN0b21SZW5kZXJlcnM6IHtcbiAgICBBbm5vdGF0aW9uOiAoeyBhbm5vdGF0aW9uIH0pID0%252BIHtcbiAgICAgIC8vIFNraXAgaWYgYW5ub3RhdGlvbiBpcyBub3QgYSB3aWRnZXQgKGZvcm0gZmllbGQpXG4gICAgICBpZiAoIShhbm5vdGF0aW9uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuV2lkZ2V0QW5ub3RhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgZm9ybSBmaWVsZCBpcyBpbiBvdXIgcmVxdWlyZWQgZmllbGRzIGxpc3RcbiAgICAgIGNvbnN0IGlzUmVxdWlyZWRGaWVsZCA9XG4gICAgICAgIHJlcXVpcmVkRm9ybUZpZWxkcy5zaXplID4gMCAmJlxuICAgICAgICByZXF1aXJlZEZvcm1GaWVsZHMuZmluZChcbiAgICAgICAgICAoZm9ybUZpZWxkKSA9PiBmb3JtRmllbGQubmFtZSA9PT0gYW5ub3RhdGlvbi5mb3JtRmllbGROYW1lXG4gICAgICAgICk7XG5cbiAgICAgIC8vIElmIGl0J3MgYSByZXF1aXJlZCBmaWVsZCwgY3JlYXRlIGEgY3VzdG9tIHdyYXBwZXIgd2l0aCBzcGVjaWFsIHN0eWxpbmdcbiAgICAgIGlmIChpc1JlcXVpcmVkRmllbGQpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChcInJlcXVpcmVkLWZvcm0tZmllbGRcIik7XG4gICAgICAgIC8vIFNlZSBDU1MgdGFiIGZvciBzdHlsaW5nIG9mIC5yZXF1aXJlZC1mb3JtLWZpZWxkXG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBub2RlIHdpdGggYXBwZW5kIGZsYWcgdG8gcHJlc2VydmUgZGVmYXVsdCByZW5kZXJpbmdcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGFwcGVuZDogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIG51bGwgZm9yIG5vbi1yZXF1aXJlZCBmaWVsZHMgKGRlZmF1bHQgcmVuZGVyaW5nKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgfSxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIC8vIEdldCBhbGwgZm9ybSBmaWVsZHNcbiAgY29uc3QgZm9ybUZpZWxkcyA9IGF3YWl0IGluc3RhbmNlLmdldEZvcm1GaWVsZHMoKTtcbiAgLy8gTWFyayB0aGVtIGFzIHJlcXVpcmVkXG4gIGNvbnN0IGNoYW5nZXMgPSBmb3JtRmllbGRzLm1hcCgoZm9ybUZpZWxkKSA9PlxuICAgIGZvcm1GaWVsZC5zZXQoXCJyZXF1aXJlZFwiLCB0cnVlKVxuICApO1xuXG4gIC8vIEFwcGx5IHRoZSBjaGFuZ2VzIHRvIG1ha2UgZmllbGRzIHJlcXVpcmVkXG4gIGF3YWl0IGluc3RhbmNlLnVwZGF0ZShjaGFuZ2VzKTtcblxuICAvLyBHZXQgdXBkYXRlZCBmb3JtIGZpZWxkc1xuICBjb25zdCB1cGRhdGVkRm9ybUZpZWxkcyA9IGF3YWl0IGluc3RhbmNlLmdldEZvcm1GaWVsZHMoKTtcbiAgXG4gIC8vIEZpbHRlciBvbmx5IHJlcXVpcmVkIGZpZWxkc1xuICAvLyBPcHRpb25hbCAtIGFsbCBmb3JtIGZpZWxkcyBpbiB0aGlzIGV4YW1wbGUgYXJlIHJlcXVpcmVkXG4gIHJlcXVpcmVkRm9ybUZpZWxkcyA9IHVwZGF0ZWRGb3JtRmllbGRzLmZpbHRlcihcbiAgICAoZm9ybUZpZWxkKSA9PiBmb3JtRmllbGQucmVxdWlyZWQgJiYgZm9ybUZpZWxkXG4gICk7XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4ucmVxdWlyZWQtZm9ybS1maWVsZDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiICpcIjtcbiAgY29sb3I6IHJlZDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IC0xMnB4O1xuICB0b3A6IDM1JTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuIn0%253D) + - Mark all form fields as required, and visually highlight them using a custom renderer. — [Video](https://www.youtube.com/watch?v=tt-C3Ps9gj4) + diff --git a/playground/web-redaction.md b/playground/web-redaction.md new file mode 100644 index 0000000..cfb34ff --- /dev/null +++ b/playground/web-redaction.md @@ -0,0 +1,24 @@ +# Web SDK Examples: Redaction + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/annotation/README.md](../web/annotation/README.md). + +--- + +## Redaction + +- [Redact keywords programmatically](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21WS2V6VG00d2hVIiwibGF5ZXIiOiJyYW5kb21TbThmV0s5RnRQIn19LCJqcyI6Ii8qKlxuICogSW5pdGlhbGl6ZXMgUFNQREZLaXQgYW5kIHBlcmZvcm1zIGJhdGNoIHJlZGFjdGlvbiBvZiBzZW5zaXRpdmUgaW5mb3JtYXRpb25cbiAqIEF1dG9tYXRpY2FsbHkgcmVkYWN0cyBzcGVjaWZpZWQgcGxhY2UgbmFtZXMgYW5kIHBlcnNvbmFsIG5hbWVzIGZyb20gdGhlIGRvY3VtZW50XG4gKi9cblxuLy8gTGlzdHMgb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHRvIGJlIHJlZGFjdGVkXG5jb25zdCBTRU5TSVRJVkVfREFUQSA9IHtcbiAgcGxhY2VzOiBbXG4gICAgXCJLb3JhbVwiLFxuICAgIFwiTm9tU2FvXCIsXG4gICAgXCJVZ2FuZGFcIixcbiAgICBcIk5nb2dvXCIsXG4gICAgXCJUaGFpbGFuZFwiLFxuICAgIFwiTXlhbm1hclwiXG4gIF0sXG4gIG5hbWVzOiBbXG4gICAgXCJMeWRpYSBWIEx1bmN6XCIsXG4gICAgXCJBbWFuZGEgVGFuXCIsXG4gICAgXCJNaWNoYWVsIEhhc2xhbVwiLFxuICAgIFwiTGFycyBLdWxpa1wiLFxuICAgIFwiVG9tb3MgUHJvZmZpdHRcIixcbiAgICBcIlN1Y2hpbmRhIE1hbGFpdmlqaXRub25kXCIsXG4gICAgXCJNaWNoYWVsIEd1bWVydFwiXG4gIF1cbn07XG5cbi8vIERlZmF1bHQgc2VhcmNoIG9wdGlvbnMgZm9yIHJlZGFjdGlvblxuY29uc3QgUkVEQUNUSU9OX1NFQVJDSF9PUFRJT05TID0ge1xuICBzZWFyY2hUeXBlOiBQU1BERktpdC5TZWFyY2hUeXBlLlRFWFQsXG4gIHNlYXJjaEluQW5ub3RhdGlvbnM6IGZhbHNlLFxuICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgc3RhcnRQYWdlSW5kZXg6IDBcbn07XG5cblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUktcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gQ3JlYXRlIHJlZGFjdGlvbnMgZm9yIHBsYWNlc1xuICAgIGNvbnNvbGUubG9nKCdDcmVhdGluZyByZWRhY3Rpb25zIGZvciBwbGFjZXMuLi4nKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFNFTlNJVElWRV9EQVRBLnBsYWNlcy5tYXAocGxhY2UgPT4gXG4gICAgICAgIGluc3RhbmNlLmNyZWF0ZVJlZGFjdGlvbnNCeVNlYXJjaChwbGFjZSwgUkVEQUNUSU9OX1NFQVJDSF9PUFRJT05TKVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgcmVkYWN0aW9ucyBmb3IgbmFtZXNcbiAgICBjb25zb2xlLmxvZygnQ3JlYXRpbmcgcmVkYWN0aW9ucyBmb3IgbmFtZXMuLi4nKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFNFTlNJVElWRV9EQVRBLm5hbWVzLm1hcChuYW1lID0%252BIFxuICAgICAgICBpbnN0YW5jZS5jcmVhdGVSZWRhY3Rpb25zQnlTZWFyY2gobmFtZSwgUkVEQUNUSU9OX1NFQVJDSF9PUFRJT05TKVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBBcHBseSBhbGwgcmVkYWN0aW9ucyB0byB0aGUgZG9jdW1lbnRcbiAgICBjb25zb2xlLmxvZygnQXBwbHlpbmcgYWxsIHJlZGFjdGlvbnMuLi4nKTtcbiAgICBhd2FpdCBpbnN0YW5jZS5hcHBseVJlZGFjdGlvbnMoKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnQmF0Y2ggcmVkYWN0aW9uIGNvbXBsZXRlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGJhdGNoIHJlZGFjdGlvbjonLCBlcnJvcik7XG4gIH1cbn0pOyIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + - Load a PDF, search for keywords, create redaction annotations over the found text, and apply the redactions to permanently remove the text. — [Video](https://www.youtube.com/watch?v=eGfnOXXTjWo) + +- [Apply redactions to text with an overlay](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21IYm5aaFZLTnRCIiwibGF5ZXIiOiJyYW5kb21EWXN5NjgzZUxFIn19LCJqcyI6Ii8qKlxuICogSW5pdGlhbGl6ZXMgUFNQREZLaXQgYW5kIGNyZWF0ZXMgcmVkYWN0aW9ucyBmb3IgYWxsIHRleHQgaW4gdGhlIGRvY3VtZW50XG4gKiBDcmVhdGVzIGEgcmVkYWN0aW9uIGFubm90YXRpb24gZm9yIGVhY2ggbGluZSBvZiB0ZXh0IGFuZCBhcHBsaWVzIHRoZW1cbiAqL1xuXG4vLyBDb25maWd1cmF0aW9uIGZvciByZWRhY3Rpb24gYW5ub3RhdGlvbnNcbmNvbnN0IFJFREFDVElPTl9DT05GSUcgPSB7XG4gIGNvbG9yOiBQU1BERktpdC5Db2xvci5SRUQsXG4gIG92ZXJsYXlUZXh0OiBcIlJFREFDVEVEXCIsXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWRhY3Rpb24gYW5ub3RhdGlvbiBmb3IgYSB0ZXh0IGxpbmVcbiAqIEBwYXJhbSB7UFNQREZLaXQuVGV4dExpbmV9IHRleHRMaW5lIC0gVGhlIHRleHQgbGluZSB0byByZWRhY3RcbiAqIEByZXR1cm5zIHtQU1BERktpdC5Bbm5vdGF0aW9ucy5SZWRhY3Rpb25Bbm5vdGF0aW9ufSBUaGUgcmVkYWN0aW9uIGFubm90YXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUmVkYWN0aW9uRnJvbVRleHRMaW5lKHRleHRMaW5lKSB7XG4gIGNvbnN0IHsgYm91bmRpbmdCb3gsIHBhZ2VJbmRleCB9ID0gdGV4dExpbmU7XG5cbiAgcmV0dXJuIG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5SZWRhY3Rpb25Bbm5vdGF0aW9uKHtcbiAgICBpZDogUFNQREZLaXQuZ2VuZXJhdGVJbnN0YW50SWQoKSxcbiAgICBwYWdlSW5kZXgsXG4gICAgYm91bmRpbmdCb3gsXG4gICAgcmVjdHM6IG5ldyBQU1BERktpdC5JbW11dGFibGUuTGlzdChbYm91bmRpbmdCb3hdKSxcbiAgICAuLi5SRURBQ1RJT05fQ09ORklHLFxuICB9KTtcbn1cblxuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coXCJTdGFydGluZyBmdWxsIGRvY3VtZW50IHJlZGFjdGlvbi4uLlwiKTtcblxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBwYWdlIGluZGljZXMgYmFzZWQgb24gdG90YWwgcGFnZSBjb3VudFxuICAgIGNvbnN0IHBhZ2VJbmRpY2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogaW5zdGFuY2UudG90YWxQYWdlQ291bnQgfSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBwYWdlIGluZGV4IGFuZCBnZXRzIHRleHQgbGluZXMgb24gcGFnZVxuICAgIC8vIFdhaXQgZm9yIGFsbCBwYWdlcyB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICBjb25zdCBhbGxQYWdlc1RleHRMaW5lcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFnZUluZGljZXMubWFwKCh2YWx1ZSwgaW5kZXgpID0%252BIGluc3RhbmNlLnRleHRMaW5lc0ZvclBhZ2VJbmRleChpbmRleCkpXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBhcnJheSBvZiByZWRhY3Rpb24gYW5ub3RhdGlvbnMgZm9yIGFsbCB0ZXh0IGxpbmVzXG4gICAgY29uc29sZS5sb2coXCJDcmVhdGluZyByZWRhY3Rpb24gYW5ub3RhdGlvbnMuLi5cIik7XG4gICAgY29uc3QgcmVkYWN0aW9uQW5ub3RhdGlvbnMgPSBhbGxQYWdlc1RleHRMaW5lcy5mbGF0TWFwKChwYWdlVGV4dExpbmVzKSA9PlxuICAgICAgcGFnZVRleHRMaW5lcy5yZWR1Y2UoXG4gICAgICAgIChhbm5vdGF0aW9ucywgdGV4dExpbmUpID0%252BIFtcbiAgICAgICAgICAuLi5hbm5vdGF0aW9ucyxcbiAgICAgICAgICBjcmVhdGVSZWRhY3Rpb25Gcm9tVGV4dExpbmUodGV4dExpbmUpLFxuICAgICAgICBdLFxuICAgICAgICBbXVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYW5kIGFwcGx5IHRoZSByZWRhY3Rpb25zXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgQ3JlYXRpbmcgJHtyZWRhY3Rpb25Bbm5vdGF0aW9ucy5sZW5ndGh9IHJlZGFjdGlvbiBhbm5vdGF0aW9ucy4uLmBcbiAgICApO1xuICAgIGF3YWl0IGluc3RhbmNlLmNyZWF0ZShyZWRhY3Rpb25Bbm5vdGF0aW9ucyk7XG5cbiAgICBjb25zb2xlLmxvZyhcIkFwcGx5aW5nIHJlZGFjdGlvbnMuLi5cIik7XG4gICAgYXdhaXQgaW5zdGFuY2UuYXBwbHlSZWRhY3Rpb25zKCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIkRvY3VtZW50IHJlZGFjdGlvbiBjb21wbGV0ZVwiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIGRvY3VtZW50IHJlZGFjdGlvbjpcIiwgZXJyb3IpO1xuICB9XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + - Load a PDF, retrieve all text lines from every page, create redaction annotations over the detected text using an overlay, and apply the redactions to the document. — [Video](https://www.youtube.com/watch?v=IIciwmN-LZ4) + +- [Approve or reject redactions before applying](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/annotation/redact-one-by-one) + +- [Approve or reject redactions before applying — Playground](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIn0sImpzIjoiLy8gRGVjbGFyZSB0aGUgUFNQREZLaXQgaW5zdGFuY2UgdmFyaWFibGVcbmxldCBpbnN0YW5jZTtcblxuLy8gRnVuY3Rpb24gdG8gcmV0cmlldmUgYWxsIHJlZGFjdGlvbiBhbm5vdGF0aW9ucyBpbiB0aGUgZG9jdW1lbnRcbmNvbnN0IGdldEFsbEFubm90YXRpb25zID0gYXN5bmMgKCkgPT4ge1xuICBsZXQgYW5ub3RhdGlvbnNMaXN0ID0gUFNQREZLaXQuSW1tdXRhYmxlLkxpc3QoKTsgLy8gSW5pdGlhbGl6ZSBhbiBpbW11dGFibGUgbGlzdCB0byBzdG9yZSBhbm5vdGF0aW9uc1xuXG4gIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgcGFnZXMgdG8gY29sbGVjdCByZWRhY3Rpb24gYW5ub3RhdGlvbnNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0YW5jZS50b3RhbFBhZ2VDb3VudCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGFubnMgPSAoYXdhaXQgaW5zdGFuY2UuZ2V0QW5ub3RhdGlvbnMoaSkpLmZpbHRlcihcbiAgICAgIChhKSA9PiBhIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuUmVkYWN0aW9uQW5ub3RhdGlvbiAvLyBGaWx0ZXIgb25seSByZWRhY3Rpb24gYW5ub3RhdGlvbnNcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKGFubnMpOyAvLyBMb2cgcmVkYWN0aW9uIGFubm90YXRpb25zIGZvciBkZWJ1Z2dpbmdcbiAgICBhbm5vdGF0aW9uc0xpc3QgPSBhbm5vdGF0aW9uc0xpc3QuY29uY2F0KGFubnMpOyAvLyBDb25jYXRlbmF0ZSBhbm5vdGF0aW9ucyB0byB0aGUgbGlzdFxuICB9XG4gIHJldHVybiBhbm5vdGF0aW9uc0xpc3Q7IC8vIFJldHVybiB0aGUgbGlzdCBvZiByZWRhY3Rpb24gYW5ub3RhdGlvbnNcbn07XG5cbi8vIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBhbm5vdGF0aW9uIHRvb2x0aXBzXG5jb25zdCByZWRhY3Rpb25Bbm5vdGF0aW9uc0hhbmRsZXJDYWxsYmFjayA9IChhbm5vdGF0aW9uKSA9PlxuICAvLyBDaGVjayBpZiB0aGUgYW5ub3RhdGlvbiBpcyBhIHJlZGFjdGlvbiBhbm5vdGF0aW9uXG4gIGFubm90YXRpb24gaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5SZWRhY3Rpb25Bbm5vdGF0aW9uXG4gICAgPyBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImN1c3RvbVwiLCAvLyBEZWZpbmUgYXMgYSBjdXN0b20gdG9vbHRpcCBpdGVtXG4gICAgICAgICAgdGl0bGU6IFwiQWNjZXB0XCIsIC8vIExhYmVsIGZvciB0aGUgYWNjZXB0IG9wdGlvblxuICAgICAgICAgIGlkOiBcInRvb2x0aXAtYWNjZXB0LWFubm90YXRpb25cIiwgLy8gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0b29sdGlwXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlRvb2x0aXBJdGVtLUR1cGxpY2F0aW9uXCIsIC8vIENTUyBjbGFzcyBmb3Igc3R5bGluZ1xuICAgICAgICAgIG9uUHJlc3M6IGFzeW5jICgpID0%252BIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgcmVkYWN0aW9uIGFubm90YXRpb25zIGV4Y2VwdCB0aGUgY3VycmVudCBvbmVcbiAgICAgICAgICAgIGNvbnN0IGFsbFJlZGFjdGlvbkFubm90YXRpb25zID0gKGF3YWl0IGdldEFsbEFubm90YXRpb25zKCkpLmZpbHRlcihcbiAgICAgICAgICAgICAgKGEpID0%252BIGEuaWQgIT09IGFubm90YXRpb24uaWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgb3RoZXIgcmVkYWN0aW9uIGFubm90YXRpb25zLCBhcHBseSByZWRhY3Rpb25zLCBhbmQgcmVzdG9yZSB0aGVtXG4gICAgICAgICAgICBhd2FpdCBpbnN0YW5jZS5kZWxldGUoYWxsUmVkYWN0aW9uQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgYXdhaXQgaW5zdGFuY2UuYXBwbHlSZWRhY3Rpb25zKCk7XG4gICAgICAgICAgICBhd2FpdCBpbnN0YW5jZS5jcmVhdGUoYWxsUmVkYWN0aW9uQW5ub3RhdGlvbnMpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImN1c3RvbVwiLCAvLyBEZWZpbmUgYXMgYSBjdXN0b20gdG9vbHRpcCBpdGVtXG4gICAgICAgICAgdGl0bGU6IFwiUmVqZWN0XCIsIC8vIExhYmVsIGZvciB0aGUgcmVqZWN0IG9wdGlvblxuICAgICAgICAgIGlkOiBcInRvb2x0aXAtcmVqZWN0LWFubm90YXRpb25cIiwgLy8gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0b29sdGlwXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlRvb2x0aXBJdGVtLUR1cGxpY2F0aW9uXCIsIC8vIENTUyBjbGFzcyBmb3Igc3R5bGluZ1xuICAgICAgICAgIG9uUHJlc3M6IGFzeW5jICgpID0%252BIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmRlbGV0ZShhbm5vdGF0aW9uKTsgLy8gRGVsZXRlIHRoZSBzZWxlY3RlZCByZWRhY3Rpb24gYW5ub3RhdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdXG4gICAgOiBbXTsgLy8gUmV0dXJuIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBhbm5vdGF0aW9uIGlzIG5vdCBhIHJlZGFjdGlvbiBhbm5vdGF0aW9uXG5cbi8vIExvYWQgUFNQREZLaXQgd2l0aCBjb25maWd1cmF0aW9uc1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLCAvLyBTcHJlYWQgYmFzZSBvcHRpb25zIHRvIHJldGFpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLCAvLyBTZXQgdGhlbWUgdG8gZGFyayBtb2RlXG4gIGVuYWJsZUF1dG9tYXRpY0xpbmtFeHRyYWN0aW9uOiB0cnVlLCAvLyBFbmFibGUgYXV0b21hdGljIGxpbmsgZGV0ZWN0aW9uIGluIHRoZSBkb2N1bWVudFxuICBhbm5vdGF0aW9uVG9vbHRpcENhbGxiYWNrOiByZWRhY3Rpb25Bbm5vdGF0aW9uc0hhbmRsZXJDYWxsYmFjaywgLy8gQXNzaWduIGN1c3RvbSB0b29sdGlwIGNhbGxiYWNrXG4gIHRvb2xiYXJJdGVtczogW1xuICAgIC4uLlBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMsIC8vIEluY2x1ZGUgZGVmYXVsdCB0b29sYmFyIGl0ZW1zXG4gICAgeyB0eXBlOiBcInJlZGFjdC1yZWN0YW5nbGVcIiB9LCAvLyBBZGQgcmVkYWN0aW9uIHJlY3RhbmdsZSB0b29sXG4gICAgeyB0eXBlOiBcInJlZGFjdC10ZXh0LWhpZ2hsaWdodGVyXCIgfSwgLy8gQWRkIHJlZGFjdGlvbiB0ZXh0IGhpZ2hsaWdodGVyIHRvb2xcbiAgXSxcbn0pLnRoZW4oKF9pbnN0YW5jZSkgPT4ge1xuICBpbnN0YW5jZSA9IF9pbnN0YW5jZTsgLy8gQXNzaWduIHRoZSBsb2FkZWQgaW5zdGFuY2UgdG8gdGhlIGdsb2JhbCB2YXJpYWJsZVxuICBjb25zb2xlLmxvZyhcIlBTUERGS2l0IGxvYWRlZCEgYnkgTmFyYXNoaW1hblwiKTsgLy8gTG9nIGEgbWVzc2FnZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsIGxvYWRpbmdcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmN1c3RvbS10b29sYmFyLWl0ZW0ge1xuICBoZWlnaHQ6IDEwMCU7XG59XG4ifQ%253D%253D) + - Manage redaction annotations from an annotation tooltip with two options that allow you to apply or reject redactions one by one. — [Video](https://www.youtube.com/watch?v=1vAsjBmU1FA) + +- [Add a custom tooltip to a redaction annotation](https://www.nutrient.io/playground?p=eyJ2IjoxLCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkssdG9vbGJhckl0ZW1zOlsuLi5QU1BERktpdC5kZWZhdWx0VG9vbGJhckl0ZW1zLHt0eXBlOidyZWRhY3QtcmVjdGFuZ2xlJ30se3R5cGU6J3JlZGFjdC10ZXh0LWhpZ2hsaWdodGVyJ31dLGFubm90YXRpb25Ub29sdGlwQ2FsbGJhY2s6YW5uPT57aWYoYW5uIGluc3RhbmNlb2YgUFNQREZLaXQuQW5ub3RhdGlvbnMuUmVkYWN0aW9uQW5ub3RhdGlvbil7Y29uc3Qgc2VsZWN0Tm9kZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtyZXR1cm4gc2VsZWN0Tm9kZS5jbGFzc05hbWU9J3NlbGVjdC1ub2RlJyxzZWxlY3ROb2RlLmlubmVySFRNTD0nVGVzdCcsW3t0eXBlOidjdXN0b20nLGlkOidteS1idXR0b24nLG5vZGU6c2VsZWN0Tm9kZSxvblByZXNzOmV2ZW50PT57YWxlcnQoJ2hlbGxvIGZyb20gbXkgYnV0dG9uJyl9fV19cmV0dXJuW119fSkudGhlbigoYXN5bmMgaW5zdGFuY2U9Pntjb25zdCByZWRhY3Rpb25JZD1hd2FpdCBpbnN0YW5jZS5jcmVhdGVSZWRhY3Rpb25zQnlTZWFyY2goJ1NldCBvZiBLaXRjaGVuJyk7YXdhaXQgaW5zdGFuY2Uuc2V0U2VsZWN0ZWRBbm5vdGF0aW9ucyhyZWRhY3Rpb25JZCl9KSk7Iiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJhbm5vdGF0aW9ucy5wZGYiLCJqd3QiOnsicGVybWlzc2lvbnMiOlsicmVhZC1kb2N1bWVudCIsIndyaXRlIl0sInVzZXJJZCI6InJhbmRvbU9GZDlxdzAwdVAiLCJsYXllciI6InJhbmRvbVNLR3hlUjVubXUifX0sImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cbi5QU1BERktpdC1Qb3BvdmVyLUFubm90YXRpb24tVG9vbHRpcCB7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLnNlbGVjdC1ub2RlIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgYmFja2dyb3VuZDogIzNkNDY0ZDtcbiAgbWluLXdpZHRoOiA0NHB4O1xuICBib3JkZXI6IDAgc29saWQgIzAwMDA7XG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgaGVpZ2h0OiAyNXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAtMTVweDtcbiAgdG9wOiAtMTBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uc2VsZWN0LW5vZGU6OmFmdGVyIHtcbiAgY29udGVudDogXCJcIjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IC01cHg7IC8qIEFkanVzdHMgdGhlIGFycm93IHBvc2l0aW9uIHRvIGxvb2sgYXR0YWNoZWQgdG8gdGhlIGJ1dHRvbiAqL1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci10b3A6IDVweCBzb2xpZCAjM2Q0NjRkOyAvKiBBcnJvdyBjb2xvciAqL1xufVxuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + - Add redaction tools to the toolbar and modify the tooltip behavior for redaction annotations. — [Video](https://www.youtube.com/watch?v=b1pMsyNb8y8) + diff --git a/playground/web-signing.md b/playground/web-signing.md new file mode 100644 index 0000000..646ff0f --- /dev/null +++ b/playground/web-signing.md @@ -0,0 +1,42 @@ +# Web SDK Examples: Signing + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/signing/README.md](../web/signing/README.md). + +--- + +## Signing + +- [Disable signature annotation editing](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIn0sImpzIjoiLy8gTG9hZCBQU1BERktpdCB3aXRoIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsIC8vIFNwcmVhZCB0aGUgYmFzZSBvcHRpb25zIHRvIHJldGFpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zXG5cbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssIC8vIFNldCB0aGUgdGhlbWUgdG8gZGFyayBtb2RlIGZvciBiZXR0ZXIgdmlzaWJpbGl0eVxuXG4gIGlzRWRpdGFibGVBbm5vdGF0aW9uOiBmdW5jdGlvbiAoYW5ub3RhdGlvbikge1xuICAgIC8vIEZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGFubm90YXRpb24gaXMgZWRpdGFibGVcblxuICAgIC8vIENoZWNrIGlmIHRoZSBhbm5vdGF0aW9uIGlzIGEgc2lnbmF0dXJlXG4gICAgcmV0dXJuICFhbm5vdGF0aW9uLmlzU2lnbmF0dXJlOyAvLyBSZXR1cm4gdHJ1ZSBpZiBpdCdzIG5vdCBhIHNpZ25hdHVyZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gIH0sXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAvLyBDYWxsYmFjayBmdW5jdGlvbiBleGVjdXRlZCBhZnRlciBQU1BERktpdCBoYXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZFxuICBjb25zb2xlLmxvZyhcIlBTUERGS2l0IGxvYWRlZCEgYnkgTmFyYXNoaW1hblwiKTsgLy8gTG9nIGEgbWVzc2FnZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsIGxvYWRpbmdcbn0pO1xuIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + - Customize the editability of annotations by preventing users from modifying signature annotations. — [Video](https://www.youtube.com/watch?v=uOZbzjrgs8A) + +- [Automate signature placement in form fields and restrict signature placement to other fields](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJtb2RlIjoic3RhbmRhbG9uZSIsImpzIjoiUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbn0pLnRoZW4oYXN5bmMoaW5zdGFuY2UpID0%2BIHtcbiAgbGV0IHN0b3JlZFNpZ25hdHVyZTtcblxuICAvL0dldHRpbmcgYWxsIGZvcm0gZmllbGRzIHRvIHVzZSBpbiBhbm5vdGF0aW9uIHByZXNzIGV2ZW50XG4gIGNvbnN0IGZvcm1GaWVsZHMgPSBhd2FpdCBpbnN0YW5jZS5nZXRGb3JtRmllbGRzKCk7XG5cbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcImFubm90YXRpb25zLmNyZWF0ZVwiLCAoYW5ub3RhdGlvbnMpID0%2BIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnMuZ2V0KDApO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGFubm90YXRpb24uaXNTaWduYXR1cmUgJiYgYW5ub3RhdGlvbjtcblxuICAgIGlmIChzaWduYXR1cmUpIHtcbiAgICAgIHN0b3JlZFNpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbiAgICB9XG4gIH0pO1xuXG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbm5vdGF0aW9ucy5wcmVzc1wiLCAoZXZlbnQpID0%2BIHtcbiAgICBjb25zdCB7YW5ub3RhdGlvbjogd2lkZ2V0fSA9IGV2ZW50XG5cbiAgICAvL0dldHRpbmcgdGhlIGlkIG9mIHRoZSB3aWRnZXQgdG8gc2VlIGlmIGFueSBmb3JtIGZpZWxkIGhhcyBpdFxuICAgIGNvbnN0IHtpZH0gPSB3aWRnZXRcbiAgICAvL0NoZWNraW5nIGlmIHRoZSB3aWRnZXQgaGFzIGEgZm9ybSBmaWVsZCBvZiB0eXBlIFNpZ25hdHVyZVxuICAgIGNvbnN0IGlzV2lkZ2V0U2lnbmF0dXJlID0gZm9ybUZpZWxkcy5zb21lKGZvcm09PntcbiAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIFBTUERGS2l0LkZvcm1GaWVsZHMuU2lnbmF0dXJlRm9ybUZpZWxkICYmIGZvcm0uYW5ub3RhdGlvbklkcy5zb21lKGlkcz0%2BaWRzPT09aWQpKSByZXR1cm4gdHJ1ZVxuICAgICAgICByZXR1cm5cbiAgICAgIH0pXG4gIFxuICAgIGlmKCFzdG9yZWRTaWduYXR1cmUpIHJldHVyblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy9TZXR0aW5nIHRoZSBTaWduYXR1cmUgb25seSBpZiB0aGUgV2lkZ2V0IGhhcyBhIGZvcm0gZmllbGQgb2YgdHlwZSBTaWduYXR1cmVcbiAgICBpc1dpZGdldFNpZ25hdHVyZSAmJiBpbnN0YW5jZS5jcmVhdGUodHJhbnNsYXRlSW5rQW5ub3RhdGlvbihzdG9yZWRTaWduYXR1cmUsIHdpZGdldCkpO1xuICB9KTtcblxuICBmdW5jdGlvbiBvZmZzZXRUcmFuc2xhdGlvbih3aWRnZXQsIHNpZ25hdHVyZSkge1xuICAgIHJldHVybiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUG9pbnQoe1xuICAgICAgeDpcbiAgICAgICAgd2lkZ2V0LmJvdW5kaW5nQm94LmxlZnQgLVxuICAgICAgICBzaWduYXR1cmUuYm91bmRpbmdCb3gubGVmdCArXG4gICAgICAgICh3aWRnZXQuYm91bmRpbmdCb3gud2lkdGggLSBzaWduYXR1cmUuYm91bmRpbmdCb3gud2lkdGgpIC8gMixcbiAgICAgIHk6XG4gICAgICAgIHdpZGdldC5ib3VuZGluZ0JveC50b3AgLVxuICAgICAgICBzaWduYXR1cmUuYm91bmRpbmdCb3gudG9wICtcbiAgICAgICAgKHdpZGdldC5ib3VuZGluZ0JveC5oZWlnaHQgLSBzaWduYXR1cmUuYm91bmRpbmdCb3guaGVpZ2h0KSAvIDIsXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGVJbmtBbm5vdGF0aW9uKGFubm90YXRpb24sIHdpZGdldCkge1xuICAgIGNvbnN0IG9mZnNldCA9IG9mZnNldFRyYW5zbGF0aW9uKHdpZGdldCwgYW5ub3RhdGlvbik7XG4gICAgY29uc3QgbmV3U2l6ZSA9IGZpdEluKFxuICAgICAge1xuICAgICAgICB3aWR0aDogYW5ub3RhdGlvbi5ib3VuZGluZ0JveC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBhbm5vdGF0aW9uLmJvdW5kaW5nQm94LmhlaWdodCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHdpZHRoOiB3aWRnZXQuYm91bmRpbmdCb3gud2lkdGgsXG4gICAgICAgIGhlaWdodDogd2lkZ2V0LmJvdW5kaW5nQm94LmhlaWdodCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgcmVzaXplUmF0aW8gPSBuZXdTaXplLndpZHRoIC8gYW5ub3RhdGlvbi5ib3VuZGluZ0JveC53aWR0aDtcbiAgICBjb25zdCBuZXdMZWZ0ID1cbiAgICAgIHdpZGdldC5ib3VuZGluZ0JveC5sZWZ0ICtcbiAgICAgIHdpZGdldC5ib3VuZGluZ0JveC53aWR0aCAvIDIgLVxuICAgICAgbmV3U2l6ZS53aWR0aCAvIDI7XG4gICAgY29uc3QgbmV3VG9wID1cbiAgICAgIHdpZGdldC5ib3VuZGluZ0JveC50b3AgK1xuICAgICAgd2lkZ2V0LmJvdW5kaW5nQm94LmhlaWdodCAvIDIgLVxuICAgICAgbmV3U2l6ZS5oZWlnaHQgLyAyO1xuXG4gICAgY29uc3QgbmV3Qm91bmRpbmdCb3ggPSBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICBsZWZ0OiBuZXdMZWZ0LFxuICAgICAgdG9wOiBuZXdUb3AsXG4gICAgICB3aWR0aDogbmV3U2l6ZS53aWR0aCxcbiAgICAgIGhlaWdodDogbmV3U2l6ZS5oZWlnaHQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYW5ub3RhdGlvblxuICAgICAgLnNldChcImlkXCIsIG51bGwpXG4gICAgICAuc2V0KFwicGFnZUluZGV4XCIsIHdpZGdldC5wYWdlSW5kZXgpXG4gICAgICAuc2V0KFwiYm91bmRpbmdCb3hcIiwgbmV3Qm91bmRpbmdCb3gpO1xuICB9XG5cbiAgZnVuY3Rpb24gZml0SW4oc2l6ZSwgY29udGFpbmVyU2l6ZSkge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gc2l6ZTtcblxuICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBjb250YWluZXJTaXplLndpZHRoIC8gd2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBjb250YWluZXJTaXplLmhlaWdodCAvIGhlaWdodDtcblxuICAgIGNvbnN0IHJhdGlvID0gTWF0aC5taW4od2lkdGhSYXRpbywgaGVpZ2h0UmF0aW8pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB3aWR0aCAqIHJhdGlvLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQgKiByYXRpbyxcbiAgICB9O1xuICB9XG59KTtcbiJ9) + - Detect signature annotations and allow users to apply them to designated signature fields. — [Video](https://www.youtube.com/watch?v=SiD59eLElKw) + +- [Prevent overlapping signature widgets](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6Ii8vUHJldmVudCBPdmVybGFwcGluZyBTaWduYXR1cmUgV2lkZ2V0c1xuXG5sZXQgZ2xvYmFsSW5zdGFuY2U7XG5sZXQgZXhpc3RpbmdXaWRnZXRzID0gW107IC8vIFRyYWNrIGV4aXN0aW5nIHNpZ25hdHVyZSB3aWRnZXRzXG5cbmNvbnN0IHRvb2xiYXJJdGVtcyA9IFtcbiAgeyB0eXBlOiBcImZvcm0tY3JlYXRvclwiIH0sXG4gIC4uLk51dHJpZW50Vmlld2VyLmRlZmF1bHRUb29sYmFySXRlbXMsXG5dO1xuXG5OdXRyaWVudFZpZXdlci5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBOdXRyaWVudFZpZXdlci5UaGVtZS5EQVJLLFxuICBvbldpZGdldEFubm90YXRpb25DcmVhdGlvblN0YXJ0OiAoYW5ub3RhdGlvbiwgZm9ybUZpZWxkKSA9PiB7XG4gICAgY29uc3QgeyBib3VuZGluZ0JveCB9ID0gYW5ub3RhdGlvbjtcblxuICAgIC8vIENoZWNrIGlmIHRoaXMgd2lkZ2V0IHdvdWxkIG92ZXJsYXAgd2l0aCBhbnkgZXhpc3Rpbmcgc2lnbmF0dXJlIHdpZGdldHNcbiAgICBjb25zdCBoYXNPdmVybGFwID0gZXhpc3RpbmdXaWRnZXRzLnNvbWUoKGV4aXN0aW5nV2lkZ2V0KSA9PlxuICAgICAgYm91bmRpbmdCb3guaXNSZWN0T3ZlcmxhcHBpbmcoZXhpc3RpbmdXaWRnZXQuYm91bmRpbmdCb3gpXG4gICAgKTtcblxuICAgIGlmIChoYXNPdmVybGFwKSB7XG4gICAgICBhbGVydChcIkNhbm5vdCBjcmVhdGUgb3ZlcmxhcHBpbmcgc2lnbmF0dXJlIHdpZGdldHNcIik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBvdmVybGFwLCBzdG9yZSB0aGlzIHdpZGdldCBhbmQgYWxsb3cgY3JlYXRpb25cbiAgICBleGlzdGluZ1dpZGdldHMucHVzaCh7IGJvdW5kaW5nQm94LCBmb3JtRmllbGQgfSk7XG4gICAgcmV0dXJuIHsgYW5ub3RhdGlvbiwgZm9ybUZpZWxkIH07XG4gIH0sXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICBnbG9iYWxJbnN0YW5jZSA9IGluc3RhbmNlO1xuICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXModG9vbGJhckl0ZW1zKTtcbiAgY29uc29sZS5sb2coXCJQU1BERktpdCBsb2FkZWQhXCIpO1xufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIn0%253D) + - Intercepts widget creation and checks the new widget’s bounding box against existing signature widgets. If an overlap is detected, it shows an alert and cancels creation; otherwise, it records the widget and continues. + +- [Display a “Sign Here" widget that guides users to the next signature field](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/signing/sign-here-upgraded) + - Manage a signing widget in a PDF document, guiding users to the next available signature field and hiding the widget once all required signatures are completed. — [Video](https://www.youtube.com/watch?v=DkxInhZoatI) + +- [Customize the size of signature annotations](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tRXhaUFJxQTVFQSIsImxheWVyIjoicmFuZG9tNFY2T1cyT0syTyJ9fSwianMiOiJsZXQgc2NhbGluZ0ZhY3RvclR5cGVTaWduYXR1cmU9LjIsc2NhbGluZ0ZhY3RvckRyYXdTaWduYXR1cmU9LjI7UFNQREZLaXQubG9hZCh7Li4uYmFzZU9wdGlvbnMsdGhlbWU6UFNQREZLaXQuVGhlbWUuREFSS30pLnRoZW4oKGluc3RhbmNlPT57aW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignYW5ub3RhdGlvbnMuY3JlYXRlJywoYXN5bmMgY3JlYXRlZEFubm90YXRpb25zPT57XG4vLyBSZXNpemUgdHlwZSBzaWduYXR1cmUgYW5ub3RhdGlvbnNcbmxldCB0eXBlU2lnbmF0dXJlPWNyZWF0ZWRBbm5vdGF0aW9ucy5maWx0ZXIoKGFubm90YXRpb249PmFubm90YXRpb24gaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5JbWFnZUFubm90YXRpb24pKTtpZih0eXBlU2lnbmF0dXJlLl90YWlsKXtjb25zdCB0eXBlU2lnbmF0dXJlRmxhdD10eXBlU2lnbmF0dXJlLl90YWlsLmFycmF5WzBdO2lmKHR5cGVTaWduYXR1cmVGbGF0LmlzU2lnbmF0dXJlKXtjb25zdCBib3VuZGluZ0JveD10eXBlU2lnbmF0dXJlRmxhdC5ib3VuZGluZ0JveCxuZXdXaWR0aD1zY2FsaW5nRmFjdG9yVHlwZVNpZ25hdHVyZSpib3VuZGluZ0JveC53aWR0aCxuZXdIZWlnaHQ9c2NhbGluZ0ZhY3RvclR5cGVTaWduYXR1cmUqYm91bmRpbmdCb3guaGVpZ2h0LG5ld0xlZnQ9Ym91bmRpbmdCb3gubGVmdCsoYm91bmRpbmdCb3gud2lkdGgtbmV3V2lkdGgpLzIsbmV3VG9wPWJvdW5kaW5nQm94LnRvcCsoYm91bmRpbmdCb3guaGVpZ2h0LW5ld0hlaWdodCkvMixuZXdCb3VuZGluZ0JveD1uZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7bGVmdDpuZXdMZWZ0LHRvcDpuZXdUb3Asd2lkdGg6bmV3V2lkdGgsaGVpZ2h0Om5ld0hlaWdodH0pLG5ld0Fubm90YXRpb249dHlwZVNpZ25hdHVyZUZsYXQuc2V0KCdib3VuZGluZ0JveCcsbmV3Qm91bmRpbmdCb3gpO2F3YWl0IGluc3RhbmNlLnVwZGF0ZShuZXdBbm5vdGF0aW9uKX19XG4vLyBSZXNpemUgZHJhdyBzaWduYXR1cmUgYW5ub3RhdGlvbnNcbmVsc2UgY3JlYXRlZEFubm90YXRpb25zLmZpbHRlcigoYW5ub3RhdGlvbj0%252BYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBTUERGS2l0LkFubm90YXRpb25zLklua0Fubm90YXRpb24pKSxjcmVhdGVkQW5ub3RhdGlvbnM9Y3JlYXRlZEFubm90YXRpb25zLm1hcCgoYW5ub3RhdGlvbj0%252BYW5ub3RhdGlvbi51cGRhdGUoJ2JvdW5kaW5nQm94JywoYm91bmRpbmdCb3g9PmJvdW5kaW5nQm94LnNjYWxlKHNjYWxpbmdGYWN0b3JEcmF3U2lnbmF0dXJlKS5tZXJnZSh7bGVmdDpib3VuZGluZ0JveC5sZWZ0K2JvdW5kaW5nQm94LndpZHRoLzQsdG9wOmJvdW5kaW5nQm94LnRvcCtib3VuZGluZ0JveC5oZWlnaHQvNH0pKSkudXBkYXRlKCdsaW5lcycsKGxpbmVzPT5saW5lcy5tYXAoKGxpbmU9PmxpbmUubWFwKChwb2ludD0%252BcG9pbnQudHJhbnNsYXRlKHt4Oi1hbm5vdGF0aW9uLmJvdW5kaW5nQm94LmxlZnQseTotYW5ub3RhdGlvbi5ib3VuZGluZ0JveC50b3B9KS5zY2FsZSguMikudHJhbnNsYXRlKHt4OmFubm90YXRpb24uYm91bmRpbmdCb3gubGVmdCthbm5vdGF0aW9uLmJvdW5kaW5nQm94LndpZHRoLzQseTphbm5vdGF0aW9uLmJvdW5kaW5nQm94LnRvcCthbm5vdGF0aW9uLmJvdW5kaW5nQm94LmhlaWdodC80fSkpKSkpKSkpKSxhd2FpdCBpbnN0YW5jZS51cGRhdGUoY3JlYXRlZEFubm90YXRpb25zKX0pKX0pKTsifQ%253D%253D) + - Listen for the creation of signature annotations and resize and reposition them based on specific scaling factors. — [Video](https://www.youtube.com/watch?v=wrTeL1ZRyS4) + +- [Get the last signed signature field](https://nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9uc30pLnRoZW4oKGFzeW5jIGluc3RhbmNlPT57bGV0IGxhc3RGb3JtRmllbGRDbGlja2VkO2luc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLnByZXNzJywoZXZlbnQ9PntsYXN0Rm9ybUZpZWxkQ2xpY2tlZD1ldmVudC5hbm5vdGF0aW9ufSkpLGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLmNyZWF0ZScsKGNyZWF0ZWRBbm5vdGF0aW9ucz0%252Beyhhc3luYyBjcmVhdGVkQW5ub3RhdGlvbnM9PntsZXQgY3JlYXRlZEFubm90YXRpb25zRmxhdD1jcmVhdGVkQW5ub3RhdGlvbnMudG9BcnJheSgpWzBdO2NvbnNvbGUubG9nKCd0aGlzIGlzIHRoZSBzaWduYXR1cmUgYW5ub3RhdGlvbicpLGNvbnNvbGUubG9nKGNyZWF0ZWRBbm5vdGF0aW9uc0ZsYXQpLGNyZWF0ZWRBbm5vdGF0aW9uc0ZsYXQuaXNTaWduYXR1cmUmJmxhc3RGb3JtRmllbGRDbGlja2VkJiYoY29uc29sZS5sb2coJ3RoaXMgaXMgdGhlIGZpZWxkIHRoYXQgd2FzIHNpZ25lZCcpLGNvbnNvbGUubG9nKGxhc3RGb3JtRmllbGRDbGlja2VkKSxsYXN0Rm9ybUZpZWxkQ2xpY2tlZD1udWxsKX0pKGNyZWF0ZWRBbm5vdGF0aW9ucyl9KSl9KSk7Iiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJmb3JtLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tS044eHVKaWhnbyIsImxheWVyIjoicmFuZG9teDJXSWtzVFA5cyJ9fSwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + - Listen for the creation of signature annotations and track which form field was last clicked before they were created. — [Video](https://www.youtube.com/watch?v=NeIfQtK-Sg8) + +- [Implement a multi-signer PDF signing app in Next.js](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/signing/signing-demo-complete) + - Implement a signing app that allows multiple signers to sign PDFs using electronic signatures and customize signing fields, and that supports digital signatures for verifying document integrity. — [Video](https://www.youtube.com/watch?v=l749tKkP1Ak) + +- [Implement multi-party signing in Vanilla JS](https://github.com/PSPDFKit/awesome-pspdfkit/tree/master/web/document-generator-vanillajs) + - Implement a signing app that allows different users to sign specific fields in a PDF. — [Video](https://www.youtube.com/watch?v=1UmR6Zo8Ql4) + +- [Navigate signature fields smoothly](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmJsb2Ige1xuICBiYWNrZ3JvdW5kOiBibGFjaztcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuXG4gIGJveC1zaGFkb3c6IDAgMCAwIDAgcmdiYSgwLCAwLCAwLCAxKTtcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgYW5pbWF0aW9uOiBwdWxzZSAycyBpbmZpbml0ZTtcbn1cblxuQGtleWZyYW1lcyBwdWxzZSB7XG4gIDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpO1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDAgcmdiYSgwLCAwLCAwLCAwLjcpO1xuICB9XG5cbiAgNzAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDEwcHggcmdiYSgwLCAwLCAwLCAwKTtcbiAgfVxuXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSk7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMCByZ2JhKDAsIDAsIDAsIDApO1xuICB9XG59XG4iLCJqcyI6ImxldCBnbG9iYWxJbnN0YW5jZTtcbi8vVG8gaXRlcmF0ZSB0aHJvdWdoIGZvcm1zXG5mdW5jdGlvbiBmb3JtRWxlbWVudHNJdGVyYXRvcihpbmRleCxyZWN0KXtcbi8vZ2xvYmFsSW5zdGFuY2UuanVtcFRvUmVjdChpbmRleCwgcmVjdCk7XG5jb25zdCBwYWdlPWdsb2JhbEluc3RhbmNlLmNvbnRlbnREb2N1bWVudC5nZXRSb290Tm9kZSgpLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXBhZ2UtaW5kZXg9XCIke2luZGV4fVwiXWApLGFycm93PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTthcnJvdy5jbGFzc0xpc3QuYWRkKCdibG9iJyksYXJyb3cuc3R5bGUuY3NzVGV4dCs9J2JhY2tncm91bmQ6IHVybChodHRwczovL3BzcGRma2l0LmNvbS9hc3NldHMvaW1hZ2VzL2ljb25zL2Fycm93UmlnaHRMaWdodEJnLWVkYWYyNmI3LnN2ZykgNTAlIG5vLXJlcGVhdDtcXG4gICAgY29udGVudDogXCJcIjtcXG4gICAgaGVpZ2h0OiAxLjJlbTtcXG4gICAgbGVmdDogLTJyZW07XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICB3aWR0aDogMXJlbTsnO2NvbnN0IGl0ZW09bmV3IFBTUERGS2l0LkN1c3RvbU92ZXJsYXlJdGVtKHtpZDonYXJyb3cnLG5vZGU6YXJyb3cscGFnZUluZGV4OmluZGV4LHBvc2l0aW9uOm5ldyBQU1BERktpdC5HZW9tZXRyeS5Qb2ludCh7eDpyZWN0LmxlZnQrMTUseTpyZWN0LnRvcH0pLG9uQXBwZWFyKCl7XG4vLyBjb25zb2xlLmxvZyhcInJlbmRlcmVkIVwiKTtcbn19KTtnbG9iYWxJbnN0YW5jZS5zZXRDdXN0b21PdmVybGF5SXRlbShpdGVtKSx3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0%252Be3BhZ2Uuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOidlbmQnLGlubGluZTonbmVhcmVzdCcsYmVoYXZpb3I6J3Ntb290aCd9KX0pKX1sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZm9ybS1jb3VudGVyJywnMCcpLFBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkssaXNFZGl0YWJsZUFubm90YXRpb246YW5ub3RhdGlvbj0%252BJ1NpZ25lcjEnPT1hbm5vdGF0aW9uPy5jdXN0b21EYXRhPy5yb2xlXG4vLyBpbml0aWFsVmlld1N0YXRlOiBuZXcgUFNQREZLaXQuVmlld1N0YXRlKHsgem9vbTogMiB9KSxcbn0pLnRoZW4oKGFzeW5jIGluc3RhbmNlPT57aW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGU9PnZpZXdTdGF0ZS5zZXQoJ3ByZXJlbmRlcmVkUGFnZVNwcmVhZHMnLG51bGwpKSksZ2xvYmFsSW5zdGFuY2U9aW5zdGFuY2U7XG4vLyA8IS0tIElHTk9SRSAtLT5cbi8vVXBkYXRpbmcgc29tZSBmaWVsZHMgdG8gZml0IHRoZSBzYW1wbGUgcHVycG9zZVxuY29uc3QgY2hhbmdlcz0oYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7bGVuZ3RoOmluc3RhbmNlLnRvdGFsUGFnZUNvdW50fSkubWFwKCgoXyxwYWdlSW5kZXgpPT5pbnN0YW5jZS5nZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgpKSkpKS5mbGF0TWFwKChhbm5vdGF0aW9ucz0%252BYW5ub3RhdGlvbnMucmVkdWNlKCgoYWNjLGFubm90YXRpb24pPT5hbm5vdGF0aW9uLmlkLm1hdGNoKC9eMTc2JHxeNTckL2cpP2FjYy5jb25jYXQoYW5ub3RhdGlvbi5zZXQoJ2N1c3RvbURhdGEnLHtyb2xlOidTaWduZXIxJ30pKTphY2MpLFtdKSkpO2F3YWl0IGluc3RhbmNlLnVwZGF0ZShjaGFuZ2VzKTtcbi8vIDwtLSBJR05PUkUgIS0tPlxuY29uc3QgcGFnZUFubm90YXRpb25zPShhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHtsZW5ndGg6aW5zdGFuY2UudG90YWxQYWdlQ291bnR9KS5tYXAoKChfLHBhZ2VJbmRleCk9Pmluc3RhbmNlLmdldEFubm90YXRpb25zKHBhZ2VJbmRleCkpKSkpLmZsYXRNYXAoKGFubm90YXRpb25zPT5hbm5vdGF0aW9ucy5yZWR1Y2UoKChhY2MsYW5ub3RhdGlvbik9PmFubm90YXRpb24%252FLmN1c3RvbURhdGE%252FLnJvbGUuaW5jbHVkZXMoJ1NpZ25lcjEnKT9hY2MuY29uY2F0KGFubm90YXRpb24pOmFjYyksW10pKSk7c2V0VGltZW91dCgoKCk9PntwYWdlQW5ub3RhdGlvbnMubGVuZ3RoPjAmJmZvcm1FbGVtZW50c0l0ZXJhdG9yKHBhZ2VBbm5vdGF0aW9uc1swXS5wYWdlSW5kZXgscGFnZUFubm90YXRpb25zWzBdLmJvdW5kaW5nQm94KX0pLDFlMyksXG4vL3NlbGVjdGluZyB0aGUgbmV4dCBmb3JtIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCBzaWduZXJcbmluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Fubm90YXRpb25zLndpbGxDaGFuZ2UnLChhc3luYyBldmVudD0%252Be2NvbnN0e2Fubm90YXRpb25zOmFubm90YXRpb25zLHJlYXNvbjpyZWFzb259PWV2ZW50O2xldCBjb3VudGVyPXBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmb3JtLWNvdW50ZXInKSk7YW5ub3RhdGlvbnMuZ2V0KDApLmlzU2lnbmF0dXJlJiYnU0VMRUNUX0VORCc9PT1yZWFzb24mJihpbnN0YW5jZS5yZW1vdmVDdXN0b21PdmVybGF5SXRlbSgnYXJyb3cnKSxjb3VudGVyKz0xLGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdmb3JtLWNvdW50ZXInLGNvdW50ZXIudG9TdHJpbmcoKSksY291bnRlcjxwYWdlQW5ub3RhdGlvbnMubGVuZ3RoJiZzZXRUaW1lb3V0KCgoKT0%252Be2Zvcm1FbGVtZW50c0l0ZXJhdG9yKHBhZ2VBbm5vdGF0aW9uc1tjb3VudGVyXS5wYWdlSW5kZXgscGFnZUFubm90YXRpb25zW2NvdW50ZXJdLmJvdW5kaW5nQm94KX0pLDFlMykpfSkpfSkpOyIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + - Create a document signing workflow that highlights form elements with an arrow overlay to guide users through the signing process. — [Video](https://www.youtube.com/watch?v=r3HZD6mvU6I) + +- [Automatically add timestamp after eSignature](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJsZXQgc2lnbmF0dXJlV2lkZ2V0SWQgPSBudWxsOyAvLyBTdG9yZSB0aGUgd2lkZ2V0IElEIGZvciBkZWxldGlvblxubGV0IHNpZ25hdHVyZUZpZWxkTmFtZSA9IFwiU2lnMVwiOyAvLyBTaWduYXR1cmUgZmllbGQgbmFtZVxubGV0IGxlZnQxID0gMzgwLFxuICB0b3AyID0gMTUwLFxuICB3aWR0aDMgPSAxODAsXG4gIGhlaWdodDQgPSAzMDtcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIGlzRWRpdGFibGVBbm5vdGF0aW9uOiBmdW5jdGlvbiAoYW5ub3RhdGlvbikge1xuICAgIHJldHVybiAhYW5ub3RhdGlvbi5pc1NpZ25hdHVyZTsgLy8gUHJldmVudHMgZWRpdGluZyBzaWduYXR1cmVzXG4gIH0sXG4gIGVsZWN0cm9uaWNTaWduYXR1cmVzOiB7XG4gICAgLy9jcmVhdGlvbk1vZGVzOiBbUFNQREZLaXQuRWxlY3Ryb25pY1NpZ25hdHVyZUNyZWF0aW9uTW9kZS5EUkFXXSxcbiAgICAvL2NyZWF0aW9uTW9kZXM6IFtQU1BERktpdC5FbGVjdHJvbmljU2lnbmF0dXJlQ3JlYXRpb25Nb2RlLlRZUEVdLFxuICAgIC8vY3JlYXRpb25Nb2RlczogW1BTUERGS2l0LkVsZWN0cm9uaWNTaWduYXR1cmVDcmVhdGlvbk1vZGUuSU1BR0VdLFxuICAgIC8vZm9udHM6IFtuZXcgUFNQREZLaXQuRm9udChcIkFFUklBTFwiKV1cbiAgfSxcbn0pLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiTnV0cmllbnQgbG9hZGVkISAtIGJ5IE5hcmFzaGltYW5cIik7XG5cbiAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGFubm90YXRpb24gZm9yIHRoZSBzaWduYXR1cmVcbiAgY29uc3Qgd2lkZ2V0ID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLldpZGdldEFubm90YXRpb24oe1xuICAgIHBhZ2VJbmRleDogMCxcbiAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgbGVmdDogbGVmdDEsXG4gICAgICB0b3A6IHRvcDIsXG4gICAgICB3aWR0aDogd2lkdGgzLCAvLyBGaXhlZCB3aWR0aFxuICAgICAgaGVpZ2h0OiBoZWlnaHQ0LCAvLyBGaXhlZCBoZWlnaHRcbiAgICB9KSxcbiAgICBvcGFjaXR5OiAwLjUsIC8vIE1ha2UgaXQgc2xpZ2h0bHkgdHJhbnNwYXJlbnRcbiAgICBmb3JtRmllbGROYW1lOiBzaWduYXR1cmVGaWVsZE5hbWUsXG4gICAgaWQ6IFBTUERGS2l0LmdlbmVyYXRlSW5zdGFudElkKCksXG4gIH0pO1xuXG4gIC8vIFN0b3JlIHRoZSB3aWRnZXQgSUQgZm9yIGxhdGVyIGRlbGV0aW9uXG4gIHNpZ25hdHVyZVdpZGdldElkID0gd2lkZ2V0LmlkO1xuXG4gIC8vIENyZWF0ZSB0aGUgc2lnbmF0dXJlIGZvcm0gZmllbGRcbiAgY29uc3QgZm9ybUZpZWxkID0gbmV3IFBTUERGS2l0LkZvcm1GaWVsZHMuU2lnbmF0dXJlRm9ybUZpZWxkKHtcbiAgICBuYW1lOiBzaWduYXR1cmVGaWVsZE5hbWUsXG4gICAgYW5ub3RhdGlvbklkczogUFNQREZLaXQuSW1tdXRhYmxlLkxpc3QoW3dpZGdldC5pZF0pLFxuICB9KTtcbiAgYXdhaXQgaW5zdGFuY2UuY3JlYXRlKFt3aWRnZXQsIGZvcm1GaWVsZF0pO1xuICBjb25zb2xlLmxvZyhcIlNpZ25hdHVyZSB3aWRnZXQgYW5ub3RhdGlvbiBhZGRlZC5cIik7XG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJpbmtTaWduYXR1cmVzLmNyZWF0ZVwiLCBhc3luYyAoYW5ub3RhdGlvbikgPT4ge1xuICAgIGF3YWl0IGluc3RhbmNlLmRlbGV0ZShzaWduYXR1cmVXaWRnZXRJZCk7XG4gICAgaWYgKFxuICAgICAgLy9jcmVhdGlvbk1vZGVzOiBbUFNQREZLaXQuRWxlY3Ryb25pY1NpZ25hdHVyZUNyZWF0aW9uTW9kZS5EUkFXXVxuICAgICAgYW5ub3RhdGlvbi5jb250ZW50VHlwZSA9PT0gbnVsbCB8fFxuICAgICAgYW5ub3RhdGlvbi5jb250ZW50VHlwZSA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBsZWZ0MSA9IGxlZnQxICsgMTA7XG4gICAgICB0b3AyID0gdG9wMiAtIDEyO1xuICAgICAgd2lkdGgzID0gd2lkdGgzIC0gNTA7XG4gICAgICBoZWlnaHQ0ID0gaGVpZ2h0NCArIDI1O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAvL2NyZWF0aW9uTW9kZXM6IFtQU1BERktpdC5FbGVjdHJvbmljU2lnbmF0dXJlQ3JlYXRpb25Nb2RlLlRZUEVdXG4gICAgICBhbm5vdGF0aW9uLmNvbnRlbnRUeXBlID09PSBcImltYWdlL3BuZ1wiICYmXG4gICAgICBhbm5vdGF0aW9uLmZpbGVOYW1lID09PSBudWxsXG4gICAgKSB7XG4gICAgICBsZWZ0MSA9IGxlZnQxIC0gMzA7XG4gICAgICB0b3AyID0gdG9wMiAtIDEyO1xuICAgICAgd2lkdGgzID0gd2lkdGgzICsgMjAwO1xuICAgICAgaGVpZ2h0NCA9IGhlaWdodDQgKyAyNTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgLy9jcmVhdGlvbk1vZGVzOiBbUFNQREZLaXQuRWxlY3Ryb25pY1NpZ25hdHVyZUNyZWF0aW9uTW9kZS5JTUFHRV0sXG4gICAgICAoYW5ub3RhdGlvbi5jb250ZW50VHlwZSA9PT0gXCJpbWFnZS9wbmdcIiB8fFxuICAgICAgICBhbm5vdGF0aW9uLmNvbnRlbnRUeXBlID09PSBcImltYWdlL2pwZWdcIikgJiZcbiAgICAgIGFubm90YXRpb24uZmlsZU5hbWUgIT0gbnVsbFxuICAgICkge1xuICAgICAgbGVmdDEgPSBsZWZ0MSArIDEwO1xuICAgICAgdG9wMiA9IHRvcDIgLSAxMjtcbiAgICAgIHdpZHRoMyA9IHdpZHRoMyAtIDUwO1xuICAgICAgaGVpZ2h0NCA9IGhlaWdodDQgKyAyNTtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGluZ0JveCA9IGFubm90YXRpb24uYm91bmRpbmdCb3g7XG4gICAgY29uc29sZS5sb2coXCJCb3VuZGluZyBCb3g6XCIsIGJvdW5kaW5nQm94KTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBCb3VuZGluZyBCb3ggLSBMZWZ0OiAke2xlZnQxfSwgVG9wOiAke3RvcDJ9LCBXaWR0aDogJHt3aWR0aDN9LCBIZWlnaHQ6ICR7aGVpZ2h0NH1gXG4gICAgKTtcblxuICAgIGNvbnN0IExvZ2dlZGludXNlciA9IFwiTnV0cmllbnRcIjtcbiAgICBjb25zdCBzaWduZWRCeSA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5UZXh0QW5ub3RhdGlvbih7XG4gICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICB0ZXh0OiB7XG4gICAgICAgIGZvcm1hdDogXCJwbGFpblwiLFxuICAgICAgICB2YWx1ZTogYHBvd2VyZWQgYnkgYCArIExvZ2dlZGludXNlcixcbiAgICAgIH0sXG4gICAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgICBsZWZ0OiBsZWZ0MSArIDMwLFxuICAgICAgICB0b3A6IHRvcDIgLSA1LFxuICAgICAgICB3aWR0aDogd2lkdGgzICsgMTAwLFxuICAgICAgICBoZWlnaHQ6IDEzLFxuICAgICAgfSksXG4gICAgICBmb250OiBcIlZlcmRhbmFcIixcbiAgICAgIGZvbnRTaXplOiA5LFxuICAgICAgZm9udENvbG9yOiBQU1BERktpdC5Db2xvci5CTFVFLFxuICAgICAgaG9yaXpvbnRhbEFsaWduOiBcImxlZnRcIixcbiAgICAgIC8vcmVhZE9ubHk6IHRydWUsXG4gICAgICBsb2NrZWQ6IHRydWUsXG4gICAgICBsb2NrZWRDb250ZW50czogdHJ1ZSxcbiAgICAgIG5vdGU6IFwiQXV0aGVudGljYXRlZCB1c2VyXCIsXG4gICAgICBpc0ZpdHRpbmc6IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IHNpZ25lZGJ5QW5ubyA9IGluc3RhbmNlLmNyZWF0ZShzaWduZWRCeSk7XG5cbiAgICB2YXIgY3VycmVudGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHZhciBvcHRpb25zID0geyBkYXk6IFwiMi1kaWdpdFwiLCBtb250aDogXCJzaG9ydFwiLCB5ZWFyOiBcIm51bWVyaWNcIiB9O1xuICAgIHZhciBmb3JtYXR0ZWREYXRlID0gY3VycmVudGRhdGVcbiAgICAgIC50b0xvY2FsZURhdGVTdHJpbmcoXCJlbi1HQlwiLCBvcHRpb25zKVxuICAgICAgLnJlcGxhY2UoXCIsXCIsIFwiXCIpOyAvLyBFeGFtcGxlOiBcIjA0IERlYyAyMDI0XCJcbiAgICB2YXIgdGltZU9wdGlvbnMgPSB7XG4gICAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICAgIG1pbnV0ZTogXCIyLWRpZ2l0XCIsXG4gICAgICBzZWNvbmQ6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICB9O1xuICAgIHZhciBmb3JtYXR0ZWRUaW1lID0gY3VycmVudGRhdGUudG9Mb2NhbGVUaW1lU3RyaW5nKFwiZW4tR0JcIiwgdGltZU9wdGlvbnMpOyAvLyBFeGFtcGxlOiBcIjEzOjQ1OjMwXCJcbiAgICB2YXIgZGF0ZXRpbWUgPSBmb3JtYXR0ZWREYXRlICsgXCIgVGltZTogXCIgKyBmb3JtYXR0ZWRUaW1lO1xuICAgIGNvbnN0IHNpZ25lZEF0ID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLlRleHRBbm5vdGF0aW9uKHtcbiAgICAgIHBhZ2VJbmRleDogMCxcbiAgICAgIHRleHQ6IHtcbiAgICAgICAgZm9ybWF0OiBcInBsYWluXCIsXG4gICAgICAgIHZhbHVlOiBgU2lnbmVkIEAgYCArIGRhdGV0aW1lLFxuICAgICAgfSxcbiAgICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICAgIGxlZnQ6IGxlZnQxICsgMzAsXG4gICAgICAgIHRvcDogdG9wMiArIDUwLFxuICAgICAgICB3aWR0aDogd2lkdGgzICsgMTAwLFxuICAgICAgICBoZWlnaHQ6IDEzLFxuICAgICAgfSksXG4gICAgICBmb250OiBcIlZlcmRhbmFcIixcbiAgICAgIGZvbnRTaXplOiA5LFxuICAgICAgZm9udENvbG9yOiBQU1BERktpdC5Db2xvci5CTFVFLFxuICAgICAgaG9yaXpvbnRhbEFsaWduOiBcImxlZnRcIixcbiAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IHNpZ25UaW1lQW5ubyA9IGluc3RhbmNlLmNyZWF0ZShzaWduZWRBdCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBcIkxlZnQ6IFwiLFxuICAgICAgbGVmdDEsXG4gICAgICBcIlRvcDogXCIsXG4gICAgICB0b3AyLFxuICAgICAgXCJ3aWR0aDogXCIsXG4gICAgICB3aWR0aDMsXG4gICAgICBcImhlaWdodDogXCIsXG4gICAgICBoZWlnaHQ0XG4gICAgKTtcbiAgICBjb25zdCBsaW5lQW5ubyA9IG5ldyBQU1BERktpdC5Bbm5vdGF0aW9ucy5MaW5lQW5ub3RhdGlvbih7XG4gICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICBzdGFydFBvaW50OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUG9pbnQoeyB4OiBsZWZ0MSArIDIwLCB5OiB0b3AyIC0gMiB9KSxcbiAgICAgIGVuZFBvaW50OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUG9pbnQoe1xuICAgICAgICB4OiBsZWZ0MSArIDIwLFxuICAgICAgICB5OiB0b3AyICsgaGVpZ2h0NCArIDUsXG4gICAgICB9KSxcbiAgICAgIGJvdW5kaW5nQm94OiBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICAgIGxlZnQ6IGxlZnQxLFxuICAgICAgICB0b3A6IHRvcDIsXG4gICAgICAgIHdpZHRoOiAyMCxcbiAgICAgICAgaGVpZ2h0OiA2MCxcbiAgICAgIH0pLFxuICAgICAgbG9ja2VkOiB0cnVlLFxuICAgICAgbG9ja2VkQ29udGVudHM6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgbGluZURyYXduQW5ubyA9IGluc3RhbmNlLmNyZWF0ZShsaW5lQW5ubyk7XG4gIH0pO1xufSk7XG4ifQ%253D%253D) + +- [Restrict signature widget to page bounds](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6Ii8vIFJlc3RyaWN0IFNpZ25hdHVyZSBXaWRnZXQgdG8gUGFnZSBCb3VuZHNcbmxldCBnbG9iYWxJbnN0YW5jZTtcblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIHRvb2xiYXJJdGVtczogW3sgdHlwZTogXCJmb3JtLWNyZWF0b3JcIiB9XSxcbiAgb25XaWRnZXRBbm5vdGF0aW9uQ3JlYXRpb25TdGFydDogKGFubm90YXRpb24sIGZvcm1GaWVsZCkgPT4ge1xuICAgIGNvbnN0IHsgYm91bmRpbmdCb3g6IGJvdW5kaW5nQm94LCBwYWdlSW5kZXg6IHBhZ2VJbmRleCB9ID0gYW5ub3RhdGlvbixcbiAgICAgIHsgaGVpZ2h0OiBoZWlnaHQsIHdpZHRoOiB3aWR0aCB9ID1cbiAgICAgICAgZ2xvYmFsSW5zdGFuY2UucGFnZUluZm9Gb3JJbmRleChwYWdlSW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUmVjdCh7XG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIH0pLmlzUmVjdEluc2lkZShib3VuZGluZ0JveCkgfHwgYWxlcnQoXCJDYW5ub3QgY3JlYXRlIFNpZ25hdHVyZVwiKSxcbiAgICAgIG51bGxcbiAgICApO1xuICB9LFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgKGdsb2JhbEluc3RhbmNlID0gaW5zdGFuY2UpLFxuICAgIGNvbnNvbGUubG9nKFwiUFNQREZLaXQgbG9hZGVkIVwiKSxcbiAgICBjb25zb2xlLmxvZyhcIkFQSSBkb2NzOiBodHRwczovL3BzcGRma2l0LmNvbS9hcGkvd2ViL1wiKSxcbiAgICBjb25zb2xlLmxvZyhcIkd1aWRlczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vZ3VpZGVzL3dlYi9cIik7XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4uUFNQREZLaXQtQW5ub3RhdGlvbi1GbGFncy1Qb3BvdmVyIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgY3Vyc29yOiBub25lO1xufVxuXG4uVGh1bWJuYWlsLUlzLVJlYWQge1xuICBjb250ZW50OiB1cmwoL2Fzc2V0cy9pbWFnZXMvaWNvbnMvbW9uby9jaGVja21hcmstYzQyYjBkNTIuc3ZnKTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICByaWdodDogMjIlO1xuICB0b3A6IDExJTtcbiAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xufVxuLlBTUERGS2l0LVNpZGViYXItVGh1bWJuYWlscy1QYWdlLVNlbGVjdGVkXG4gIC5QU1BERktpdC1TaWRlYmFyLVRodW1ibmFpbHMtUGFnZS1JbWFnZSB7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDRweCBsYXZlbmRlcjtcbn1cblxuLlBTUERGS2l0LVNpZGViYXItVGh1bWJuYWlscy1QYWdlLVNlbGVjdGVkXG4gIC5QU1BERktpdC1TaWRlYmFyLVRodW1ibmFpbHMtUGFnZS1MYWJlbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IGxhdmVuZGVyO1xufVxuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + - On widget creation, this should compare the widget’s bounding box to the full page rectangle and block placement if any part falls outside the page. It shows an alert and cancels creation when invalid. + diff --git a/playground/web-text-comparison.md b/playground/web-text-comparison.md new file mode 100644 index 0000000..87ff292 --- /dev/null +++ b/playground/web-text-comparison.md @@ -0,0 +1,17 @@ +# Web SDK Examples: Text Comparison + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/miscellaneous/README.md](../web/miscellaneous/README.md). + +--- + +## Text Comparison + +- [Text comparison using the `loadTextComparison` method](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6IlBTUERGS2l0LmxvYWRUZXh0Q29tcGFyaXNvbih7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgICAgICAgICBkb2N1bWVudEE6IFwiaHR0cHM6Ly9wdWJsaWMtc29sdXRpb25zLWVuZ2luZWVyaW5nLWJ1Y2tldC5zMy5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbS9kb2NzL3RleHQtY29tcGFyaXNvbi1hLnBkZlwiLFxuICAgICAgICBkb2N1bWVudEI6IFwiaHR0cHM6Ly9wdWJsaWMtc29sdXRpb25zLWVuZ2luZWVyaW5nLWJ1Y2tldC5zMy5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbS9kb2NzL3RleHQtY29tcGFyaXNvbi1iLnBkZlwiLFxuICAgICAgICB0b29sYmFySXRlbXM6IFtcbiAgICAgICAgICB7IHR5cGU6IFwicHJldi1jaGFuZ2VcIiB9LFxuICAgICAgICAgIHsgdHlwZTogXCJuZXh0LWNoYW5nZVwiIH0sXG4gICAgICAgICAgeyB0eXBlOiBcImNvbXBhcmlzb24tY2hhbmdlc1wiIH0sXG4gICAgICAgICAgeyB0eXBlOiBcInNjcm9sbC1sb2NrXCIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29tcGFyaXNvblNpZGViYXJDb25maWc6IHtcbiAgICAgICAgICBkaWZmQ29sb3JzOiB7XG4gICAgICAgICAgICBkZWxldGlvbkNvbG9yOiBuZXcgUFNQREZLaXQuQ29sb3IoeyByOiAyNTUsIGc6IDIxOCwgYjogMTg1IH0pLFxuICAgICAgICAgICAgaW5zZXJ0aW9uQ29sb3I6IG5ldyBQU1BERktpdC5Db2xvcih7IHI6IDIwMCwgZzogMjU1LCBiOiAyMDAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiTG9hZGVkIHN1Y2Nlc3NmdWxseSAtIGJ5IE5hcmFzaGltYW5cIilcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIn0%253D) + +- [Compare and highlight PDF text changes](https://github.com/jonaddams/nutrient-web-text-comparison-custom-ui) + - Compare two PDF documents by highlighting textual differences, synchronizing their views side-by-side, and displaying a sidebar listing the detected changes. + +- [Custom Text Comparison demo](https://nutrient-web-text-comparison-custom-ui.vercel.app/)) + diff --git a/playground/web-toolbars-menus.md b/playground/web-toolbars-menus.md new file mode 100644 index 0000000..75dc600 --- /dev/null +++ b/playground/web-toolbars-menus.md @@ -0,0 +1,33 @@ +# Web SDK Examples: Toolbars and Menus + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/miscellaneous/README.md](../web/miscellaneous/README.md). + +--- + +## Toolbars and Menus + +- [Add a custom sidebar item in menu](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiIsImpzIjoiUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgLyp0b29sYmFySXRlbXM6IFBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMucmVkdWNlKChhY2MsIGl0ZW0pID0%252BIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSBcInNpZGViYXItdGh1bWJuYWlsc1wiKSB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChbaXRlbSwgY3VzdG9tXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYy5jb25jYXQoW2l0ZW1dKTtcbiAgfSwgW10pKi9cbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gICAgY29uc3QgY3VzdG9tID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwibXktYnV0dG9uXCIsXG4gICAgdGl0bGU6IFwiU2hvdy9IaWRlXCIsXG4gICAgZHJvcGRvd25Hcm91cDogXCJzaWRlYmFyXCIsXG4gICAgb25QcmVzczogKGV2ZW50LCBpZCkgPT4ge1xuICAgICAgYWxlcnQoXCJjdXN0b20gYnV0dG9uIGFkZGVkXCIpXG4gICAgfSxcbiAgfTtcbiAgY29uc3QgdG9vbGJhckl0ZW1zID0gUFNQREZLaXQuZGVmYXVsdFRvb2xiYXJJdGVtcy5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtLnR5cGUgPT09IFwic2lkZWJhci10aHVtYm5haWxzXCIpIHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KFtpdGVtLCBjdXN0b21dKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjLmNvbmNhdChbaXRlbV0pO1xuICB9LCBbXSlcblxuaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKFsuLi50b29sYmFySXRlbXNdKVxuXG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + - Add a custom “Show/Hide” button next to the sidebar thumbnails in the toolbar that triggers an alert when clicked. — [Video](https://www.youtube.com/watch?v=9EY2C0Eadx8) + +- [Add a custom sidebar item with selected text](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJjb25zdCB7XG4gIEludGVyZmFjZXM6IEludGVyZmFjZXMsXG4gIGNyZWF0ZUJsb2NrOiBjcmVhdGVCbG9jayxcbiAgUmVjaXBlczogUmVjaXBlcyxcbiAgQ29yZTogQ29yZSxcbn0gPSBQU1BERktpdC5VSTtcbmZ1bmN0aW9uIGdlbmVyYXRlQ3VzdG9tVUkodGV4dCkge1xuICByZXR1cm4ge1xuICAgIFtQU1BERktpdC5VSUVsZW1lbnQuU2lkZWJhcl06IHtcbiAgICAgIFtQU1BERktpdC5TaWRlYmFyTW9kZS5DVVNUT01dOiAoeyBjb250YWluZXJOb2RlOiBjb250YWluZXJOb2RlIH0pID0%252BIHtcbiAgICAgICAgY29uc3QgZG9jaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIC8vIFNldCB0aGUgdGV4dCBjb250ZW50XG4gICAgICAgIC8vIFJldHVybiB0aGUgY3VzdG9tIFVJIG5vZGVcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoZG9jaS5pbm5lclRleHQgPSB0ZXh0KSxcbiAgICAgICAgICAvLyBBcHBseSBzdHlsZXNcbiAgICAgICAgICAoZG9jaS5zdHlsZS5jb2xvciA9IFwicmVkXCIpLFxuICAgICAgICAgIChkb2NpLnN0eWxlLmJhY2tncm91bmQgPSBcIndoaXRlXCIpLFxuICAgICAgICAgIChkb2NpLnN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkIGJsYWNrXCIpLCAvLyBCb3JkZXIgd2l0aCBjb2xvclxuICAgICAgICAgIChkb2NpLnN0eWxlLm1hcmdpbiA9IFwiMjBweFwiKSwgLy8gVW5pZm9ybSBtYXJnaW4gYXJvdW5kIHRoZSBlbGVtZW50XG4gICAgICAgICAgKGRvY2kuc3R5bGUucGFkZGluZyA9IFwiMTBweFwiKSwgLy8gUGFkZGluZyBpbnNpZGUgdGhlIGRpdlxuICAgICAgICAgIChkb2NpLnN0eWxlLnRleHRBbGlnbiA9IFwiY2VudGVyXCIpLCAvLyBBbGlnbiB0ZXh0IGluIHRoZSBjZW50ZXIgb2YgdGhlIGRpdlxuICAgICAgICAgIChkb2NpLnN0eWxlLmJvcmRlclJhZGl1cyA9IFwiOHB4XCIpLCAvLyBBZGQgcm91bmRlZCBjb3JuZXJzXG4gICAgICAgICAgLy9kb2NpLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiOyAvLyBJbmxpbmUtYmxvY2sgZm9yIG1pZGRsZSBhbGlnbm1lbnRcbiAgICAgICAgICAoZG9jaS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIiksIC8vIFRvIGFsbG93IHByZWNpc2UgcG9zaXRpb25pbmdcbiAgICAgICAgICAvL2RvY2kuc3R5bGUubGVmdCA9IFwiMTAlXCI7IC8vIEFsaWduIGhvcml6b250YWxseVxuICAgICAgICAgIC8vZG9jaS5zdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVgoLTUwJSlcIjsgLy8gQ2VudGVyLWFsaWduIGhvcml6b250YWxseVxuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgZGl2IHRvIHRoZSBjb250YWluZXJcbiAgICAgICAgICBjb250YWluZXJOb2RlLmFwcGVuZENoaWxkKGRvY2kpLFxuICAgICAgICAgIHsgbm9kZTogY29udGFpbmVyTm9kZSB9XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICB1aToge1xuICAgIFtJbnRlcmZhY2VzLlByaW1hcnlUb29sYmFyXTogKHsgcHJvcHM6IHByb3BzLCBpbnN0YW5jZTogaW5zdGFuY2UgfSkgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IGNyZWF0ZUJsb2NrKFJlY2lwZXMuUHJpbWFyeVRvb2xiYXIsIHByb3BzLCAoeyB1aTogdWkgfSkgPT4ge1xuICAgICAgICBjb25zdCBzaWRlYmFyID0gdWkuZ2V0QmxvY2tCeUlkKFwic2lkZWJhclwiKTtcbiAgICAgICAgaWYgKHNpZGViYXIpIHtcbiAgICAgICAgICBjb25zdCBuZXdTaWRlYmFyID0gY3JlYXRlQmxvY2soQ29yZS5CdXR0b25TZWxlY3QsIHtcbiAgICAgICAgICAgIC4uLnNpZGViYXIucHJvcHMsXG4gICAgICAgICAgICBvblNlbGVjdGlvbkNoYW5nZTogKGtleSkgPT4ge1xuICAgICAgICAgICAgICBcInNpZGViYXItY3VzdG9tXCIgPT09IGtleVxuICAgICAgICAgICAgICAgID8gaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BXG4gICAgICAgICAgICAgICAgICAgIHZpZXdTdGF0ZS5zZXQoXCJzaWRlYmFyTW9kZVwiLCBQU1BERktpdC5TaWRlYmFyTW9kZS5DVVNUT00pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBzaWRlYmFyLnByb3BzLm9uU2VsZWN0aW9uQ2hhbmdlPy4oa2V5KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAuLi5zaWRlYmFyLnByb3BzLml0ZW1zLFxuICAgICAgICAgICAgICB7IGlkOiBcInNpZGViYXItY3VzdG9tXCIsIGxhYmVsOiBcIkN1c3RvbSBTaWRlYmFyXCIgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdWkucmVwbGFjZShcInNpZGViYXJcIiwgbmV3U2lkZWJhcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVpLmNyZWF0ZUNvbXBvbmVudCgpO1xuICAgICAgfSkuY3JlYXRlQ29tcG9uZW50KCksXG4gICAgfSksXG4gIH0sXG4gIGluaXRpYWxWaWV3U3RhdGU6IG5ldyBQU1BERktpdC5WaWV3U3RhdGUoe1xuICAgIHNpZGViYXJNb2RlOiBQU1BERktpdC5TaWRlYmFyTW9kZS5DVVNUT00sXG4gIH0pLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInRleHRTZWxlY3Rpb24uY2hhbmdlXCIsIGFzeW5jICh0ZXh0U2VsZWN0aW9uKSA9PiB7XG4gICAgaWYgKHRleHRTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCB0ZXh0U2VsZWN0aW9uLmdldFRleHQoKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiU2VsZWN0ZWQgdGV4dDpcIiwgdGV4dCksXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVGV4dCBsZW5ndGg6XCIsIHRleHQubGVuZ3RoKTtcbiAgICAgIC8vIEdlbmVyYXRlIGFuZCBhcHBseSBjdXN0b20gVUkgd2l0aCB0aGUgc2VsZWN0ZWQgdGV4dFxuICAgICAgY29uc3QgY3VzdG9tVUkgPSBnZW5lcmF0ZUN1c3RvbVVJKHRleHQpO1xuICAgICAgaW5zdGFuY2Uuc2V0Q3VzdG9tVUlDb25maWd1cmF0aW9uKGN1c3RvbVVJKTtcbiAgICB9IGVsc2UgY29uc29sZS5sb2coXCJObyB0ZXh0IGlzIHNlbGVjdGVkXCIpO1xuICB9KTtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + +- [Add a read checkmark to thumbnails](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLGluaXRpYWxWaWV3U3RhdGU6bmV3IFBTUERGS2l0LlZpZXdTdGF0ZSh7c2lkZWJhck1vZGU6J1RIVU1CTkFJTFMnfSl9KS50aGVuKChhc3luYyBpbnN0YW5jZT0%252Be2NvbnN0IGFubm90YXRpb249bmV3IFBTUERGS2l0LkFubm90YXRpb25zLlJlY3RhbmdsZUFubm90YXRpb24oe3BhZ2VJbmRleDowLGJvdW5kaW5nQm94Om5ldyBQU1BERktpdC5HZW9tZXRyeS5SZWN0KHtsZWZ0OjEwLHRvcDoxMCx3aWR0aDoxMDAsaGVpZ2h0OjEwMH0pLGxvY2tlZDohMH0pO2luc3RhbmNlLmNyZWF0ZShhbm5vdGF0aW9uKTtjb25zdCByZWFkQ2hlY2ttYXJrPXBhZ2VJbmRleD0%252Be2NvbnN0IGN1cnJlbnRUaHVtYm5haWw9aW5zdGFuY2UuY29udGVudERvY3VtZW50LmdldFJvb3ROb2RlKCkucXVlcnlTZWxlY3RvcihgLlBTUERGS2l0LVNpZGViYXItVGh1bWJuYWlscy1QYWdlW2RhdGEtcGFnZS1pbmRleD1cIiR7cGFnZUluZGV4fVwiXWApO2N1cnJlbnRUaHVtYm5haWwucXVlcnlTZWxlY3RvcignLlRodW1ibmFpbC1Jcy1SZWFkJyl8fGN1cnJlbnRUaHVtYm5haWwuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywnPHNwYW4gY2xhc3M9XCJUaHVtYm5haWwtSXMtUmVhZFwiPjwvc3Bhbj4nKX07XG4vL2luaXQgZm9yIGN1cnJlbnQgcGFnZSBpbmRleFxucmVhZENoZWNrbWFyayhpbnN0YW5jZS52aWV3U3RhdGUuY3VycmVudFBhZ2VJbmRleCksaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcigndmlld1N0YXRlLmN1cnJlbnRQYWdlSW5kZXguY2hhbmdlJyxyZWFkQ2hlY2ttYXJrKX0pKTsiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLlBTUERGS2l0LUFubm90YXRpb24tRmxhZ3MtUG9wb3ZlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGN1cnNvcjogbm9uZTtcbn1cblxuLlRodW1ibmFpbC1Jcy1SZWFkIHtcbiAgY29udGVudDogdXJsKC9hc3NldHMvaW1hZ2VzL2ljb25zL21vbm8vY2hlY2ttYXJrLWM0MmIwZDUyLnN2Zyk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgcmlnaHQ6IDIyJTtcbiAgdG9wOiAxMSU7XG4gIG9wYWNpdHk6IDEgIWltcG9ydGFudDtcbn1cbiJ9) + +- [Custom button on redaction annotation toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwianMiOiIvKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gZHJvcGRvd24gbWVudSBhbmQgY29uZmlndXJlcyBQU1BERktpdCB3aXRoIGEgbW9kaWZpZWQgdG9vbGJhclxuICogZm9yIHJlZGFjdGlvbiBhbm5vdGF0aW9ucy5cbiAqL1xuXG4vLyBDcmVhdGUgYSBkcm9wZG93biBtZW51IHdpdGggdXNlciBvcHRpb25zXG5jb25zdCBzZWxlY3ROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcbnNlbGVjdE5vZGUuaW5uZXJIVE1MID0gYFxuICAgIDxvcHRpb24gdmFsdWU9XCJhbGljZVwiPkFsaWNlPC9vcHRpb24%252BXG4gICAgPG9wdGlvbiB2YWx1ZT1cImJvYlwiPkJvYjwvb3B0aW9uPlxuICAgIDxvcHRpb24gdmFsdWU9XCJjYXJvbFwiPkNhcm9sPC9vcHRpb24%252BXG4gICAgPG9wdGlvbiB2YWx1ZT1cImpvaG5cIj5Kb2huPC9vcHRpb24%252BXG5gO1xuXG4vLyBBZGRlZCBzdHlsZSB0byBzZWxlY3QgYW5kIHBhcmVudCBlbGVtZW50IGluIENTUyB0YWIgdG8gdGFrZSB1cCB0aGUgZnVsbCBoZWlnaHRcblxuLy8gQWRkIGNoYW5nZSBldmVudCBsaXN0ZW5lciB0byBsb2cgc2VsZWN0ZWQgdmFsdWVzXG5zZWxlY3ROb2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKGV2ZW50KSA9PiB7XG4gIGNvbnNvbGUubG9nKGBTZWxlY3RlZCBvcHRpb246ICR7ZXZlbnQudGFyZ2V0LnZhbHVlfWApO1xuICBhbGVydChgU2VsZWN0ZWQgb3B0aW9uOiAke2V2ZW50LnRhcmdldC52YWx1ZX1gKTtcbn0pO1xuXG4vLyBEZWZpbmUgY3VzdG9tIHRvb2xiYXIgaXRlbSBjb25maWd1cmF0aW9uXG5jb25zdCBjdXN0b21Ub29sYmFySXRlbSA9IHtcbiAgdHlwZTogXCJjdXN0b21cIixcbiAgaWQ6IFwibXktYnV0dG9uXCIsXG4gIHRpdGxlOiBcIk15IEJ1dHRvblwiLFxuICBub2RlOiBzZWxlY3ROb2RlLFxuICBvblByZXNzOiAoZXZlbnQpID0%252BIHtcbiAgICBjb25zb2xlLmxvZyhcImhlbGxvIGZyb20gbXkgYnV0dG9uXCIpO1xuICB9LFxufTtcblxuLy8gSW5pdGlhbGl6ZSBQU1BERktpdCB3aXRoIGN1c3RvbSB0b29sYmFyIGNvbmZpZ3VyYXRpb25cblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG5cbiAgLy8gQ3VzdG9tIHRvb2xiYXIgY29uZmlndXJhdGlvbiBmb3IgYW5ub3RhdGlvbnNcbiAgYW5ub3RhdGlvblRvb2xiYXJJdGVtczogKGFubm90YXRpb24sIHsgZGVmYXVsdEFubm90YXRpb25Ub29sYmFySXRlbXMgfSkgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBhbm5vdGF0aW9uIGlzIGEgcmVkYWN0aW9uXG4gICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5SZWRhY3Rpb25Bbm5vdGF0aW9uKSB7XG4gICAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgXCJhcHBseS1yZWRhY3Rpb25zXCIgYnV0dG9uXG4gICAgICBjb25zdCBhcHBseVJlZGFjdGlvbnNJbmRleCA9IGRlZmF1bHRBbm5vdGF0aW9uVG9vbGJhckl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgKGl0ZW0pID0%252BIGl0ZW0udHlwZSA9PT0gXCJhcHBseS1yZWRhY3Rpb25zXCJcbiAgICAgICk7XG5cbiAgICAgIC8vIEluc2VydCBjdXN0b20gYnV0dG9uIGFmdGVyIHRoZSBcImFwcGx5LXJlZGFjdGlvbnNcIiBidXR0b25cbiAgICAgIGRlZmF1bHRBbm5vdGF0aW9uVG9vbGJhckl0ZW1zLnNwbGljZShcbiAgICAgICAgYXBwbHlSZWRhY3Rpb25zSW5kZXggKyAxLFxuICAgICAgICAwLFxuICAgICAgICBjdXN0b21Ub29sYmFySXRlbVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGRlZmF1bHRBbm5vdGF0aW9uVG9vbGJhckl0ZW1zO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBkZWZhdWx0IHRvb2xiYXIgaXRlbXMgZm9yIG5vbi1yZWRhY3Rpb24gYW5ub3RhdGlvbnNcbiAgICByZXR1cm4gZGVmYXVsdEFubm90YXRpb25Ub29sYmFySXRlbXM7XG4gIH0sXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAvLyBMb2cgc3VjY2VzcyBtZXNzYWdlcyBhbmQgZG9jdW1lbnRhdGlvbiBsaW5rc1xuICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZGl2W3RpdGxlPSdNeSBCdXR0b24nXVwiKTtcbiAgY29uc29sZS5sb2coXCJQU1BERktpdCBsb2FkZWQhXCIpO1xuICBjb25zb2xlLmxvZyhcIkFQSSBkb2NzOiBodHRwczovL251dHJpZW50LmlvL2FwaS93ZWIvXCIpO1xuICBjb25zb2xlLmxvZyhcIkd1aWRlczogaHR0cHM6Ly9udXRyaWVudC5pby9ndWlkZXMvd2ViL1wiKTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuZGl2W3RpdGxlPVwiTXkgQnV0dG9uXCJdIHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG5kaXZbdGl0bGU9XCJNeSBCdXR0b25cIl0gc2VsZWN0IHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuIn0%253D) + - Add a custom dropdown menu to the redaction annotation toolbar that logs the selected name when changed. — [Video](https://www.youtube.com/watch?v=XH7GJM9yMnw) + +- [Add link, highlight, and underline annotations](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tWmFpZTY0V0M5dCIsImxheWVyIjoicmFuZG9tNE02M1BlUWNZNiJ9fSwianMiOiIvLyBDb25maWd1cmVzIFBTUERGS2l0IHdpdGggYSBjdXN0b20gbGluayBhbm5vdGF0aW9uIHRvb2wgdGhhdCBjcmVhdGVzIGEgaGlnaGxpZ2h0ZWQsIHVuZGVybGluZWQsIGNsaWNrYWJsZSBsaW5rIGZyb20gc2VsZWN0ZWQgdGV4dFxuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gQ3JlYXRlIGN1c3RvbSB0b29sYmFyIGJ1dHRvbiBlbGVtZW50XG4gIGNvbnN0IGJ1dHRvbk5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBidXR0b25Ob2RlLmlubmVySFRNTCA9IGBcbiAgICA8YnV0dG9uIFxuICAgICAgY2xhc3M9XCJQU1BERktpdC04ZWhjYmh6MjQxejF0Znloanp0YmUxMnViZSBQU1BERktpdC01aHF2cGdjZ3BmMTc2OWNuMzVkdnRnNGt0eiBcbiAgICAgICAgUFNQREZLaXQtVG9vbGJhci1CdXR0b24tTGluay1Bbm5vdGF0aW9uIFBTUERGS2l0LXl6cGZ6dzliZmQ5ZWpwMWs3a2dkYWN1N2QgXG4gICAgICAgIFBTUERGS2l0LVRvb2xiYXItQnV0dG9uIFBTUERGS2l0LVRvb2wtQnV0dG9uXCJcbiAgICAgIHRpdGxlPVwiTGlua1wiXG4gICAgICBhcmlhLWxhYmVsPVwiTGlua1wiXG4gICAgICBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCI%252BXG4gICAgICA8c3BhbiBjbGFzcz1cIlBTUERGS2l0LTZlZWtteDJyM3J6cG40OTU1N3ZkdDJlNXRqIFBTUERGS2l0LVRvb2wtQnV0dG9uLUljb24gXG4gICAgICAgIFBTUERGS2l0LVRvb2xiYXItQnV0dG9uLUljb24gUFNQREZLaXQtSWNvbiBQU1BERktpdC1JY29uLUxpbmtcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjI1XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI1IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTE0LjEyMTkgMTAuNTlDMTQuNDQ4MiAxMC45MTQzIDE0LjcwNzEgMTEuMjk5OSAxNC44ODM3IDExLjcyNDdDMTUuMDYwNCAxMi4xNDk0IDE1LjE1MTMgMTIuNjA0OSAxNS4xNTEzIDEzLjA2NUMxNS4xNTEzIDEzLjUyNSAxNS4wNjA0IDEzLjk4MDUgMTQuODgzNyAxNC40MDUyQzE0LjcwNzEgMTQuODMgMTQuNDQ4MiAxNS4yMTU2IDE0LjEyMTkgMTUuNTRMMTAuNTkxOSAxOS4wN0MxMC4yNjY4IDE5LjQwMzggOS44NzgwMSAxOS42NjkxIDkuNDQ4NjQgMTkuODUwM0M5LjAxOTI3IDIwLjAzMTUgOC41NTc5NiAyMC4xMjQ4IDguMDkxOTMgMjAuMTI0OEM3LjYyNTkgMjAuMTI0OCA3LjE2NDU5IDIwLjAzMTUgNi43MzUyMiAxOS44NTAzQzYuMzA1ODUgMTkuNjY5MSA1LjkxNzExIDE5LjQwMzggNS41OTE5MyAxOS4wN0M1LjI1ODEgMTguNzQ0OCA0Ljk5Mjc3IDE4LjM1NiA0LjgxMTYxIDE3LjkyNjdDNC42MzA0NSAxNy40OTczIDQuNTM3MTEgMTcuMDM2IDQuNTM3MTEgMTYuNTdDNC41MzcxMSAxNi4xMDM5IDQuNjMwNDUgMTUuNjQyNiA0LjgxMTYxIDE1LjIxMzNDNC45OTI3NyAxNC43ODM5IDUuMjU4MSAxNC4zOTUxIDUuNTkxOTMgMTQuMDdMNy40MTE5MyAxMi4zNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD5cbiAgICAgICAgICA8cGF0aCBkPVwiTTExLjMwMTkgMTMuNDA5OUMxMC45NzU2IDEzLjA4NTYgMTAuNzE2NyAxMi43IDEwLjU0MDEgMTIuMjc1MkMxMC4zNjM0IDExLjg1MDUgMTAuMjcyNSAxMS4zOTUgMTAuMjcyNSAxMC45MzQ5QzEwLjI3MjUgMTAuNDc0OSAxMC4zNjM0IDEwLjAxOTQgMTAuNTQwMSA5LjU5NDY3QzEwLjcxNjcgOS4xNjk5MiAxMC45NzU2IDguNzg0MjggMTEuMzAxOSA4LjQ1OTk0TDE0LjgzMTkgNC45Mjk5NEMxNS4xNTcxIDQuNTk2MTEgMTUuNTQ1OCA0LjMzMDc5IDE1Ljk3NTIgNC4xNDk2MkMxNi40MDQ1IDMuOTY4NDYgMTYuODY1OCAzLjg3NTEyIDE3LjMzMTkgMy44NzUxMkMxNy43OTc5IDMuODc1MTIgMTguMjU5MiAzLjk2ODQ2IDE4LjY4ODYgNC4xNDk2MkMxOS4xMTggNC4zMzA3OSAxOS41MDY3IDQuNTk2MTEgMTkuODMxOSA0LjkyOTk0QzIwLjE2NTcgNS4yNTUxMiAyMC40MzEgNS42NDM4NiAyMC42MTIyIDYuMDczMjNDMjAuNzkzNCA2LjUwMjYxIDIwLjg4NjcgNi45NjM5MSAyMC44ODY3IDcuNDI5OTRDMjAuODg2NyA3Ljg5NTk3IDIwLjc5MzQgOC4zNTcyOCAyMC42MTIyIDguNzg2NjVDMjAuNDMxIDkuMjE2MDMgMjAuMTY1NyA5LjYwNDc3IDE5LjgzMTkgOS45Mjk5NEwxOC4wMTE5IDExLjY0OTlcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48L3BhdGg%252BXG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvYnV0dG9uPmA7XG5cbiAgLy8gRGVmaW5lIGN1c3RvbSB0b29sYmFyIGl0ZW0gZm9yIGNyZWF0aW5nIGxpbmtlZCBoaWdobGlnaHRzXG4gIGNvbnN0IGhpZ2hsaWdodFdpdGhMaW5rID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgaWQ6IFwiaGlnaGxpZ2h0LWxpbmtcIixcbiAgICB0aXRsZTogXCJMaW5rXCIsXG4gICAgbm9kZTogYnV0dG9uTm9kZSxcbiAgICBvblByZXNzOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBHZXQgdGV4dCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IGluc3RhbmNlLmdldFRleHRTZWxlY3Rpb24oKTtcbiAgICAgIGNvbnN0IHsgZ2V0U2VsZWN0ZWRSZWN0c1BlclBhZ2UsIHN0YXJ0UGFnZUluZGV4IH0gPSBzZWxlY3RlZFRleHQ7XG5cbiAgICAgIC8vIEdldCByZWN0YW5nbGVzIGZvciBzZWxlY3RlZCB0ZXh0XG4gICAgICBjb25zdCBmaXJzdFBhZ2VTZWxlY3Rpb24gPSAoYXdhaXQgZ2V0U2VsZWN0ZWRSZWN0c1BlclBhZ2UoKSkuZ2V0KDApO1xuICAgICAgY29uc3QgeyByZWN0cywgcGFnZUluZGV4IH0gPSBmaXJzdFBhZ2VTZWxlY3Rpb247XG5cbiAgICAgIC8vIENyZWF0ZSBhZGp1c3RlZCByZWN0YW5nbGVzIGZvciBoaWdobGlnaHRcbiAgICAgIGNvbnN0IGhpZ2hsaWdodFJlY3RzID0gcmVjdHMubWFwKChyZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkUmVjdCA9IHJlY3QudHJhbnNsYXRlWSgtNSk7XG4gICAgICAgIHJldHVybiBhZGp1c3RlZFJlY3RcbiAgICAgICAgICAuc2V0KFwiaGVpZ2h0XCIsIHJlY3QuaGVpZ2h0IC0gMTApXG4gICAgICAgICAgLnNldChcInRvcFwiLCByZWN0LnRvcCArIDgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhZGp1c3RlZCByZWN0YW5nbGVzIGZvciB1bmRlcmxpbmVcbiAgICAgIGNvbnN0IHVuZGVybGluZVJlY3RzID0gcmVjdHMubWFwKChyZWN0KSA9PiB7XG4gICAgICAgIC8vIGFkanVzdCB0aGUgWSBwb3NpdGlvbiBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gY29uc3QgYWRqdXN0ZWRSZWN0ID0gcmVjdC50cmFuc2xhdGVZKC0zKTtcbiAgICAgICAgcmV0dXJuIHJlY3Quc2V0KFwiaGVpZ2h0XCIsIHJlY3QuaGVpZ2h0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgaGlnaGxpZ2h0XG4gICAgICBjb25zdCBoaWdobGlnaHQgPSBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuSGlnaGxpZ2h0QW5ub3RhdGlvbih7XG4gICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4LFxuICAgICAgICByZWN0czogaGlnaGxpZ2h0UmVjdHMsXG4gICAgICAgIGJvdW5kaW5nQm94OiBQU1BERktpdC5HZW9tZXRyeS5SZWN0LnVuaW9uKHJlY3RzKSxcbiAgICAgICAgY29sb3I6IFBTUERGS2l0LkNvbG9yLllFTExPVyxcbiAgICAgICAgYmxlbmRNb2RlOiBcIm11bHRpcGx5XCIsXG4gICAgICAgIG9wYWNpdHk6IDAuNSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgdW5kZXJsaW5lXG4gICAgICBjb25zdCB1bmRlcmxpbmUgPSBuZXcgUFNQREZLaXQuQW5ub3RhdGlvbnMuVW5kZXJsaW5lQW5ub3RhdGlvbih7XG4gICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4LFxuICAgICAgICByZWN0czogdW5kZXJsaW5lUmVjdHMsXG4gICAgICAgIGJvdW5kaW5nQm94OiBQU1BERktpdC5HZW9tZXRyeS5SZWN0LnVuaW9uKHJlY3RzKSxcbiAgICAgICAgY29sb3I6IFBTUERGS2l0LkNvbG9yLkJMVUUsXG4gICAgICAgIGJsZW5kTW9kZTogXCJtdWx0aXBseVwiLFxuICAgICAgICBvcGFjaXR5OiAwLjksXG4gICAgICB9KTtcblxuICAgICAgLy8gQ3JlYXRlIGxpbmtcbiAgICAgIGNvbnN0IGxpbmtBbm5vdGF0aW9uID0gbmV3IFBTUERGS2l0LkFubm90YXRpb25zLkxpbmtBbm5vdGF0aW9uKHtcbiAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgIGJvdW5kaW5nQm94OiBQU1BERktpdC5HZW9tZXRyeS5SZWN0LnVuaW9uKHJlY3RzKSxcbiAgICAgICAgYWN0aW9uOiBuZXcgUFNQREZLaXQuQWN0aW9ucy5VUklBY3Rpb24oe1xuICAgICAgICAgIHVyaTogXCJodHRwczovL251dHJpZW50LmlvXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBib3JkZXJDb2xvcjogUFNQREZLaXQuQ29sb3IuVFJBTlNQQVJFTlQsXG4gICAgICAgIGJsZW5kTW9kZTogXCJtdWx0aXBseVwiLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhbGwgYW5ub3RhdGlvbnNcbiAgICAgIGF3YWl0IGluc3RhbmNlLmNyZWF0ZShbbGlua0Fubm90YXRpb24sIHVuZGVybGluZSwgaGlnaGxpZ2h0XSk7XG4gICAgfSxcbiAgfTtcblxuICAvLyBBZGQgY3VzdG9tdG9vbCB0byB0aGUgaW5saW5lIHRleHQgc2VsZWN0aW9uIHRvb2xiYXJcbiAgaW5zdGFuY2Uuc2V0SW5saW5lVGV4dFNlbGVjdGlvblRvb2xiYXJJdGVtcygodG9vbGJhck9wdGlvbnMsIHNlbGVjdGlvbikgPT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdEl0ZW1zLCBoYXNEZXNrdG9wTGF5b3V0IH0gPSB0b29sYmFyT3B0aW9ucztcbiAgICByZXR1cm4gWy4uLmRlZmF1bHRJdGVtcywgaGlnaGxpZ2h0V2l0aExpbmtdO1xuICB9KTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + - Add a custom toolbar button that, when clicked, highlights the selected text, underlines it, and attaches a link. — [Video](https://www.youtube.com/watch?v=e5X0KPGwFPI) + +- [Rotate PDF pages with custom toolbar buttons](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6Ii8vIExvYWQgUFNQREZLaXQgd2l0aCBzcGVjaWZpYyBjb25maWd1cmF0aW9uc1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgdG9vbGJhckl0ZW1zOiBbeyB0eXBlOiBcImxheW91dC1jb25maWdcIiB9LCB7IHR5cGU6IFwiZXhwb3J0LXBkZlwiIH1dLCAvLyBEZWZpbmUgdG9vbGJhciBpdGVtcyBpbmNsdWRpbmcgbGF5b3V0IGNvbmZpZyBhbmQgZXhwb3J0IFBERlxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gQ2FsbGJhY2sgZnVuY3Rpb24gZXhlY3V0ZWQgYWZ0ZXIgUFNQREZLaXQgaGFzIHN1Y2Nlc3NmdWxseSBsb2FkZWRcbiAgY29uc29sZS5sb2coXCJQU1BERktpdCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7IC8vIExvZyBhIG1lc3NhZ2UgdG8gaW5kaWNhdGUgc3VjY2Vzc2Z1bCBsb2FkaW5nXG5cbiAgLy8gRGVmaW5lIGEgY3VzdG9tIHRvb2xiYXIgYnV0dG9uIGZvciByb3RhdGluZyB0aGUgcGFnZSBjb3VudGVyY2xvY2t3aXNlXG4gIGNvbnN0IGl0ZW1fMSA9IHtcbiAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgIGlkOiBcIkFudGlDbG9ja3dpc2VcIixcbiAgICB0aXRsZTogXCJBbnRpQ2xvY2t3aXNlXCIsIC8vIEJ1dHRvbiB0aXRsZVxuICAgIGljb246IGA8c3BhbiBjbGFzcz1cIlBTUERGS2l0LTQ0MW1xNm0yZXdkNzZ2ZWU5NXY5ZnI3bXkyIFBTUERGS2l0LUxheW91dC1Db25maWctT3B0aW9uLVBhZ2UtUm90YXRpb24tTGVmdCBQU1BERktpdC1MYXlvdXQtQ29uZmlnLU9wdGlvblwiIHRpdGxlPVwiUm90YXRlIExlZnRcIiBhcmlhLWxhYmVsPVwiUm90YXRlIExlZnRcIiBpZD1cImRvd25zaGlmdC01LWl0ZW0tNVwiIHJvbGU9XCJvcHRpb25cIiBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcIj48c3BhbiBjbGFzcz1cIlBTUERGS2l0LTZlZWtteDJyM3J6cG40OTU1N3ZkdDJlNXRqIFBTUERGS2l0LTZmN3NhcnA3dHNhN3VtbjRmOTJ3dmoxYmZ2IFBTUERGS2l0LUxheW91dC1Db25maWctT3B0aW9uLUljb24gUFNQREZLaXQtSWNvbiBQU1BERktpdC1JY29uLUxheW91dENvbmZpZ1ZpZXdSb3RhdGVMZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMzZweDsgaGVpZ2h0OiAzNnB4O1wiPjxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZvY3VzYWJsZT1cImZhbHNlXCI%252BPHJlY3Qgb3BhY2l0eT1cIi4xNVwiIHk9XCIxXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjIyXCIgcng9XCIxLjI1XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcmVjdD48cmVjdCBvcGFjaXR5PVwiLjE1XCIgeD1cIi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMjNcIiBoZWlnaHQ9XCIyMVwiIHJ4PVwiLjc1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCI%252BPC9yZWN0PjxwYXRoIGQ9XCJNOSA2LjY1bDIuNDE1LTIuNDE1YS4wNS4wNSAwIDAgMSAuMDg1LjAzNnY0Ljc1OGEuMDUuMDUgMCAwIDEtLjA4NS4wMzZMOSA2LjY1elwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI%252BPC9wYXRoPjxwYXRoIGQ9XCJNMTIgMTkuNWE2LjUgNi41IDAgMSAwIDAtMTNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVwiLjY2XCIgZD1cIk04LjY0MSAxOC41NjZhNi41MzIgNi41MzIgMCAwIDEtMi4yMTQtMi4yMTlcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVwiLjMzXCIgZD1cIk01LjUgMTNjMC0uODg0LjE3Ni0xLjcyNi40OTYtMi40OTRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD48L3N2Zz48L3NwYW4%252BPC9zcGFuPmAsXG4gICAgb25QcmVzczogKGV2ZW50KSA9PiB7XG4gICAgICBpbnN0YW5jZS5hcHBseU9wZXJhdGlvbnMoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJyb3RhdGVQYWdlc1wiLCAvLyBSb3RhdGlvbiBvcGVyYXRpb25cbiAgICAgICAgICBwYWdlSW5kZXhlczogW2luc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4XSwgLy8gVGFyZ2V0IHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgICAgICByb3RhdGVCeTogLTkwLCAvLyBSb3RhdGUgY291bnRlcmNsb2Nrd2lzZSBieSA5MCBkZWdyZWVzXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGl0ZW1fMiA9IHtcbiAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgIGlkOiBcIkNsb2Nrd2lzZVwiLFxuICAgIHRpdGxlOiBcIkNsb2Nrd2lzZVwiLCAvLyBCdXR0b24gdGl0bGVcbiAgICBpY29uOiBgPHNwYW4gY2xhc3M9XCJQU1BERktpdC00NDFtcTZtMmV3ZDc2dmVlOTV2OWZyN215MiBQU1BERktpdC1MYXlvdXQtQ29uZmlnLU9wdGlvbi1QYWdlLVJvdGF0aW9uLVJpZ2h0IFBTUERGS2l0LUxheW91dC1Db25maWctT3B0aW9uXCIgdGl0bGU9XCJSb3RhdGUgUmlnaHRcIiBhcmlhLWxhYmVsPVwiUm90YXRlIFJpZ2h0XCIgaWQ9XCJkb3duc2hpZnQtNS1pdGVtLTZcIiByb2xlPVwib3B0aW9uXCIgYXJpYS1zZWxlY3RlZD1cImZhbHNlXCI%252BPHNwYW4gY2xhc3M9XCJQU1BERktpdC02ZWVrbXgycjNyenBuNDk1NTd2ZHQyZTV0aiBQU1BERktpdC02ZjdzYXJwN3RzYTd1bW40Zjkyd3ZqMWJmdiBQU1BERktpdC1MYXlvdXQtQ29uZmlnLU9wdGlvbi1JY29uIFBTUERGS2l0LUljb24gUFNQREZLaXQtSWNvbi1MYXlvdXRDb25maWdWaWV3Um90YXRlUmlnaHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cIndpZHRoOiAzNnB4OyBoZWlnaHQ6IDM2cHg7XCI%252BPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj48cmVjdCBvcGFjaXR5PVwiLjE1XCIgeT1cIjFcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEuMjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCI%252BPC9yZWN0PjxyZWN0IG9wYWNpdHk9XCIuMTVcIiB4PVwiLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIyM1wiIGhlaWdodD1cIjIxXCIgcng9XCIuNzVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIj48L3JlY3Q%252BPHBhdGggZD1cIk0xNSA2LjY1bC0yLjQxNS0yLjQxNWEuMDUuMDUgMCAwIDAtLjA4NS4wMzZ2NC43NThhLjA1LjA1IDAgMCAwIC4wODUuMDM2TDE1IDYuNjV6XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48L3BhdGg%252BPHBhdGggZD1cIk0xMiAxOS41YTYuNSA2LjUgMCAxIDEgMC0xM1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI%252BPC9wYXRoPjxwYXRoIG9wYWNpdHk9XCIuNjZcIiBkPVwiTTE1LjM1OSAxOC41NjZhNi41MzIgNi41MzIgMCAwIDAgMi4yMTQtMi4yMTlcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVwiLjMzXCIgZD1cIk0xOC41IDEzYTYuNDggNi40OCAwIDAgMC0uNDk2LTIuNDk0XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48L3BhdGg%252BPC9zdmc%252BPC9zcGFuPjwvc3Bhbj5gLFxuICAgIG9uUHJlc3M6IChldmVudCkgPT4ge1xuICAgICAgaW5zdGFuY2UuYXBwbHlPcGVyYXRpb25zKFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwicm90YXRlUGFnZXNcIiwgLy8gUm90YXRpb24gb3BlcmF0aW9uXG4gICAgICAgICAgcGFnZUluZGV4ZXM6IFtpbnN0YW5jZS52aWV3U3RhdGUuY3VycmVudFBhZ2VJbmRleF0sIC8vIFRhcmdldCB0aGUgY3VycmVudCBwYWdlXG4gICAgICAgICAgcm90YXRlQnk6IDkwLCAvLyBSb3RhdGUgY2xvY2t3aXNlIGJ5IDkwIGRlZ3JlZXNcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0sXG4gIH07XG5cbiAgLy8gQWRkIHRoZSBjdXN0b20gdG9vbGJhciBidXR0b25zIHRvIHRoZSBleGlzdGluZyB0b29sYmFyIGl0ZW1zXG4gIGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcygoaXRlbXMpID0%252BIHtcbiAgICBpdGVtcy5wdXNoKGl0ZW1fMSwgaXRlbV8yKTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH0pO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIGZvciBkb2N1bWVudCBjaGFuZ2Ugb3BlcmF0aW9uc1xuICBpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKFwiZG9jdW1lbnQuY2hhbmdlXCIsIChvcGVyYXRpb25zKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJEb2N1bWVudCBjaGFuZ2VkOlwiLCAuLi5vcGVyYXRpb25zKTsgLy8gTG9nIGRvY3VtZW50IG1vZGlmaWNhdGlvbnNcbiAgfSk7XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + - Add custom buttons in the toolbar to help rotate the current page clockwise or counterclockwise, while also logging any document changes. — [Video](https://www.youtube.com/watch?v=z51KF9KUzQI) + +- [Add redaction annotation to the annotation sidebar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tbEUxUXUwYzdjVCIsImxheWVyIjoicmFuZG9ta1FnUzRqOEpySCJ9fSwibW9kZSI6InN0YW5kYWxvbmUiLCJqcyI6Ii8vIFRoaXMgcGxheWdyb3VuZCBhZGRzIHJlZGFjdGlvbiBhbm5vdGF0aW9uIHN1cHBvcnQgYW5kIGEgdGV4dCByZWRhY3Rpb24gdG9vbC5cbi8vIE1hcmsgaXRlbXMgZm9yIHJlZGFjdGlvbiwgdGhlbiBvcGVuIHRoZSBBbm5vdGF0aW9ucyBzaWRlYmFyIHRvIHNlZSBhbmQgbmF2aWdhdGUgdG8gdGhlbSBieSBjbGlja2luZyBvbiB0aGVtXG5cblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG5cbiAgLy8gQ29uZmlndXJlIGluaXRpYWwgdmlldyBzdGF0ZSB3aXRoIGN1c3RvbSBzaWRlYmFyIG9wdGlvbnNcbiAgaW5pdGlhbFZpZXdTdGF0ZTogbmV3IFBTUERGS2l0LlZpZXdTdGF0ZSh7XG4gICAgc2lkZWJhck9wdGlvbnM6IHtcbiAgICAgIC8vIENvbmZpZ3VyZSBhbm5vdGF0aW9uIHNpZGViYXIgbW9kZVxuICAgICAgW1BTUERGS2l0LlNpZGViYXJNb2RlLkFOTk9UQVRJT05TXToge1xuICAgICAgICAvLyBJbmNsdWRlIGRlZmF1bHQgYW5ub3RhdGlvbiB0eXBlcyBwbHVzIHJlZGFjdGlvbiBhbm5vdGF0aW9uc1xuICAgICAgICBpbmNsdWRlQ29udGVudDogW1xuICAgICAgICAgIC4uLlBTUERGS2l0LmRlZmF1bHRBbm5vdGF0aW9uc1NpZGViYXJDb250ZW50LFxuICAgICAgICAgIFBTUERGS2l0LkFubm90YXRpb25zLlJlZGFjdGlvbkFubm90YXRpb24sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gQWRkIHJlZGFjdGlvbiB0ZXh0IGhpZ2hsaWdodGVyIHRvb2wgdG8gdGhlIHRvb2xiYXJcbiAgaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcykgPT4gW1xuICAgIC4uLml0ZW1zLFxuICAgIHsgdHlwZTogXCJyZWRhY3QtdGV4dC1oaWdobGlnaHRlclwiIH0sXG4gIF0pO1xuXG4gIC8vIExvZyBzdWNjZXNzIGFuZCBkb2N1bWVudGF0aW9uIGxpbmtzXG4gIGNvbnNvbGUubG9nKFwiUFNQREZLaXQgbG9hZGVkIVwiKTtcbiAgY29uc29sZS5sb2coXCJBUEkgZG9jczogaHR0cHM6Ly9wc3BkZmtpdC5jb20vYXBpL3dlYi9cIik7XG4gIGNvbnNvbGUubG9nKFwiR3VpZGVzOiBodHRwczovL3BzcGRma2l0LmNvbS9ndWlkZXMvd2ViL1wiKTtcbn0pO1xuIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) + - Add redaction annotations to the sidebar view and append a redaction highlighter button to the toolbar. — [Video](https://www.youtube.com/watch?v=82cuTLHsKO8) + +- [Persistent line drawing mode with toggle via a custom toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiIvLyBEZWNsYXJlIGluc3RhbmNlIHZhcmlhYmxlIGZvciBQU1BERktpdFxubGV0IGluc3RhbmNlO1xuXG4vLyBUcmFjayB3aGV0aGVyIGxpbmUgY3JlYXRpb24gbW9kZSBpcyBlbmFibGVkXG5sZXQgaXNMaW5lQ3JlYXRpb25FbmFibGVkID0gZmFsc2U7XG5cbi8vIEN1c3RvbSB0b29sYmFyIGl0ZW0gZm9yIGFkZGluZyBjb250aW51b3VzIGxpbmUgYW5ub3RhdGlvbnNcbmNvbnN0IGxpbmVUb29sSXRlbSA9IHtcbiAgdHlwZTogXCJjdXN0b21cIixcbiAgaWQ6IFwiTGluZVRvb2xcIixcbiAgdGl0bGU6IFwiQWRkIExpbmVcIixcbiAgc2VsZWN0ZWQ6IGlzTGluZUNyZWF0aW9uRW5hYmxlZCxcbiAgb25QcmVzcygpIHtcbiAgICBpZiAoaXNMaW5lQ3JlYXRpb25FbmFibGVkKSB7XG4gICAgICAvLyBEZWFjdGl2YXRlIGxpbmUgY3JlYXRpb24gbW9kZVxuICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BXG4gICAgICAgIHZpZXdTdGF0ZS5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgbnVsbClcbiAgICAgICk7XG4gICAgICBpc0xpbmVDcmVhdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWN0aXZhdGUgbGluZSBjcmVhdGlvbiBtb2RlIGltbWVkaWF0ZWx5XG4gICAgICBpbnN0YW5jZS5zZXRWaWV3U3RhdGUoKHZpZXdTdGF0ZSkgPT5cbiAgICAgICAgdmlld1N0YXRlLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuU0hBUEVfTElORSlcbiAgICAgICk7XG4gICAgICBpc0xpbmVDcmVhdGlvbkVuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0b29sYmFyIGl0ZW0gc3RhdGVcbiAgICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoKGl0ZW1zKSA9PlxuICAgICAgaXRlbXMubWFwKChpdGVtKSA9PlxuICAgICAgICBpdGVtLmlkID09PSBcIkxpbmVUb29sXCJcbiAgICAgICAgICA%252FIHsgLi4uaXRlbSwgc2VsZWN0ZWQ6IGlzTGluZUNyZWF0aW9uRW5hYmxlZCB9XG4gICAgICAgICAgOiBpdGVtXG4gICAgICApXG4gICAgKTtcbiAgfSxcbn07XG5cbi8vIExvYWQgUFNQREZLaXQgKE51dHJpZW50IFdlYiBTREspXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIGVuYWJsZUhpc3Rvcnk6IHRydWUsXG4gIHRvb2xiYXJJdGVtczogUFNQREZLaXQuZGVmYXVsdFRvb2xiYXJJdGVtcy5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtLnR5cGUgPT09IFwic3BhY2VyXCIpIHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KFtpdGVtLCB7IHR5cGU6IFwidW5kb1wiIH0sIHsgdHlwZTogXCJyZWRvXCIgfV0pO1xuICAgIH1cbiAgICBpZiAoaXRlbS50eXBlID09PSBcImV4cG9ydC1wZGZcIikge1xuICAgICAgcmV0dXJuIGFjYy5jb25jYXQoW2l0ZW0sIGxpbmVUb29sSXRlbV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChbaXRlbV0pO1xuICAgIH1cbiAgfSwgW10pLFxufSkudGhlbigoX2luc3RhbmNlKSA9PiB7XG4gIGluc3RhbmNlID0gX2luc3RhbmNlO1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IGxvYWRlZCB3aXRoIGNvbnRpbnVvdXMgbGluZSBhbm5vdGF0aW9uLiAtIEJ5IE5hcmFzaGltYW5cIik7XG5cbiAgLy8gUmUtZW5hYmxlIGludGVyYWN0aW9uIG1vZGUgYXV0b21hdGljYWxseSBhZnRlciBhbm5vdGF0aW9uIGNyZWF0aW9uXG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbm5vdGF0aW9ucy5jcmVhdGVcIiwgKGFubm90YXRpb25zKSA9PiB7XG4gICAgaWYgKCFpc0xpbmVDcmVhdGlvbkVuYWJsZWQpIHJldHVybjtcblxuICAgIGNvbnN0IGxpbmVDcmVhdGVkID0gYW5ub3RhdGlvbnMuc29tZShcbiAgICAgIChhbm5vdCkgPT4gYW5ub3QgaW5zdGFuY2VvZiBQU1BERktpdC5Bbm5vdGF0aW9ucy5MaW5lQW5ub3RhdGlvblxuICAgICk7XG5cbiAgICBpZiAobGluZUNyZWF0ZWQpIHtcbiAgICAgIC8vIFNsaWdodCBkZWxheSBlbnN1cmVzIGludGVybmFsIHJlc2V0IGNvbXBsZXRlc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PlxuICAgICAgICAgIHZpZXdTdGF0ZS5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLlNIQVBFX0xJTkUpXG4gICAgICAgICk7XG4gICAgICB9LCA1MCk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + +- [Persistent text annotation mode via a custom toolbar toggle](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiIvLyBEZWNsYXJlIHRoZSBpbnN0YW5jZSB2YXJpYWJsZSBmb3IgUFNQREZLaXRcbmxldCBpbnN0YW5jZTtcblxuLy8gVHJhY2sgaWYgdGV4dCBhbm5vdGF0aW9uIGNvbnRpbnVvdXMgbW9kZSBpcyBhY3RpdmVcbmxldCBpc1RleHRDcmVhdGlvbkVuYWJsZWQgPSBmYWxzZTtcblxuLy8gQ3VzdG9tIHRvb2xiYXIgaXRlbSB0byB0b2dnbGUgY29udGludW91cyBUZXh0QW5ub3RhdGlvbiBtb2RlXG5jb25zdCB0ZXh0VG9vbEl0ZW0gPSB7XG4gIHR5cGU6IFwiY3VzdG9tXCIsXG4gIGlkOiBcIlRleHRUb29sXCIsXG4gIHRpdGxlOiBcIkFkZCBUZXh0XCIsXG4gIHNlbGVjdGVkOiBpc1RleHRDcmVhdGlvbkVuYWJsZWQsXG4gIG9uUHJlc3MoKSB7XG4gICAgaWYgKGlzVGV4dENyZWF0aW9uRW5hYmxlZCkge1xuICAgICAgLy8gV2hlbiBidXR0b24gdG9nZ2xlZCBPRkYsIGV4cGxpY2l0bHkgZGVhY3RpdmF0ZSBtb2RlXG4gICAgICBpbnN0YW5jZS5zZXRWaWV3U3RhdGUoKHZpZXdTdGF0ZSkgPT5cbiAgICAgICAgdmlld1N0YXRlLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBudWxsKVxuICAgICAgKTtcbiAgICAgIGlzVGV4dENyZWF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXaGVuIGJ1dHRvbiB0b2dnbGVkIE9OLCBleHBsaWNpdGx5IGFjdGl2YXRlIFRFWFQgbW9kZVxuICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BXG4gICAgICAgIHZpZXdTdGF0ZS5zZXQoXCJpbnRlcmFjdGlvbk1vZGVcIiwgUFNQREZLaXQuSW50ZXJhY3Rpb25Nb2RlLlRFWFQpXG4gICAgICApO1xuICAgICAgaXNUZXh0Q3JlYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRUb29sYmFySXRlbXMoKGl0ZW1zKSA9PlxuICAgICAgaXRlbXMubWFwKChpdGVtKSA9PlxuICAgICAgICBpdGVtLmlkID09PSBcIlRleHRUb29sXCJcbiAgICAgICAgICA%252FIHsgLi4uaXRlbSwgc2VsZWN0ZWQ6IGlzVGV4dENyZWF0aW9uRW5hYmxlZCB9XG4gICAgICAgICAgOiBpdGVtXG4gICAgICApXG4gICAgKTtcbiAgfSxcbn07XG5cbi8vIExvYWQgTnV0cmllbnQgV2ViIFNES1xuUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICBlbmFibGVIaXN0b3J5OiB0cnVlLFxuICB0b29sYmFySXRlbXM6IFBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMucmVkdWNlKChhY2MsIGl0ZW0pID0%252BIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSBcInNwYWNlclwiKSB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChbaXRlbSwgeyB0eXBlOiBcInVuZG9cIiB9LCB7IHR5cGU6IFwicmVkb1wiIH1dKTtcbiAgICB9XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJleHBvcnQtcGRmXCIpIHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KFtpdGVtLCB0ZXh0VG9vbEl0ZW1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFjYy5jb25jYXQoW2l0ZW1dKTtcbiAgICB9XG4gIH0sIFtdKSxcbn0pLnRoZW4oKF9pbnN0YW5jZSkgPT4ge1xuICBpbnN0YW5jZSA9IF9pbnN0YW5jZTtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQgd2l0aCBjb3JyZWN0IHRvZ2dsZSBsb2dpYy4gLSBCeSBOYXJhc2hpbWFuXCIpO1xuXG4gIC8vIExpc3RlbiBleHBsaWNpdGx5IGZvciB2aWV3U3RhdGUgY2hhbmdlc1xuICBpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKFwidmlld1N0YXRlLmNoYW5nZVwiLCAodmlld1N0YXRlKSA9PiB7XG4gICAgY29uc3QgY3VycmVudEludGVyYWN0aW9uTW9kZSA9IHZpZXdTdGF0ZS5pbnRlcmFjdGlvbk1vZGU7XG5cbiAgICBpZiAoY3VycmVudEludGVyYWN0aW9uTW9kZSA9PT0gbnVsbCAmJiBpc1RleHRDcmVhdGlvbkVuYWJsZWQpIHtcbiAgICAgIC8vIEVuc3VyZSBpbnRlcm5hbCByZXNldCAoYWZ0ZXIgdGV4dCBhbm5vdGF0aW9uIGNyZWF0aW9uKSB0cmlnZ2VycyBURVhUIG1vZGUgYWdhaW5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBET1VCTEUtQ0hFQ0sgYnV0dG9uIHN0YXRlIGJlZm9yZSByZWFjdGl2YXRpbmcgdG8gYXZvaWQgdW5pbnRlbmRlZCBhY3RpdmF0aW9uc1xuICAgICAgICBpZiAoaXNUZXh0Q3JlYXRpb25FbmFibGVkKSB7XG4gICAgICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2cykgPT5cbiAgICAgICAgICAgIHZzLnNldChcImludGVyYWN0aW9uTW9kZVwiLCBQU1BERktpdC5JbnRlcmFjdGlvbk1vZGUuVEVYVClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + diff --git a/playground/web-viewer.md b/playground/web-viewer.md new file mode 100644 index 0000000..02bdad4 --- /dev/null +++ b/playground/web-viewer.md @@ -0,0 +1,63 @@ +# Web SDK Examples: Viewer + +> These are interactive Nutrient Playground examples. Click any link to try the code in your browser. +> +> For local runnable examples, see [web/viewer/README.md](../web/viewer/README.md). + +--- + +## Viewer + +- [Show real-time zoom percentage in the toolbar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJiYXNpYy5wZGYifSwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgLy8gU2V0IHRoZSBkZWZhdWx0IHpvb20gbGV2ZWwgdG8gMTAwJSBvbiBsb2FkXG4gIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodmlld1N0YXRlKSA9PiB2aWV3U3RhdGUuc2V0KFwiem9vbVwiLCAxKSk7XG5cbiAgLy8gQ3JlYXRlIGEgY3VzdG9tIHRvb2xiYXIgaXRlbSB0byBkaXNwbGF5IHpvb20gcGVyY2VudGFnZVxuICBjb25zdCB0b29sYmFySXRlbXMgPSBbXG4gICAge1xuICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgIHRpdGxlOiBcIjEwMCVcIiwgLy8gSW5pdGlhbCBkaXNwbGF5IGFzIDEwMCVcbiAgICAgIGlkOiBcInpvb20tZGlzcGxheVwiLCAvLyBVbmlxdWUgSUQgZm9yIHRoZSB6b29tIGRpc3BsYXkgaXRlbVxuICAgICAgZHJvcGRvd25Hcm91cDogXCJ6b29tR3JvdXBcIiwgLy8gR3JvdXAgaXQgd2l0aCBvdGhlciB6b29tIG9wdGlvbnMgaWYgbmVlZGVkXG4gICAgICBzZWxlY3RlZDogdHJ1ZSwgLy8gU2V0IGFzIHNlbGVjdGVkIGluaXRpYWxseVxuICAgICAgdG9vbHRpcDogXCJSZXNldCB0byAxMDAlXCIsIC8vIFRvb2x0aXAgd2hlbiBob3ZlcmVkXG4gICAgICBvblByZXNzOiAoKSA9PiB7XG4gICAgICAgIC8vIFJlc2V0IHpvb20gdG8gMTAwJSB3aGVuIGNsaWNrZWRcbiAgICAgICAgaW5zdGFuY2Uuc2V0Vmlld1N0YXRlKCh2aWV3U3RhdGUpID0%252BIHZpZXdTdGF0ZS5zZXQoXCJ6b29tXCIsIDEpKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgXTtcblxuICAvLyBBZGQgdGhlIGN1c3RvbSB0b29sYmFyIGl0ZW0gdG8gdGhlIHRvb2xiYXJcbiAgaW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcykgPT4gaXRlbXMuY29uY2F0KHRvb2xiYXJJdGVtcykpO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIHRvIHVwZGF0ZSB6b29tIGRpc3BsYXkgZHluYW1pY2FsbHlcbiAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihcInZpZXdTdGF0ZS56b29tLmNoYW5nZVwiLCAoem9vbSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygem9vbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IE1hdGgucm91bmQoem9vbSAqIDEwMCkgKyBcIiVcIjsgLy8gQ29udmVydCB6b29tIGxldmVsIHRvIHBlcmNlbnRhZ2VcbiAgICAgIGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcygoaXRlbXMpID0%252BXG4gICAgICAgIGl0ZW1zLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgICBpdGVtLmlkID09PSBcInpvb20tZGlzcGxheVwiID8geyAuLi5pdGVtLCB0aXRsZTogcGVyY2VudGFnZSB9IDogaXRlbVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG4gIGNvbnNvbGUubG9nKFwiTnV0cmllbnQgdmlld2VyIGxvYWRlZCEgLSBieSBOYXJhc2hpbWFuXCIpO1xufSk7XG4ifQ%253D%253D) + +- [Zoom in/out with scroll](https://nutrient.io/playground?p=eyJ2IjoxLCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChpbnN0YW5jZT0%252Be2NvbnN0IE1JTl9aT09NPWluc3RhbmNlLm1pbmltdW1ab29tTGV2ZWwsTUFYX1pPT009aW5zdGFuY2UubWF4aW11bVpvb21MZXZlbDsvLyBjaGFuZ2UgYnkgMTAlIGZvciBlYWNoIHdoZWVsIGV2ZW50XG4vLyBtYXhpbXVtIHpvb20gbGV2ZWxcbi8vIE1haW50YWluIG91ciBvd24gem9vbSBzdGF0ZVxubGV0IGN1cnJlbnRab29tPTE7aW5zdGFuY2UuY29udGVudERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywoZnVuY3Rpb24oZXZlbnQpe1xuLy8gQ2FwdHVyZSBtb3VzZSBwb3NpdGlvblxuY29uc3QgbW91c2VYPWV2ZW50LmNsaWVudFgsbW91c2VZPWV2ZW50LmNsaWVudFksem9vbURpcmVjdGlvbj1ldmVudC5kZWx0YVk%252BMD8tMToxOy8vIC0xIGZvciB6b29tIG91dCwgMSBmb3Igem9vbSBpblxuY3VycmVudFpvb20rPS4wNSp6b29tRGlyZWN0aW9uLFxuLy8gRW5zdXJlIGN1cnJlbnRab29tIGlzIHdpdGhpbiB0aGUgZGVmaW5lZCByYW5nZVxuY3VycmVudFpvb209TWF0aC5tYXgoTUlOX1pPT00sTWF0aC5taW4oTUFYX1pPT00sY3VycmVudFpvb20pKTtjb25zdCB6b29tV2lkdGg9d2luZG93LmlubmVyV2lkdGgqY3VycmVudFpvb20sem9vbUhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHQqY3VycmVudFpvb20sbGVmdD1tb3VzZVgtem9vbVdpZHRoLzIsdG9wPW1vdXNlWS16b29tSGVpZ2h0LzIsYm91bmRpbmdCb3g9bmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe2xlZnQ6bGVmdCx0b3A6dG9wLHdpZHRoOnpvb21XaWR0aCxoZWlnaHQ6em9vbUhlaWdodH0pO2NvbnNvbGUubG9nKCdjdXJyZW50IFpvb206ICcrY3VycmVudFpvb20pLFxuLy8gVXBkYXRlIHRoZSB6b29tIGxldmVsIGluIHRoZSB2aWV3U3RhdGVcbmluc3RhbmNlLnNldFZpZXdTdGF0ZSgoc3RhdGU9PnN0YXRlLnNldCgnem9vbScsY3VycmVudFpvb20pKSksXG4vLyBJbnZva2UganVtcEFuZFpvb21Ub1JlY3Rcbmluc3RhbmNlLmp1bXBBbmRab29tVG9SZWN0KGluc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4LGJvdW5kaW5nQm94KSxcbi8vIFByZXZlbnQgZGVmYXVsdCB3aGVlbCBiZWhhdmlvclxuZXZlbnQucHJldmVudERlZmF1bHQoKX0pLHtwYXNzaXZlOiExfSl9KSk7In0%253D) + - Use the mouse wheel to zoom in or out from where the mouse is pointing. — [Video](https://www.youtube.com/watch?v=-2vSBsXXSZc) + +- [Create a blank A3 document](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6ImNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50LCAuLi5yZXN0IH0gPSBiYXNlT3B0aW9ucyxcbiAgUERGc3R1YiA9IGAlUERGLTEuMFxuMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4%252BZW5kb2JqXG4yIDAgb2JqPDwvVHlwZS9QYWdlcy9LaWRzWzMgMCBSIDQgMCBSIDUgMCBSIDYgMCBSIDcgMCBSXS9Db3VudCA1Pj5lbmRvYmpcbjMgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA4NDEuODkgMTE5MC41NV0%252BPmVuZG9ialxuNCAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDg0MS44OSAxMTkwLjU1XT4%252BZW5kb2JqXG41IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgODQxLjg5IDExOTAuNTVdPj5lbmRvYmpcbjYgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA4NDEuODkgMTE5MC41NV0%252BPmVuZG9ialxuNyAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDg0MS44OSAxMTkwLjU1XT4%252BZW5kb2JqXG54cmVmXG4wIDhcbjAwMDAwMDAwMDAgNjU1MzUgZlxuMDAwMDAwMDAxMCAwMDAwMCBuXG4wMDAwMDAwMDUzIDAwMDAwIG5cbjAwMDAwMDAxMDIgMDAwMDAgblxuMDAwMDAwMDE1MSAwMDAwMCBuXG4wMDAwMDAwMjAwIDAwMDAwIG5cbjAwMDAwMDAyNDkgMDAwMDAgblxuMDAwMDAwMDI5OCAwMDAwMCBuXG50cmFpbGVyPDwvU2l6ZSA4L1Jvb3QgMSAwIFI%252BPlxuc3RhcnR4cmVmXG4zNDdcbiVFT0ZcbmAsXG4gIHVpbnQ4YXJyYXkgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoUERGc3R1Yik7XG5QU1BERktpdC5sb2FkKHtcbiAgLi4ucmVzdCxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIGRvY3VtZW50OiB1aW50OGFycmF5LmJ1ZmZlcixcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiTnV0cmllbnQgbG9hZGVkISBieSBOYXJhc2hpbWFuXCIpO1xufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIn0%253D) + +- [Load a document from an S3 bucket as a URL and allow a linearized document](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6IlBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIGRvY3VtZW50OlxuICAgIFwiaHR0cHM6Ly9wdWJsaWMtc29sdXRpb25zLWVuZ2luZWVyaW5nLWJ1Y2tldC5zMy5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbS9kb2NzL0xpbmVhcml6ZWQtaU9TLVF1aWNrU3RhcnQtR3VpZGVzLnBkZlwiLFxuICBhbGxvd0xpbmVhcml6ZWRMb2FkaW5nOiB0cnVlLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIGJ5IE5hcmFzaGltYW5cIik7XG59KTtcbiIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG5cdCJ9) + +- [Use a custom button on the toolbar to add a blank page to the beginning of a document](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImZvcm0ucGRmIn0sImpzIjoiUFNQREZLaXQubG9hZCh7XG4gIC4uLmJhc2VPcHRpb25zLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgaXNBUFN0cmVhbVJlbmRlcmVkOiAoKSA9PiBmYWxzZSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICBpZDogXCJteS1idXR0b25cIixcbiAgICB0aXRsZTogXCJBZGQtUGFnZVwiLFxuICAgIG9uUHJlc3M6IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgUERGc3R1YiA9XG4gICAgICAgICAgXCIlUERGLTEuMFxcbjEgMCBvYmo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI%252BPmVuZG9iaiAyIDAgb2JqPDwvVHlwZS9QYWdlcy9LaWRzWzMgMCBSXS9Db3VudCAxPj5lbmRvYmogMyAwIG9iajw8L1R5cGUvUGFnZS9NZWRpYUJveFswIDAgNzUwIDEwMDBdPj5lbmRvYmpcXG54cmVmXFxuMCA0XFxuMDAwMDAwMDAwMCA2NTUzNSBmXFxuMDAwMDAwMDAxMCAwMDAwMCBuXFxuMDAwMDAwMDA1MyAwMDAwMCBuXFxuMDAwMDAwMDEwMiAwMDAwMCBuXFxudHJhaWxlcjw8L1NpemUgNC9Sb290IDEgMCBSPj5cXG5zdGFydHhyZWZcXG4xNDlcXG4lRU9GXCIsXG4gICAgICAgIHVpbnQ4YXJyYXkgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoUERGc3R1Yik7XG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3VpbnQ4YXJyYXkuYnVmZmVyXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiIH0pO1xuICAgICAgYXdhaXQgaW5zdGFuY2UuYXBwbHlPcGVyYXRpb25zKFtcbiAgICAgICAge1xuICAgICAgICAgIGJlZm9yZVBhZ2VJbmRleDogMCxcbiAgICAgICAgICBkb2N1bWVudDogYmxvYixcbiAgICAgICAgICB0cmVhdEltcG9ydGVkRG9jdW1lbnRBc09uZVBhZ2U6IGZhbHNlLFxuICAgICAgICAgIHR5cGU6IFwiaW1wb3J0RG9jdW1lbnRcIixcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0sXG4gIH07XG4gIGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcyhbXG4gICAgaXRlbSxcbiAgICB7XG4gICAgICB0eXBlOiBcImZvcm0tY3JlYXRvclwiLFxuICAgIH0sXG4gIF0pO1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IExvYWRlZCEgYnkgTmFyYXNoaW1hblwiKTtcbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIn0%253D) + +- [Export selected pages in Document Editor](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tSnNFMWRTck9xTCIsImxheWVyIjoicmFuZG9tNTNzeVJEQ3gyQiJ9fSwianMiOiJjb25zdCBjdXN0b21JdGVtPXt0eXBlOidjdXN0b20nLGlkOidFeHBvcnRQREYnLHRpdGxlOidFeHBvcnQgU2VsZWN0ZWQgUGFnZXMnLG9uUHJlc3M6ZXZlbnQ9Pntcbi8vIEdldCB0aGUgcGFnZUlkcyBvZiB0aGUgcGFnZSBzZWxlY3RlZCBpbiB0aGUgRG9jdW1lbnQgRWRpdG9yXG5sZXQgc2VsZWN0ZWRQYWdlcz13aW5kb3cuaW5zdGFuY2UuY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5QU1BERktpdC1Eb2N1bWVudEVkaXRvci1UaHVtYm5haWxzLVBhZ2UtU2VsZWN0ZWQnKSxwYWdlc1RvRXhwb3J0PUFycmF5LmZyb20oc2VsZWN0ZWRQYWdlcykubWFwKChwYWdlPT5wYWdlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1pZCcpKSkubWFwKE51bWJlcikuc29ydCgoKGEsYik9PmEtYikpO1xuLy8gR2V0IHRoZSBkb2N1bWVudCBhcyBhIFBERiBBcnJheUJ1ZmZlci5cbmNvbnN0IG9wZXJhdGlvbnM9W3t0eXBlOidrZWVwUGFnZXMnLHBhZ2VJbmRleGVzOnBhZ2VzVG9FeHBvcnR9XTt3aW5kb3cuaW5zdGFuY2UuZXhwb3J0UERGV2l0aE9wZXJhdGlvbnMob3BlcmF0aW9ucykudGhlbigocGRmQXJyYXlCdWZmZXI9Pntcbi8vIFlvdSBjYW4gdGhlbiBzZW5kIHRoaXMgQXJyYXlCdWZmZXIgdG8geW91ciBzZXJ2ZXIsIHNhdmUgaXQsIG9yIHR1cm4gaXQgaW50byBhIEJsb2IgdG8gZG93bmxvYWQuXG5jb25zdCBibG9iPW5ldyBCbG9iKFtwZGZBcnJheUJ1ZmZlcl0se3R5cGU6J2FwcGxpY2F0aW9uL3BkZid9KSx1cmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSxsaW5rPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtsaW5rLmhyZWY9dXJsLGxpbmsuZG93bmxvYWQ9J2V4cG9ydGVkLnBkZicsbGluay5jbGljaygpLFxuLy8gUmVtZW1iZXIgdG8gcmV2b2tlIHRoZSBVUkwgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxuc2V0VGltZW91dCgoKCk9PlVSTC5yZXZva2VPYmplY3RVUkwodXJsKSksMTAwKX0pKSxjb25zb2xlLmxvZygnc2VsZWN0ZWQgcGFnZXMnKSxjb25zb2xlLmxvZyhwYWdlc1RvRXhwb3J0KX19LGRlZmF1bHRUb29sYmFySXRlbXM9UFNQREZLaXQuZGVmYXVsdERvY3VtZW50RWRpdG9yVG9vbGJhckl0ZW1zO1xuLy8gR2V0IHRoZSBkZWZhdWx0IHRvb2xiYXIgaXRlbXMuXG4vLyBBZGQgYSBjdXN0b20gaXRlbSB0byB0aGUgbGlzdC5cbmRlZmF1bHRUb29sYmFySXRlbXMucHVzaChjdXN0b21JdGVtKSxQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyxkb2N1bWVudEVkaXRvclRvb2xiYXJJdGVtczpkZWZhdWx0VG9vbGJhckl0ZW1zfSkudGhlbigoaW5zdGFuY2U9Pnt3aW5kb3cuaW5zdGFuY2U9aW5zdGFuY2V9KSk7IiwibW9kZSI6InN0YW5kYWxvbmUiLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuXHQifQ%253D%253D) + - Add a new button in Document Editor to export selected pages from a document as a PDF. + +- [Regular expression (regex) search](https://nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImNvbnN0IGl0ZW09e3R5cGU6J2N1c3RvbScsaWQ6J215LWJ1dHRvbicsdGl0bGU6J015IEJ1dHRvbicsb25QcmVzczpldmVudD0%252Be2FsZXJ0KCdoZWxsbyBmcm9tIG15IGJ1dHRvbicpfX07dmFyIGluc3RhbmNlR2xvYmFsO1BTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zfSkudGhlbigoaW5zdGFuY2U9PntsZXQgbGFzdFNlYXJjaFRlcm09Jyc7aW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignc2VhcmNoLnRlcm1DaGFuZ2UnLChhc3luYyBldmVudD0%252Be1xuLy8gT3B0IG91dCBmcm9tIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLlxuZXZlbnQucHJldmVudERlZmF1bHQoKTtjb25zdHt0ZXJtOnRlcm19PWV2ZW50O1xuLy8gVXBkYXRlIHRoZSBzZWFyY2ggdGVybSBpbiB0aGUgc2VhcmNoIGJveC4gV2l0aG91dCB0aGlzIGxpbmUsXG4vLyB0aGUgc2VhcmNoIGJveCB3b3VsZCBzdGF5IGVtcHR5LlxuaW5zdGFuY2Uuc2V0U2VhcmNoU3RhdGUoKHN0YXRlPT5zdGF0ZS5zZXQoJ3Rlcm0nLHRlcm0pKSksbGFzdFNlYXJjaFRlcm09dGVybTtcbi8vIFBlcmZvcm0gYSBjdXN0b20gc2VhcmNoIGZvciB0aGUgdGVybS5cbmNvbnN0IHJlc3VsdHM9YXdhaXQgYXN5bmMgZnVuY3Rpb24odGVybSxpbnN0YW5jZSl7cmV0dXJuIGluc3RhbmNlLnNlYXJjaCh0ZXJtLHtzZWFyY2hUeXBlOlBTUERGS2l0LlNlYXJjaFR5cGUuUkVHRVh9KX0odGVybSxpbnN0YW5jZSk7XG4vLyBPdXIgcmVzdWx0cyBjb3VsZCByZXR1cm4gaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiBleHBlY3RlZC5cbi8vIExldCdzIG1ha2Ugc3VyZSBvbmx5IHJlc3VsdHMgbWF0Y2hpbmcgb3VyIGN1cnJlbnQgdGVybSBhcmUgYXBwbGllZC5cbmlmKHRlcm0hPT1sYXN0U2VhcmNoVGVybSlyZXR1cm47XG4vLyBGaW5hbGx5LCB3ZSBhcHBseSB0aGUgcmVzdWx0cy4gTm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBtb2RpZnlcbi8vIHRoZSBzZWFyY2ggc3RhdGUgZmlyc3QgYW5kIHRoZW4gcGFzcyB0aGUgbmV3IHN0YXRlXG4vLyB0byBgaW5zdGFuY2Uuc2V0U2VhcmNoU3RhdGVgLlxuY29uc3QgbmV3U3RhdGU9aW5zdGFuY2Uuc2VhcmNoU3RhdGUuc2V0KCdyZXN1bHRzJyxyZXN1bHRzKTtpbnN0YW5jZS5zZXRTZWFyY2hTdGF0ZShuZXdTdGF0ZSl9KSl9KSk7In0%253D) + +- [Print a single page](https://nutrient.io/playground?p=eyJ2IjoxLCJqcyI6ImNvbnN0IGl0ZW09e3R5cGU6J2N1c3RvbScsaWQ6J215LWJ1dHRvbicsdGl0bGU6J015IEJ1dHRvbicsb25QcmVzczpldmVudD0%252Be2FsZXJ0KCdoZWxsbyBmcm9tIG15IGJ1dHRvbicpfX07dmFyIGluc3RhbmNlR2xvYmFsO1BTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkssdG9vbGJhckl0ZW1zOlBTUERGS2l0LmRlZmF1bHRUb29sYmFySXRlbXMucmVkdWNlKCgoYWNjLGl0ZW0pPT4nZXhwb3J0LXBkZic9PT1pdGVtLnR5cGU%252FYWNjLmNvbmNhdChbaXRlbSx7dHlwZTonY3VzdG9tJyxpZDonUHJpbnQnLHJlc3BvbnNpdmVHcm91cDonYW5ub3RhdGUnLFxuLy9pY29uOiBcImh0dHBzOi8vc3Znc2hhcmUuY29tL2kvcTB0LnN2Z1wiLFxuc2VsZWN0ZWQ6ITEsb25QcmVzcygpe2NvbnNvbGUubG9nKCdQcmludCcpLGNvbnNvbGUubG9nKCdjdXJyZW50IHBhZ2UgJyxpbnN0YW5jZUdsb2JhbC52aWV3U3RhdGUuY3VycmVudFBhZ2VJbmRleCk7Y29uc3Qgb3BlcmF0aW9ucz1be3R5cGU6J2tlZXBQYWdlcycscGFnZUluZGV4ZXM6W2luc3RhbmNlR2xvYmFsLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4XX1dO2luc3RhbmNlR2xvYmFsLmV4cG9ydFBERldpdGhPcGVyYXRpb25zKG9wZXJhdGlvbnMpLnRoZW4oKGZ1bmN0aW9uKGJ1ZmZlcil7XG4vL2J1ZmZlcjsgLy8gPT4gQXJyYXlCdWZmZXJcbmNvbnNvbGUubG9nKGJ1ZmZlcik7XG4vLyBDb252ZXJ0IGJ1ZmZlciBpbnRvIGEgQmxvYlxuY29uc3QgYmxvYj1uZXcgQmxvYihbYnVmZmVyXSx7dHlwZTonYXBwbGljYXRpb24vcGRmJ30pLG9iamVjdFVSTD1VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuLy8gQ3JlYXRlIG9iamVjdCBVUkxcbi8vIENvbnZlcnQgdGhlIFBERiBCbG9iIHRvIGEgZGF0YSBVUkxcbihcbi8vIERlZmluZSB0aGUgYmxvYlRvRGF0YVVSTCBmdW5jdGlvblxuZnVuY3Rpb24oYmxvYil7cmV0dXJuIG5ldyBQcm9taXNlKCgocmVzb2x2ZSxyZWplY3QpPT57Y29uc3QgcmVhZGVyPW5ldyBGaWxlUmVhZGVyO3JlYWRlci5vbmxvYWRlbmQ9KCk9PnJlc29sdmUocmVhZGVyLnJlc3VsdCkscmVhZGVyLm9uZXJyb3I9cmVqZWN0LHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpfSkpfSkoYmxvYikudGhlbigoZGF0YVVSTD0%252Be1xuLy8gTG9hZCB0aGUgUERGIGRhdGEgVVJMIGludG8gdGhlIGlmcmFtZVxuY29uc29sZS5sb2coJ25vdyBwcmludGluZycpLGNvbnNvbGUubG9nKGRvY3VtZW50KTtcbi8vIENyZWF0ZSBhbiBpZnJhbWUgYW5kIGFkZCBpdCB0byB0aGUgRE9NXG5jb25zdCBwZGZGcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtwZGZGcmFtZS5pZD0ncGRmLWZyYW1lJyxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBkZkZyYW1lKSxcbi8vIExvYWQgdGhlIFBERiBkYXRhIFVSTCBpbnRvIHRoZSBpZnJhbWVcbnBkZkZyYW1lLnNyYz1vYmplY3RVUkwsXG4vLyBXYWl0IHVudGlsIHRoZSBpZnJhbWUgaGFzIGxvYWRlZCBpdHMgY29udGVudCBiZWZvcmUgcHJpbnRpbmdcbnBkZkZyYW1lLm9ubG9hZD1mdW5jdGlvbigpe3BkZkZyYW1lLmNvbnRlbnRXaW5kb3cucHJpbnQoKX19KSl9KSl9LHRpdGxlOidQcmludCBzaW5nbGUgcGFnZSd9XSk6YWNjLmNvbmNhdChbaXRlbV0pKSxbXSl9KS50aGVuKChpbnN0YW5jZT0%252Be2luc3RhbmNlR2xvYmFsPWluc3RhbmNlLGNvbnNvbGUubG9nKCdQU1BERktpdCBsb2FkZWQhJyksY29uc29sZS5sb2coJ0FQSSBkb2NzOiBodHRwczovL3BzcGRma2l0LmNvbS9hcGkvd2ViLycpLGNvbnNvbGUubG9nKCdHdWlkZXM6IGh0dHBzOi8vcHNwZGZraXQuY29tL2d1aWRlcy93ZWIvJyl9KSk7IiwibW9kZSI6InN0YW5kYWxvbmUiLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiIsImp3dCI6eyJwZXJtaXNzaW9ucyI6WyJyZWFkLWRvY3VtZW50Iiwid3JpdGUiXSwidXNlcklkIjoicmFuZG9tR0pXMEFya2V3dSIsImxheWVyIjoicmFuZG9tS1lDOFQ5b2lrciJ9fX0%253D). + - Add a print button that prints the currently viewed page of the document as a PDF when clicked. + +- [Restrict zoom level both ways](https://nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuXHQiLCJqcyI6IlBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChpbnN0YW5jZT0%252Be2NvbnNvbGUubG9nKCdpbml0aWFsIHpvb206ICcsaW5zdGFuY2UuY3VycmVudFpvb21MZXZlbCksaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcigndmlld1N0YXRlLmNoYW5nZScsKChjdXJyZW50LHByZXZpb3VzKT0%252Be2N1cnJlbnQ%252FLnpvb208PTE%252FKGluc3RhbmNlLnNldFRvb2xiYXJJdGVtcygoaXRlbXM9Pml0ZW1zLm1hcCgoaXRlbT0%252BKCd6b29tLW91dCc9PWl0ZW0udHlwZSYmKGl0ZW0uZGlzYWJsZWQ9ITApLGl0ZW0pKSkpKSxpbnN0YW5jZS5zZXRWaWV3U3RhdGUoKHZpZXdTdGF0ZT0%252Bdmlld1N0YXRlLnNldCgnem9vbScsMSkpKSk6aW5zdGFuY2Uuc2V0VG9vbGJhckl0ZW1zKChpdGVtcz0%252BaXRlbXMubWFwKChpdGVtPT4oJ3pvb20tb3V0Jz09aXRlbS50eXBlJiYoaXRlbS5kaXNhYmxlZD0hMSksaXRlbSkpKSkpfSkpfSkpOyIsInNldHRpbmdzIjp7ImZpbGVOYW1lIjoiYmFzaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21wd2kwM3RHZGxZIiwibGF5ZXIiOiJyYW5kb205Sms3YzJMMEpzIn19LCJtb2RlIjoic3RhbmRhbG9uZSJ9) + +- [Extract text from cropped PDF pages](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21WRGg3ZVVBRWFBIiwibGF5ZXIiOiJyYW5kb21LZGV1a0FhZkJMIn19LCJqcyI6IlBTUERGS2l0Lk9wdGlvbnMuSUdOT1JFX0RPQ1VNRU5UX1BFUk1JU1NJT05TPSEwLFBTUERGS2l0LmxvYWQoey4uLmJhc2VPcHRpb25zLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KS50aGVuKChpbnN0YW5jZT0%252Be1xuLy9WYXJpYWJsZXMgdG8gc2F2ZSB0aGUgY3JvcCBhcmVhIFJlY3QsIGFuZCB0aGUgcGFnZSBpbmRleCBmcm9tIHdoZXJlIGl0IHdhcyB0YWtlblxubGV0IGNyb3BBcmVhLGNyb3BQYWdlSW5kZXgsaXRlbT17aWQ6J215LWJ1dHRvbicsdGl0bGU6J2Nyb3AgcGFnZXMnLHR5cGU6J2N1c3RvbScsb25QcmVzczphc3luYyBldmVudD0%252Be2F3YWl0IGluc3RhbmNlLmV4cG9ydFBERldpdGhPcGVyYXRpb25zKFt7dHlwZTonY3JvcFBhZ2VzJyxwYWdlSW5kZXhlczpjcm9wUGFnZUluZGV4LC8vSSdtIHBhc3NpbmcgdGhlIHBhZ2UgaW5kZXggd2hlcmUgSSdtIGFwcGx5aW5nIHRoZSBjcm9wXG5jcm9wQm94OmNyb3BBcmVhfV0pLnRoZW4oKHRpdGxlQXJyQnVmPT57Y29uc29sZS50aW1lKCksUFNQREZLaXQubG9hZCh7Li4uYmFzZU9wdGlvbnMsZG9jdW1lbnQ6dGl0bGVBcnJCdWYsaGVhZGxlc3M6ITB9KS50aGVuKChhc3luYyB0eHRJbnN0YW5jZT0%252Be1xuLy9JIGFtIGFsc28gcGFzc2luZyB0aGlzIHBhZ2VJbmRleCBoZXJlIHRvIGVuc3VyZSBJIGdldCB0aGUgdGV4dCBmcm9tIHRoZSBjcm9wcGVkIHRleHRcbmNvbnN0IHRleHQ9KGF3YWl0IHR4dEluc3RhbmNlLnRleHRMaW5lc0ZvclBhZ2VJbmRleChjcm9wUGFnZUluZGV4KSkubWFwKChlPT5lLmNvbnRlbnRzKSkuam9pbignJyk7Y29uc29sZS5sb2codGV4dCksUFNQREZLaXQudW5sb2FkKHR4dEluc3RhbmNlKX0pKX0pKX19O1xuLy9NeSBjdXN0b20gdG9vbCB0byBhcHBseSB0aGUgb3BlcmF0aW9uIG9uIGNsaWNrXG4vL0hlcmUgSSBzZXQgdGhlIGN1c3RvbSB0b29sYmFyIGl0ZW1cbmluc3RhbmNlLnNldFRvb2xiYXJJdGVtcyhbe3R5cGU6J2RvY3VtZW50LWNyb3AnfSx7dHlwZTonem9vbS1vdXQnfSx7dHlwZTonem9vbS1pbid9LGl0ZW1dKSxcbi8vVGhlIGV2ZW50IGxpc3RlbmVyIHRvIGdldCB0aGUgY3JvcGJveCBhbmQgcGFnZWluZGV4IHZhbHVlc1xuaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignY3JvcEFyZWEuY2hhbmdlU3RvcCcsKGNyb3A9Pntjb25zdHtjcm9wQm94OmNyb3BCb3gscGFnZUluZGV4OnBhZ2VJbmRleH09Y3JvcDtjcm9wQXJlYT1jcm9wQm94LGNyb3BQYWdlSW5kZXg9cGFnZUluZGV4fSkpfSkpOyIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + - Add a custom “crop pages” button to the toolbar that crops a selected page and extracts its text after the crop operation is applied. + +- [Execute operations in headless mode before loading a document in the viewer](https://nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIiwiand0Ijp7InBlcm1pc3Npb25zIjpbInJlYWQtZG9jdW1lbnQiLCJ3cml0ZSJdLCJ1c2VySWQiOiJyYW5kb21sRTFRdTBjN2NUIiwibGF5ZXIiOiJyYW5kb21rUWdTNGo4SnJIIn19LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJQU1BERktpdC5sb2FkKHsuLi5iYXNlT3B0aW9ucyx0aGVtZTpQU1BERktpdC5UaGVtZS5EQVJLLGhlYWRsZXNzOiEwfSkudGhlbigoYXN5bmMgaW5zdGFuY2U9Pntcbi8vQ29udmVydGluZyB0aGUgdG90YWwgcGFnZSBjb3VudCB0byBhbiBhcnJheSB0aGF0IEknbGwgbGF0ZXIgdXNlIHRvIHNwbGl0IHRoZSBmaWxlIGluIGhhbGZcbmNvbnN0IHBhZ2VJbmRleGVzPUFycmF5LmZyb20oe2xlbmd0aDppbnN0YW5jZS50b3RhbFBhZ2VDb3VudH0sKChfLGkpPT5pKSksZmlyc3RIYWxmPXBhZ2VJbmRleGVzLnNsaWNlKDAsTWF0aC5jZWlsKHBhZ2VJbmRleGVzLmxlbmd0aC8yKSksc2Vjb25kSGFsZj1wYWdlSW5kZXhlcy5zbGljZShNYXRoLmNlaWwocGFnZUluZGV4ZXMubGVuZ3RoLzIpKSxmaWxlQT1hd2FpdCBpbnN0YW5jZS5leHBvcnRQREZXaXRoT3BlcmF0aW9ucyhbe3R5cGU6J3JlbW92ZVBhZ2VzJyxwYWdlSW5kZXhlczpzZWNvbmRIYWxmfSxcbi8qIHtcbiAgICAgICAgdHlwZTogXCJwZXJmb3JtT2NyXCIsXG4gICAgICAgIHBhZ2VJbmRleGVzOiBmaXJzdEhhbGYsXG4gICAgICAgIGxhbmd1YWdlOiBcImVuZ2xpc2hcIixcbiAgICAgIH0sKi9cbi8vQWRkaW5nIGFuIEFubm90YXRpb24gdG8gdGhlIGZpcnN0IGhhbGYgdG8gc2hvdyB0aGF0IHRoZSBwcm9jZXNzZWQgZmlsZSBpcyB0aGUgb25lIGJlaW5nIGxvYWRlZFxue3R5cGU6J2FwcGx5SW5zdGFudEpzb24nLGluc3RhbnRKc29uOnthbm5vdGF0aW9uczpbe2Jib3g6WzEwMCwxNTAsMjAwLDc1XSxibGVuZE1vZGU6J25vcm1hbCcsY3JlYXRlZEF0OicxOTcwLTAxLTAxVDAwOjAwOjAwWicsaWQ6JzAxRjczR0o0UlBFTlRDTUZTQ0o1Q1NGVDVHJyxuYW1lOicwMUY3M0dKNFJQRU5UQ01GU0NKNUNTRlQ1Rycsb3BhY2l0eToxLHBhZ2VJbmRleDowLHN0cm9rZUNvbG9yOicjMjI5M0ZCJyxzdHJva2VXaWR0aDo1LHR5cGU6J3BzcGRma2l0L3NoYXBlL3JlY3RhbmdsZScsdXBkYXRlZEF0OicxOTcwLTAxLTAxVDAwOjAwOjAwWicsdjoxfV0sZm9ybWF0OidodHRwczovL3BzcGRma2l0LmNvbS9pbnN0YW50LWpzb24vdjEnfX1dKS50aGVuKChmaWxlPT5uZXcgQmxvYihbZmlsZV0se3R5cGU6J2FwcGxpY2F0aW9uL3BkZid9KSkpLGZpbGVCPWF3YWl0IGluc3RhbmNlLmV4cG9ydFBERldpdGhPcGVyYXRpb25zKFt7dHlwZToncmVtb3ZlUGFnZXMnLHBhZ2VJbmRleGVzOmZpcnN0SGFsZn1dKS50aGVuKChmaWxlPT5uZXcgQmxvYihbZmlsZV0se3R5cGU6J2FwcGxpY2F0aW9uL3BkZid9KSkpO2luc3RhbmNlLmV4cG9ydFBERldpdGhPcGVyYXRpb25zKFtcbi8vVGhlIG9yZGVyIG9mIHRoZSBvcGVyYXRpb25zIG1hdHRlcnNcbnt0eXBlOidpbXBvcnREb2N1bWVudCcsYmVmb3JlUGFnZUluZGV4Omluc3RhbmNlLnRvdGFsUGFnZUNvdW50LHRyZWF0SW1wb3J0ZWREb2N1bWVudEFzT25lUGFnZTohMSxkb2N1bWVudDpmaWxlQn0se3R5cGU6J2ltcG9ydERvY3VtZW50JyxiZWZvcmVQYWdlSW5kZXg6aW5zdGFuY2UudG90YWxQYWdlQ291bnQsdHJlYXRJbXBvcnRlZERvY3VtZW50QXNPbmVQYWdlOiExLGRvY3VtZW50OmZpbGVBfSx7dHlwZToncmVtb3ZlUGFnZXMnLHBhZ2VJbmRleGVzOnBhZ2VJbmRleGVzfV0pLnRoZW4oKHJlcz0%252Be2NvbnN0e2RvY3VtZW50OmRvY3VtZW50LC4uLnJlc3R9PWJhc2VPcHRpb25zO1xuLy9VbmxvYWRpbmcgdGhlIGhlYWRsZXNzIGluc3RhbmNlIHRvIGVuaGFuY2UgcGVyZm9ybWFjZVxuLy9JZiB5b3UnZCBsaWtlIHRvIG5vdGljZSB0aGUgZGlmZmVyZW50IGNvbW1lbnQgb3V0IHRoZSB1bmxvYWRcblBTUERGS2l0LnVubG9hZChpbnN0YW5jZSksXG4vL0xvYWRpbmcgdGhlIHJlc3VsdGluZyBQREZcblBTUERGS2l0LmxvYWQoey4uLnJlc3QsZG9jdW1lbnQ6cmVzLHRoZW1lOlBTUERGS2l0LlRoZW1lLkRBUkt9KX0pKX0pKTsiLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + - Split a PDF document into two halves, add an annotation to the first half, and reassemble the document by importing both halves back together into a new PDF file. + +- [Save selected page from Document Editor](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIn0sImpzIjoiLy8gTG9hZCBQU1BERktpdCB3aXRoIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zXG5QU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsIC8vIFNwcmVhZCB0aGUgYmFzZSBvcHRpb25zIHRvIHJldGFpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLCAvLyBTZXQgdGhlbWUgdG8gZGFyayBtb2RlIGZvciBiZXR0ZXIgdXNlciBleHBlcmllbmNlXG59KS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAvLyBTZXQgdGhlIGludGVyYWN0aW9uIG1vZGUgdG8gRE9DVU1FTlRfRURJVE9SXG4gIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgoc3RhdGUpID0%252BXG4gICAgc3RhdGUuc2V0KFwiaW50ZXJhY3Rpb25Nb2RlXCIsIFwiRE9DVU1FTlRfRURJVE9SXCIpXG4gICk7XG5cbiAgLy8gRGVmaW5lIGEgY3VzdG9tIHRvb2xiYXIgaXRlbSBmb3IgZXhwb3J0aW5nIHNlbGVjdGVkIHBhZ2VzXG4gIGNvbnN0IGN1c3RvbVRvb2xiYXJJdGVtID0ge1xuICAgIHR5cGU6IFwiY3VzdG9tXCIsIC8vIERlZmluZSBhcyBhIGN1c3RvbSB0b29sYmFyIGl0ZW1cbiAgICBpZDogXCJjdXN0b20tc2F2ZS1hc1wiLCAvLyBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRvb2xiYXIgaXRlbVxuICAgIHRpdGxlOiBcIk15IEV4dHJhY3QgUGFnZXNcIiwgLy8gRGlzcGxheSB0aXRsZSBmb3IgdGhlIHRvb2xiYXIgaXRlbVxuICAgIGNsYXNzTmFtZTogXCJjdXN0b20tdG9vbGJhci1pdGVtXCIsIC8vIENTUyBjbGFzcyBmb3Igc3R5bGluZ1xuICAgIGljb246IFwiXCIsIC8vIFBsYWNlaG9sZGVyIGZvciBhbiBpY29uIChjYW4gYmUgY3VzdG9taXplZCBsYXRlcilcblxuICAgIC8vIEZ1bmN0aW9uIHRyaWdnZXJlZCB3aGVuIHRoZSB0b29sYmFyIGl0ZW0gaXMgY2xpY2tlZFxuICAgIG9uUHJlc3M6IGFzeW5jIChcbiAgICAgIGV2ZW50LFxuICAgICAge1xuICAgICAgICBzZXRPcGVyYXRpb25zOiBzZXRPcGVyYXRpb25zLCAvLyBGdW5jdGlvbiB0byBzZXQgb3BlcmF0aW9ucyBvbiBkb2N1bWVudFxuICAgICAgICBnZXRTZWxlY3RlZFBhZ2VJbmRleGVzOiBnZXRTZWxlY3RlZFBhZ2VJbmRleGVzLCAvLyBGdW5jdGlvbiB0byBnZXQgc2VsZWN0ZWQgcGFnZXNcbiAgICAgIH1cbiAgICApID0%252BIHtcbiAgICAgIC8vIEdldCBpbmRpY2VzIG9mIHNlbGVjdGVkIHBhZ2VzXG4gICAgICBjb25zdCBzZWxlY3RlZFBhZ2VzSW5kZXggPSBnZXRTZWxlY3RlZFBhZ2VJbmRleGVzKCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQYWdlc0luZGV4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gcGFnZXMgc2VsZWN0ZWRcIik7IC8vIExvZyBhbiBlcnJvciBpZiBubyBwYWdlcyBhcmUgc2VsZWN0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coXCJTZWxlY3RlZCBwYWdlcyBpbmRpY2VzOiBcIiwgc2VsZWN0ZWRQYWdlc0luZGV4KTsgLy8gTG9nIHNlbGVjdGVkIHBhZ2UgaW5kZXhlc1xuXG4gICAgICAvLyBFeHBvcnQgdGhlIHNlbGVjdGVkIHBhZ2VzIGFzIGEgbmV3IFBERiBmaWxlXG4gICAgICBjb25zdCBmaWxlID0gYXdhaXQgaW5zdGFuY2UuZXhwb3J0UERGV2l0aE9wZXJhdGlvbnMoW1xuICAgICAgICB7IHR5cGU6IFwia2VlcFBhZ2VzXCIsIHBhZ2VJbmRleGVzOiBzZWxlY3RlZFBhZ2VzSW5kZXggfSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBDcmVhdGUgYSBCbG9iIG9iamVjdCBmb3IgdGhlIGV4cG9ydGVkIFBERlxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiIH0pO1xuICAgICAgY29uc29sZS5sb2coXCJCbG9iIERhdGE6IFwiLCBibG9iKTsgLy8gTG9nIGJsb2IgZGF0YVxuXG4gICAgICAvLyBEb3dubG9hZCB0aGUgZmlsZVxuICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgICAvLyBGb3IgSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2VcbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJsb2IsIFwic2VsZWN0ZWRwYWdlcy5wZGZcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgYS5ocmVmID0gb2JqZWN0VXJsO1xuICAgICAgICBhLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgYS5kb3dubG9hZCA9IFwic2VsZWN0ZWRwYWdlcy5wZGZcIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgICAgYS5jbGljaygpOyAvLyBTaW11bGF0ZSBhIGNsaWNrIGV2ZW50IHRvIHRyaWdnZXIgZG93bmxvYWRcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVcmwpOyAvLyBSZXZva2UgdGhlIG9iamVjdCBVUkxcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgYW5jaG9yIGVsZW1lbnRcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIC8vIFNldCBjdXN0b20gZG9jdW1lbnQgZWRpdG9yIHRvb2xiYXIgaXRlbXNcbiAgaW5zdGFuY2Uuc2V0RG9jdW1lbnRFZGl0b3JUb29sYmFySXRlbXMoW1xuICAgIHsgdHlwZTogXCJhZGRcIiB9LCAvLyBBZGQgYnV0dG9uIHRvIGluc2VydCBuZXcgZWxlbWVudHNcbiAgICBjdXN0b21Ub29sYmFySXRlbSwgLy8gQWRkIHRoZSBjdXN0b20gZXhwb3J0IHBhZ2VzIGJ1dHRvblxuICAgIHsgdHlwZTogXCJtb3ZlLWxlZnRcIiB9LCAvLyBNb3ZlIGVsZW1lbnRzIGxlZnRcbiAgICB7IHR5cGU6IFwibW92ZS1yaWdodFwiIH0sIC8vIE1vdmUgZWxlbWVudHMgcmlnaHRcbiAgICB7IHR5cGU6IFwiZHVwbGljYXRlXCIgfSwgLy8gRHVwbGljYXRlIHNlbGVjdGVkIGVsZW1lbnRzXG4gIF0pO1xuXG4gIGNvbnNvbGUubG9nKFwiTnV0cmllbnQgbG9hZGVkISBieSBOYXJhc2hpbWFuXCIpOyAvLyBMb2cgY29tcGxldGlvbiBvZiBzZXR1cFxufSk7XG4iLCJtb2RlIjoic3RhbmRhbG9uZSIsImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4uY3VzdG9tLXRvb2xiYXItaXRlbSB7XG4gIGhlaWdodDogMTAwJTtcbn1cbiJ9) + +- [Convert from text to speech](https://github.com/PSPDFKit/awesome-nutrient/tree/master/web/annotation/text-2-speech) + +- [Enable speech to text](https://github.com/PSPDFKit/awesome-nutrient/tree/master/web/annotation/speech-2-text) + - Enable speech-to-text synthesis to create text annotations. + +- [Detect when viewer UI is loaded](./web/viewer/detecting-when-the-viewer-UI-loads.md) + - Detect if the Web SDK Viewer has been loaded completely or not. + +- [Watermark documents in headless mode using Web SDK](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwianMiOiJQU1BERktpdC5sb2FkKHtcbiAgLi4uYmFzZU9wdGlvbnMsXG4gIHRoZW1lOiBQU1BERktpdC5UaGVtZS5EQVJLLFxuICBoZWFkbGVzczogdHJ1ZSxcbiAgZGlzYWJsZVRleHRTZWxlY3Rpb246IHRydWUsXG59KS50aGVuKGFzeW5jIChpbnN0YW5jZSkgPT4ge1xuICBsZXQgd2F0ZXJtYXJrcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGluc3RhbmNlLnRvdGFsUGFnZUNvdW50IH0pLm1hcCgoXywgcGFnZUluZGV4KSA9PlxuICAgICAgICBpbnN0YW5jZS5wYWdlSW5mb0ZvckluZGV4KHBhZ2VJbmRleClcbiAgICAgIClcbiAgICApXG4gICkucmVkdWNlKChhY2MsIHBhZ2VJbmZvKSA9PiB7XG4gICAgY29uc3QgeyBpbmRleDogcGFnZUluZGV4LCByYXdQZGZCb3hlcyB9ID0gcGFnZUluZm8sXG4gICAgICB7IGNyb3BCb3ggfSA9IHJhd1BkZkJveGVzLFxuICAgICAgW2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodF0gPSBjcm9wQm94O1xuXG4gICAgY29uc3QgdG90YWxSb3dzID0gNDsgLy8gNCByb3dzXG4gICAgY29uc3QgdG90YWxDb2xzID0gMzsgLy8gMyBjb2x1bW5zXG4gICAgY29uc3QgdGV4dCA9IFwiQ09ORklERU5USUFMXCI7XG4gICAgY29uc3QgZm9udFNpemUgPSAxNDtcbiAgICBjb25zdCB0ZXh0V2lkdGggPSB3aWR0aCAqIDAuNDsgLy8gSW5jcmVhc2VkIHdpZHRoICg0MCUgb2YgcGFnZSB3aWR0aClcbiAgICBjb25zdCB0ZXh0SGVpZ2h0ID0gNTA7IC8vIEluY3JlYXNlZCBoZWlnaHQgZm9yIGJldHRlciB2aXNpYmlsaXR5XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0b3RhbFJvd3M7IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB0b3RhbENvbHM7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IHggPSAoY29sICsgMSkgKiAod2lkdGggLyAodG90YWxDb2xzICsgMSkpO1xuICAgICAgICBjb25zdCB5ID0gKHJvdyArIDEpICogKGhlaWdodCAvICh0b3RhbFJvd3MgKyAxKSk7XG5cbiAgICAgICAgYWNjLnB1c2goXG4gICAgICAgICAgbmV3IFBTUERGS2l0LkFubm90YXRpb25zLlRleHRBbm5vdGF0aW9uKHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4LFxuICAgICAgICAgICAgdGV4dDogeyBmb3JtYXQ6IFwicGxhaW5cIiwgdmFsdWU6IHRleHQgfSxcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgIGlzQm9sZDogdHJ1ZSxcbiAgICAgICAgICAgIGZvbnQ6IFwiSGVsdmV0aWNhXCIsXG4gICAgICAgICAgICBob3Jpem9udGFsQWxpZ246IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBib3VuZGluZ0JveDogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlJlY3Qoe1xuICAgICAgICAgICAgICBsZWZ0OiB4IC0gdGV4dFdpZHRoIC8gMiwgLy8gQ2VudGVyIGhvcml6b250YWxseVxuICAgICAgICAgICAgICB0b3A6IHkgLSB0ZXh0SGVpZ2h0IC8gMiwgLy8gQ2VudGVyIHZlcnRpY2FsbHlcbiAgICAgICAgICAgICAgd2lkdGg6IHRleHRXaWR0aCArIDEwMCwgLy8gSW5jcmVhc2VkIHdpZHRoXG4gICAgICAgICAgICAgIGhlaWdodDogdGV4dEhlaWdodCArIDEwMCwgLy8gSW5jcmVhc2VkIGhlaWdodFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmb250Q29sb3I6IFBTUERGS2l0LkNvbG9yLkdSQVksXG4gICAgICAgICAgICByb3RhdGlvbjogMzAsIC8vIFNsaWdodCB0aWx0XG4gICAgICAgICAgICBsb2NrZWQ6IHRydWUsXG4gICAgICAgICAgICBsb2NrZWRDb250ZW50czogdHJ1ZSxcbiAgICAgICAgICAgIG9wYWNpdHk6IDAuMiwgLy8gVHJhbnNwYXJlbnQgd2F0ZXJtYXJrXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10pO1xuXG4gIGxldCB3YXRlcm1hcmtlZCA9IGF3YWl0IGluc3RhbmNlLmNyZWF0ZSh3YXRlcm1hcmtzKTtcbiAgY29uc3QgZmlsZWxhdHRlbmVkID0gYXdhaXQgaW5zdGFuY2UuYXBwbHlPcGVyYXRpb25zKFt7IHR5cGU6IFwiZmxhdHRlbkFubm90YXRpb25zXCIgfV0pOyAvLyBPcHRpb25hbDogRmxhdHRlbiB3YXRlcm1hcmtzXG4gICAgICBpZiAod2F0ZXJtYXJrZWQubGVuZ3RoID4gMClcbiAgICAgIHtcbiAgICAgICAgaW5zdGFuY2UuZXhwb3J0UERGKCkudGhlbigoYnVmZmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiIH0pO1xuICAgICAgICAvLyBPbmNlIHlvdSBnZXQgdGhlIGJsb2IgZGF0YSB5b3UgY2FuIHNhdmUgaXQgdG8gdGhlIGRlc2lnbmVkIGxvY2F0aW9uXG4gICAgICAgIC8vIEFsc28gcGFzcyB0aGUgYXBwcm9wcmlhdGUgZmlsZSBuYW1lLiBGb3IgZGVtbyBwdXJwb3NlLCBJIGFtIGRvd25sb2FkaW5nIHRoZSBmaWxlIHRvIHNob3cgdGhlIGZpbGUgaXMgd2F0ZXJtYWtlZCBpbiBoZWFkbGVzcyBtb2RlLiBcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBcImRvY3VtZW50LnBkZlwiO1xuICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKSB7XG4gICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJsb2IsIGZpbGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICBhLmhyZWYgPSBvYmplY3RVcmw7XG4gICAgICAgICAgYS5zdHlsZSA9IFwiZGlzcGxheTogbm9uZVwiO1xuICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlTmFtZTtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCk7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB9XG59KTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + +- [Track page time and log it in the custom sidebar](https://www.nutrient.io/playground?p=eyJ2IjoxLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIiwic2V0dGluZ3MiOnsiZmlsZU5hbWUiOiJzY2llbnRpZmljLnBkZiJ9LCJqcyI6ImxldCBwYWdlVGltZVNwZW50ID0ge307XG5sZXQgbGFzdFBhZ2VJbmRleCA9IG51bGw7XG5sZXQgbGFzdFBhZ2VFbnRlclRpbWUgPSBEYXRlLm5vdygpO1xubGV0IHNpZGViYXJDb250ZW50Tm9kZSA9IG51bGw7XG5sZXQgZmluYWxpemVkUGFnZXMgPSBuZXcgU2V0KCk7XG5cbmNvbnN0IHsgSW50ZXJmYWNlcywgY3JlYXRlQmxvY2ssIFJlY2lwZXMsIENvcmUgfSA9IFBTUERGS2l0LlVJO1xuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1c3RvbVVJKCkge1xuICByZXR1cm4ge1xuICAgIFtQU1BERktpdC5VSUVsZW1lbnQuU2lkZWJhcl06IHtcbiAgICAgIFtQU1BERktpdC5TaWRlYmFyTW9kZS5DVVNUT01dOiAoeyBjb250YWluZXJOb2RlIH0pID0%252BIHtcbiAgICAgICAgY29udGFpbmVyTm9kZS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgd3JhcHBlci5zdHlsZS5wYWRkaW5nID0gXCIxNnB4XCI7XG4gICAgICAgIHdyYXBwZXIuc3R5bGUuY29sb3IgPSBcIndoaXRlXCI7XG4gICAgICAgIHdyYXBwZXIuaW5uZXJIVE1MID0gYDxoMyBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEwcHg7XCI%252BIFRpbWUgU3BlbnQgcGVyIFBhZ2U8L2gzPmA7XG4gICAgICAgIHNpZGViYXJDb250ZW50Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoc2lkZWJhckNvbnRlbnROb2RlKTtcbiAgICAgICAgY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZCh3cmFwcGVyKTtcbiAgICAgICAgcmVuZGVyVGltZVNwZW50Q29udGVudCgpO1xuICAgICAgICByZXR1cm4geyBub2RlOiBjb250YWluZXJOb2RlIH07XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbmRlclRpbWVTcGVudENvbnRlbnQoKSB7XG4gIGlmICghc2lkZWJhckNvbnRlbnROb2RlKSByZXR1cm47XG4gIHNpZGViYXJDb250ZW50Tm9kZS5pbm5lckhUTUwgPSBcIlwiO1xuICBjb25zdCBzb3J0ZWQgPSBPYmplY3Qua2V5cyhwYWdlVGltZVNwZW50KS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGZvciAoY29uc3QgcGFnZSBvZiBzb3J0ZWQpIHtcbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgcC50ZXh0Q29udGVudCA9IGBQYWdlICR7K3BhZ2UgKyAxfTogJHtwYWdlVGltZVNwZW50W3BhZ2VdLnRvRml4ZWQoMil9c2A7XG4gICAgc2lkZWJhckNvbnRlbnROb2RlLmFwcGVuZENoaWxkKHApO1xuICB9XG59XG5cblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG4gIHVpOiB7XG4gICAgW0ludGVyZmFjZXMuUHJpbWFyeVRvb2xiYXJdOiAoeyBwcm9wcywgaW5zdGFuY2UgfSkgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IGNyZWF0ZUJsb2NrKFJlY2lwZXMuUHJpbWFyeVRvb2xiYXIsIHByb3BzLCAoeyB1aSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpZGViYXIgPSB1aS5nZXRCbG9ja0J5SWQoXCJzaWRlYmFyXCIpO1xuICAgICAgICBpZiAoc2lkZWJhcikge1xuICAgICAgICAgIGNvbnN0IG5ld1NpZGViYXIgPSBjcmVhdGVCbG9jayhDb3JlLkJ1dHRvblNlbGVjdCwge1xuICAgICAgICAgICAgLi4uc2lkZWJhci5wcm9wcyxcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlOiAoa2V5KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChrZXkgPT09IFwic2lkZWJhci1jdXN0b21cIikge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLnNldFZpZXdTdGF0ZSgodnMpID0%252BXG4gICAgICAgICAgICAgICAgICB2cy5zZXQoXCJzaWRlYmFyTW9kZVwiLCBQU1BERktpdC5TaWRlYmFyTW9kZS5DVVNUT00pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaWRlYmFyLnByb3BzLm9uU2VsZWN0aW9uQ2hhbmdlPy4oa2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgIC4uLnNpZGViYXIucHJvcHMuaXRlbXMsXG4gICAgICAgICAgICAgIHsgaWQ6IFwic2lkZWJhci1jdXN0b21cIiwgbGFiZWw6IFwiVGltZSBTcGVudCBpbiBlYWNoIFBhZ2VcIiB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB1aS5yZXBsYWNlKFwic2lkZWJhclwiLCBuZXdTaWRlYmFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1aS5jcmVhdGVDb21wb25lbnQoKTtcbiAgICAgIH0pLmNyZWF0ZUNvbXBvbmVudCgpLFxuICAgIH0pLFxuICB9LFxuICBpbml0aWFsVmlld1N0YXRlOiBuZXcgUFNQREZLaXQuVmlld1N0YXRlKHtcbiAgICBzaWRlYmFyTW9kZTogUFNQREZLaXQuU2lkZWJhck1vZGUuQ1VTVE9NLFxuICB9KSxcbiAgY3VzdG9tVUk6IGdlbmVyYXRlQ3VzdG9tVUkoKSxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiTnV0cmllbnQgbG9hZGVkIC0gYnkgTmFyYXNoaW1hblwiKTtcbiAgbGFzdFBhZ2VJbmRleCA9IGluc3RhbmNlLnZpZXdTdGF0ZS5jdXJyZW50UGFnZUluZGV4O1xuXG4gIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgXCJ2aWV3U3RhdGUuY3VycmVudFBhZ2VJbmRleC5jaGFuZ2VcIixcbiAgICAobmV3UGFnZUluZGV4KSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdGltZVNwZW50ID0gKG5vdyAtIGxhc3RQYWdlRW50ZXJUaW1lKSAvIDEwMDA7XG4gICAgICBpZiAobGFzdFBhZ2VJbmRleCAhPT0gbnVsbCAmJiAhZmluYWxpemVkUGFnZXMuaGFzKGxhc3RQYWdlSW5kZXgpKSB7XG4gICAgICAgIHBhZ2VUaW1lU3BlbnRbbGFzdFBhZ2VJbmRleF0gPVxuICAgICAgICAgIChwYWdlVGltZVNwZW50W2xhc3RQYWdlSW5kZXhdIHx8IDApICsgdGltZVNwZW50O1xuICAgICAgfVxuICAgICAgbGFzdFBhZ2VJbmRleCA9IG5ld1BhZ2VJbmRleDtcbiAgICAgIGxhc3RQYWdlRW50ZXJUaW1lID0gbm93O1xuXG4gICAgICByZW5kZXJUaW1lU3BlbnRDb250ZW50KCk7XG4gICAgfVxuICApO1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsICgpID0%252BIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWVTcGVudCA9IChub3cgLSBsYXN0UGFnZUVudGVyVGltZSkgLyAxMDAwO1xuICAgIGlmICghZmluYWxpemVkUGFnZXMuaGFzKGxhc3RQYWdlSW5kZXgpKSB7XG4gICAgICBwYWdlVGltZVNwZW50W2xhc3RQYWdlSW5kZXhdID1cbiAgICAgICAgKHBhZ2VUaW1lU3BlbnRbbGFzdFBhZ2VJbmRleF0gfHwgMCkgKyB0aW1lU3BlbnQ7XG4gICAgICBpZiAocGFnZVRpbWVTcGVudFtsYXN0UGFnZUluZGV4XSA%252BPSAzMCkge1xuICAgICAgICBmaW5hbGl6ZWRQYWdlcy5hZGQobGFzdFBhZ2VJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn0pO1xuIn0%253D) + +- [Generate different page sizes and detect page dimensions to show in the browser console](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6ImxldCBjdXJyZW50UGFnZVNpemU7XG5jb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCwgLi4ucmVzdCB9ID0gYmFzZU9wdGlvbnMsXG4gIFBERnN0dWIgPSBgJVBERi0xLjRcbjEgMCBvYmo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI%252BPmVuZG9ialxuMiAwIG9iajw8L1R5cGUvUGFnZXMvS2lkc1tcbiAgMyAwIFIgNCAwIFIgNSAwIFIgNiAwIFIgNyAwIFIgXG4gIDggMCBSIDkgMCBSIDEwIDAgUiAxMSAwIFIgMTIgMCBSIFxuICAxMyAwIFIgMTQgMCBSIDE1IDAgUiAxNiAwIFIgMTcgMCBSIFxuICAxOCAwIFIgMTkgMCBSIDIwIDAgUiAyMSAwIFIgMjIgMCBSIFxuICAyMyAwIFIgMjQgMCBSIDI1IDAgUiAyNiAwIFIgMjcgMCBSXG5dL0NvdW50IDI1Pj5lbmRvYmpcbjMgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCAyMzg0IDMzNzBdPj5lbmRvYmogICUgQTBcbjQgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCAxNjg0IDIzODRdPj5lbmRvYmogICUgQTFcbjUgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCAxMTkwIDE2ODRdPj5lbmRvYmogICUgQTJcbjYgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA4NDIgMTE5MF0%252BPmVuZG9iaiAgICUgQTNcbjcgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA1OTUgODQyXT4%252BZW5kb2JqICAgICUgQTRcbjggMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA0MjAgNTk1XT4%252BZW5kb2JqICAgICUgQTVcbjkgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCAyODM0IDQwMDhdPj5lbmRvYmogICUgQjBcbjEwIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMjAwNCAyODM0XT4%252BZW5kb2JqICUgQjFcbjExIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTQxNyAyMDA0XT4%252BZW5kb2JqICUgQjJcbjEyIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTAwMCAxNDE3XT4%252BZW5kb2JqICUgQjNcbjEzIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgNzA5IDEwMDBdPj5lbmRvYmogICUgQjRcbjE0IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMjU5OSAzNjc3XT4%252BZW5kb2JqICUgQzBcbjE1IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTgzNyAyNTk5XT4%252BZW5kb2JqICUgQzFcbjE2IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTI5OCAxODM3XT4%252BZW5kb2JqICUgQzJcbjE3IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgOTE4IDEyOThdPj5lbmRvYmogICUgQzNcbjE4IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgNjEyIDc5Ml0%252BPmVuZG9iaiAgICUgQU5TSSBBXG4xOSAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDc5MiAxMjI0XT4%252BZW5kb2JqICAlIEFOU0kgQlxuMjAgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCAxMjI0IDE1ODRdPj5lbmRvYmogJSBBTlNJIENcbjIxIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTU4NCAyNDQ4XT4%252BZW5kb2JqICUgQU5TSSBEXG4yMiAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDY0OCA4NjRdPj5lbmRvYmogICAlIEFSQ0ggQVxuMjMgMCBvYmo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA4NjQgMTI5Nl0%252BPmVuZG9iaiAgJSBBUkNIIEJcbjI0IDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMTI5NiAxNzI4XT4%252BZW5kb2JqICUgQVJDSCBDXG4yNSAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDE3MjggMjU5Ml0%252BPmVuZG9iaiAlIEFSQ0ggRFxueHJlZlxuMCAyNlxuMDAwMDAwMDAwMCA2NTUzNSBmXG4wMDAwMDAwMDEwIDAwMDAwIG5cbjAwMDAwMDAwNTMgMDAwMDAgblxuMDAwMDAwMDEwMiAwMDAwMCBuXG4wMDAwMDAwMTUxIDAwMDAwIG5cbjAwMDAwMDAyMDAgMDAwMDAgblxuMDAwMDAwMDI0OSAwMDAwMCBuXG4wMDAwMDAwMjk4IDAwMDAwIG5cbjAwMDAwMDAzNTAgMDAwMDAgblxuMDAwMDAwMDQwMSAwMDAwMCBuXG4wMDAwMDAwNDUzIDAwMDAwIG5cbjAwMDAwMDA1MDUgMDAwMDAgblxuMDAwMDAwMDU1NyAwMDAwMCBuXG4wMDAwMDAwNjA5IDAwMDAwIG5cbjAwMDAwMDA2NjEgMDAwMDAgblxuMDAwMDAwMDcxMyAwMDAwMCBuXG4wMDAwMDAwNzY1IDAwMDAwIG5cbjAwMDAwMDA4MTcgMDAwMDAgblxuMDAwMDAwMDg2OSAwMDAwMCBuXG4wMDAwMDAwOTIxIDAwMDAwIG5cbjAwMDAwMDA5NzMgMDAwMDAgblxuMDAwMDAwMTAyNSAwMDAwMCBuXG4wMDAwMDAxMDc3IDAwMDAwIG5cbjAwMDAwMDExMjkgMDAwMDAgblxuMDAwMDAwMTE4MSAwMDAwMCBuXG4wMDAwMDAxMjMzIDAwMDAwIG5cbnRyYWlsZXI8PC9TaXplIDI2L1Jvb3QgMSAwIFI%252BPlxuc3RhcnR4cmVmXG4xMzAwXG4lJUVPRlxuYCxcbiAgdWludDhhcnJheSA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShQREZzdHViKTtcblxuLy8gTG9hZCBpbiBQU1BERktpdCBvciBOdXRyaWVudCBTREtcblBTUERGS2l0LmxvYWQoe1xuICAuLi5yZXN0LFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbiAgZG9jdW1lbnQ6IHVpbnQ4YXJyYXkuYnVmZmVyLFxufSkudGhlbigoaW5zdGFuY2UpID0%252BIHtcbiAgY29uc29sZS5sb2coXCJOdXRyaWVudCBsb2FkZWQhIC0gYnkgTmFyYXNoaW1hblwiKTtcblxuICBpbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKFxuICAgIFwidmlld1N0YXRlLmN1cnJlbnRQYWdlSW5kZXguY2hhbmdlXCIsXG4gICAgKHBhZ2VJbmRleCkgPT4ge1xuICAgICAgZ2V0UGFnZVNpemUocGFnZUluZGV4KTtcbiAgICB9XG4gICk7XG5cbiAgY29uc3QgZ2V0UGFnZVNpemUgPSBhc3luYyAocGFnZUluZGV4KSA9PiB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBsYWJlbCwgcm90YXRpb24gfSA9XG4gICAgICBpbnN0YW5jZS5wYWdlSW5mb0ZvckluZGV4KHBhZ2VJbmRleCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIldpZHRoOlwiLCB3aWR0aCk7XG4gICAgY29uc29sZS5sb2coXCJIZWlnaHQ6XCIsIGhlaWdodCk7XG4gICAgY29uc29sZS5sb2coXCJMYWJlbDpcIiwgbGFiZWwpO1xuICAgIGNvbnNvbGUubG9nKFwiUm90YXRpb246XCIsIHJvdGF0aW9uKTtcblxuICAgIGxldCBjdXJyZW50UGFnZVNpemUgPSBcIlVua25vd25cIjsgLy8gRGVmYXVsdCB2YWx1ZVxuXG4gICAgLy8gQS1TZXJpZXNcbiAgICBpZiAod2lkdGggPT09IDU5NSAmJiBoZWlnaHQgPT09IDg0MikgY3VycmVudFBhZ2VTaXplID0gXCJBNFwiO1xuICAgIGVsc2UgaWYgKHdpZHRoID09PSA4NDIgJiYgaGVpZ2h0ID09PSAxMTkwKSBjdXJyZW50UGFnZVNpemUgPSBcIkEzXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDExOTAgJiYgaGVpZ2h0ID09PSAxNjg0KSBjdXJyZW50UGFnZVNpemUgPSBcIkEyXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDE2ODQgJiYgaGVpZ2h0ID09PSAyMzg0KSBjdXJyZW50UGFnZVNpemUgPSBcIkExXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDIzODQgJiYgaGVpZ2h0ID09PSAzMzcwKSBjdXJyZW50UGFnZVNpemUgPSBcIkEwXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDQyMCAmJiBoZWlnaHQgPT09IDU5NSkgY3VycmVudFBhZ2VTaXplID0gXCJBNVwiO1xuXG4gICAgLy8gQi1TZXJpZXNcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gMjgzNCAmJiBoZWlnaHQgPT09IDQwMDgpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQjBcIjtcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gMjAwNCAmJiBoZWlnaHQgPT09IDI4MzQpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQjFcIjtcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gMTQxNyAmJiBoZWlnaHQgPT09IDIwMDQpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQjJcIjtcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gMTAwMCAmJiBoZWlnaHQgPT09IDE0MTcpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQjNcIjtcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gNzA5ICYmIGhlaWdodCA9PT0gMTAwMCkgY3VycmVudFBhZ2VTaXplID0gXCJCNFwiO1xuXG4gICAgLy8gQU5TSVxuICAgIGVsc2UgaWYgKHdpZHRoID09PSA2MTIgJiYgaGVpZ2h0ID09PSA3OTIpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQU5TSSBBXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDc5MiAmJiBoZWlnaHQgPT09IDEyMjQpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQU5TSSBCXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDEyMjQgJiYgaGVpZ2h0ID09PSAxNTg0KSBjdXJyZW50UGFnZVNpemUgPSBcIkFOU0kgQ1wiO1xuICAgIGVsc2UgaWYgKHdpZHRoID09PSAxNTg0ICYmIGhlaWdodCA9PT0gMjQ0OCkgY3VycmVudFBhZ2VTaXplID0gXCJBTlNJIERcIjtcblxuICAgIC8vIEFSQ0hcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gNjQ4ICYmIGhlaWdodCA9PT0gODY0KSBjdXJyZW50UGFnZVNpemUgPSBcIkFSQ0ggQVwiO1xuICAgIGVsc2UgaWYgKHdpZHRoID09PSA4NjQgICYmIGhlaWdodCA9PT0gMTI5NikgY3VycmVudFBhZ2VTaXplID0gXCJBUkNIIEJcIjtcbiAgICBlbHNlIGlmICh3aWR0aCA9PT0gMTI5NiAmJiBoZWlnaHQgPT09IDE3MjgpIGN1cnJlbnRQYWdlU2l6ZSA9IFwiQVJDSCBDXCI7XG4gICAgZWxzZSBpZiAod2lkdGggPT09IDE3MjggJiYgaGVpZ2h0ID09PSAyNTkyKSBjdXJyZW50UGFnZVNpemUgPSBcIkFSQ0ggRFwiO1xuXG4gICAgY29uc29sZS5sb2coXCJDdXJyZW50IFBhZ2UgU2l6ZTpcIiwgY3VycmVudFBhZ2VTaXplKTtcbiAgfTtcblxuICBpZiAoaW5zdGFuY2Uudmlld1N0YXRlLmN1cnJlbnRQYWdlSW5kZXggPT09IDApIHtcbiAgICBnZXRQYWdlU2l6ZSgwKTtcbiAgfVxufSk7XG4iLCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuIn0%253D) + +- [Overlay a YouTube video on a PDF](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmljb25fdGV4dCB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGglM0QlMjIyNSUyMiBoZWlnaHQlM0QlMjIyNSUyMiB2aWV3Qm94JTNEJTIyMCUyMDAlMjAyNSUyMDI1JTIyIGZpbGwlM0QlMjIlMjNGRkZGRkYlMjIgeG1sbnMlM0QlMjJodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTIyJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC43NSUyMiBkJTNEJTIyTTEuNzA2NzkgMjAuNTY4TDMuNDc0NzkgMjIuMzM1TDIuMDU5NzkgMjMuNzVDMS44NzIyNiAyMy45Mzc1IDEuNjE3OTUgMjQuMDQyOCAxLjM1Mjc5IDI0LjA0MjhDMS4wODc2MiAyNC4wNDI4IDAuODMzMzE0IDIzLjkzNzUgMC42NDU3ODcgMjMuNzVMMC4yOTI3ODYgMjMuMzk2QzAuMTA1MzE1IDIzLjIwODUgMCAyMi45NTQyIDAgMjIuNjg5QzAgMjIuNDIzOCAwLjEwNTMxNSAyMi4xNjk1IDAuMjkyNzg2IDIxLjk4MkwxLjcwNjc5IDIwLjU2OFolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NwYXRoIGQlM0QlMjJNOC45MjQ3OSA1LjkyOTk5TDguMjE0NzkgNi42Mjk5OUMzLjI2NDc5IDExLjYzIDMuNjI0NzkgMTYuODkgMy42MjQ3OSAxNi44OUwyLjA0NDc5IDE4LjQ4QzEuOTI4MzggMTguNTk2MSAxLjgzNjAyIDE4LjczNCAxLjc3MyAxOC44ODU5QzEuNzA5OTkgMTkuMDM3OCAxLjY3NzU1IDE5LjIwMDYgMS42Nzc1NSAxOS4zNjVDMS42Nzc1NSAxOS41Mjk0IDEuNzA5OTkgMTkuNjkyMiAxLjc3MyAxOS44NDQxQzEuODM2MDIgMTkuOTk1OSAxLjkyODM4IDIwLjEzMzkgMi4wNDQ3OSAyMC4yNUwzLjc5NDc5IDIyQzMuOTEwOSAyMi4xMTY0IDQuMDQ4ODQgMjIuMjA4OCA0LjIwMDcgMjIuMjcxOEM0LjM1MjU2IDIyLjMzNDggNC41MTUzNyAyMi4zNjcyIDQuNjc5NzkgMjIuMzY3MkM0Ljg0NDIgMjIuMzY3MiA1LjAwNzAxIDIyLjMzNDggNS4xNTg4NyAyMi4yNzE4QzUuMzEwNzMgMjIuMjA4OCA1LjQ0ODY3IDIyLjExNjQgNS41NjQ3OSAyMkw3LjE1NDc5IDIwLjQxQzcuMTU0NzkgMjAuNDEgMTIuNDY0OCAyMC43NyAxNy40MTQ4IDE1LjgyTDE4LjExNDggMTUuMTElMjIgc3Ryb2tlJTNEJTIyYmxhY2slMjIgc3Ryb2tlLW1pdGVybGltaXQlM0QlMjIxMCUyMiBzdHJva2UtbGluZWNhcCUzRCUyMnJvdW5kJTIyLyUzRSUzQ3BhdGggb3BhY2l0eSUzRCUyMjAuMzMlMjIgZCUzRCUyMk0xNi43MDY4IDE1LjgyNkw4LjIyMTggNy4zNDFMNi44MDc4IDguNzU1TDE1LjI5MjggMTcuMjRMMTYuNzA2OCAxNS44MjZaJTIyIGZpbGwlM0QlMjIlMjNGODI0MDAlMjIvJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC41JTIyIGQlM0QlMjJNNi45Mzk4MSAxOS45MzFMNC4xMTA4MSAxNy4xMDNMMy40MDM4MSAxNy44MUw2LjIzMjgxIDIwLjYzOEw2LjkzOTgxIDE5LjkzMVolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NjaXJjbGUgY3glM0QlMjIxOC4wNDQ4JTIyIGN5JTNEJTIyNiUyMiByJTNEJTIyNiUyMiBmaWxsJTNEJTIyJTIzRjgyNDAwJTIyLyUzRSUzQy9zdmclM0VcIilcbiAgICBuby1yZXBlYXQgY2VudGVyO1xufVxuXG4uaWNvbl9zaWduYXR1cmUge1xuICB3aWR0aDogNTBweDtcbiAgaGVpZ2h0OiA1MHB4O1xuICBiYWNrZ3JvdW5kOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZvY3VzYWJsZT1cImZhbHNlXCI%252BPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNy4zMzcgMTlIMmEyIDIgMCAwIDEtMi0yVjdhMiAyIDAgMCAxIDItMmgyMGEyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0yIDJoLTkuMzUxYy0uMi42OTgtLjQyIDEuMzUzLS42NTUgMS45MzYtLjI5My43My0uNjI0IDEuMzg2LS45OTMgMS44NzItLjM0MS40NS0uODU2Ljk0Mi0xLjU0Ni45NDItLjgxNiAwLTEuMjktLjYzNy0xLjUzNi0xLjE0NS0uMjY0LS41NDUtLjQxOS0xLjIzNS0uNTAzLTEuOTA1YTExLjE4MiAxMS4xODIgMCAwIDEtLjA3OS0xLjdaTTIgNi41aDIwYS41LjUgMCAwIDEgLjUuNXYxMGEuNS41IDAgMCAxLS41LjVoLTguOTY0YTM1LjAyIDM1LjAyIDAgMCAwIC4zNzgtMS44NzJjLjE2NC0uOTQ3LjI4OC0xLjkwMi4zNjEtMi44MDZhMTIuNjI3IDEyLjYyNyAwIDAgMSAxLjU3My0uODg0bC4wNTYuMTQzLjEyOC4zMjVjLjExNC4yODQuMjY0LjYzLjQ1NC45MTEuMTYxLjI0LjUxNy42ODMgMS4xMDUuNjgzIDEuMDM1IDAgMS44OS0uNTkgMi40OS0xLjM4Ni42LS43OTcgMS4wMDMtMS44NjIgMS4xNjItMy4wMTFhLjc1Ljc1IDAgMSAwLTEuNDg2LS4yMDZjLS4xMzIuOTUtLjQ1NyAxLjc2LS44NzQgMi4zMTQtLjM3LjQ5LS43NjguNzMtMS4xNDUuNzhsLS4wMDgtLjAxMWEzLjcxIDMuNzEgMCAwIDEtLjMwNy0uNjM2bC0uMDk4LS4yNDhhMTEuOTMzIDExLjkzMyAwIDAgMC0uMjI4LS41NTcgMi4xNjIgMi4xNjIgMCAwIDAtLjIyNC0uMzkyYy0uMDYyLS4wODMtLjMwNC0uMzk3LS43MzctLjM5N2EuNzUuNzUgMCAwIDAtLjI3LjA1IDExLjkgMTEuOSAwIDAgMC0xLjUxNy43MjNjLS4wMDItLjI1MS0uMDEtLjQ5My0uMDIzLS43MjQtLjA0NC0uNzM0LS4xNTUtMS40MjItLjM4Mi0xLjk1LS4yMjMtLjUyLS42NjctMS4wOTktMS40NDQtMS4wOTktLjUyIDAtMS4yMTUuMjE3LTEuOS40ODYtLjcxOC4yODItMS41MzkuNjctMi4zNTggMS4xLTEuNjIzLjg1My0zLjMyMiAxLjkxNy00LjIzOSAyLjcyN2EuNzUuNzUgMCAxIDAgLjk5NCAxLjEyNGMuNzgtLjY5IDIuMzUzLTEuNjg4IDMuOTQzLTIuNTIzYTIzLjE4IDIzLjE4IDAgMCAxIDIuMjEtMS4wMzJjLjY0Ni0uMjU1IDEuMDg4LS4zNjggMS4zMS0uMzhhLjY5LjY5IDAgMCAxIC4xMDYuMTg4Yy4xMjUuMjkyLjIyMi43NzYuMjYyIDEuNDQ5LjAzLjQ4LjAyNyAxLjAyMy0uMDAyIDEuNjA5LS41MjQuMzc3LTEuMDMuNzg1LTEuNTA2IDEuMjA3LTEuMzU4IDEuMjA3LTIuNTI3IDIuNTk2LTMuMTMxIDMuODQzYTIuNTYzIDIuNTYzIDAgMCAwLS4xNjMuNDUySDJhLjUuNSAwIDAgMS0uNS0uNVY3YS41LjUgMCAwIDEgLjUtLjVaTTExLjA4NCAxOWMtLjE1Mi40OTYtLjMxNC45Ni0uNDgyIDEuMzc3LS4yNy42NzUtLjU0MyAxLjE5Mi0uNzk2IDEuNTI2LS4xODMuMjQtLjI5OS4zMTUtLjM0My4zMzctLjAzNS0uMDI3LS4xMDQtLjEwMi0uMTk0LS4yODgtLjE2Mi0uMzM1LS4yOS0uODQyLS4zNjQtMS40MzlBOS42NzggOS42NzggMCAwIDEgOC44MzggMTloMi4yNDZabS40MS0xLjVIOS4xNDJjLjUxOC0uOTY0IDEuNDgtMi4xMTMgMi42NzUtMy4xNzQuMTA1LS4wOTQuMjEyLS4xODYuMzItLjI3OGEzMi40MTUgMzIuNDE1IDAgMCAxLS42NDMgMy40NTJabS40NDItOC43N3MuMDA2LjAwMi4wMTYuMDEyYy0uMDExLS4wMDUtLjAxNi0uMDEtLjAxNi0uMDExWk05LjQ4OCAyMi4yNTdzLS4wMDMgMC0uMDA4LS4wMDNjLjAwNi4wMDEuMDA4LjAwMi4wMDguMDAzWm03LjgxMS05LjY5LS4wMS0uMDEuMDEuMDFaXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiPjwvcGF0aD48L3N2Zz4nKVxuICAgIG5vLXJlcGVhdCBjZW50ZXI7XG59XG4iLCJqcyI6IlBTUERGS2l0LmxvYWQoeyAuLi5iYXNlT3B0aW9ucywgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUksgfSkudGhlbihcbiAgKGluc3RhbmNlKSA9PiB7XG4gICAgY29uc3QgdmlkZW9XaWRnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgLy8gQ29ycmVjdGVkIHRlbXBsYXRlIHN0cmluZyB1c2FnZVxuICAgIHZpZGVvV2lkZ2V0LmlubmVySFRNTCA9IGBcbiAgICAgIDxpZnJhbWUgd2lkdGg9XCI1MDBcIiBoZWlnaHQ9XCIzNzVcIlxuICAgICAgICBzcmM9XCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC80SEVYdnJUWXBZQVwiXG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgIGFsbG93ZnVsbHNjcmVlbj5cbiAgICAgIDwvaWZyYW1lPlxuICAgIGA7XG5cbiAgICBjb25zdCBpdGVtID0gbmV3IFBTUERGS2l0LkN1c3RvbU92ZXJsYXlJdGVtKHtcbiAgICAgIGlkOiBcInZpZGVvLWluc3RydWN0aW9uc1wiLFxuICAgICAgbm9kZTogdmlkZW9XaWRnZXQsXG4gICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICBwb3NpdGlvbjogbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlBvaW50KHsgeDogNTAsIHk6IDIwMCB9KVxuICAgIH0pO1xuXG4gICAgaW5zdGFuY2Uuc2V0Q3VzdG9tT3ZlcmxheUl0ZW0oaXRlbSk7XG4gIH1cbik7XG4iLCJtb2RlIjoic3RhbmRhbG9uZSJ9) + +- [Custom overlay with an MP4/HTML5 video on PDF](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJjc3MiOiIvKiBBZGQgeW91ciBDU1MgaGVyZSAqL1xuLmljb25fdGV4dCB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGglM0QlMjIyNSUyMiBoZWlnaHQlM0QlMjIyNSUyMiB2aWV3Qm94JTNEJTIyMCUyMDAlMjAyNSUyMDI1JTIyIGZpbGwlM0QlMjIlMjNGRkZGRkYlMjIgeG1sbnMlM0QlMjJodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTIyJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC43NSUyMiBkJTNEJTIyTTEuNzA2NzkgMjAuNTY4TDMuNDc0NzkgMjIuMzM1TDIuMDU5NzkgMjMuNzVDMS44NzIyNiAyMy45Mzc1IDEuNjE3OTUgMjQuMDQyOCAxLjM1Mjc5IDI0LjA0MjhDMS4wODc2MiAyNC4wNDI4IDAuODMzMzE0IDIzLjkzNzUgMC42NDU3ODcgMjMuNzVMMC4yOTI3ODYgMjMuMzk2QzAuMTA1MzE1IDIzLjIwODUgMCAyMi45NTQyIDAgMjIuNjg5QzAgMjIuNDIzOCAwLjEwNTMxNSAyMi4xNjk1IDAuMjkyNzg2IDIxLjk4MkwxLjcwNjc5IDIwLjU2OFolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NwYXRoIGQlM0QlMjJNOC45MjQ3OSA1LjkyOTk5TDguMjE0NzkgNi42Mjk5OUMzLjI2NDc5IDExLjYzIDMuNjI0NzkgMTYuODkgMy42MjQ3OSAxNi44OUwyLjA0NDc5IDE4LjQ4QzEuOTI4MzggMTguNTk2MSAxLjgzNjAyIDE4LjczNCAxLjc3MyAxOC44ODU5QzEuNzA5OTkgMTkuMDM3OCAxLjY3NzU1IDE5LjIwMDYgMS42Nzc1NSAxOS4zNjVDMS42Nzc1NSAxOS41Mjk0IDEuNzA5OTkgMTkuNjkyMiAxLjc3MyAxOS44NDQxQzEuODM2MDIgMTkuOTk1OSAxLjkyODM4IDIwLjEzMzkgMi4wNDQ3OSAyMC4yNUwzLjc5NDc5IDIyQzMuOTEwOSAyMi4xMTY0IDQuMDQ4ODQgMjIuMjA4OCA0LjIwMDcgMjIuMjcxOEM0LjM1MjU2IDIyLjMzNDggNC41MTUzNyAyMi4zNjcyIDQuNjc5NzkgMjIuMzY3MkM0Ljg0NDIgMjIuMzY3MiA1LjAwNzAxIDIyLjMzNDggNS4xNTg4NyAyMi4yNzE4QzUuMzEwNzMgMjIuMjA4OCA1LjQ0ODY3IDIyLjExNjQgNS41NjQ3OSAyMkw3LjE1NDc5IDIwLjQxQzcuMTU0NzkgMjAuNDEgMTIuNDY0OCAyMC43NyAxNy40MTQ4IDE1LjgyTDE4LjExNDggMTUuMTElMjIgc3Ryb2tlJTNEJTIyYmxhY2slMjIgc3Ryb2tlLW1pdGVybGltaXQlM0QlMjIxMCUyMiBzdHJva2UtbGluZWNhcCUzRCUyMnJvdW5kJTIyLyUzRSUzQ3BhdGggb3BhY2l0eSUzRCUyMjAuMzMlMjIgZCUzRCUyMk0xNi43MDY4IDE1LjgyNkw4LjIyMTggNy4zNDFMNi44MDc4IDguNzU1TDE1LjI5MjggMTcuMjRMMTYuNzA2OCAxNS44MjZaJTIyIGZpbGwlM0QlMjIlMjNGODI0MDAlMjIvJTNFJTNDcGF0aCBvcGFjaXR5JTNEJTIyMC41JTIyIGQlM0QlMjJNNi45Mzk4MSAxOS45MzFMNC4xMTA4MSAxNy4xMDNMMy40MDM4MSAxNy44MUw2LjIzMjgxIDIwLjYzOEw2LjkzOTgxIDE5LjkzMVolMjIgZmlsbCUzRCUyMiUyM0Y4MjQwMCUyMi8lM0UlM0NjaXJjbGUgY3glM0QlMjIxOC4wNDQ4JTIyIGN5JTNEJTIyNiUyMiByJTNEJTIyNiUyMiBmaWxsJTNEJTIyJTIzRjgyNDAwJTIyLyUzRSUzQy9zdmclM0VcIilcbiAgICBuby1yZXBlYXQgY2VudGVyO1xufVxuXG4uaWNvbl9zaWduYXR1cmUge1xuICB3aWR0aDogNTBweDtcbiAgaGVpZ2h0OiA1MHB4O1xuICBiYWNrZ3JvdW5kOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZvY3VzYWJsZT1cImZhbHNlXCI%252BPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNy4zMzcgMTlIMmEyIDIgMCAwIDEtMi0yVjdhMiAyIDAgMCAxIDItMmgyMGEyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0yIDJoLTkuMzUxYy0uMi42OTgtLjQyIDEuMzUzLS42NTUgMS45MzYtLjI5My43My0uNjI0IDEuMzg2LS45OTMgMS44NzItLjM0MS40NS0uODU2Ljk0Mi0xLjU0Ni45NDItLjgxNiAwLTEuMjktLjYzNy0xLjUzNi0xLjE0NS0uMjY0LS41NDUtLjQxOS0xLjIzNS0uNTAzLTEuOTA1YTExLjE4MiAxMS4xODIgMCAwIDEtLjA3OS0xLjdaTTIgNi41aDIwYS41LjUgMCAwIDEgLjUuNXYxMGEuNS41IDAgMCAxLS41LjVoLTguOTY0YTM1LjAyIDM1LjAyIDAgMCAwIC4zNzgtMS44NzJjLjE2NC0uOTQ3LjI4OC0xLjkwMi4zNjEtMi44MDZhMTIuNjI3IDEyLjYyNyAwIDAgMSAxLjU3My0uODg0bC4wNTYuMTQzLjEyOC4zMjVjLjExNC4yODQuMjY0LjYzLjQ1NC45MTEuMTYxLjI0LjUxNy42ODMgMS4xMDUuNjgzIDEuMDM1IDAgMS44OS0uNTkgMi40OS0xLjM4Ni42LS43OTcgMS4wMDMtMS44NjIgMS4xNjItMy4wMTFhLjc1Ljc1IDAgMSAwLTEuNDg2LS4yMDZjLS4xMzIuOTUtLjQ1NyAxLjc2LS44NzQgMi4zMTQtLjM3LjQ5LS43NjguNzMtMS4xNDUuNzhsLS4wMDgtLjAxMWEzLjcxIDMuNzEgMCAwIDEtLjMwNy0uNjM2bC0uMDk4LS4yNDhhMTEuOTMzIDExLjkzMyAwIDAgMC0uMjI4LS41NTcgMi4xNjIgMi4xNjIgMCAwIDAtLjIyNC0uMzkyYy0uMDYyLS4wODMtLjMwNC0uMzk3LS43MzctLjM5N2EuNzUuNzUgMCAwIDAtLjI3LjA1IDExLjkgMTEuOSAwIDAgMC0xLjUxNy43MjNjLS4wMDItLjI1MS0uMDEtLjQ5My0uMDIzLS43MjQtLjA0NC0uNzM0LS4xNTUtMS40MjItLjM4Mi0xLjk1LS4yMjMtLjUyLS42NjctMS4wOTktMS40NDQtMS4wOTktLjUyIDAtMS4yMTUuMjE3LTEuOS40ODYtLjcxOC4yODItMS41MzkuNjctMi4zNTggMS4xLTEuNjIzLjg1My0zLjMyMiAxLjkxNy00LjIzOSAyLjcyN2EuNzUuNzUgMCAxIDAgLjk5NCAxLjEyNGMuNzgtLjY5IDIuMzUzLTEuNjg4IDMuOTQzLTIuNTIzYTIzLjE4IDIzLjE4IDAgMCAxIDIuMjEtMS4wMzJjLjY0Ni0uMjU1IDEuMDg4LS4zNjggMS4zMS0uMzhhLjY5LjY5IDAgMCAxIC4xMDYuMTg4Yy4xMjUuMjkyLjIyMi43NzYuMjYyIDEuNDQ5LjAzLjQ4LjAyNyAxLjAyMy0uMDAyIDEuNjA5LS41MjQuMzc3LTEuMDMuNzg1LTEuNTA2IDEuMjA3LTEuMzU4IDEuMjA3LTIuNTI3IDIuNTk2LTMuMTMxIDMuODQzYTIuNTYzIDIuNTYzIDAgMCAwLS4xNjMuNDUySDJhLjUuNSAwIDAgMS0uNS0uNVY3YS41LjUgMCAwIDEgLjUtLjVaTTExLjA4NCAxOWMtLjE1Mi40OTYtLjMxNC45Ni0uNDgyIDEuMzc3LS4yNy42NzUtLjU0MyAxLjE5Mi0uNzk2IDEuNTI2LS4xODMuMjQtLjI5OS4zMTUtLjM0My4zMzctLjAzNS0uMDI3LS4xMDQtLjEwMi0uMTk0LS4yODgtLjE2Mi0uMzM1LS4yOS0uODQyLS4zNjQtMS40MzlBOS42NzggOS42NzggMCAwIDEgOC44MzggMTloMi4yNDZabS40MS0xLjVIOS4xNDJjLjUxOC0uOTY0IDEuNDgtMi4xMTMgMi42NzUtMy4xNzQuMTA1LS4wOTQuMjEyLS4xODYuMzItLjI3OGEzMi40MTUgMzIuNDE1IDAgMCAxLS42NDMgMy40NTJabS40NDItOC43N3MuMDA2LjAwMi4wMTYuMDEyYy0uMDExLS4wMDUtLjAxNi0uMDEtLjAxNi0uMDExWk05LjQ4OCAyMi4yNTdzLS4wMDMgMC0uMDA4LS4wMDNjLjAwNi4wMDEuMDA4LjAwMi4wMDguMDAzWm03LjgxMS05LjY5LS4wMS0uMDEuMDEuMDFaXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiPjwvcGF0aD48L3N2Zz4nKVxuICAgIG5vLXJlcGVhdCBjZW50ZXI7XG59XG4iLCJqcyI6IlBTUERGS2l0LmxvYWQoeyAuLi5iYXNlT3B0aW9ucywgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUksgfSkudGhlbihcbiAgKGluc3RhbmNlKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJOdXRyaWVudCBMb2FkZWQgLSBieSBOYXJhc2hpbWFuXCIpO1xuXG4gICAgY29uc3QgdmlkZW9XaWRnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIC8vIFVzaW5nIDx2aWRlbz4gaW5zdGVhZCBvZiA8aWZyYW1lPiBmb3IgSFRNTDUgVmlkZW9zXG4gICAgdmlkZW9XaWRnZXQuaW5uZXJIVE1MID0gYFxuICAgICAgPHZpZGVvIHdpZHRoPVwiNTAwXCIgaGVpZ2h0PVwiMzc1XCIgY29udHJvbHM%252BXG4gICAgICAgIDxzb3VyY2Ugc3JjPVwiaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9odG1sL21vdl9iYmIubXA0XCIgdHlwZT1cInZpZGVvL21wNFwiPlxuICAgICAgICBZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdmlkZW8gdGFnLlxuICAgICAgPC92aWRlbz5cbiAgICBgO1xuXG4gICAgY29uc3QgaXRlbSA9IG5ldyBQU1BERktpdC5DdXN0b21PdmVybGF5SXRlbSh7XG4gICAgICBpZDogXCJ2aWRlby1pbnN0cnVjdGlvbnNcIixcbiAgICAgIG5vZGU6IHZpZGVvV2lkZ2V0LFxuICAgICAgcGFnZUluZGV4OiAwLFxuICAgICAgcG9zaXRpb246IG5ldyBQU1BERktpdC5HZW9tZXRyeS5Qb2ludCh7IHg6IDUwLCB5OiAyMDAgfSksXG4gICAgfSk7XG5cbiAgICBpbnN0YW5jZS5zZXRDdXN0b21PdmVybGF5SXRlbShpdGVtKTtcbiAgfVxuKTtcbiIsIm1vZGUiOiJzdGFuZGFsb25lIn0%253D) + +- [Extract text from each page and count the number of words](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6InNjaWVudGlmaWMucGRmIn0sImNzcyI6Ii8qIEFkZCB5b3VyIENTUyBoZXJlICovXG4iLCJqcyI6IlBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgdGhlbWU6IFBTUERGS2l0LlRoZW1lLkRBUkssXG59KS50aGVuKGFzeW5jIChpbnN0YW5jZSkgPT4ge1xuICBjb25zb2xlLmxvZyhcIk51dHJpZW50IExvYWRlZCAtIGJ5IE5hcmFzaGltYW5cIik7XG4gIC8vIEluaXRpYWxpemUgYW4gZW1wdHkgYXJyYXkgdG8gc3RvcmUgdGV4dCBmb3IgZWFjaCBwYWdlXG4gIGxldCBwYWdldGV4dCA9IFtdO1xuICBjb25zdCB0b3RhbFBhZ2VzID0gaW5zdGFuY2UudG90YWxQYWdlQ291bnQ7XG4gIGNvbnNvbGUubG9nKGBUb3RhbCBwYWdlczogJHt0b3RhbFBhZ2VzfWApO1xuXG4gIC8vIExvb3AgdGhyb3VnaCBlYWNoIHBhZ2UgdG8gZXh0cmFjdCB0ZXh0XG4gIGZvciAobGV0IHBhZ2VJbmRleCA9IDA7IHBhZ2VJbmRleCA8IHRvdGFsUGFnZXM7IHBhZ2VJbmRleCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCB0aGUgdGV4dCBsaW5lcyBmb3IgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgY29uc3QgdGV4dExpbmVzID0gYXdhaXQgaW5zdGFuY2UudGV4dExpbmVzRm9yUGFnZUluZGV4KHBhZ2VJbmRleCk7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHQgZm9yIHRoaXMgcGFnZSBpZiBpdCdzIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAoIXBhZ2V0ZXh0W3BhZ2VJbmRleF0pIHtcbiAgICAgICAgcGFnZXRleHRbcGFnZUluZGV4XSA9IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmNhdGVuYXRlIGFsbCB0aGUgdGV4dCBsaW5lcyBmb3IgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgdGV4dExpbmVzLmZvckVhY2goKHRleHRMaW5lKSA9PiB7XG4gICAgICAgIHBhZ2V0ZXh0W3BhZ2VJbmRleF0gKz0gdGV4dExpbmUuY29udGVudHMgKyBcIiBcIjsgLy8gQWRkIHNwYWNlIGJldHdlZW4gbGluZXNcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgd29yZCBjb3VudCBmb3IgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgY29uc3Qgd29yZENvdW50ID0gcGFnZXRleHRbcGFnZUluZGV4XS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG5cbiAgICAgIC8vIExvZyB0aGUgZXh0cmFjdGVkIHRleHQgYW5kIHdvcmQgY291bnQgZm9yIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgIC8vY29uc29sZS5sb2coYFBhZ2UgJHtwYWdlSW5kZXggKyAxfTpgKTtcbiAgICAgIC8vY29uc29sZS5sb2cocGFnZXRleHRbcGFnZUluZGV4XSk7XG4gICAgICBjb25zb2xlLmxvZyhgV29yZCBDb3VudCBmb3IgUGFnZSAke3BhZ2VJbmRleCArIDF9OiAke3dvcmRDb3VudH1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coYEVycm9yIHJldHJpZXZpbmcgdGV4dCBmb3IgcGFnZSAke3BhZ2VJbmRleCArIDF9OmAsIGVycm9yKTtcbiAgICB9XG4gIH1cbn0pO1xuIiwibW9kZSI6InN0YW5kYWxvbmUifQ%253D%253D) + +- [Video overlay with drag and resize](https://www.nutrient.io/playground?p=eyJ2IjoxLCJzZXR0aW5ncyI6eyJmaWxlTmFtZSI6ImJhc2ljLnBkZiJ9LCJqcyI6ImNvbnN0IFBERnN0dWIgPSBgJVBERi0xLjBcbjEgMCBvYmo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI%252BPmVuZG9ialxuMiAwIG9iajw8L1R5cGUvUGFnZXMvS2lkc1szIDAgUl0vQ291bnQgMT4%252BZW5kb2JqXG4zIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgNTk1LjI4IDg0MS44OV0%252BPmVuZG9ialxueHJlZlxuMCA0XG4wMDAwMDAwMDAwIDY1NTM1IGZcbjAwMDAwMDAwMTAgMDAwMDAgblxuMDAwMDAwMDA1MyAwMDAwMCBuXG4wMDAwMDAwMTAyIDAwMDAwIG5cbnRyYWlsZXI8PC9TaXplIDQvUm9vdCAxIDAgUj4%252BXG5zdGFydHhyZWZcbjE1MVxuJSVFT0ZcbmA7XG5cbmNvbnN0IHVpbnQ4YXJyYXkgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoUERGc3R1Yik7XG5cblBTUERGS2l0LmxvYWQoe1xuICAuLi5iYXNlT3B0aW9ucyxcbiAgZG9jdW1lbnQ6IHVpbnQ4YXJyYXkuYnVmZmVyLFxuICB0aGVtZTogUFNQREZLaXQuVGhlbWUuREFSSyxcbn0pLnRoZW4oKGluc3RhbmNlKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiTnVyaWVudCBsb2FkZWQhIC0gYnkgTmFyYXNoaW1hblwiKTtcblxuICBjb25zdCB2aWRlb1dpZGdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHZpZGVvV2lkZ2V0LnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICB2aWRlb1dpZGdldC5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBpZD1cImRyYWctaGFuZGxlXCIgc3R5bGU9XCJcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAzMHB4O1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIFwiPlxuICAgICAgRHJhZyB0byBtb3ZlXG4gICAgPC9kaXY%252BXG4gICAgPHZpZGVvIGlkPVwidmlkZW8tZWxlbWVudFwiIHdpZHRoPVwiNTAwXCIgaGVpZ2h0PVwiMzc1XCIgY29udHJvbHM%252BXG4gICAgICA8c291cmNlIHNyYz1cImh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vaHRtbC9tb3ZfYmJiLm1wNFwiIHR5cGU9XCJ2aWRlby9tcDRcIj5cbiAgICAgIFlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB2aWRlbyB0YWcuXG4gICAgPC92aWRlbz5cbiAgICA8ZGl2IGlkPVwicmVzaXplLWhhbmRsZVwiIHN0eWxlPVwiXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIHdpZHRoOiA0MHB4O1xuICAgICAgaGVpZ2h0OiA0MHB4O1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQpO1xuICAgICAgY3Vyc29yOiBzZS1yZXNpemU7XG4gICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgXCI%252BLi48L2Rpdj5cbiAgYDtcblxuICBsZXQgY3VycmVudFBvc2l0aW9uID0gbmV3IFBTUERGS2l0Lkdlb21ldHJ5LlBvaW50KHsgeDogMTAsIHk6IDEwIH0pO1xuICBsZXQgY3VycmVudFdpZHRoID0gNTAwO1xuICBsZXQgY3VycmVudEhlaWdodCA9IDM3NTtcblxuICBjb25zdCB2aWRlb092ZXJsYXkgPSBuZXcgUFNQREZLaXQuQ3VzdG9tT3ZlcmxheUl0ZW0oe1xuICAgIGlkOiBcInZpZGVvLXdpZGdldFwiLFxuICAgIG5vZGU6IHZpZGVvV2lkZ2V0LFxuICAgIHBhZ2VJbmRleDogMCxcbiAgICBwb3NpdGlvbjogY3VycmVudFBvc2l0aW9uLFxuICB9KTtcblxuICBpbnN0YW5jZS5zZXRDdXN0b21PdmVybGF5SXRlbSh2aWRlb092ZXJsYXkpO1xuXG4gIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gIGxldCBpc1Jlc2l6aW5nID0gZmFsc2U7XG4gIGxldCBkcmFnU3RhcnRYID0gMDtcbiAgbGV0IGRyYWdTdGFydFkgPSAwO1xuICBsZXQgaW5pdGlhbFBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XG4gIGxldCBpbml0aWFsU2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuXG4gIGNvbnN0IGRyYWdIYW5kbGUgPSB2aWRlb1dpZGdldC5xdWVyeVNlbGVjdG9yKFwiI2RyYWctaGFuZGxlXCIpO1xuICBjb25zdCByZXNpemVIYW5kbGUgPSB2aWRlb1dpZGdldC5xdWVyeVNlbGVjdG9yKFwiI3Jlc2l6ZS1oYW5kbGVcIik7XG4gIGNvbnN0IHZpZGVvRWxlbWVudCA9IHZpZGVvV2lkZ2V0LnF1ZXJ5U2VsZWN0b3IoXCIjdmlkZW8tZWxlbWVudFwiKTtcblxuICBkcmFnSGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgKGUpID0%252BIHtcbiAgICBpc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICBkcmFnU3RhcnRYID0gZS5jbGllbnRYO1xuICAgIGRyYWdTdGFydFkgPSBlLmNsaWVudFk7XG4gICAgaW5pdGlhbFBvc2l0aW9uID0geyB4OiBjdXJyZW50UG9zaXRpb24ueCwgeTogY3VycmVudFBvc2l0aW9uLnkgfTtcblxuICAgIGRyYWdIYW5kbGUuc3R5bGUuYmFja2dyb3VuZCA9IFwicmdiYSgwLCAxMDAsIDIwMCwgMC44KVwiO1xuICAgIGRyYWdIYW5kbGUudGV4dENvbnRlbnQgPSBcIk1vdmluZy4uLlwiO1xuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9KTtcblxuICByZXNpemVIYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoZSkgPT4ge1xuICAgIGlzUmVzaXppbmcgPSB0cnVlO1xuICAgIGRyYWdTdGFydFggPSBlLmNsaWVudFg7XG4gICAgZHJhZ1N0YXJ0WSA9IGUuY2xpZW50WTtcbiAgICBpbml0aWFsU2l6ZSA9IHsgd2lkdGg6IGN1cnJlbnRXaWR0aCwgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0IH07XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCAoZSkgPT4ge1xuICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBkZWx0YVggPSBlLmNsaWVudFggLSBkcmFnU3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZS5jbGllbnRZIC0gZHJhZ1N0YXJ0WTtcblxuICAgICAgY29uc3QgbmV3WCA9IE1hdGgubWF4KDAsIGluaXRpYWxQb3NpdGlvbi54ICsgZGVsdGFYKTtcbiAgICAgIGNvbnN0IG5ld1kgPSBNYXRoLm1heCgwLCBpbml0aWFsUG9zaXRpb24ueSArIGRlbHRhWSk7XG5cbiAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IG5ldyBQU1BERktpdC5HZW9tZXRyeS5Qb2ludCh7IHg6IG5ld1gsIHk6IG5ld1kgfSk7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRPdmVybGF5ID0gbmV3IFBTUERGS2l0LkN1c3RvbU92ZXJsYXlJdGVtKHtcbiAgICAgICAgaWQ6IFwidmlkZW8td2lkZ2V0XCIsXG4gICAgICAgIG5vZGU6IHZpZGVvV2lkZ2V0LFxuICAgICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICAgIHBvc2l0aW9uOiBjdXJyZW50UG9zaXRpb24sXG4gICAgICB9KTtcblxuICAgICAgaW5zdGFuY2Uuc2V0Q3VzdG9tT3ZlcmxheUl0ZW0odXBkYXRlZE92ZXJsYXkpO1xuICAgIH0gZWxzZSBpZiAoaXNSZXNpemluZykge1xuICAgICAgY29uc3QgZGVsdGFYID0gZS5jbGllbnRYIC0gZHJhZ1N0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGUuY2xpZW50WSAtIGRyYWdTdGFydFk7XG5cbiAgICAgIGN1cnJlbnRXaWR0aCA9IE1hdGgubWF4KDIwMCwgaW5pdGlhbFNpemUud2lkdGggKyBkZWx0YVgpO1xuICAgICAgY3VycmVudEhlaWdodCA9IE1hdGgubWF4KDE1MCwgaW5pdGlhbFNpemUuaGVpZ2h0ICsgZGVsdGFZKTtcblxuICAgICAgdmlkZW9FbGVtZW50LndpZHRoID0gY3VycmVudFdpZHRoO1xuICAgICAgdmlkZW9FbGVtZW50LmhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCAoKSA9PiB7XG4gICAgaWYgKGlzRHJhZ2dpbmcpIHtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgZHJhZ0hhbmRsZS5zdHlsZS5iYWNrZ3JvdW5kID0gXCJyZ2JhKDAsIDAsIDAsIDAuNylcIjtcbiAgICAgIGRyYWdIYW5kbGUudGV4dENvbnRlbnQgPSBcIiBEcmFnIHRvIG1vdmVcIjtcblxuICAgICAgY29uc29sZS5sb2coXCJWaWRlbyBtb3ZlZCB0bzpcIiwgY3VycmVudFBvc2l0aW9uKTtcbiAgICB9XG4gICAgaWYgKGlzUmVzaXppbmcpIHtcbiAgICAgIGlzUmVzaXppbmcgPSBmYWxzZTtcbiAgICAgIGNvbnNvbGUubG9nKFwiVmlkZW8gcmVzaXplZCB0bzpcIiwgY3VycmVudFdpZHRoLCBcInhcIiwgY3VycmVudEhlaWdodCk7XG4gICAgfVxuICB9KTtcblxuICBkcmFnSGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIChlKSA9PiB7XG4gICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgZHJhZ1N0YXJ0WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgZHJhZ1N0YXJ0WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgaW5pdGlhbFBvc2l0aW9uID0geyB4OiBjdXJyZW50UG9zaXRpb24ueCwgeTogY3VycmVudFBvc2l0aW9uLnkgfTtcblxuICAgIGRyYWdIYW5kbGUuc3R5bGUuYmFja2dyb3VuZCA9IFwicmdiYSgwLCAxMDAsIDIwMCwgMC44KVwiO1xuICAgIGRyYWdIYW5kbGUudGV4dENvbnRlbnQgPSBcIk1vdmluZy4uLlwiO1xuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9KTtcblxuICByZXNpemVIYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgKGUpID0%252BIHtcbiAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICBpc1Jlc2l6aW5nID0gdHJ1ZTtcbiAgICBkcmFnU3RhcnRYID0gdG91Y2guY2xpZW50WDtcbiAgICBkcmFnU3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICBpbml0aWFsU2l6ZSA9IHsgd2lkdGg6IGN1cnJlbnRXaWR0aCwgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0IH07XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCAoZSkgPT4ge1xuICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IHRvdWNoLmNsaWVudFggLSBkcmFnU3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gdG91Y2guY2xpZW50WSAtIGRyYWdTdGFydFk7XG5cbiAgICAgIGNvbnN0IG5ld1ggPSBNYXRoLm1heCgwLCBpbml0aWFsUG9zaXRpb24ueCArIGRlbHRhWCk7XG4gICAgICBjb25zdCBuZXdZID0gTWF0aC5tYXgoMCwgaW5pdGlhbFBvc2l0aW9uLnkgKyBkZWx0YVkpO1xuXG4gICAgICBjdXJyZW50UG9zaXRpb24gPSBuZXcgUFNQREZLaXQuR2VvbWV0cnkuUG9pbnQoeyB4OiBuZXdYLCB5OiBuZXdZIH0pO1xuXG4gICAgICBjb25zdCB1cGRhdGVkT3ZlcmxheSA9IG5ldyBQU1BERktpdC5DdXN0b21PdmVybGF5SXRlbSh7XG4gICAgICAgIGlkOiBcInZpZGVvLXdpZGdldFwiLFxuICAgICAgICBub2RlOiB2aWRlb1dpZGdldCxcbiAgICAgICAgcGFnZUluZGV4OiAwLFxuICAgICAgICBwb3NpdGlvbjogY3VycmVudFBvc2l0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIGluc3RhbmNlLnNldEN1c3RvbU92ZXJsYXlJdGVtKHVwZGF0ZWRPdmVybGF5KTtcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAoaXNSZXNpemluZykge1xuICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCBkZWx0YVggPSB0b3VjaC5jbGllbnRYIC0gZHJhZ1N0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IHRvdWNoLmNsaWVudFkgLSBkcmFnU3RhcnRZO1xuXG4gICAgICBjdXJyZW50V2lkdGggPSBNYXRoLm1heCgyNTAsIGluaXRpYWxTaXplLndpZHRoICsgZGVsdGFYKTtcbiAgICAgIGN1cnJlbnRIZWlnaHQgPSBNYXRoLm1heCgyMDAsIGluaXRpYWxTaXplLmhlaWdodCArIGRlbHRhWSk7XG5cbiAgICAgIHZpZGVvRWxlbWVudC53aWR0aCA9IGN1cnJlbnRXaWR0aDtcbiAgICAgIHZpZGVvRWxlbWVudC5oZWlnaHQgPSBjdXJyZW50SGVpZ2h0O1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgKCkgPT4ge1xuICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICBkcmFnSGFuZGxlLnN0eWxlLmJhY2tncm91bmQgPSBcInJnYmEoMCwgMCwgMCwgMC43KVwiO1xuICAgICAgZHJhZ0hhbmRsZS50ZXh0Q29udGVudCA9IFwiRHJhZyB0byBtb3ZlXCI7XG4gICAgfVxuICAgIGlmIChpc1Jlc2l6aW5nKSB7XG4gICAgICBpc1Jlc2l6aW5nID0gZmFsc2U7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiY3NzIjoiLyogQWRkIHlvdXIgQ1NTIGhlcmUgKi9cbiJ9) + +- [Multi Tab Support](https://github.com/PSPDFKit/awesome-nutrient/tree/master/web/viewer/multi-tab) + diff --git a/web/annotation/README.md b/web/annotation/README.md new file mode 100644 index 0000000..165a399 --- /dev/null +++ b/web/annotation/README.md @@ -0,0 +1,129 @@ +# Annotation Examples (Local) + +These are runnable examples you can clone and run locally. Each demonstrates specific annotation features in Nutrient Web SDK. + +> For interactive playground examples, see [Annotations Playground Examples](../../playground/web-annotations.md). + +--- + +## Available Examples + +### comment-annotations +**Description**: Demonstrates how to create and manage comment annotations on PDFs. + +**Quick start**: +```bash +cd comment-annotations +npm install +npm start +``` + +--- + +### comments-status +**Description**: Shows how to track and manage comment status (e.g., open, resolved). + +**Quick start**: +```bash +cd comments-status +npm install +npm start +``` + +--- + +### create-annotation-from-clipboard +**Description**: Create annotations from clipboard content (images, text). + +**Quick start**: +```bash +cd create-annotation-from-clipboard +npm install +npm start +``` + +--- + +### customise-annotation-sidebar +**Description**: Customize the appearance and behavior of the annotation sidebar. + +**Quick start**: +```bash +cd customise-annotation-sidebar +npm install +npm start +``` + +--- + +### get-all-annotations-boundingBox +**Description**: Retrieve and work with bounding boxes of all annotations in a document. + +**Quick start**: +```bash +cd get-all-annotations-boundingBox +npm install +npm start +``` + +--- + +### redact-one-by-one +**Description**: Progressive redaction workflow - redact sensitive content one item at a time. + +**Quick start**: +```bash +cd redact-one-by-one +npm install +npm run dev +``` + +--- + +### snipping-annotation +**Description**: Create snipping tool-style annotations for screenshots. + +**Quick start**: +```bash +cd snipping-annotation +npm install +npm start +``` + +--- + +### speech-2-text +**Description**: Convert speech to text annotations using browser speech recognition. + +**Quick start**: +```bash +cd speech-2-text +npm install +npm start +``` + +--- + +### text-2-speech +**Description**: Convert annotation text to speech using browser text-to-speech. + +**Quick start**: +```bash +cd text-2-speech +npm install +npm start +``` + +--- + +## Prerequisites + +All examples require: +- **Node.js** (v16 or higher recommended) +- **npm** or **yarn** + +## Need Help? + +- [Nutrient Web SDK Documentation](https://www.nutrient.io/guides/web/) +- [API Reference](https://www.nutrient.io/api/web/) +- [Support](https://support.nutrient.io/hc/en-us/requests/new) diff --git a/web/document-editor/README.md b/web/document-editor/README.md new file mode 100644 index 0000000..6a80456 --- /dev/null +++ b/web/document-editor/README.md @@ -0,0 +1,33 @@ +# Document Editor Examples (Local) + +These examples demonstrate document editing capabilities including page manipulation, content editing, and document assembly. + +> For interactive playground examples, see [Document Editor Playground Examples](../../playground/web-document-editor.md). + +--- + +## Available Examples + +### save-selected-page-from-document-editor +**Description**: Extract and save individual pages from the document editor interface. + +**Quick start**: +```bash +cd save-selected-page-from-document-editor +npm install +npm start +``` + +--- + +## Prerequisites + +All examples require: +- **Node.js** (v16 or higher recommended) +- **npm** or **yarn** + +## Need Help? + +- [Nutrient Web SDK Documentation](https://www.nutrient.io/guides/web/) +- [API Reference](https://www.nutrient.io/api/web/) +- [Support](https://support.nutrient.io/hc/en-us/requests/new) diff --git a/web/miscellaneous/README.md b/web/miscellaneous/README.md new file mode 100644 index 0000000..96bfce1 --- /dev/null +++ b/web/miscellaneous/README.md @@ -0,0 +1,36 @@ +# Miscellaneous Examples (Local) + +These examples demonstrate various integrations, analytics, and specialized use cases with Nutrient Web SDK. + +> For related playground examples, see: +> - [Toolbars & Menus Examples](../../playground/web-toolbars-menus.md) +> - [Text Comparison Examples](../../playground/web-text-comparison.md) + +--- + +## Available Examples + +### mixpanel-web-analytics +**Description**: Integration with Mixpanel for tracking PDF viewer analytics and user interactions. + +**Quick start**: +```bash +cd mixpanel-web-analytics +npm install +npm start +``` + +--- + +## Prerequisites + +All examples require: +- **Node.js** (v16 or higher recommended) +- **npm** or **yarn** +- Additional service credentials where applicable (e.g., Mixpanel API key) + +## Need Help? + +- [Nutrient Web SDK Documentation](https://www.nutrient.io/guides/web/) +- [API Reference](https://www.nutrient.io/api/web/) +- [Support](https://support.nutrient.io/hc/en-us/requests/new) diff --git a/web/signing/README.md b/web/signing/README.md new file mode 100644 index 0000000..b3a9250 --- /dev/null +++ b/web/signing/README.md @@ -0,0 +1,57 @@ +# Signing Examples (Local) + +These are runnable examples demonstrating electronic and digital signature capabilities with Nutrient Web SDK. + +> For interactive playground examples, see [Signing Playground Examples](../../playground/web-signing.md). + +--- + +## Available Examples + +### clientside-digital-sigature +**Description**: Implement client-side digital signatures with certificate-based signing. + +**Quick start**: +```bash +cd clientside-digital-sigature +npm install +npm start +``` + +--- + +### sign-here-upgraded +**Description**: Enhanced "sign here" workflow with drag-and-drop signature placement. + +**Quick start**: +```bash +cd sign-here-upgraded +npm install +npm start +``` + +--- + +### signing-demo-complete +**Description**: Complete signing workflow demo with signature creation, placement, and finalization. + +**Quick start**: +```bash +cd signing-demo-complete +npm install +npm run dev +``` + +--- + +## Prerequisites + +All examples require: +- **Node.js** (v16 or higher recommended) +- **npm** or **yarn** + +## Need Help? + +- [Nutrient Web SDK Documentation](https://www.nutrient.io/guides/web/) +- [API Reference](https://www.nutrient.io/api/web/) +- [Support](https://support.nutrient.io/hc/en-us/requests/new) diff --git a/web/viewer/README.md b/web/viewer/README.md new file mode 100644 index 0000000..db639e9 --- /dev/null +++ b/web/viewer/README.md @@ -0,0 +1,33 @@ +# Viewer Examples (Local) + +These examples showcase advanced PDF viewing capabilities and custom viewer configurations. + +> For interactive playground examples, see [Viewer Playground Examples](../../playground/web-viewer.md). + +--- + +## Available Examples + +### multi-tab +**Description**: Multi-tab PDF viewer allowing users to open and switch between multiple documents. + +**Quick start**: +```bash +cd multi-tab +npm install +npm start +``` + +--- + +## Prerequisites + +All examples require: +- **Node.js** (v16 or higher recommended) +- **npm** or **yarn** + +## Need Help? + +- [Nutrient Web SDK Documentation](https://www.nutrient.io/guides/web/) +- [API Reference](https://www.nutrient.io/api/web/) +- [Support](https://support.nutrient.io/hc/en-us/requests/new) diff --git a/windows/pspdfkit-with-winui3/PSPDFKit-WinUI3-example/Assets/index.html b/windows/pspdfkit-with-winui3/PSPDFKit-WinUI3-example/Assets/index.html index 9ed9e8c..0097c6f 100644 --- a/windows/pspdfkit-with-winui3/PSPDFKit-WinUI3-example/Assets/index.html +++ b/windows/pspdfkit-with-winui3/PSPDFKit-WinUI3-example/Assets/index.html @@ -1,4 +1,4 @@ - +