soiz1 commited on
Commit
9ab1a44
·
verified ·
1 Parent(s): 5b9624b

Upload static files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +10 -0
  2. 41f50eb9f984c12c2544.worker.js +228 -0
  3. 41f50eb9f984c12c2544.worker.js.map +1 -0
  4. editor.html +53 -0
  5. file-list-webpack.json +624 -0
  6. js/0.js +74 -0
  7. js/0.js.map +1 -0
  8. js/1.js +124 -0
  9. js/1.js.map +1 -0
  10. js/2.js +53 -0
  11. js/2.js.map +1 -0
  12. js/addon-default-entry.js +0 -0
  13. js/addon-default-entry.js.map +0 -0
  14. js/addon-entry-2d-color-picker.js +1635 -0
  15. js/addon-entry-2d-color-picker.js.map +1 -0
  16. js/addon-entry-better-img-uploads.js +271 -0
  17. js/addon-entry-better-img-uploads.js.map +1 -0
  18. js/addon-entry-block-count.js +97 -0
  19. js/addon-entry-block-count.js.map +1 -0
  20. js/addon-entry-block-palette-icons.js +314 -0
  21. js/addon-entry-block-palette-icons.js.map +1 -0
  22. js/addon-entry-blocks2image.js +238 -0
  23. js/addon-entry-blocks2image.js.map +1 -0
  24. js/addon-entry-cat-blocks.js +327 -0
  25. js/addon-entry-cat-blocks.js.map +1 -0
  26. js/addon-entry-clones.js +210 -0
  27. js/addon-entry-clones.js.map +1 -0
  28. js/addon-entry-columns.js +212 -0
  29. js/addon-entry-columns.js.map +1 -0
  30. js/addon-entry-custom-block-shape.js +209 -0
  31. js/addon-entry-custom-block-shape.js.map +1 -0
  32. js/addon-entry-custom-block-text.js +66 -0
  33. js/addon-entry-custom-block-text.js.map +1 -0
  34. js/addon-entry-custom-zoom.js +121 -0
  35. js/addon-entry-custom-zoom.js.map +1 -0
  36. js/addon-entry-debugger.js +0 -0
  37. js/addon-entry-debugger.js.map +0 -0
  38. js/addon-entry-default-costume-editor-color.js +300 -0
  39. js/addon-entry-default-costume-editor-color.js.map +1 -0
  40. js/addon-entry-disable-paste-offset.js +71 -0
  41. js/addon-entry-disable-paste-offset.js.map +1 -0
  42. js/addon-entry-disable-stage-drag-select.js +79 -0
  43. js/addon-entry-disable-stage-drag-select.js.map +1 -0
  44. js/addon-entry-editor-buttons-reverse-order.js +43 -0
  45. js/addon-entry-editor-buttons-reverse-order.js.map +1 -0
  46. js/addon-entry-editor-colored-context-menus.js +131 -0
  47. js/addon-entry-editor-colored-context-menus.js.map +1 -0
  48. js/addon-entry-editor-extra-keys.js +102 -0
  49. js/addon-entry-editor-extra-keys.js.map +1 -0
  50. js/addon-entry-editor-sounds.js +68 -0
.gitattributes ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ js/vendors~editor~embed~fullscreen~player~playground.js filter=lfs diff=lfs merge=lfs -text
2
+ js/vendors~editor~embed~fullscreen~player~playground.js.map filter=lfs diff=lfs merge=lfs -text
3
+ static/assets/48d66af328a669a1c84c5dc87a4e9a3b.ttf filter=lfs diff=lfs merge=lfs -text
4
+ static/assets/4c768843c9fa6593074231cd762b83f8.ttf filter=lfs diff=lfs merge=lfs -text
5
+ static/assets/57f5c040b2ec7c6f269042b4e1c32a03.png filter=lfs diff=lfs merge=lfs -text
6
+ static/assets/5f46c8dc3b8cc2296eb73f013dfce3db.ttf filter=lfs diff=lfs merge=lfs -text
7
+ static/assets/8996930d8e83f63cc3341172205df460.otf filter=lfs diff=lfs merge=lfs -text
8
+ static/assets/8d83d454d2c42614a203322393c23a5b.ttf filter=lfs diff=lfs merge=lfs -text
9
+ static/assets/9ec3449723269a806ec6eaba0f8f6cef.ttf filter=lfs diff=lfs merge=lfs -text
10
+ static/assets/eb64e706eb7a3b324ba50d3279a980b1.ttf filter=lfs diff=lfs merge=lfs -text
41f50eb9f984c12c2544.worker.js ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+ /******/
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+ /******/
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId]) {
10
+ /******/ return installedModules[moduleId].exports;
11
+ /******/ }
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ i: moduleId,
15
+ /******/ l: false,
16
+ /******/ exports: {}
17
+ /******/ };
18
+ /******/
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+ /******/
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.l = true;
24
+ /******/
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+ /******/
29
+ /******/
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+ /******/
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+ /******/
36
+ /******/ // define getter function for harmony exports
37
+ /******/ __webpack_require__.d = function(exports, name, getter) {
38
+ /******/ if(!__webpack_require__.o(exports, name)) {
39
+ /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
40
+ /******/ }
41
+ /******/ };
42
+ /******/
43
+ /******/ // define __esModule on exports
44
+ /******/ __webpack_require__.r = function(exports) {
45
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
46
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
47
+ /******/ }
48
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
49
+ /******/ };
50
+ /******/
51
+ /******/ // create a fake namespace object
52
+ /******/ // mode & 1: value is a module id, require it
53
+ /******/ // mode & 2: merge all properties of value into the ns
54
+ /******/ // mode & 4: return value when already ns object
55
+ /******/ // mode & 8|1: behave like require
56
+ /******/ __webpack_require__.t = function(value, mode) {
57
+ /******/ if(mode & 1) value = __webpack_require__(value);
58
+ /******/ if(mode & 8) return value;
59
+ /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
60
+ /******/ var ns = Object.create(null);
61
+ /******/ __webpack_require__.r(ns);
62
+ /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
63
+ /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
64
+ /******/ return ns;
65
+ /******/ };
66
+ /******/
67
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
68
+ /******/ __webpack_require__.n = function(module) {
69
+ /******/ var getter = module && module.__esModule ?
70
+ /******/ function getDefault() { return module['default']; } :
71
+ /******/ function getModuleExports() { return module; };
72
+ /******/ __webpack_require__.d(getter, 'a', getter);
73
+ /******/ return getter;
74
+ /******/ };
75
+ /******/
76
+ /******/ // Object.prototype.hasOwnProperty.call
77
+ /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
78
+ /******/
79
+ /******/ // __webpack_public_path__
80
+ /******/ __webpack_require__.p = "";
81
+ /******/
82
+ /******/
83
+ /******/ // Load entry module and return exports
84
+ /******/ return __webpack_require__(__webpack_require__.s = "./node_modules/babel-loader/lib/index.js?!./node_modules/scratch-storage/src/FetchWorkerTool.worker.js");
85
+ /******/ })
86
+ /************************************************************************/
87
+ /******/ ({
88
+
89
+ /***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/scratch-storage/src/FetchWorkerTool.worker.js":
90
+ /*!************************************************************************************************************!*\
91
+ !*** ./node_modules/babel-loader/lib??ref--4!./node_modules/scratch-storage/src/FetchWorkerTool.worker.js ***!
92
+ \************************************************************************************************************/
93
+ /*! no static exports found */
94
+ /***/ (function(module, exports, __webpack_require__) {
95
+
96
+ /* eslint-env worker */
97
+
98
+ const saferFetchAsArrayBuffer = __webpack_require__(/*! ./safer-fetch */ "./node_modules/scratch-storage/src/safer-fetch.js");
99
+ const complete = [];
100
+ let timeoutId = null;
101
+ const checkCompleted = () => {
102
+ if (timeoutId) return;
103
+ timeoutId = setTimeout(() => {
104
+ timeoutId = null;
105
+ if (complete.length) {
106
+ // Send our chunk of completed requests and instruct postMessage to
107
+ // transfer the buffers instead of copying them.
108
+ postMessage(complete.slice(),
109
+ // Instruct postMessage that these buffers in the sent message
110
+ // should use their Transferable trait. After the postMessage
111
+ // call the "buffers" will still be in complete if you looked,
112
+ // but they will all be length 0 as the data they reference has
113
+ // been sent to the window. This lets us send a lot of data
114
+ // without the normal postMessage behaviour of making a copy of
115
+ // all of the data for the window.
116
+ complete.map(response => response.buffer).filter(Boolean));
117
+ complete.length = 0;
118
+ }
119
+ });
120
+ };
121
+
122
+ /**
123
+ * Receive a job from the parent and fetch the requested data.
124
+ * @param {object} options.job A job id, url, and options descriptor to perform.
125
+ */
126
+ const onMessage = _ref => {
127
+ let {
128
+ data: job
129
+ } = _ref;
130
+ saferFetchAsArrayBuffer(job.url, job.options).then(buffer => complete.push({
131
+ id: job.id,
132
+ buffer
133
+ })).catch(error => complete.push({
134
+ id: job.id,
135
+ error: error && error.message || "Failed request: ".concat(job.url)
136
+ })).then(checkCompleted);
137
+ };
138
+ if (self.fetch) {
139
+ postMessage({
140
+ support: {
141
+ fetch: true
142
+ }
143
+ });
144
+ self.addEventListener('message', onMessage);
145
+ } else {
146
+ postMessage({
147
+ support: {
148
+ fetch: false
149
+ }
150
+ });
151
+ self.addEventListener('message', _ref2 => {
152
+ let {
153
+ data: job
154
+ } = _ref2;
155
+ postMessage([{
156
+ id: job.id,
157
+ error: 'fetch is unavailable'
158
+ }]);
159
+ });
160
+ }
161
+
162
+ /***/ }),
163
+
164
+ /***/ "./node_modules/scratch-storage/src/safer-fetch.js":
165
+ /*!*********************************************************!*\
166
+ !*** ./node_modules/scratch-storage/src/safer-fetch.js ***!
167
+ \*********************************************************/
168
+ /*! no static exports found */
169
+ /***/ (function(module, exports) {
170
+
171
+ /* eslint-env browser */
172
+ /* eslint-disable no-use-before-define */
173
+
174
+ // This throttles and retries fetch() to mitigate the effect of random network errors and
175
+ // random browser errors (especially in Chrome)
176
+
177
+ let currentFetches = 0;
178
+ const queue = [];
179
+ const startNextFetch = _ref => {
180
+ let [resolve, url, options] = _ref;
181
+ let firstError;
182
+ let failedAttempts = 0;
183
+ const attemptToFetch = () => fetch(url, options).then(result => {
184
+ // In a macOS WKWebView, requests from file: URLs to other file: URLs always have status: 0 and ok: false
185
+ // even though the requests were successful. If the requested file doesn't exist, fetch() rejects instead.
186
+ // We aren't aware of any other cases where fetch() can resolve with status 0, so this should be safe.
187
+ if (result.ok || result.status === 0) return result.arrayBuffer();
188
+ if (result.status === 404) return null;
189
+ return Promise.reject(result.status);
190
+ }).then(buffer => {
191
+ currentFetches--;
192
+ checkStartNextFetch();
193
+ return buffer;
194
+ }).catch(error => {
195
+ if (error === 403) {
196
+ // Retrying this request will not help, so return an error now.
197
+ throw error;
198
+ }
199
+ console.warn("Attempt to fetch ".concat(url, " failed"), error);
200
+ if (!firstError) {
201
+ firstError = error;
202
+ }
203
+ if (failedAttempts < 2) {
204
+ failedAttempts++;
205
+ return new Promise(cb => setTimeout(cb, (failedAttempts + Math.random() - 1) * 5000)).then(attemptToFetch);
206
+ }
207
+ currentFetches--;
208
+ checkStartNextFetch();
209
+ throw firstError;
210
+ });
211
+ return resolve(attemptToFetch());
212
+ };
213
+ const checkStartNextFetch = () => {
214
+ if (currentFetches < 100 && queue.length > 0) {
215
+ currentFetches++;
216
+ startNextFetch(queue.shift());
217
+ }
218
+ };
219
+ const saferFetchAsArrayBuffer = (url, options) => new Promise(resolve => {
220
+ queue.push([resolve, url, options]);
221
+ checkStartNextFetch();
222
+ });
223
+ module.exports = saferFetchAsArrayBuffer;
224
+
225
+ /***/ })
226
+
227
+ /******/ });
228
+ //# sourceMappingURL=41f50eb9f984c12c2544.worker.js.map
41f50eb9f984c12c2544.worker.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"41f50eb9f984c12c2544.worker.js","sources":["webpack://GUI/webpack/bootstrap","webpack://GUI/./node_modules/scratch-storage/src/FetchWorkerTool.worker.js","webpack://GUI/./node_modules/scratch-storage/src/safer-fetch.js"],"sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./node_modules/babel-loader/lib/index.js?!./node_modules/scratch-storage/src/FetchWorkerTool.worker.js\");\n","/* eslint-env worker */\n\nconst saferFetchAsArrayBuffer = require('./safer-fetch');\n\nconst complete = [];\n\nlet timeoutId = null;\n\nconst checkCompleted = () => {\n if (timeoutId) return;\n timeoutId = setTimeout(() => {\n timeoutId = null;\n if (complete.length) {\n // Send our chunk of completed requests and instruct postMessage to\n // transfer the buffers instead of copying them.\n postMessage(\n complete.slice(),\n // Instruct postMessage that these buffers in the sent message\n // should use their Transferable trait. After the postMessage\n // call the \"buffers\" will still be in complete if you looked,\n // but they will all be length 0 as the data they reference has\n // been sent to the window. This lets us send a lot of data\n // without the normal postMessage behaviour of making a copy of\n // all of the data for the window.\n complete.map(response => response.buffer).filter(Boolean)\n );\n complete.length = 0;\n }\n });\n};\n\n/**\n * Receive a job from the parent and fetch the requested data.\n * @param {object} options.job A job id, url, and options descriptor to perform.\n */\nconst onMessage = ({data: job}) => {\n saferFetchAsArrayBuffer(job.url, job.options)\n .then(buffer => complete.push({id: job.id, buffer}))\n .catch(error => complete.push({id: job.id, error: (error && error.message) || `Failed request: ${job.url}`}))\n .then(checkCompleted);\n};\n\nif (self.fetch) {\n postMessage({support: {fetch: true}});\n self.addEventListener('message', onMessage);\n} else {\n postMessage({support: {fetch: false}});\n self.addEventListener('message', ({data: job}) => {\n postMessage([{id: job.id, error: 'fetch is unavailable'}]);\n });\n}\n","/* eslint-env browser */\n/* eslint-disable no-use-before-define */\n\n// This throttles and retries fetch() to mitigate the effect of random network errors and\n// random browser errors (especially in Chrome)\n\nlet currentFetches = 0;\nconst queue = [];\n\nconst startNextFetch = ([resolve, url, options]) => {\n let firstError;\n let failedAttempts = 0;\n\n const attemptToFetch = () => fetch(url, options)\n .then(result => {\n // In a macOS WKWebView, requests from file: URLs to other file: URLs always have status: 0 and ok: false\n // even though the requests were successful. If the requested file doesn't exist, fetch() rejects instead.\n // We aren't aware of any other cases where fetch() can resolve with status 0, so this should be safe.\n if (result.ok || result.status === 0) return result.arrayBuffer();\n if (result.status === 404) return null;\n return Promise.reject(result.status);\n })\n .then(buffer => {\n currentFetches--;\n checkStartNextFetch();\n return buffer;\n })\n .catch(error => {\n if (error === 403) {\n // Retrying this request will not help, so return an error now.\n throw error;\n }\n\n console.warn(`Attempt to fetch ${url} failed`, error);\n if (!firstError) {\n firstError = error;\n }\n\n if (failedAttempts < 2) {\n failedAttempts++;\n return new Promise(cb => setTimeout(cb, (failedAttempts + Math.random() - 1) * 5000))\n .then(attemptToFetch);\n }\n\n currentFetches--;\n checkStartNextFetch();\n throw firstError;\n });\n\n return resolve(attemptToFetch());\n};\n\nconst checkStartNextFetch = () => {\n if (currentFetches < 100 && queue.length > 0) {\n currentFetches++;\n startNextFetch(queue.shift());\n }\n};\n\nconst saferFetchAsArrayBuffer = (url, options) => new Promise(resolve => {\n queue.push([resolve, url, options]);\n checkStartNextFetch();\n});\n\nmodule.exports = saferFetchAsArrayBuffer;\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClFA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;;;;A","sourceRoot":""}
editor.html ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="google" value="notranslate">
7
+ <meta name="description" content="s4sエディターは、クレイジーなプロジェクトを可能にするために大量のクールなものを追加するために作成されたTurboWarpとPenguinmodのモッドです。" />
8
+ <title>PenguinMod - Editor</title>
9
+ <link rel="apple-touch-icon" href="images/apple-touch-icon.png">
10
+ <link rel="icon" type="image/x-icon" href="images/192.png">
11
+
12
+ <link rel="manifest" href="manifest.webmanifest">
13
+
14
+ <style>
15
+ #splash {
16
+ position: absolute; width: 100%; height: 100%; top: 0; left: 0;
17
+ display: flex; align-items: center; justify-content: center;
18
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; color: #0022ff;
19
+ }
20
+ .tw-loaded #splash, #splash-content { display: none; }
21
+ #splash[splash-theme="dark"] { background-color: #333; color: #fff; }
22
+ #splash-spinner:after {
23
+ content: " "; display: block; width: 64px; height: 64px;
24
+ border-radius: 50%; border: 6px solid; border-color: currentColor transparent currentColor transparent;
25
+ animation: splash-spinner 1.2s linear infinite;
26
+ }
27
+ @keyframes splash-spinner {
28
+ 0% { transform: rotate(0deg); }
29
+ 100% { transform: rotate(360deg); }
30
+ }
31
+ </style>
32
+ </head>
33
+ <body>
34
+ <div id="splash" aria-hidden="true">
35
+ <noscript>
36
+ <h1>Enable JavaScript</h1>
37
+ </noscript>
38
+ <div id="splash-content">
39
+ <div id="splash-spinner"></div>
40
+ </div>
41
+ </div>
42
+ <script>
43
+ (function() {
44
+ document.querySelector('#splash-content').style.display = 'block';
45
+
46
+ try {var localTheme = localStorage.getItem('tw:theme');} catch (e) {}
47
+ if (localTheme ? localTheme === 'dark' : window.matchMedia('(prefers-color-scheme: dark)').matches) document.querySelector('#splash').setAttribute('splash-theme', 'dark');
48
+
49
+ })();
50
+ </script>
51
+ <div id="app"></div>
52
+ <script src="js/vendors~addon-settings~credits~editor~embed~fullscreen~player~playground.js"></script><script src="js/vendors~addon-settings~credits~editor~embed~fullscreen~playground.js"></script><script src="js/vendors~editor~embed~fullscreen~player~playground.js"></script><script src="js/addon-settings~addons~editor~fullscreen~player~playground.js"></script><script src="js/editor.js"></script></body>
53
+ </html>
file-list-webpack.json ADDED
@@ -0,0 +1,624 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "41f50eb9f984c12c2544.worker.js",
3
+ "41f50eb9f984c12c2544.worker.js.map",
4
+ "js/extension-worker/extension-worker.14a028226cb72e45678c.js",
5
+ "js/extension-worker/extension-worker.14a028226cb72e45678c.js.map",
6
+ "js/extension worker.js",
7
+ "js/extension worker.js.map",
8
+ "sw.js",
9
+ "static/assets/5566fa235cca306584cdda4d4bbd6640.svg",
10
+ "static/assets/a6cebfe99bad7b01f59b85998cbc4628.svg",
11
+ "static/assets/31446edc97ac1eb0c3d2af65c0d8432a.svg",
12
+ "static/assets/02d927ce93445be737c7ff43fb98b135.svg",
13
+ "static/assets/21739a7b303ece303b023791813412cb.svg",
14
+ "static/assets/d84cdb7f4b9567882511ab47f63e342b.svg",
15
+ "static/assets/12e69a59db0f0c697eaaf1abbcad902f.svg",
16
+ "static/assets/80ad76114d0b3f2fc54a3756dd283a53.svg",
17
+ "static/assets/09469790f10bcd5ed51fe8f85f8bdc1e.svg",
18
+ "static/assets/81d5d1258558641e78d425193753207c.svg",
19
+ "static/assets/989d99155bdb2720680a8c09fb7c454e.svg",
20
+ "static/assets/770c1f3eca5a0d7c327c275865dad3f0.svg",
21
+ "static/assets/1b769802c531b5a04faf429c1ec27632.svg",
22
+ "static/assets/7d6f0362fc2114f39b4f6651ebeda312.svg",
23
+ "static/assets/482dc5011057fe26e9542e9476601bf2.png",
24
+ "static/assets/8fb27bc07c64def488d712e06906c7a4.svg",
25
+ "static/assets/46857e786bc7e3b6b81fb2e99c7b74e9.svg",
26
+ "static/assets/751f2b7681471a8020a47cb3d456a8d2.svg",
27
+ "static/assets/a0d194f44b13fbeaf843e784cc8b03fb.svg",
28
+ "static/assets/b370449e927fbc501686cf597511f7fc.svg",
29
+ "static/assets/c9f4f655230d224c33ead125216199db.svg",
30
+ "static/assets/db445f7d7b15b698deb8a08c31697f87.svg",
31
+ "static/assets/e53ff4a140871927b2d5be4f5cdb2c79.svg",
32
+ "static/assets/680b3ff6a51d8fc77fbaf8695c8de929.svg",
33
+ "static/assets/4e14eca3d0328a2d2fe39428c6127b2a.svg",
34
+ "static/assets/a746db3baa99760ac6d9093990a95bba.svg",
35
+ "static/assets/e45e0626c5e444a55bb3b6380041a879.svg",
36
+ "static/assets/2d4c184e3846a60d2ba3b21fbd792f77.svg",
37
+ "static/assets/40948f8d98c39a96fbba5cf02ec6c8c9.svg",
38
+ "static/assets/5b82df2c2b7bc7783cdcfd1c58f9aa92.svg",
39
+ "static/assets/31c459a6fc47e3d9ff83a2a95e25ae76.svg",
40
+ "static/assets/45c47a95ac3bd35713d6a96dd906ebc2.svg",
41
+ "static/assets/04e10c82d2a75d397ca963c1a9f9e1e7.svg",
42
+ "static/assets/369019214d73953a85fb0eec22bcce7c.svg",
43
+ "static/assets/51a878842a231ebe2fa7cc331e65e89d.svg",
44
+ "static/assets/2b48b1ca1e69f653cfdc7c80eb657f56.svg",
45
+ "static/assets/325cb39cb89c3ff39ca5585585d838f5.svg",
46
+ "static/assets/c64657eab9e2899098a8e0d04f560d1f.svg",
47
+ "static/assets/5e7725764b0a01350ea36166d722c370.svg",
48
+ "static/assets/29c0aa6c826f3dc4710823f345eae288.svg",
49
+ "static/assets/00091c06e9ea001f51bb7303be96b739.svg",
50
+ "static/assets/fcbe21fb0b0dfda0887771aa849f0200.svg",
51
+ "static/assets/2e52d021419ed131bf294fbfb166dad0.svg",
52
+ "static/assets/d37e41b89c301f1ee2c0e911b5c1d4d2.svg",
53
+ "static/assets/2a044a86dce4eb8bc149bb0db93dd352.svg",
54
+ "static/assets/fdd055b7cf23dbaccb433b35f76cdb49.svg",
55
+ "static/assets/38864948713b3bea4c8f3a77c85003bd.svg",
56
+ "static/assets/c90f59f422ddd73d2d58569f872b36d0.svg",
57
+ "static/assets/6af0d9a73807fa35410cc50cb6f5e3c7.svg",
58
+ "static/assets/992fc2de9ef0319e29b6d3c8ff5d8ca0.svg",
59
+ "static/assets/c8455deb7c37c2d4c88e94147d12afb2.svg",
60
+ "static/assets/30314175f450b6007dca6a532e5f7919.svg",
61
+ "static/assets/adaeb8876e88eba49f66fe82f5aed731.svg",
62
+ "static/assets/768bcbb6656593c4d4a48e4c7f98f1d6.svg",
63
+ "static/assets/08cb40364031026f31772bcfa94d6993.svg",
64
+ "static/assets/ac92bfcb2fc35687d1ba5ab6bb733671.svg",
65
+ "static/assets/59c79fa681b1421547664294a259b2d8.svg",
66
+ "static/assets/b526c1fdbbcf5e07a2ed065d5bcb7a15.svg",
67
+ "static/assets/3cfc9b39a0d002246119d47f6756d77e.svg",
68
+ "static/assets/1fa6345d57ffc67eccd9f44cf6a383dd.svg",
69
+ "static/assets/dba629c24296756d68a135988fe96011.svg",
70
+ "static/assets/99de7c4b260353d52ca40624a6dfe112.svg",
71
+ "static/assets/3a2d63269c47aa8244b0d613cf50eb6c.svg",
72
+ "static/assets/e6f716edc49c30d8e46444093f2c113a.svg",
73
+ "static/assets/66617b2996691804289777645e751c0e.svg",
74
+ "static/assets/5679cd29c517886712116060d3360592.svg",
75
+ "static/assets/382a52221b13870cd56d51ac719a5d8b.svg",
76
+ "static/assets/b592c8b4b02de3c7d367ce10efa9d7a6.svg",
77
+ "static/assets/ac62d5285bf0943dcad9391fa0986fb4.svg",
78
+ "static/assets/a02821bc5d19d616d43d55ac10779101.png",
79
+ "static/assets/f04f7b0f673ced51710157ce16e49276.png",
80
+ "static/assets/94b3a496d095dd3b3cfbaabb84a190fd.png",
81
+ "static/assets/942d5ca1a892e7dc5156d0ae7b438c1b.png",
82
+ "static/assets/d6214ab9abf22f5d5dee060cb72f637f.png",
83
+ "static/assets/4c5757837d14e9fca439064c62617ba1.png",
84
+ "static/assets/44c364962f4cb85aef2cdec4f0e01fd4.png",
85
+ "static/assets/0966e5defb1ae50e569fbbc7ebe7f22a.png",
86
+ "static/assets/11c35683a60415bf62ee1a7324a25848.png",
87
+ "static/assets/1c8f54c61adf1cee25299833093395f3.png",
88
+ "static/assets/1d1e22600289d252ebda0b9924bf7d3a.png",
89
+ "static/assets/58d62765bbaa69620eb5bcd2c1cbbebb.png",
90
+ "static/assets/f974293a11768662b53444715e3439ed.png",
91
+ "static/assets/8bad9bd9d9a0d53b4a0f4e69bf02764a.png",
92
+ "static/assets/76e8f03f3f2ac00ab16dd4f2afee63c4.png",
93
+ "static/assets/5fe2f38d9b66e0a55b49e717fcd5c001.png",
94
+ "static/assets/06e9863f95061349f2ba2e0fb0b58ddc.png",
95
+ "static/assets/827c57667d965940792a82d82345e075.png",
96
+ "static/assets/bd16b79cacee7f23835efba88ed4aa67.png",
97
+ "static/assets/c60f3f06c5fb4d49df7236aeb2f31a9d.png",
98
+ "static/assets/02996322134b61a0344527cddc61f9bd.png",
99
+ "static/assets/5e80f6caeb6323606a203fbb248fe18a.png",
100
+ "static/assets/97aa37df83e2c5c2effa09d6622cd3a7.png",
101
+ "static/assets/638bc6bde253241454993ae12273970b.png",
102
+ "static/assets/4ec6148233578e86736548eb8b9952e7.png",
103
+ "static/assets/edd84717633475a8d3db34087123314a.png",
104
+ "static/assets/8f3259bb74d811177e8e65dcbea39ed4.png",
105
+ "static/assets/06785171617ea882557cf5afed61f364.svg",
106
+ "static/assets/8fdeee6df0b53509b7f9d623cab482b3.svg",
107
+ "static/assets/1e348b2e8899c618822c76299803903e.svg",
108
+ "static/assets/90eaf6469dbf3a808a3d9739cc77358d.mp3",
109
+ "static/assets/4240a79d13ecf2792f825457194c96d9.mp3",
110
+ "static/assets/9ad12a9de73f49fb645902987027eb2b.mp3",
111
+ "static/assets/2b7b80de8884cc3cf584aa0deb86a59b.mp3",
112
+ "static/assets/5c6533a34175f61a9cab627f671111e1.mp3",
113
+ "static/assets/5888c4ba6b8a0767f8be5bbc81994397.mp3",
114
+ "static/assets/fad59dd220562492e6722aa8a97f9369.mp3",
115
+ "static/assets/51a75dd50afd0bc6022dfc86455be19c.mp3",
116
+ "static/assets/9f8e3a1db63c7a8fd976beca7e3546c3.mp3",
117
+ "static/assets/b6a8e4a96ffcd83154ad2c5cbcb52751.mp3",
118
+ "static/assets/1c9630b745711a0b829841e8555d76e4.mp3",
119
+ "static/assets/f8d8b9d9f1aa45900b786980418219b1.mp3",
120
+ "static/assets/83f2d48d0c7d1e6be8a509d4d2c6d0e5.mp3",
121
+ "static/assets/b700cf6f9c368ce49851d287ddd3b63c.mp3",
122
+ "static/assets/3fbd690bdae84637e34b8b933a164e3d.mp3",
123
+ "static/assets/a7c08a472cc8b1c4e0c45ae9b030b414.mp3",
124
+ "static/assets/f28b1ecd6fccd6218a837c14b1109da7.mp3",
125
+ "static/assets/f9868658d8483a6dbcd600e0226dfeef.mp3",
126
+ "static/assets/10af80546707afae5507edb828dd35a0.mp3",
127
+ "static/assets/7a7fdb40997804d4778e2a12bd7599f7.mp3",
128
+ "static/assets/a61fc8393abec3c0d1e813fc01f252ee.mp3",
129
+ "static/assets/a0b130dbafdc7958b73d162239053173.mp3",
130
+ "static/assets/d72b98474fc83d6268886779339e242e.mp3",
131
+ "static/assets/d4b3ce804680eb7d58f6accc7436e807.mp3",
132
+ "static/assets/129b99ac19024c35228d855f42fb852b.mp3",
133
+ "static/assets/8c0c02f16572b730d422f96a3ce53e7f.mp3",
134
+ "static/assets/00d2dff9d5ece15a67074374b2027590.mp3",
135
+ "static/assets/09995475180591a6c64c8744fbfdf4d8.mp3",
136
+ "static/assets/961bfad11616b6f5c951c58499cf267a.mp3",
137
+ "static/assets/2b0cfb89b2c8d1badb03136fcf911c3b.mp3",
138
+ "static/assets/c44ce3bfa465281e765f197d6c3ee7ea.mp3",
139
+ "static/assets/e6180253665b8248f685c6d96881f75b.mp3",
140
+ "static/assets/b52b83f63e8482255d46f40ea454fa01.mp3",
141
+ "static/assets/1e7ed7b14b056ebd80f434143846fb4e.mp3",
142
+ "static/assets/c36dd943607003a3229aca77b49d32de.mp3",
143
+ "static/assets/f382f43d667b784d1bcd8cfe7aa6fff0.mp3",
144
+ "static/assets/5e0704b815761d38242f1b961ce9ef69.mp3",
145
+ "static/assets/1a87a73db1ba0193283680e37b35754e.mp3",
146
+ "static/assets/fc383956e315b7ee2bd8dd09de311701.mp3",
147
+ "static/assets/0b18f02669375ad2ee80bef8d07ea7ec.mp3",
148
+ "static/assets/1980303ffc6f5c17c601a9e5992aea77.mp3",
149
+ "static/assets/57f0f65052d9dac78ee66b11cc696b6a.mp3",
150
+ "static/assets/da1a6ebcd442e9d867b31fb21ce6a289.mp3",
151
+ "static/assets/bacc13779ca01580b89f39dd2118c22a.mp3",
152
+ "static/assets/0dcd27b60c185811b19f59d56eaa12f6.mp3",
153
+ "static/assets/1a064f9a752824e781ccf79ab66850ed.mp3",
154
+ "static/assets/a05bbf6359407ad7950e115edab178d9.mp3",
155
+ "static/assets/da3126c6a70c4ef84192c33f99996354.mp3",
156
+ "static/assets/103fe904046c35630c600cb122492d78.mp3",
157
+ "static/assets/8ca9997e9ed7534a8d0f349a6125bd24.mp3",
158
+ "static/assets/83857346b7c2e6a351c69377e82a3606.mp3",
159
+ "static/assets/ecb1cbda3b9c4f29ab971734d97e3faf.mp3",
160
+ "static/assets/0043f23189fb3cbf2021a88959961ece.mp3",
161
+ "static/assets/78a74345ee778afbd6abe637b4f69efc.mp3",
162
+ "static/assets/d434438e5d193118e4aad3a846e1c7ba.mp3",
163
+ "static/assets/39563f3b38b1fdb805323b1f69dace54.mp3",
164
+ "static/assets/0e8ed599d9875c77d52db36de2b2b33f.mp3",
165
+ "static/assets/7337f194b0a727f4be98902487dfb615.mp3",
166
+ "static/assets/ed2a96fbdb476efe419246982e357121.mp3",
167
+ "static/assets/7c5a16e0627c64fd62ec597bb72b879d.mp3",
168
+ "static/assets/e27f7cdf42df8b768345ae83fecffe4b.mp3",
169
+ "static/assets/318e019bdee5ed02903aa5f22a9903f2.svg",
170
+ "static/assets/e1249124e702a974df36355af6aa2385.svg",
171
+ "static/assets/9d7acb2e5784a9a1d52e564af3d8469b.svg",
172
+ "static/assets/bd6d382729ecbd23c5181cf2b327072f.svg",
173
+ "static/assets/e008ee0cb1202de1137823150da1644a.svg",
174
+ "static/assets/c088896fb05dc466b45ecaa1d5c4d007.svg",
175
+ "static/assets/ab2c140af0ffba6b515eebc2156742e2.svg",
176
+ "static/assets/7601fa61034e5d7d542538e1e4338a4e.svg",
177
+ "static/assets/7b98085c05bdcd97dd0c6d4b34317793.svg",
178
+ "static/assets/4bfaa15915bc5fb88b40b3e1a537c3ea.svg",
179
+ "static/assets/60fb267c5ab0c6f4ed9ab4a891ca7dd5.svg",
180
+ "static/assets/8a30520407ffdf5b0e7e06e490db9c1d.svg",
181
+ "static/assets/76b6cb627b95d79705c0b41664064f0e.svg",
182
+ "static/assets/c846a442121113b1d04f6b9d50912038.svg",
183
+ "static/assets/0e009d6e684951615b31a267baa37636.svg",
184
+ "static/assets/88a77444f0bb453209bf1c62becbd37c.svg",
185
+ "static/assets/b2c44c738c9cbc1a99cd6edfd0c2b85b.svg",
186
+ "static/assets/e21225ab4b675bc61eed30cfb510c288.svg",
187
+ "static/assets/3547fa1f2678a483a19f46852f36b426.svg",
188
+ "static/assets/969aaca3d7c0ff67b664b24c2652fb12.svg",
189
+ "static/assets/70f8bee49a78f131d8dc87658809a684.svg",
190
+ "static/assets/e997e36ade408c75ef4424b928e10846.svg",
191
+ "static/assets/7c9434c4f1f44e3d198db3bc77305fff.svg",
192
+ "static/assets/6f52bcc0310181641bac6fec51c69e13.svg",
193
+ "static/assets/b987c9e2c37b17bd7c97f1fa47257d7e.svg",
194
+ "static/assets/6fb602003b4d9e845e84f77129346396.svg",
195
+ "static/assets/1640b6d968e0a0e13bc3c309a616deaa.svg",
196
+ "static/assets/385aa4b73a425883b4f9e91501a52299.svg",
197
+ "static/assets/e587d9d7e9a2f1f28041ba5c15db7a40.svg",
198
+ "static/assets/94b06fb716871f81bec601724e29a457.svg",
199
+ "static/assets/551aae506dfa65ce3b45713b5300a678.svg",
200
+ "static/assets/91f179b258bd0c1953f8fe6129d9615f.svg",
201
+ "static/assets/301439e2e5ab88b658368ee525e6752b.svg",
202
+ "static/assets/44e4859e354c81d66c73f741df2e5ec7.svg",
203
+ "static/assets/9cfdd378e4cc977fe663ca932e530ec6.svg",
204
+ "static/assets/35c6867250ec4f430624bc9e2e7072d7.svg",
205
+ "static/assets/3c3142e814ff1652338af92a410d3d70.svg",
206
+ "static/assets/63e5827c1506216bd7c9927a4e5eb558.svg",
207
+ "static/assets/18dada8a9aabcfc157e051d2e33aa7fd.png",
208
+ "static/assets/33b2c770e12dd94797701e92ae37a820.svg",
209
+ "static/assets/89a5687599f173f2b910aa5fcd862b42.svg",
210
+ "static/assets/a3e689235188ba10c5cfd75730cb88a7.svg",
211
+ "static/assets/04e28ba12fe914cf4f131dcb85ae82d6.svg",
212
+ "static/assets/a80790c977586cc0595b5fe2f0bcb39a.svg",
213
+ "static/assets/33592a76d0d0fdaa4a32b2ea41db5e16.svg",
214
+ "static/assets/76121b7f4eff7d7ca0d49a45479d3f3f.svg",
215
+ "static/assets/ee54d776d2cda9a3c537ac7e8f144037.svg",
216
+ "static/assets/cb666b99d3528f91b52f985dfb102afa.svg",
217
+ "static/assets/97926439955086f8ee4aabbd81580f17.png",
218
+ "static/assets/3e83d9d800459175308f0b45b117af16.png",
219
+ "static/assets/42157e6edddc19588c3c2ff188703799.svg",
220
+ "static/assets/0fd9fd69a38ab79358df5a77b29702c8.svg",
221
+ "static/assets/8b8f2d052b4092ec47ad66c30c8b1642.svg",
222
+ "static/assets/4b6100c9f591be6470cdfd4697de0b54.svg",
223
+ "static/assets/71655cde34ae75f48cb8820abf4b31e7.svg",
224
+ "static/assets/05e05756b592740a3670417b4df19ca9.svg",
225
+ "static/assets/572a212c2e777e3a9061c97453497009.png",
226
+ "static/assets/dd98971c2c185caf86144b6b5234d0fa.svg",
227
+ "static/assets/88a3bec89367b65d176c22eef8c6ddcd.svg",
228
+ "static/assets/10811a978de201353d564df7ba1ddb58.svg",
229
+ "static/assets/7bf301e0e47ee990a3572e0aea2f850e.svg",
230
+ "static/assets/8beb9da10f72d02b48baf0b24ac72449.svg",
231
+ "static/assets/58d1104d0922e424a0b0d4a27e6ed826.svg",
232
+ "static/assets/999649b8d77ea4f04e0dca31326090c1.svg",
233
+ "static/assets/acf8e02623682856899b55f10f66e212.svg",
234
+ "static/assets/2a70b21aaaed0619bdfcdec91db1ebe8.svg",
235
+ "static/assets/a5787bb7364d8131ed49a8f53037d7f4.svg",
236
+ "static/assets/ac6d4216d424b165ba317fe4e997d6da.svg",
237
+ "static/assets/fa945ee6723e936790970b40e6d3fe1f.svg",
238
+ "static/assets/7569623cd83d4ceab6b37c1541d656af.svg",
239
+ "static/assets/5d308ce375ea6edae5abf4e33eda07f3.svg",
240
+ "static/assets/79d588614c7827f6ac6620014b0eb078.svg",
241
+ "static/assets/d79bf4bbb8df5542ffef65d9e61b37ed.svg",
242
+ "static/assets/78d48375d26960c3ac4fe82387055621.svg",
243
+ "static/assets/d8cbb86bdb5ce2ba9f2ed0975f51231e.svg",
244
+ "static/assets/0c19152025f432ddd7d67c039d328f26.svg",
245
+ "static/assets/622321b437cc79dd9ed885540a94505a.svg",
246
+ "static/assets/0896da795cd8d2199e8cfb968229d04a.svg",
247
+ "static/assets/06b8b81e4596f360738c678f6a840dc2.svg",
248
+ "static/assets/5f4208a6b7257c456c018d57efc8a7e9.svg",
249
+ "static/assets/6c037268777f4b85658c4fdc1f55b4f9.svg",
250
+ "static/assets/d0285f1906636f21d1149a4797b978dc.svg",
251
+ "static/assets/2d24a289beac8fe221ce132aac88a320.svg",
252
+ "static/assets/1319094a51748798730f01d1dc0972ac.svg",
253
+ "static/assets/dfe35552790fb5ff38c78a43f5e62f30.svg",
254
+ "static/assets/41835a2c99bdd753b68472735b2bd611.svg",
255
+ "static/assets/663892634c556da228c1d09301a54e63.svg",
256
+ "static/assets/27802141bca7404b477168369bf3475d.svg",
257
+ "static/assets/e28b110fa5eef35531fa271a3a7b6314.svg",
258
+ "static/assets/1bb0adb555e07593962e9fc28ec7566d.svg",
259
+ "static/assets/ce5820b006d753e4133f46ae776f4d96.svg",
260
+ "static/assets/f9dce53613d5f85b311ce9f84423c08b.svg",
261
+ "static/assets/bbbd98ae6a34eac772e34a57aaa5f977.svg",
262
+ "static/assets/664d94e5cb8676c780c74c695f2e972c.svg",
263
+ "static/assets/500c8018b36d12bcde6ef92e20e5ed5d.png",
264
+ "static/assets/5dbf111a76a93a93613ec81c16dfc6d3.svg",
265
+ "static/assets/f8ff5dbef05bc3337cd3660fb956cffa.svg",
266
+ "static/assets/2f9cda00a530ac237fc24063067377c3.svg",
267
+ "static/assets/8bcd9c00e30a0af9d832735651fd9643.svg",
268
+ "static/assets/8f531cd80e1aa712fdff13a69c9c62e2.svg",
269
+ "static/assets/74546102be38f592d24b4330a16a8639.svg",
270
+ "static/assets/90e939d170002c61a50116ed55763b19.svg",
271
+ "static/assets/4da38973d5ffd15c54e80894d430288c.svg",
272
+ "static/assets/df6a71244d4727d19c5a78d71677d2a6.svg",
273
+ "static/assets/a4d91e3b83e7cbccaf4a4e2322b873f5.svg",
274
+ "static/assets/27f90bfa982840e56c3ad207561193fa.svg",
275
+ "static/assets/21988681fa28c8ce37982ca26463a6f5.svg",
276
+ "static/assets/d889a872f3b0985b28fa872764172ef1.svg",
277
+ "static/assets/26255153f92ea41df149a58d3c3fe2cf.svg",
278
+ "static/assets/993a0700d8a0972d309307b0a4688ed7.svg",
279
+ "static/assets/00505ca954aec95aac898ee7d5a7ee6c.svg",
280
+ "static/assets/83b16872b1684580c2e0a1ee1e57506e.svg",
281
+ "static/assets/ed523e83c862293741568a89219e5dcf.svg",
282
+ "static/assets/fb3f9fa9be421f5153cd0223c3b0cb87.svg",
283
+ "static/assets/42428924171999cebe3efd5e70b7bc53.svg",
284
+ "static/assets/f22d5ea0ef6a46b2a4a174fed722c396.svg",
285
+ "static/assets/8279ce395d0333b880b8be6d243fd111.svg",
286
+ "static/assets/7f41449e898401168112236180fcf9d6.svg",
287
+ "static/assets/3dd8f573267d99448c62fd87bf0e3591.svg",
288
+ "static/assets/27557abca597bafded7f45adede9a6bf.svg",
289
+ "static/assets/238a12e6d066c100697e7b28c87913d0.svg",
290
+ "static/assets/b4c3606f4126d3226d96d31e36fff84d.svg",
291
+ "static/assets/b5257afbe4bcf7953029ddb8f18b24fe.svg",
292
+ "static/assets/d93fb1224d372792aadc4706e9b45858.svg",
293
+ "static/assets/fe5afd6776eac0f7724b132a9ff5057d.svg",
294
+ "static/assets/199f58b4a80fa56c5d8e032d6da5e9c2.svg",
295
+ "static/assets/424371873bc8df88d6a305d8727157ab.svg",
296
+ "static/assets/481fbac64b59203d7ddffa564a7537d8.svg",
297
+ "static/assets/42d9642b78a0d9f0a1f4065fc74e7bc0.svg",
298
+ "static/assets/617dd0f2b2f2be576184b4283a3c917f.svg",
299
+ "static/assets/c6778106d615504de22e9254f1729577.svg",
300
+ "static/assets/38a70367a21e2f1fb15aa59b7d367450.svg",
301
+ "static/assets/9ddae4f6c1aeaf0784007203d9d4ac9c.svg",
302
+ "static/assets/422b48c2206d5240a6717c92496ba21a.svg",
303
+ "static/assets/837d221121f5f6dc06f1ae42a7f5e071.svg",
304
+ "static/assets/05e9c069d478b9e056e35f04e7dedf64.svg",
305
+ "static/assets/4d250151a07cfc8b54b34e1df68d265c.svg",
306
+ "static/assets/dd55f4c6c20f5d25e520b6f5bfb090c5.svg",
307
+ "static/assets/2e0c4790f8f9cf28e3c346b9cef0fcb6.svg",
308
+ "static/assets/a2ed866eb2db31b7583e7b52ee598246.svg",
309
+ "static/assets/8f160ba31754d0e965eaeb54b60d6240.svg",
310
+ "static/assets/36fcc7dbca20720abcab01e49d4955f9.svg",
311
+ "static/assets/fb356e819d8ab210a241ce81b9bac33c.png",
312
+ "static/assets/f2457825850317e66ef2128504613c30.svg",
313
+ "static/assets/33b737193edfe1730f38112ad35a84b4.svg",
314
+ "static/assets/620f707d6d9dcd512ec6604b0eda2cb3.svg",
315
+ "static/assets/f0fc12e672912247cc20d34ea452b517.svg",
316
+ "static/assets/d71c0379472f709318ef81ff0dccf7d5.svg",
317
+ "static/assets/01011831acb632804df035321ff68afe.svg",
318
+ "static/assets/89c89d8cb19c183635c7e00f2ff5a63c.svg",
319
+ "static/assets/870d942b2502550f58b9eab7561f42ec.svg",
320
+ "static/assets/c4c75827d7f30081f493963fadec60a1.svg",
321
+ "static/assets/171fbf8ebb9d7127d4c59a04568e2af4.svg",
322
+ "static/assets/33152e09f092ce18fe776f1d670ac99f.svg",
323
+ "static/assets/aaa4a3575852fe11d04f44c4a972ae73.svg",
324
+ "static/assets/bc45b073cd2fc0c2265374bdb4e05d67.svg",
325
+ "static/assets/b433ee02a13fa2a12f7f7059f1f6729a.svg",
326
+ "static/assets/d92e74438d72c2223692825df66e026e.svg",
327
+ "static/assets/73773f78bf2bfc449218fbaee1922964.svg",
328
+ "static/assets/3d9e2585d6ed12b9fb994438e0c4c42a.svg",
329
+ "static/assets/bf3ee9d7d91a231cde773f88f6799425.png",
330
+ "static/assets/1aa0695f67909940855aad4cc774f906.svg",
331
+ "static/assets/8e5e28b23ba596614a60d319d9c64165.svg",
332
+ "static/assets/3286e2838658ebdb82f62d062b14e951.svg",
333
+ "static/assets/6608d56b3dce2738b2b137569d305d3b.png",
334
+ "static/assets/fa121178a0dc748c56257f39987f0540.svg",
335
+ "static/assets/60fc7acc624571cfa9d250d7d5cff041.svg",
336
+ "static/assets/7b6399d516d5921bb199f57cdd8bbbbe.svg",
337
+ "static/assets/5a70df361bb00fa62b9338d89c92f377.png",
338
+ "static/assets/02470ceceed9235b943e6b5a9edc8efb.png",
339
+ "static/assets/cc4d68fe9d6a77c7f35f9d5461b60967.png",
340
+ "static/assets/d61429ad96a25ec2917ebc77d900aae0.svg",
341
+ "static/assets/c30d6a0e73cf38ad6ea7f5e4fe0428a3.png",
342
+ "static/assets/84a9455c54ab68ad8dcf8b6f6465ae71.svg",
343
+ "static/assets/6be143c7cb9d23c787f7f20674a76f72.svg",
344
+ "static/assets/4b6ca5259f1271d510f081867e746847.png",
345
+ "static/assets/504d73be1b361b4b9ca7f655ce085dc6.svg",
346
+ "static/assets/7eea42371f5ccb84b4fc7d0ba7331ea3.png",
347
+ "static/assets/48d03d1d2794e30b221465fc07da79f7.png",
348
+ "static/assets/4ec70230d5b7f1ab12560b4619f2dbf9.svg",
349
+ "static/assets/800f6f1573677d59954e8d3164602287.svg",
350
+ "static/assets/7679e8aa3b5a6b745823e00a7b950065.png",
351
+ "static/assets/c79988bb17fdba37fe2d1ee3eacf9f5f.png",
352
+ "static/assets/ae1b9be9ac5a0793b990a0ba5231c662.png",
353
+ "static/assets/98cd4769145ea580a7d6fef9fdb62aab.png",
354
+ "static/assets/10299cfdb7aae4ef46933f78b4366d6f.png",
355
+ "static/assets/a51b949b03d40faa62ef202a787f76ec.png",
356
+ "static/assets/ccf5cd43b7f5661f8141f879e4a015bb.png",
357
+ "static/assets/a77d7ed07c4715b2b580438d46a567b9.svg",
358
+ "static/assets/9ecfc22bb2fae434d72acfa182df6927.png",
359
+ "static/assets/3adc1e3e705ec30e961125d7c136db09.png",
360
+ "static/assets/195b65444703293e0624ff4e09c13c81.png",
361
+ "static/assets/c8215bcfbb4dc9000bb0da3947cdb523.png",
362
+ "static/assets/c304e6cc2ad622167b6ef46e30cc9423.png",
363
+ "static/assets/bb0b18c664cbbb05be54c26055908e95.svg",
364
+ "static/assets/cd2fa6465953012247b14e89f4931cf9.svg",
365
+ "static/assets/89b0a98b82e2fcad7e4563b348a1caf7.png",
366
+ "static/assets/930323f74179aa022fd87939b3b2999c.svg",
367
+ "static/assets/6a8cb419123dfa9fe427b191f7b561ad.png",
368
+ "static/assets/81503641d782aa3a3f88df14b58bc3e6.png",
369
+ "static/assets/9c2e381fb6da323e4ab7948c353a629b.svg",
370
+ "static/assets/36b59d3087103cc7573145332ec64745.svg",
371
+ "static/assets/f33541f52553e00993de696ed1233229.png",
372
+ "static/assets/c51f86f9bcf8f37fc49331cbb5630c94.png",
373
+ "static/assets/6395fd31325176c1d0779dc0ff139c72.svg",
374
+ "static/assets/0a0eb1af384d2f241aab5631440b2a33.svg",
375
+ "static/assets/f87904843f21a05464c4acc3ec4d368d.png",
376
+ "static/assets/7cde88cd98adaaf1e911f68bacdbe719.svg",
377
+ "static/assets/9e32994e371028645656c0bce61be484.png",
378
+ "static/assets/30369b87eed36dd399a127ae7c0ea1a4.png",
379
+ "static/assets/51adf4a45cbacf743c3ee538e432fed2.png",
380
+ "static/assets/dc97849515ceed1012a3b89210a950fa.png",
381
+ "static/assets/3a9f7312dd51198c123804f87fa78bc9.png",
382
+ "static/assets/21a46a49b55befa73d6b8352e2795d6f.svg",
383
+ "static/assets/88ab038784badd192df6bd931d7c2e40.svg",
384
+ "static/assets/03562df738acb5b29670d58970eb432f.svg",
385
+ "static/assets/174cbb7cc72418e5f095e0b734ceed1d.svg",
386
+ "static/assets/3b0c388c2cf1462401585224ffe2f077.svg",
387
+ "static/assets/84ad46536cb4de7a9e82347461b375a1.svg",
388
+ "static/assets/f1207802424428612503584b5258902c.png",
389
+ "static/assets/f6c7e603df1d93a09e434cd34256361b.png",
390
+ "static/assets/fb7214f085f0444816f6d8a8b623b89e.svg",
391
+ "static/assets/64faeccd0a42a3548ec41b7471ff5ef6.svg",
392
+ "static/assets/c296552f9440b25b8225da38a14d9488.png",
393
+ "static/assets/5f09200519a8b4130cf1b09a35c01a10.png",
394
+ "static/assets/f3d2cc01ffb4aaea4b4e3b50e35fdf73.png",
395
+ "static/assets/b14d70e45d588be5106be4ee696dfa3f.png",
396
+ "static/assets/bd055c3853854218f060871e694b16f7.svg",
397
+ "static/assets/1e391038e9bc3c5bcadf50902980089d.png",
398
+ "static/assets/39f37f1b00fbf96926276701d8de4c89.png",
399
+ "static/assets/01fc0da0b4f9dfcf62ee83e1505e14f2.png",
400
+ "static/assets/208f28114c3654417aae9f71542d1670.png",
401
+ "static/assets/6b8350e1c4fcb14dddb1c4bac60690fc.png",
402
+ "static/assets/dd70a6d9adb5f52d0cbd0115887691eb.png",
403
+ "static/assets/1a086f192347214d507e8373d05481bd.svg",
404
+ "static/assets/55fbbef2dfcc37fb22658e968cda0a67.png",
405
+ "static/assets/51e22c71c1668188b5a3ddd9dc391ff6.svg",
406
+ "static/assets/4b52903ed5677ad3e0b820668ddb37c9.svg",
407
+ "static/assets/f2b55dc8ec1ae9e4a5c72088a185dad2.svg",
408
+ "static/assets/e8cd6294973f94c475ed746e4899fa33.svg",
409
+ "static/assets/414ef5f96bd00df3c7b4e175244ddaf3.png",
410
+ "static/assets/e48e8bc4ca2913e19da20f085e9adbe9.svg",
411
+ "static/assets/a8c1fa685a05ebc7d9ced4a1fabce2ec.png",
412
+ "static/assets/ff2dc3c9ffca9e8097e82e3ff64b5955.png",
413
+ "static/assets/ac1b57b4a9b09160349eb2d7882ca15f.svg",
414
+ "static/assets/7b7fd92f837f3b1368bb7cd709b24ebd.svg",
415
+ "static/assets/57f5c040b2ec7c6f269042b4e1c32a03.png",
416
+ "static/assets/ad2841e0f0228e47e911a5b571480f7c.svg",
417
+ "static/assets/bf2e5bd090012d68560b888d44678efc.svg",
418
+ "static/assets/7455bbbfec01551f145bced3f729f105.png",
419
+ "static/assets/73077ae1577fa8af2e8544e19e447491.png",
420
+ "static/assets/49a8736bf7fbb79e2469272f127e06d3.svg",
421
+ "static/assets/7a4510ab192e5a0bd0b1186db1396bce.svg",
422
+ "static/assets/2be1a9bef13cda38a249cfa6de0dc461.svg",
423
+ "static/assets/13fca624022cc8f762e1da20450c8f03.svg",
424
+ "static/assets/cf21e9b36c0dfd5debc399d6fbf5d2c9.svg",
425
+ "static/assets/306abcf3a285c1d279e1fed22bd74a5c.svg",
426
+ "static/assets/93259f95026260bc06f83d29d3b89115.svg",
427
+ "static/assets/78d464ee4e15000ce44b841ff2f4c518.png",
428
+ "static/assets/3fc5bb5bf0381947df17be6225e1cb26.png",
429
+ "static/assets/c7ffd288176b935f835311512a224d4b.svg",
430
+ "static/assets/d6f130fb79e78e4dd351fd930e742bcc.png",
431
+ "static/assets/f40501ed87782097b1a4eec8747eb84a.png",
432
+ "static/assets/b6162ffbfe48d4b6c67f0b469f1615ae.png",
433
+ "static/assets/8631e81b32644527d0d056b213faddc8.svg",
434
+ "static/assets/5e8eccd5a576638f029a1ed2deb4784b.svg",
435
+ "static/assets/a03436c2c26c934fc0a7997065971874.png",
436
+ "static/assets/7130491bf33852e50503dcb4024c0279.svg",
437
+ "static/assets/5f7a79af3db62e0f5b7306ac0bd5ebf9.svg",
438
+ "static/assets/0f9efe3bd6e80747dfa3aeb9e19997b5.svg",
439
+ "static/assets/f011f09e649e804c4c0c8275a7d1ba5b.png",
440
+ "static/assets/48d66af328a669a1c84c5dc87a4e9a3b.ttf",
441
+ "static/assets/4c768843c9fa6593074231cd762b83f8.ttf",
442
+ "static/assets/5f46c8dc3b8cc2296eb73f013dfce3db.ttf",
443
+ "static/assets/87a3a62c0627e925b92d3ede2f62b04f.ttf",
444
+ "static/assets/eb64e706eb7a3b324ba50d3279a980b1.ttf",
445
+ "static/assets/3682b35e452a7f4a5a61167d1632e24a.ttf",
446
+ "static/assets/8d83d454d2c42614a203322393c23a5b.ttf",
447
+ "static/assets/9ec3449723269a806ec6eaba0f8f6cef.ttf",
448
+ "static/assets/74496d9086d97aaeeafb3085e9957668.ttf",
449
+ "static/assets/61edf73198617b2326d37f232b8abd6f.otf",
450
+ "static/assets/8996930d8e83f63cc3341172205df460.otf",
451
+ "static/assets/bb59f04e7f0aabe8e142ac1607a03dd6.otf",
452
+ "static/assets/368c582b289e75a3c5299e954c2ad735.ttf",
453
+ "static/assets/64bcfe1f13fce38e2ea26280157ff2ce.ttf",
454
+ "js/0.js",
455
+ "js/1.js",
456
+ "js/2.js",
457
+ "js/addon-default-entry.js",
458
+ "js/addon-entry-2d-color-picker.js",
459
+ "js/addon-entry-better-img-uploads.js",
460
+ "js/addon-entry-block-count.js",
461
+ "js/addon-entry-block-palette-icons.js",
462
+ "js/addon-entry-blocks2image.js",
463
+ "js/addon-entry-cat-blocks.js",
464
+ "js/addon-entry-clones.js",
465
+ "js/addon-entry-columns.js",
466
+ "js/addon-entry-custom-block-shape.js",
467
+ "js/addon-entry-custom-block-text.js",
468
+ "js/addon-entry-custom-zoom.js",
469
+ "js/addon-entry-debugger.js",
470
+ "js/addon-entry-default-costume-editor-color.js",
471
+ "js/addon-entry-disable-paste-offset.js",
472
+ "js/addon-entry-disable-stage-drag-select.js",
473
+ "js/addon-entry-editor-buttons-reverse-order.js",
474
+ "js/addon-entry-editor-colored-context-menus.js",
475
+ "js/addon-entry-editor-extra-keys.js",
476
+ "js/addon-entry-editor-sounds.js",
477
+ "js/addon-entry-editor-stage-left.js",
478
+ "js/addon-entry-editor-theme3.js",
479
+ "js/addon-entry-fullscreen.js",
480
+ "js/addon-entry-gamepad.js",
481
+ "js/addon-entry-hide-delete-button.js",
482
+ "js/addon-entry-hide-flyout.js",
483
+ "js/addon-entry-hide-new-variables.js",
484
+ "js/addon-entry-hide-stage.js",
485
+ "js/addon-entry-initialise-sprite-position.js",
486
+ "js/addon-entry-load-extensions.js",
487
+ "js/addon-entry-mediarecorder.js",
488
+ "js/addon-entry-mouse-pos.js",
489
+ "js/addon-entry-no-script-bumping.js",
490
+ "js/addon-entry-number-pad.js",
491
+ "js/addon-entry-paint-by-default.js",
492
+ "js/addon-entry-paint-snap.js",
493
+ "js/addon-entry-remove-curved-stage-border.js",
494
+ "js/addon-entry-remove-sprite-confirm.js",
495
+ "js/addon-entry-script-snap.js",
496
+ "js/addon-entry-search-sprites.js",
497
+ "js/addon-entry-sprite-properties.js",
498
+ "js/addon-entry-swap-local-global.js",
499
+ "js/addon-entry-transparent-orphans.js",
500
+ "js/addon-entry-tw-disable-cloud-variables.js",
501
+ "js/addon-entry-tw-remove-backpack.js",
502
+ "js/addon-entry-tw-remove-feedback.js",
503
+ "js/addon-entry-tw-straighten-comments.js",
504
+ "js/addon-entry-vol-slider.js",
505
+ "js/addon-entry-zebra-striping.js",
506
+ "js/addon-l10n-de.js",
507
+ "js/addon-l10n-es.js",
508
+ "js/addon-l10n-fr.js",
509
+ "js/addon-l10n-hu.js",
510
+ "js/addon-l10n-it.js",
511
+ "js/addon-l10n-ja.js",
512
+ "js/addon-l10n-ko.js",
513
+ "js/addon-l10n-nl.js",
514
+ "js/addon-l10n-pl.js",
515
+ "js/addon-l10n-pt.js",
516
+ "js/addon-l10n-ro.js",
517
+ "js/addon-l10n-ru.js",
518
+ "js/addon-l10n-sl.js",
519
+ "js/addon-l10n-tr.js",
520
+ "js/addon-settings.js",
521
+ "js/addon-settings~addons~editor~fullscreen~player~playground.js",
522
+ "js/addons.js",
523
+ "js/credits.js",
524
+ "js/editor.js",
525
+ "js/embed.js",
526
+ "js/embed~player.js",
527
+ "js/fullscreen.js",
528
+ "js/iframe-extension-worker.js",
529
+ "js/library-backdrops.js",
530
+ "js/library-costumes.js",
531
+ "js/library-sounds.js",
532
+ "js/library-sprites.js",
533
+ "js/player.js",
534
+ "js/playground.js",
535
+ "js/sb.js",
536
+ "js/vendors~addon-settings~credits~editor~embed~fullscreen~player~playground.js",
537
+ "js/vendors~addon-settings~credits~editor~embed~fullscreen~playground.js",
538
+ "js/vendors~editor~embed~fullscreen~player~playground.js",
539
+ "js/0.js.map",
540
+ "js/1.js.map",
541
+ "js/2.js.map",
542
+ "js/addon-default-entry.js.map",
543
+ "js/addon-entry-2d-color-picker.js.map",
544
+ "js/addon-entry-better-img-uploads.js.map",
545
+ "js/addon-entry-block-count.js.map",
546
+ "js/addon-entry-block-palette-icons.js.map",
547
+ "js/addon-entry-blocks2image.js.map",
548
+ "js/addon-entry-cat-blocks.js.map",
549
+ "js/addon-entry-clones.js.map",
550
+ "js/addon-entry-columns.js.map",
551
+ "js/addon-entry-custom-block-shape.js.map",
552
+ "js/addon-entry-custom-block-text.js.map",
553
+ "js/addon-entry-custom-zoom.js.map",
554
+ "js/addon-entry-debugger.js.map",
555
+ "js/addon-entry-default-costume-editor-color.js.map",
556
+ "js/addon-entry-disable-paste-offset.js.map",
557
+ "js/addon-entry-disable-stage-drag-select.js.map",
558
+ "js/addon-entry-editor-buttons-reverse-order.js.map",
559
+ "js/addon-entry-editor-colored-context-menus.js.map",
560
+ "js/addon-entry-editor-extra-keys.js.map",
561
+ "js/addon-entry-editor-sounds.js.map",
562
+ "js/addon-entry-editor-stage-left.js.map",
563
+ "js/addon-entry-editor-theme3.js.map",
564
+ "js/addon-entry-fullscreen.js.map",
565
+ "js/addon-entry-gamepad.js.map",
566
+ "js/addon-entry-hide-delete-button.js.map",
567
+ "js/addon-entry-hide-flyout.js.map",
568
+ "js/addon-entry-hide-new-variables.js.map",
569
+ "js/addon-entry-hide-stage.js.map",
570
+ "js/addon-entry-initialise-sprite-position.js.map",
571
+ "js/addon-entry-load-extensions.js.map",
572
+ "js/addon-entry-mediarecorder.js.map",
573
+ "js/addon-entry-mouse-pos.js.map",
574
+ "js/addon-entry-no-script-bumping.js.map",
575
+ "js/addon-entry-number-pad.js.map",
576
+ "js/addon-entry-paint-by-default.js.map",
577
+ "js/addon-entry-paint-snap.js.map",
578
+ "js/addon-entry-remove-curved-stage-border.js.map",
579
+ "js/addon-entry-remove-sprite-confirm.js.map",
580
+ "js/addon-entry-script-snap.js.map",
581
+ "js/addon-entry-search-sprites.js.map",
582
+ "js/addon-entry-sprite-properties.js.map",
583
+ "js/addon-entry-swap-local-global.js.map",
584
+ "js/addon-entry-transparent-orphans.js.map",
585
+ "js/addon-entry-tw-disable-cloud-variables.js.map",
586
+ "js/addon-entry-tw-remove-backpack.js.map",
587
+ "js/addon-entry-tw-remove-feedback.js.map",
588
+ "js/addon-entry-tw-straighten-comments.js.map",
589
+ "js/addon-entry-vol-slider.js.map",
590
+ "js/addon-entry-zebra-striping.js.map",
591
+ "js/addon-l10n-de.js.map",
592
+ "js/addon-l10n-es.js.map",
593
+ "js/addon-l10n-fr.js.map",
594
+ "js/addon-l10n-hu.js.map",
595
+ "js/addon-l10n-it.js.map",
596
+ "js/addon-l10n-ja.js.map",
597
+ "js/addon-l10n-ko.js.map",
598
+ "js/addon-l10n-nl.js.map",
599
+ "js/addon-l10n-pl.js.map",
600
+ "js/addon-l10n-pt.js.map",
601
+ "js/addon-l10n-ro.js.map",
602
+ "js/addon-l10n-ru.js.map",
603
+ "js/addon-l10n-sl.js.map",
604
+ "js/addon-l10n-tr.js.map",
605
+ "js/addon-settings.js.map",
606
+ "js/addon-settings~addons~editor~fullscreen~player~playground.js.map",
607
+ "js/addons.js.map",
608
+ "js/credits.js.map",
609
+ "js/editor.js.map",
610
+ "js/embed.js.map",
611
+ "js/embed~player.js.map",
612
+ "js/fullscreen.js.map",
613
+ "js/iframe-extension-worker.js.map",
614
+ "js/library-backdrops.js.map",
615
+ "js/library-costumes.js.map",
616
+ "js/library-sounds.js.map",
617
+ "js/library-sprites.js.map",
618
+ "js/player.js.map",
619
+ "js/playground.js.map",
620
+ "js/sb.js.map",
621
+ "js/vendors~addon-settings~credits~editor~embed~fullscreen~player~playground.js.map",
622
+ "js/vendors~addon-settings~credits~editor~embed~fullscreen~playground.js.map",
623
+ "js/vendors~editor~embed~fullscreen~player~playground.js.map"
624
+ ]
js/0.js ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([[0],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/debug-console/style.css":
4
+ /*!*****************************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/debug-console/style.css ***!
6
+ \*****************************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
11
+ // imports
12
+
13
+
14
+ // module
15
+ exports.push([module.i, ".mediaRecorderPopup {\n box-sizing: border-box;\n width: 700px;\n max-height: min(800px, 80vh);\n max-width: 85%;\n margin-top: 12vh;\n overflow-y: auto;\n margin-left: auto;\n margin-right: auto;\n}\n\n.mediaRecorderPopupContent {\n padding: 1.5rem 2.25rem;\n}\n\n.mediaRecorderPopup p {\n font-size: 1rem;\n margin: 0.5rem auto;\n}\n\n.mediaRecorderPopup p :last-child {\n margin-left: 1rem;\n}\n\n.mediaRecorderPopup[dir=\"rtl\"] p :last-child {\n margin-left: 0;\n margin-right: 1rem;\n}\n\np.mediaRecorderPopupOption {\n display: flex;\n align-items: center;\n}\n\n.mediaRecorderPopupOption input[type=\"checkbox\"] {\n height: 1.5rem;\n}\n\n#recordOptionSecondsInput,\n#recordOptionDelayInput {\n width: 6rem;\n}\n\n.mediaRecorderPopupButtons {\n margin-top: 1.5rem;\n}\n\n.mediaRecorderPopupButtons button {\n margin-left: 0.5rem;\n}\n\n/* TW: Fixes cancel button in dark mode */\n.mediaRecorderPopupButtons button:nth-of-type(1) {\n color: black;\n}", ""]);
16
+
17
+ // exports
18
+
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/debug-console/_runtime_entry.js":
23
+ /*!***********************************************************!*\
24
+ !*** ./src/addons/addons/debug-console/_runtime_entry.js ***!
25
+ \***********************************************************/
26
+ /*! exports provided: resources */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
32
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/debug-console/userscript.js");
33
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./style.css */ "./node_modules/css-loader/index.js!./src/addons/addons/debug-console/style.css");
34
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__);
35
+ /* generated by pull.js */
36
+
37
+
38
+ const resources = {
39
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"],
40
+ "style.css": _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default.a
41
+ };
42
+
43
+ /***/ }),
44
+
45
+ /***/ "./src/addons/addons/debug-console/userscript.js":
46
+ /*!*******************************************************!*\
47
+ !*** ./src/addons/addons/debug-console/userscript.js ***!
48
+ \*******************************************************/
49
+ /*! exports provided: default */
50
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
51
+
52
+ "use strict";
53
+ __webpack_require__.r(__webpack_exports__);
54
+ /* harmony default export */ __webpack_exports__["default"] = (async _ref => {
55
+ let {
56
+ addon,
57
+ console,
58
+ msg
59
+ } = _ref;
60
+ // ページ読み込み直後にerudaを読み込む
61
+ if (!window.eruda) {
62
+ const script = document.createElement('script');
63
+ script.src = 'https://soiz1-eruda3.hf.space/eruda.js';
64
+ script.onload = () => {
65
+ eruda.init();
66
+ };
67
+ document.body.appendChild(script);
68
+ }
69
+ });
70
+
71
+ /***/ })
72
+
73
+ }]);
74
+ //# sourceMappingURL=0.js.map
js/0.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/0.js","sources":["webpack://GUI/./src/addons/addons/debug-console/style.css","webpack://GUI/./src/addons/addons/debug-console/_runtime_entry.js","webpack://GUI/./src/addons/addons/debug-console/userscript.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".mediaRecorderPopup {\\n box-sizing: border-box;\\n width: 700px;\\n max-height: min(800px, 80vh);\\n max-width: 85%;\\n margin-top: 12vh;\\n overflow-y: auto;\\n margin-left: auto;\\n margin-right: auto;\\n}\\n\\n.mediaRecorderPopupContent {\\n padding: 1.5rem 2.25rem;\\n}\\n\\n.mediaRecorderPopup p {\\n font-size: 1rem;\\n margin: 0.5rem auto;\\n}\\n\\n.mediaRecorderPopup p :last-child {\\n margin-left: 1rem;\\n}\\n\\n.mediaRecorderPopup[dir=\\\"rtl\\\"] p :last-child {\\n margin-left: 0;\\n margin-right: 1rem;\\n}\\n\\np.mediaRecorderPopupOption {\\n display: flex;\\n align-items: center;\\n}\\n\\n.mediaRecorderPopupOption input[type=\\\"checkbox\\\"] {\\n height: 1.5rem;\\n}\\n\\n#recordOptionSecondsInput,\\n#recordOptionDelayInput {\\n width: 6rem;\\n}\\n\\n.mediaRecorderPopupButtons {\\n margin-top: 1.5rem;\\n}\\n\\n.mediaRecorderPopupButtons button {\\n margin-left: 0.5rem;\\n}\\n\\n/* TW: Fixes cancel button in dark mode */\\n.mediaRecorderPopupButtons button:nth-of-type(1) {\\n color: black;\\n}\", \"\"]);\n\n// exports\n","/* generated by pull.js */\nimport _js from \"./userscript.js\";\nimport _css from \"!css-loader!./style.css\";\nexport const resources = {\n \"userscript.js\": _js,\n \"style.css\": _css,\n};","export default async ({ addon, console, msg }) => {\n // ページ読み込み直後にerudaを読み込む\n if (!window.eruda) {\n const script = document.createElement('script');\n script.src = 'https://soiz1-eruda3.hf.space/eruda.js';\n script.onload = () => {\n eruda.init();\n };\n document.body.appendChild(script);\n }\n};\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/1.js ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([[1],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/fps/userstyle.css":
4
+ /*!***********************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/fps/userstyle.css ***!
6
+ \***********************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
11
+ // imports
12
+
13
+
14
+ // module
15
+ exports.push([module.i, ".fps-counter {\n font-size: 0.625rem;\n font-weight: bold;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n white-space: nowrap;\n padding: 0.25rem;\n user-select: none;\n color: #0fbd8c;\n display: none;\n align-items: center;\n}\n\n.fps-counter.show {\n display: flex;\n}\n\n.sa-small-stage .fps-counter {\n display: none;\n}", ""]);
16
+
17
+ // exports
18
+
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/fps/_runtime_entry.js":
23
+ /*!*************************************************!*\
24
+ !*** ./src/addons/addons/fps/_runtime_entry.js ***!
25
+ \*************************************************/
26
+ /*! exports provided: resources */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
32
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/fps/userscript.js");
33
+ /* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./userstyle.css */ "./node_modules/css-loader/index.js!./src/addons/addons/fps/userstyle.css");
34
+ /* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1__);
35
+ /* generated by pull.js */
36
+
37
+
38
+ const resources = {
39
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"],
40
+ "userstyle.css": _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1___default.a
41
+ };
42
+
43
+ /***/ }),
44
+
45
+ /***/ "./src/addons/addons/fps/userscript.js":
46
+ /*!*********************************************!*\
47
+ !*** ./src/addons/addons/fps/userscript.js ***!
48
+ \*********************************************/
49
+ /*! exports provided: default */
50
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
51
+
52
+ "use strict";
53
+ __webpack_require__.r(__webpack_exports__);
54
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
55
+ let {
56
+ addon,
57
+ console,
58
+ msg
59
+ } = _ref;
60
+ const {
61
+ vm
62
+ } = addon.tab.traps;
63
+ const {
64
+ runtime
65
+ } = vm;
66
+ if (!vm.editingTarget) {
67
+ await new Promise(resolve => runtime.once("PROJECT_LOADED", resolve));
68
+ }
69
+ let fpsCounterElement = document.createElement("span");
70
+ fpsCounterElement.className = "fps-counter";
71
+ addon.tab.displayNoneWhileDisabled(fpsCounterElement);
72
+ let lastRender;
73
+ let lastFps;
74
+ let wasRunning = false;
75
+ const {
76
+ renderer
77
+ } = runtime;
78
+ const _draw = renderer.draw;
79
+ renderer.draw = function () {
80
+ _draw.call(this);
81
+ const now = runtime.currentMSecs;
82
+ // If it's been more than 500ms since the last draw, we want to reset the variables.
83
+ if (typeof lastRender !== "number" || now - lastRender > 500) {
84
+ lastRender = now;
85
+ lastFps = null;
86
+ return;
87
+ }
88
+ // If the current time has been rendered, return, Don't show infinity.
89
+ if (now === lastRender) return;
90
+ // Every time this function is ran, store the current time and remove times from half a second ago
91
+ let smoothing = 0.9;
92
+ let calculatedFps = 1000 / (now - lastRender);
93
+ if (typeof lastFps !== "number") lastFps = calculatedFps;
94
+ // Calculate a smoothed FPS so that numbers aren't changing too fast.
95
+ const fps = Math.round(lastFps * smoothing + calculatedFps * (1 - smoothing));
96
+ lastRender = now;
97
+
98
+ // Show/Hide the element based on if there are any threads running
99
+ if (runtime.threads.length === 0) {
100
+ if (wasRunning) fpsCounterElement.classList.remove("show");
101
+ wasRunning = false;
102
+ return;
103
+ }
104
+ if (!wasRunning) fpsCounterElement.classList.add("show");
105
+ if (fps !== lastFps || !wasRunning) fpsCounterElement.innerText = "FPS: ".concat(lastFps = fps);
106
+ wasRunning = true;
107
+ };
108
+ while (true) {
109
+ await addon.tab.waitForElement('[class*="controls_controls-container"]', {
110
+ markAsSeen: true,
111
+ reduxEvents: ["scratch-gui/mode/SET_PLAYER", "fontsLoaded/SET_FONTS_LOADED", "scratch-gui/locales/SELECT_LOCALE"]
112
+ });
113
+ addon.tab.appendToSharedSpace({
114
+ space: "afterStopButton",
115
+ element: fpsCounterElement,
116
+ order: 3
117
+ });
118
+ }
119
+ });
120
+
121
+ /***/ })
122
+
123
+ }]);
124
+ //# sourceMappingURL=1.js.map
js/1.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/1.js","sources":["webpack://GUI/./src/addons/addons/fps/userstyle.css","webpack://GUI/./src/addons/addons/fps/_runtime_entry.js","webpack://GUI/./src/addons/addons/fps/userscript.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".fps-counter {\\n font-size: 0.625rem;\\n font-weight: bold;\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n white-space: nowrap;\\n padding: 0.25rem;\\n user-select: none;\\n color: #0fbd8c;\\n display: none;\\n align-items: center;\\n}\\n\\n.fps-counter.show {\\n display: flex;\\n}\\n\\n.sa-small-stage .fps-counter {\\n display: none;\\n}\", \"\"]);\n\n// exports\n","/* generated by pull.js */\nimport _js from \"./userscript.js\";\nimport _css from \"!css-loader!./userstyle.css\";\nexport const resources = {\n \"userscript.js\": _js,\n \"userstyle.css\": _css,\n};","\nexport default async function ({ addon, console, msg }) {\n const { vm } = addon.tab.traps;\n const { runtime } = vm;\n if (!vm.editingTarget) {\n await new Promise((resolve) => runtime.once(\"PROJECT_LOADED\", resolve));\n }\n\n let fpsCounterElement = document.createElement(\"span\");\n fpsCounterElement.className = \"fps-counter\";\n addon.tab.displayNoneWhileDisabled(fpsCounterElement);\n\n let lastRender;\n let lastFps;\n let wasRunning = false;\n\n const { renderer } = runtime;\n const _draw = renderer.draw;\n renderer.draw = function () {\n _draw.call(this);\n\n const now = runtime.currentMSecs;\n // If it's been more than 500ms since the last draw, we want to reset the variables.\n if (typeof lastRender !== \"number\" || now - lastRender > 500) {\n lastRender = now;\n lastFps = null;\n return;\n }\n // If the current time has been rendered, return, Don't show infinity.\n if (now === lastRender) return;\n // Every time this function is ran, store the current time and remove times from half a second ago\n let smoothing = 0.9;\n let calculatedFps = 1000 / (now - lastRender);\n if (typeof lastFps !== \"number\") lastFps = calculatedFps;\n // Calculate a smoothed FPS so that numbers aren't changing too fast.\n const fps = Math.round(lastFps * smoothing + calculatedFps * (1 - smoothing));\n lastRender = now;\n\n // Show/Hide the element based on if there are any threads running\n if (runtime.threads.length === 0) {\n if (wasRunning) fpsCounterElement.classList.remove(\"show\");\n wasRunning = false;\n return;\n }\n if (!wasRunning) fpsCounterElement.classList.add(\"show\");\n if (fps !== lastFps || !wasRunning) fpsCounterElement.innerText = `FPS: ${lastFps = fps}`;\n wasRunning = true;\n };\n\n while (true) {\n await addon.tab.waitForElement('[class*=\"controls_controls-container\"]', {\n markAsSeen: true,\n reduxEvents: [\"scratch-gui/mode/SET_PLAYER\", \"fontsLoaded/SET_FONTS_LOADED\", \"scratch-gui/locales/SELECT_LOCALE\"],\n });\n addon.tab.appendToSharedSpace({ space: \"afterStopButton\", element: fpsCounterElement, order: 3 });\n }\n}"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACLA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;;;;A","sourceRoot":""}
js/2.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([[2],{
2
+
3
+ /***/ "./src/addons/addons/ScratchHighlightFullwidthNumber/_runtime_entry.js":
4
+ /*!*****************************************************************************!*\
5
+ !*** ./src/addons/addons/ScratchHighlightFullwidthNumber/_runtime_entry.js ***!
6
+ \*****************************************************************************/
7
+ /*! exports provided: resources */
8
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9
+
10
+ "use strict";
11
+ __webpack_require__.r(__webpack_exports__);
12
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
13
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js");
14
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_userscript_js__WEBPACK_IMPORTED_MODULE_0__);
15
+ /* generated by pull.js */
16
+
17
+ const resources = {
18
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0___default.a
19
+ };
20
+
21
+ /***/ }),
22
+
23
+ /***/ "./src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js":
24
+ /*!*************************************************************************!*\
25
+ !*** ./src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js ***!
26
+ \*************************************************************************/
27
+ /*! no static exports found */
28
+ /***/ (function(module, exports) {
29
+
30
+ const target = document.querySelectorAll('.blocklyBlockCanvas');
31
+ const regexp = /[0-9]/;
32
+ const observer = new MutationObserver(records => {
33
+ document.querySelectorAll('*[data-argument-type~="text"] text, *[data-argument-type~="number"] text').forEach(e => {
34
+ if (regexp.test(e.textContent)) {
35
+ e.style.fill = 'red';
36
+ } else {
37
+ e.style.fill = '';
38
+ }
39
+ });
40
+ });
41
+ target.forEach(e => {
42
+ observer.observe(e, {
43
+ attributes: true,
44
+ characterData: true,
45
+ childList: true,
46
+ subtree: true
47
+ });
48
+ });
49
+
50
+ /***/ })
51
+
52
+ }]);
53
+ //# sourceMappingURL=2.js.map
js/2.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/2.js","sources":["webpack://GUI/./src/addons/addons/ScratchHighlightFullwidthNumber/_runtime_entry.js","webpack://GUI/./src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js"],"sourcesContent":["/* generated by pull.js */\nimport _js from \"./userscript.js\";\nexport const resources = {\n \"userscript.js\": _js\n};","const target = document.querySelectorAll('.blocklyBlockCanvas');\nconst regexp = /[0-9]/;\n\nconst observer = new MutationObserver(records => {\n document.querySelectorAll('*[data-argument-type~=\"text\"] text, *[data-argument-type~=\"number\"] text').forEach(e => {\n if (regexp.test(e.textContent)){\n e.style.fill = 'red';\n } else {\n e.style.fill = '';\n }\n });\n});\n\ntarget.forEach(e => {\n observer.observe(e, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true\n });\n});"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACJA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-default-entry.js ADDED
The diff for this file is too large to render. See raw diff
 
js/addon-default-entry.js.map ADDED
The diff for this file is too large to render. See raw diff
 
js/addon-entry-2d-color-picker.js ADDED
@@ -0,0 +1,1635 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-2d-color-picker"],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/2d-color-picker/style.css":
4
+ /*!*******************************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/2d-color-picker/style.css ***!
6
+ \*******************************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
11
+ // imports
12
+
13
+
14
+ // module
15
+ exports.push([module.i, ".sa-2dcolor-picker {\n width: 150px;\n height: 150px;\n border-radius: 8px;\n margin: 8px;\n position: relative;\n user-select: none;\n}\n\n.sa-2dcolor-picker-image {\n border-radius: 8px;\n width: 150px;\n height: 150px;\n user-select: none;\n}\n", ""]);
16
+
17
+ // exports
18
+
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/2d-color-picker/assets/sv-gr.png":
23
+ /*!**************************************************************************************************!*\
24
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/2d-color-picker/assets/sv-gr.png ***!
25
+ \**************************************************************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/png;base64,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");
32
+
33
+ /***/ }),
34
+
35
+ /***/ "./src/addons/addons/2d-color-picker/_runtime_entry.js":
36
+ /*!*************************************************************!*\
37
+ !*** ./src/addons/addons/2d-color-picker/_runtime_entry.js ***!
38
+ \*************************************************************/
39
+ /*! exports provided: resources */
40
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
41
+
42
+ "use strict";
43
+ __webpack_require__.r(__webpack_exports__);
44
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
45
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/2d-color-picker/userscript.js");
46
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./style.css */ "./node_modules/css-loader/index.js!./src/addons/addons/2d-color-picker/style.css");
47
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__);
48
+ /* harmony import */ var _url_loader_assets_sv_gr_png__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! url-loader!./assets/sv-gr.png */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/2d-color-picker/assets/sv-gr.png");
49
+ /* generated by pull.js */
50
+
51
+
52
+
53
+ const resources = {
54
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"],
55
+ "style.css": _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default.a,
56
+ "assets/sv-gr.png": _url_loader_assets_sv_gr_png__WEBPACK_IMPORTED_MODULE_2__["default"]
57
+ };
58
+
59
+ /***/ }),
60
+
61
+ /***/ "./src/addons/addons/2d-color-picker/paint-editor.js":
62
+ /*!***********************************************************!*\
63
+ !*** ./src/addons/addons/2d-color-picker/paint-editor.js ***!
64
+ \***********************************************************/
65
+ /*! exports provided: default */
66
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
67
+
68
+ "use strict";
69
+ __webpack_require__.r(__webpack_exports__);
70
+ /* harmony import */ var _libraries_common_cs_normalize_color_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../libraries/common/cs/normalize-color.js */ "./src/addons/libraries/common/cs/normalize-color.js");
71
+ /* harmony import */ var _libraries_common_cs_rate_limiter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../libraries/common/cs/rate-limiter.js */ "./src/addons/libraries/common/cs/rate-limiter.js");
72
+ /* harmony import */ var _libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../libraries/thirdparty/cs/tinycolor-min.js */ "./src/addons/libraries/thirdparty/cs/tinycolor-min.js");
73
+ // this script was happily stolen from the color-picker addon, developed by Richie Bendall and apple502j
74
+
75
+ // import required libraries
76
+
77
+
78
+
79
+ /* harmony default export */ __webpack_exports__["default"] = (async _ref => {
80
+ let {
81
+ addon,
82
+ console,
83
+ msg
84
+ } = _ref;
85
+ let prevEventHandler;
86
+ // 250-ms rate limit
87
+ const rateLimiter = new _libraries_common_cs_rate_limiter_js__WEBPACK_IMPORTED_MODULE_1__["default"](250);
88
+
89
+ // get the color from scratch
90
+ const getColor = element => {
91
+ let fillOrStroke;
92
+ const state = addon.tab.redux.state;
93
+ if (state.scratchPaint.modals.fillColor) {
94
+ fillOrStroke = "fill";
95
+ } else if (state.scratchPaint.modals.strokeColor) {
96
+ fillOrStroke = "stroke";
97
+ } else {
98
+ return;
99
+ }
100
+ const colorType = state.scratchPaint.fillMode.colorIndex;
101
+ const primaryOrSecondary = ["primary", "secondary"][colorType];
102
+ const color = state.scratchPaint.color["".concat(fillOrStroke, "Color")][primaryOrSecondary];
103
+ if (color === null || color === "scratch-paint/style-path/mixed") return;
104
+ // This value can be arbitrary - it can be HEX, RGB, etc.
105
+ // Use tinycolor to convert them.
106
+ return Object(_libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__["default"])(color).toHex8();
107
+ };
108
+
109
+ // load the new color to scratch
110
+ const setColor = (hex, element) => {
111
+ hex = Object(_libraries_common_cs_normalize_color_js__WEBPACK_IMPORTED_MODULE_0__["normalizeHex"])(hex);
112
+ if (!addon.tab.redux.state || !addon.tab.redux.state.scratchPaint) return;
113
+ // The only way to reliably set color is to invoke eye dropper via click()
114
+ // then faking that the eye dropper reported the value.
115
+ const onEyeDropperOpened = _ref2 => {
116
+ let {
117
+ detail
118
+ } = _ref2;
119
+ if (detail.action.type !== "scratch-paint/eye-dropper/ACTIVATE_COLOR_PICKER") return;
120
+ addon.tab.redux.removeEventListener("statechanged", onEyeDropperOpened);
121
+ setTimeout(() => {
122
+ const previousTool = addon.tab.redux.state.scratchPaint.color.eyeDropper.previousTool;
123
+ if (previousTool) previousTool.activate();
124
+ addon.tab.redux.state.scratchPaint.color.eyeDropper.callback(hex);
125
+ addon.tab.redux.dispatch({
126
+ type: "scratch-paint/eye-dropper/DEACTIVATE_COLOR_PICKER"
127
+ });
128
+ }, 50);
129
+ };
130
+ addon.tab.redux.addEventListener("statechanged", onEyeDropperOpened);
131
+ element.children[1].children[0].click();
132
+ };
133
+
134
+ // for the color picker's background color
135
+ const convertToGeneralColor = hex => {
136
+ let h = Object(_libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__["default"])(hex).toHsv();
137
+ h.s = 1;
138
+ h.v = 1;
139
+ return Object(_libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__["default"])(h).toHex();
140
+ };
141
+
142
+ // le loop
143
+ while (true) {
144
+ // wait for color dialog box appearance
145
+ const element = await addon.tab.waitForElement('div[class*="color-picker_swatch-row"]', {
146
+ markAsSeen: true,
147
+ reduxCondition: state => state.scratchGui.editorTab.activeTabIndex === 1 && !state.scratchGui.mode.isPlayerOnly
148
+ });
149
+ rateLimiter.abort(false);
150
+ if (!("colorIndex" in addon.tab.redux.state.scratchPaint.fillMode)) {
151
+ console.error("Detected new paint editor; this will be supported in future versions.");
152
+ return;
153
+ }
154
+
155
+ // update the bg color of the picker
156
+ function updateColor() {
157
+ rateLimiter.limit(() => {
158
+ let c = getColor(element);
159
+ let chsv = Object(_libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__["default"])(c).toHsv();
160
+ updateHandleFinal(chsv.s, chsv.v);
161
+ saColorPicker.style.background = "#" + convertToGeneralColor(getColor(element));
162
+ });
163
+ }
164
+
165
+ // redux stuff
166
+ addon.tab.redux.initialize();
167
+ addon.tab.redux.addEventListener("statechanged", e => e.detail.action.type === "scratch-paint/fill-style/CHANGE_FILL_COLOR" || e.detail.action.type === "scratch-paint/fill-style/CHANGE_FILL_COLOR_2" || e.detail.action.type === "scratch-paint/stroke-style/CHANGE_STROKE_COLOR" || e.detail.action.type === "scratch-paint/stroke-style/CHANGE_STROKE_COLOR_2" ? updateColor() : 0);
168
+ if (addon.tab.redux && typeof prevEventHandler === "function") {
169
+ addon.tab.redux.removeEventListener("statechanged", prevEventHandler);
170
+ prevEventHandler = null;
171
+ }
172
+
173
+ // get the color
174
+ if (addon.tab.editorMode !== "editor") continue;
175
+ let defaultColor = getColor(element);
176
+
177
+ // create the color picker element and all it's child elements
178
+ const saColorPicker = document.createElement("div");
179
+ saColorPicker.className = "sa-2dcolor-picker";
180
+ saColorPicker.style.background = "#" + convertToGeneralColor(defaultColor || "ff0000");
181
+ const saColorPickerImage = Object.assign(document.createElement("img"), {
182
+ className: "sa-2dcolor-picker-image",
183
+ src: addon.self.getResource("/assets/sv-gr.png") /* rewritten by pull.js */,
184
+ draggable: false
185
+ });
186
+ const saColorPickerHandle = Object.assign(document.createElement("div"), {
187
+ className: addon.tab.scratchClass("slider_handle")
188
+ });
189
+ saColorPickerHandle.style.pointerEvents = "none";
190
+
191
+ // create the label
192
+ const saColorLabel = document.createElement("div");
193
+ saColorLabel.className = addon.tab.scratchClass("color-picker_row-header", {
194
+ others: "sa-2dcolor-label"
195
+ });
196
+ const saColorLabelName = document.createElement("span");
197
+ saColorLabelName.className = addon.tab.scratchClass("color-picker_label-name", {
198
+ others: "sa-2dcolor-label-name"
199
+ });
200
+ saColorLabelName.innerText = msg("shade");
201
+ const saColorLabelVal = document.createElement("span");
202
+ saColorLabelVal.className = addon.tab.scratchClass("color-picker_label-readout", {
203
+ others: "sa-2dcolor-label-val"
204
+ });
205
+ saColorLabel.appendChild(saColorLabelName);
206
+ saColorLabel.appendChild(saColorLabelVal);
207
+ let keyPressed = -1;
208
+ let originalPos = {
209
+ x: 0,
210
+ y: 0
211
+ };
212
+ window.addEventListener("keydown", e => keyPressed = e.keyCode);
213
+ window.addEventListener("keyup", () => keyPressed = -1);
214
+ let origHue = 0;
215
+ let el = null;
216
+ let mousemovefunc = function mousemovefunc(e) {
217
+ updateHandle(e, keyPressed, originalPos);
218
+ return false;
219
+ };
220
+ let mouseupfunc = function mouseupfunc(e) {
221
+ updateFinal(e, keyPressed, originalPos);
222
+ };
223
+ function updateHandle(e, keyPressed, originalPos) {
224
+ let cx = Math.min(Math.max(e.clientX - saColorPicker.getBoundingClientRect().x, 0), 150);
225
+ let cy = Math.min(Math.max(e.clientY - saColorPicker.getBoundingClientRect().y, 0), 150);
226
+ if (keyPressed === 16) {
227
+ if (Math.abs(cx - originalPos.x) > Math.abs(cy - originalPos.y)) cy = originalPos.y;else cx = originalPos.x;
228
+ }
229
+ saColorPickerHandle.style.left = cx - 8 + "px";
230
+ saColorPickerHandle.style.top = cy - 8 + "px";
231
+ saColorLabelVal.innerText = "".concat(Math.round(cx / 150 * 100), ", ").concat(100 - Math.round(cy / 150 * 100));
232
+
233
+ //update color in real-time (i only bothered to do that for solid colors)
234
+ if ((!addon.tab.redux.state.scratchPaint.fillMode.gradientType || addon.tab.redux.state.scratchPaint.fillMode.gradientType === "SOLID") && el) {
235
+ let c = Object(_libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__["default"])({
236
+ h: origHue,
237
+ s: cx / 150,
238
+ v: 1 - cy / 150
239
+ }).toHex();
240
+ if (c.startsWith("#")) el.style.background = c;else el.style.background = "#" + c;
241
+ }
242
+ }
243
+ function updateHandleFinal(s, v) {
244
+ saColorPickerHandle.style.left = s * 150 - 8 + "px";
245
+ saColorPickerHandle.style.top = (1 - v) * 150 - 8 + "px";
246
+ saColorLabelVal.innerText = "".concat(Math.round(s * 100), ", ").concat(Math.round(v * 100));
247
+ }
248
+ function updateFinal(e, keyPressed, originalPos) {
249
+ rateLimiter.limit(() => {
250
+ let ox = Math.min(Math.max(e.clientX - saColorPicker.getBoundingClientRect().x, 0), 150);
251
+ let oy = Math.min(Math.max(e.clientY - saColorPicker.getBoundingClientRect().y, 0), 150);
252
+ if (keyPressed === 16) {
253
+ if (Math.abs(ox - originalPos.x) > Math.abs(oy - originalPos.y)) oy = originalPos.y;else ox = originalPos.x;
254
+ }
255
+ let color = Object(_libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__["default"])(getColor(element)).toHsv();
256
+ let s = ox / 150;
257
+ let v = 1 - oy / 150;
258
+ let newColor = Object(_libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__["default"])({
259
+ h: color.h,
260
+ s: s,
261
+ v: v,
262
+ a: color.a
263
+ }).toHex8();
264
+ setColor(newColor, element);
265
+ updateHandleFinal(s, v);
266
+ });
267
+ window.removeEventListener("pointermove", mousemovefunc);
268
+ window.removeEventListener("pointerup", mouseupfunc);
269
+ }
270
+ if (defaultColor) {
271
+ let defaultHexColor = Object(_libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__["default"])(defaultColor).toHsv();
272
+ updateHandleFinal(defaultHexColor.s, defaultHexColor.v);
273
+ } else updateHandleFinal(1, 1);
274
+ saColorPicker.addEventListener("pointerdown", e => {
275
+ e.preventDefault();
276
+ originalPos = {
277
+ x: parseFloat(saColorPickerHandle.style.left) + 8,
278
+ y: parseFloat(saColorPickerHandle.style.top) + 8
279
+ };
280
+ let fillOrStroke;
281
+ const state = addon.tab.redux.state;
282
+ if (state.scratchPaint.modals.fillColor) {
283
+ fillOrStroke = "fill";
284
+ } else if (state.scratchPaint.modals.strokeColor) {
285
+ fillOrStroke = "stroke";
286
+ } else {
287
+ fillOrStroke = "wh";
288
+ }
289
+ el = null;
290
+ if (fillOrStroke === "fill") el = document.getElementsByClassName(addon.tab.scratchClass("color-button_color-button-swatch"))[0];else if (fillOrStroke === "stroke") el = document.getElementsByClassName(addon.tab.scratchClass("color-button_color-button-swatch"))[1];
291
+ if (el) origHue = Object(_libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__["default"])(el.style.background).toHsv().h;
292
+ updateHandle(e);
293
+ window.addEventListener("pointermove", mousemovefunc);
294
+ window.addEventListener("pointerup", mouseupfunc);
295
+ });
296
+ prevEventHandler = _ref3 => {
297
+ let {
298
+ detail
299
+ } = _ref3;
300
+ if (detail.action.type === "scratch-paint/color-index/CHANGE_COLOR_INDEX") {
301
+ setTimeout(() => {
302
+ updateColor();
303
+ }, 100);
304
+ }
305
+ };
306
+ addon.tab.redux.addEventListener("statechanged", prevEventHandler);
307
+ saColorPicker.appendChild(saColorPickerImage);
308
+ saColorPicker.appendChild(saColorPickerHandle);
309
+ const [colorSlider, saturationSlider, brightnessSlider] = [...element.parentElement.querySelectorAll('[class^="color-picker_row-header"]')].map(i => i.parentElement);
310
+ saturationSlider.style.display = "none";
311
+ brightnessSlider.style.display = "none";
312
+ colorSlider.insertAdjacentElement("afterend", saColorPicker);
313
+ colorSlider.insertAdjacentElement("afterend", saColorLabel);
314
+ }
315
+ });
316
+
317
+ /***/ }),
318
+
319
+ /***/ "./src/addons/addons/2d-color-picker/userscript.js":
320
+ /*!*********************************************************!*\
321
+ !*** ./src/addons/addons/2d-color-picker/userscript.js ***!
322
+ \*********************************************************/
323
+ /*! exports provided: default */
324
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
325
+
326
+ "use strict";
327
+ __webpack_require__.r(__webpack_exports__);
328
+ /* harmony import */ var _paint_editor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./paint-editor.js */ "./src/addons/addons/2d-color-picker/paint-editor.js");
329
+
330
+ /* harmony default export */ __webpack_exports__["default"] = (async api => {
331
+ Object(_paint_editor_js__WEBPACK_IMPORTED_MODULE_0__["default"])(api);
332
+ });
333
+
334
+ /***/ }),
335
+
336
+ /***/ "./src/addons/libraries/common/cs/normalize-color.js":
337
+ /*!***********************************************************!*\
338
+ !*** ./src/addons/libraries/common/cs/normalize-color.js ***!
339
+ \***********************************************************/
340
+ /*! exports provided: getHexRegex, normalizeHex */
341
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
342
+
343
+ "use strict";
344
+ __webpack_require__.r(__webpack_exports__);
345
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getHexRegex", function() { return getHexRegex; });
346
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalizeHex", function() { return normalizeHex; });
347
+ const getHexRegex = () => /^#?[0-9a-fA-F]{3,8}$/;
348
+ const normalizeHex = input => {
349
+ let hex = String(input);
350
+ if (!getHexRegex().test(hex)) return "#000000";
351
+ if (!hex.startsWith("#")) hex = "#".concat(hex);
352
+ if (hex.length === 4) {
353
+ const [_, r, g, b] = hex;
354
+ hex = "#".concat(r).concat(r).concat(g).concat(g).concat(b).concat(b);
355
+ }
356
+ return hex.toLowerCase();
357
+ };
358
+
359
+ /***/ }),
360
+
361
+ /***/ "./src/addons/libraries/common/cs/rate-limiter.js":
362
+ /*!********************************************************!*\
363
+ !*** ./src/addons/libraries/common/cs/rate-limiter.js ***!
364
+ \********************************************************/
365
+ /*! exports provided: default */
366
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
367
+
368
+ "use strict";
369
+ __webpack_require__.r(__webpack_exports__);
370
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RateLimiter; });
371
+ class RateLimiter {
372
+ constructor(wait) {
373
+ this.timeout = null;
374
+ this.callback = null;
375
+ this.wait = wait;
376
+ }
377
+ abort() {
378
+ let call = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
379
+ if (this.timeout) {
380
+ clearTimeout(this.timeout);
381
+ if (call) this.callback();
382
+ this.timeout = this.callback = null;
383
+ }
384
+ }
385
+ limit(callback) {
386
+ this.abort(false);
387
+ this.callback = callback;
388
+ this.timeout = setTimeout(() => {
389
+ this.timeout = this.callback = null;
390
+ callback();
391
+ }, this.wait);
392
+ }
393
+ }
394
+
395
+ /***/ }),
396
+
397
+ /***/ "./src/addons/libraries/thirdparty/cs/tinycolor-min.js":
398
+ /*!*************************************************************!*\
399
+ !*** ./src/addons/libraries/thirdparty/cs/tinycolor-min.js ***!
400
+ \*************************************************************/
401
+ /*! exports provided: default */
402
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
403
+
404
+ "use strict";
405
+ __webpack_require__.r(__webpack_exports__);
406
+ // TinyColor v1.4.2
407
+ // https://github.com/bgrins/TinyColor
408
+ // Brian Grinstead, MIT License
409
+ // Modified to use ES6 export
410
+
411
+ const tinycolor = function (Math) {
412
+ var trimLeft = /^\s+/,
413
+ trimRight = /\s+$/,
414
+ tinyCounter = 0,
415
+ mathRound = Math.round,
416
+ mathMin = Math.min,
417
+ mathMax = Math.max,
418
+ mathRandom = Math.random;
419
+ function tinycolor(color, opts) {
420
+ color = color ? color : '';
421
+ opts = opts || {};
422
+
423
+ // If input is already a tinycolor, return itself
424
+ if (color instanceof tinycolor) {
425
+ return color;
426
+ }
427
+ // If we are called as a function, call using new instead
428
+ if (!(this instanceof tinycolor)) {
429
+ return new tinycolor(color, opts);
430
+ }
431
+ var rgb = inputToRGB(color);
432
+ this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = mathRound(100 * this._a) / 100, this._format = opts.format || rgb.format;
433
+ this._gradientType = opts.gradientType;
434
+
435
+ // Don't let the range of [0,255] come back in [0,1].
436
+ // Potentially lose a little bit of precision here, but will fix issues where
437
+ // .5 gets interpreted as half of the total, instead of half of 1
438
+ // If it was supposed to be 128, this was already taken care of by `inputToRgb`
439
+ if (this._r < 1) {
440
+ this._r = mathRound(this._r);
441
+ }
442
+ if (this._g < 1) {
443
+ this._g = mathRound(this._g);
444
+ }
445
+ if (this._b < 1) {
446
+ this._b = mathRound(this._b);
447
+ }
448
+ this._ok = rgb.ok;
449
+ this._tc_id = tinyCounter++;
450
+ }
451
+ tinycolor.prototype = {
452
+ isDark: function isDark() {
453
+ return this.getBrightness() < 128;
454
+ },
455
+ isLight: function isLight() {
456
+ return !this.isDark();
457
+ },
458
+ isValid: function isValid() {
459
+ return this._ok;
460
+ },
461
+ getOriginalInput: function getOriginalInput() {
462
+ return this._originalInput;
463
+ },
464
+ getFormat: function getFormat() {
465
+ return this._format;
466
+ },
467
+ getAlpha: function getAlpha() {
468
+ return this._a;
469
+ },
470
+ getBrightness: function getBrightness() {
471
+ //http://www.w3.org/TR/AERT#color-contrast
472
+ var rgb = this.toRgb();
473
+ return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
474
+ },
475
+ getLuminance: function getLuminance() {
476
+ //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
477
+ var rgb = this.toRgb();
478
+ var RsRGB, GsRGB, BsRGB, R, G, B;
479
+ RsRGB = rgb.r / 255;
480
+ GsRGB = rgb.g / 255;
481
+ BsRGB = rgb.b / 255;
482
+ if (RsRGB <= 0.03928) {
483
+ R = RsRGB / 12.92;
484
+ } else {
485
+ R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);
486
+ }
487
+ if (GsRGB <= 0.03928) {
488
+ G = GsRGB / 12.92;
489
+ } else {
490
+ G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);
491
+ }
492
+ if (BsRGB <= 0.03928) {
493
+ B = BsRGB / 12.92;
494
+ } else {
495
+ B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);
496
+ }
497
+ return 0.2126 * R + 0.7152 * G + 0.0722 * B;
498
+ },
499
+ setAlpha: function setAlpha(value) {
500
+ this._a = boundAlpha(value);
501
+ this._roundA = mathRound(100 * this._a) / 100;
502
+ return this;
503
+ },
504
+ toHsv: function toHsv() {
505
+ var hsv = rgbToHsv(this._r, this._g, this._b);
506
+ return {
507
+ h: hsv.h * 360,
508
+ s: hsv.s,
509
+ v: hsv.v,
510
+ a: this._a
511
+ };
512
+ },
513
+ toHsvString: function toHsvString() {
514
+ var hsv = rgbToHsv(this._r, this._g, this._b);
515
+ var h = mathRound(hsv.h * 360),
516
+ s = mathRound(hsv.s * 100),
517
+ v = mathRound(hsv.v * 100);
518
+ return this._a == 1 ? "hsv(" + h + ", " + s + "%, " + v + "%)" : "hsva(" + h + ", " + s + "%, " + v + "%, " + this._roundA + ")";
519
+ },
520
+ toHsl: function toHsl() {
521
+ var hsl = rgbToHsl(this._r, this._g, this._b);
522
+ return {
523
+ h: hsl.h * 360,
524
+ s: hsl.s,
525
+ l: hsl.l,
526
+ a: this._a
527
+ };
528
+ },
529
+ toHslString: function toHslString() {
530
+ var hsl = rgbToHsl(this._r, this._g, this._b);
531
+ var h = mathRound(hsl.h * 360),
532
+ s = mathRound(hsl.s * 100),
533
+ l = mathRound(hsl.l * 100);
534
+ return this._a == 1 ? "hsl(" + h + ", " + s + "%, " + l + "%)" : "hsla(" + h + ", " + s + "%, " + l + "%, " + this._roundA + ")";
535
+ },
536
+ toHex: function toHex(allow3Char) {
537
+ return rgbToHex(this._r, this._g, this._b, allow3Char);
538
+ },
539
+ toHexString: function toHexString(allow3Char) {
540
+ return '#' + this.toHex(allow3Char);
541
+ },
542
+ toHex8: function toHex8(allow4Char) {
543
+ return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);
544
+ },
545
+ toHex8String: function toHex8String(allow4Char) {
546
+ return '#' + this.toHex8(allow4Char);
547
+ },
548
+ toRgb: function toRgb() {
549
+ return {
550
+ r: mathRound(this._r),
551
+ g: mathRound(this._g),
552
+ b: mathRound(this._b),
553
+ a: this._a
554
+ };
555
+ },
556
+ toRgbString: function toRgbString() {
557
+ return this._a == 1 ? "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";
558
+ },
559
+ toPercentageRgb: function toPercentageRgb() {
560
+ return {
561
+ r: mathRound(bound01(this._r, 255) * 100) + "%",
562
+ g: mathRound(bound01(this._g, 255) * 100) + "%",
563
+ b: mathRound(bound01(this._b, 255) * 100) + "%",
564
+ a: this._a
565
+ };
566
+ },
567
+ toPercentageRgbString: function toPercentageRgbString() {
568
+ return this._a == 1 ? "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
569
+ },
570
+ toName: function toName() {
571
+ if (this._a === 0) {
572
+ return "transparent";
573
+ }
574
+ if (this._a < 1) {
575
+ return false;
576
+ }
577
+ return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
578
+ },
579
+ toFilter: function toFilter(secondColor) {
580
+ var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);
581
+ var secondHex8String = hex8String;
582
+ var gradientType = this._gradientType ? "GradientType = 1, " : "";
583
+ if (secondColor) {
584
+ var s = tinycolor(secondColor);
585
+ secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);
586
+ }
587
+ return "progid:DXImageTransform.Microsoft.gradient(" + gradientType + "startColorstr=" + hex8String + ",endColorstr=" + secondHex8String + ")";
588
+ },
589
+ toString: function toString(format) {
590
+ var formatSet = !!format;
591
+ format = format || this._format;
592
+ var formattedString = false;
593
+ var hasAlpha = this._a < 1 && this._a >= 0;
594
+ var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name");
595
+ if (needsAlphaFormat) {
596
+ // Special case for "transparent", all other non-alpha formats
597
+ // will return rgba when there is transparency.
598
+ if (format === "name" && this._a === 0) {
599
+ return this.toName();
600
+ }
601
+ return this.toRgbString();
602
+ }
603
+ if (format === "rgb") {
604
+ formattedString = this.toRgbString();
605
+ }
606
+ if (format === "prgb") {
607
+ formattedString = this.toPercentageRgbString();
608
+ }
609
+ if (format === "hex" || format === "hex6") {
610
+ formattedString = this.toHexString();
611
+ }
612
+ if (format === "hex3") {
613
+ formattedString = this.toHexString(true);
614
+ }
615
+ if (format === "hex4") {
616
+ formattedString = this.toHex8String(true);
617
+ }
618
+ if (format === "hex8") {
619
+ formattedString = this.toHex8String();
620
+ }
621
+ if (format === "name") {
622
+ formattedString = this.toName();
623
+ }
624
+ if (format === "hsl") {
625
+ formattedString = this.toHslString();
626
+ }
627
+ if (format === "hsv") {
628
+ formattedString = this.toHsvString();
629
+ }
630
+ return formattedString || this.toHexString();
631
+ },
632
+ clone: function clone() {
633
+ return tinycolor(this.toString());
634
+ },
635
+ _applyModification: function _applyModification(fn, args) {
636
+ var color = fn.apply(null, [this].concat([].slice.call(args)));
637
+ this._r = color._r;
638
+ this._g = color._g;
639
+ this._b = color._b;
640
+ this.setAlpha(color._a);
641
+ return this;
642
+ },
643
+ lighten: function lighten() {
644
+ return this._applyModification(_lighten, arguments);
645
+ },
646
+ brighten: function brighten() {
647
+ return this._applyModification(_brighten, arguments);
648
+ },
649
+ darken: function darken() {
650
+ return this._applyModification(_darken, arguments);
651
+ },
652
+ desaturate: function desaturate() {
653
+ return this._applyModification(_desaturate, arguments);
654
+ },
655
+ saturate: function saturate() {
656
+ return this._applyModification(_saturate, arguments);
657
+ },
658
+ greyscale: function greyscale() {
659
+ return this._applyModification(_greyscale, arguments);
660
+ },
661
+ spin: function spin() {
662
+ return this._applyModification(_spin, arguments);
663
+ },
664
+ _applyCombination: function _applyCombination(fn, args) {
665
+ return fn.apply(null, [this].concat([].slice.call(args)));
666
+ },
667
+ analogous: function analogous() {
668
+ return this._applyCombination(_analogous, arguments);
669
+ },
670
+ complement: function complement() {
671
+ return this._applyCombination(_complement, arguments);
672
+ },
673
+ monochromatic: function monochromatic() {
674
+ return this._applyCombination(_monochromatic, arguments);
675
+ },
676
+ splitcomplement: function splitcomplement() {
677
+ return this._applyCombination(_splitcomplement, arguments);
678
+ },
679
+ triad: function triad() {
680
+ return this._applyCombination(_triad, arguments);
681
+ },
682
+ tetrad: function tetrad() {
683
+ return this._applyCombination(_tetrad, arguments);
684
+ }
685
+ };
686
+
687
+ // If input is an object, force 1 into "1.0" to handle ratios properly
688
+ // String input requires "1.0" as input, so 1 will be treated as 1
689
+ tinycolor.fromRatio = function (color, opts) {
690
+ if (typeof color == "object") {
691
+ var newColor = {};
692
+ for (var i in color) {
693
+ if (color.hasOwnProperty(i)) {
694
+ if (i === "a") {
695
+ newColor[i] = color[i];
696
+ } else {
697
+ newColor[i] = convertToPercentage(color[i]);
698
+ }
699
+ }
700
+ }
701
+ color = newColor;
702
+ }
703
+ return tinycolor(color, opts);
704
+ };
705
+
706
+ // Given a string or object, convert that input to RGB
707
+ // Possible string inputs:
708
+ //
709
+ // "red"
710
+ // "#f00" or "f00"
711
+ // "#ff0000" or "ff0000"
712
+ // "#ff000000" or "ff000000"
713
+ // "rgb 255 0 0" or "rgb (255, 0, 0)"
714
+ // "rgb 1.0 0 0" or "rgb (1, 0, 0)"
715
+ // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
716
+ // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
717
+ // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
718
+ // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
719
+ // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
720
+ //
721
+ function inputToRGB(color) {
722
+ var rgb = {
723
+ r: 0,
724
+ g: 0,
725
+ b: 0
726
+ };
727
+ var a = 1;
728
+ var s = null;
729
+ var v = null;
730
+ var l = null;
731
+ var ok = false;
732
+ var format = false;
733
+ if (typeof color == "string") {
734
+ color = stringInputToObject(color);
735
+ }
736
+ if (typeof color == "object") {
737
+ if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {
738
+ rgb = rgbToRgb(color.r, color.g, color.b);
739
+ ok = true;
740
+ format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
741
+ } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {
742
+ s = convertToPercentage(color.s);
743
+ v = convertToPercentage(color.v);
744
+ rgb = hsvToRgb(color.h, s, v);
745
+ ok = true;
746
+ format = "hsv";
747
+ } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {
748
+ s = convertToPercentage(color.s);
749
+ l = convertToPercentage(color.l);
750
+ rgb = hslToRgb(color.h, s, l);
751
+ ok = true;
752
+ format = "hsl";
753
+ }
754
+ if (color.hasOwnProperty("a")) {
755
+ a = color.a;
756
+ }
757
+ }
758
+ a = boundAlpha(a);
759
+ return {
760
+ ok: ok,
761
+ format: color.format || format,
762
+ r: mathMin(255, mathMax(rgb.r, 0)),
763
+ g: mathMin(255, mathMax(rgb.g, 0)),
764
+ b: mathMin(255, mathMax(rgb.b, 0)),
765
+ a: a
766
+ };
767
+ }
768
+
769
+ // Conversion Functions
770
+ // --------------------
771
+
772
+ // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
773
+ // <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
774
+
775
+ // `rgbToRgb`
776
+ // Handle bounds / percentage checking to conform to CSS color spec
777
+ // <http://www.w3.org/TR/css3-color/>
778
+ // *Assumes:* r, g, b in [0, 255] or [0, 1]
779
+ // *Returns:* { r, g, b } in [0, 255]
780
+ function rgbToRgb(r, g, b) {
781
+ return {
782
+ r: bound01(r, 255) * 255,
783
+ g: bound01(g, 255) * 255,
784
+ b: bound01(b, 255) * 255
785
+ };
786
+ }
787
+
788
+ // `rgbToHsl`
789
+ // Converts an RGB color value to HSL.
790
+ // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
791
+ // *Returns:* { h, s, l } in [0,1]
792
+ function rgbToHsl(r, g, b) {
793
+ r = bound01(r, 255);
794
+ g = bound01(g, 255);
795
+ b = bound01(b, 255);
796
+ var max = mathMax(r, g, b),
797
+ min = mathMin(r, g, b);
798
+ var h,
799
+ s,
800
+ l = (max + min) / 2;
801
+ if (max == min) {
802
+ h = s = 0; // achromatic
803
+ } else {
804
+ var d = max - min;
805
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
806
+ switch (max) {
807
+ case r:
808
+ h = (g - b) / d + (g < b ? 6 : 0);
809
+ break;
810
+ case g:
811
+ h = (b - r) / d + 2;
812
+ break;
813
+ case b:
814
+ h = (r - g) / d + 4;
815
+ break;
816
+ }
817
+ h /= 6;
818
+ }
819
+ return {
820
+ h: h,
821
+ s: s,
822
+ l: l
823
+ };
824
+ }
825
+
826
+ // `hslToRgb`
827
+ // Converts an HSL color value to RGB.
828
+ // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
829
+ // *Returns:* { r, g, b } in the set [0, 255]
830
+ function hslToRgb(h, s, l) {
831
+ var r, g, b;
832
+ h = bound01(h, 360);
833
+ s = bound01(s, 100);
834
+ l = bound01(l, 100);
835
+ function hue2rgb(p, q, t) {
836
+ if (t < 0) t += 1;
837
+ if (t > 1) t -= 1;
838
+ if (t < 1 / 6) return p + (q - p) * 6 * t;
839
+ if (t < 1 / 2) return q;
840
+ if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
841
+ return p;
842
+ }
843
+ if (s === 0) {
844
+ r = g = b = l; // achromatic
845
+ } else {
846
+ var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
847
+ var p = 2 * l - q;
848
+ r = hue2rgb(p, q, h + 1 / 3);
849
+ g = hue2rgb(p, q, h);
850
+ b = hue2rgb(p, q, h - 1 / 3);
851
+ }
852
+ return {
853
+ r: r * 255,
854
+ g: g * 255,
855
+ b: b * 255
856
+ };
857
+ }
858
+
859
+ // `rgbToHsv`
860
+ // Converts an RGB color value to HSV
861
+ // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
862
+ // *Returns:* { h, s, v } in [0,1]
863
+ function rgbToHsv(r, g, b) {
864
+ r = bound01(r, 255);
865
+ g = bound01(g, 255);
866
+ b = bound01(b, 255);
867
+ var max = mathMax(r, g, b),
868
+ min = mathMin(r, g, b);
869
+ var h,
870
+ s,
871
+ v = max;
872
+ var d = max - min;
873
+ s = max === 0 ? 0 : d / max;
874
+ if (max == min) {
875
+ h = 0; // achromatic
876
+ } else {
877
+ switch (max) {
878
+ case r:
879
+ h = (g - b) / d + (g < b ? 6 : 0);
880
+ break;
881
+ case g:
882
+ h = (b - r) / d + 2;
883
+ break;
884
+ case b:
885
+ h = (r - g) / d + 4;
886
+ break;
887
+ }
888
+ h /= 6;
889
+ }
890
+ return {
891
+ h: h,
892
+ s: s,
893
+ v: v
894
+ };
895
+ }
896
+
897
+ // `hsvToRgb`
898
+ // Converts an HSV color value to RGB.
899
+ // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
900
+ // *Returns:* { r, g, b } in the set [0, 255]
901
+ function hsvToRgb(h, s, v) {
902
+ h = bound01(h, 360) * 6;
903
+ s = bound01(s, 100);
904
+ v = bound01(v, 100);
905
+ var i = Math.floor(h),
906
+ f = h - i,
907
+ p = v * (1 - s),
908
+ q = v * (1 - f * s),
909
+ t = v * (1 - (1 - f) * s),
910
+ mod = i % 6,
911
+ r = [v, q, p, p, t, v][mod],
912
+ g = [t, v, v, q, p, p][mod],
913
+ b = [p, p, t, v, v, q][mod];
914
+ return {
915
+ r: r * 255,
916
+ g: g * 255,
917
+ b: b * 255
918
+ };
919
+ }
920
+
921
+ // `rgbToHex`
922
+ // Converts an RGB color to hex
923
+ // Assumes r, g, and b are contained in the set [0, 255]
924
+ // Returns a 3 or 6 character hex
925
+ function rgbToHex(r, g, b, allow3Char) {
926
+ var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];
927
+
928
+ // Return a 3 character hex if possible
929
+ if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
930
+ return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
931
+ }
932
+ return hex.join("");
933
+ }
934
+
935
+ // `rgbaToHex`
936
+ // Converts an RGBA color plus alpha transparency to hex
937
+ // Assumes r, g, b are contained in the set [0, 255] and
938
+ // a in [0, 1]. Returns a 4 or 8 character rgba hex
939
+ function rgbaToHex(r, g, b, a, allow4Char) {
940
+ var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16)), pad2(convertDecimalToHex(a))];
941
+
942
+ // Return a 4 character hex if possible
943
+ if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
944
+ return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
945
+ }
946
+ return hex.join("");
947
+ }
948
+
949
+ // `rgbaToArgbHex`
950
+ // Converts an RGBA color to an ARGB Hex8 string
951
+ // Rarely used, but required for "toFilter()"
952
+ function rgbaToArgbHex(r, g, b, a) {
953
+ var hex = [pad2(convertDecimalToHex(a)), pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];
954
+ return hex.join("");
955
+ }
956
+
957
+ // `equals`
958
+ // Can be called with any tinycolor input
959
+ tinycolor.equals = function (color1, color2) {
960
+ if (!color1 || !color2) {
961
+ return false;
962
+ }
963
+ return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
964
+ };
965
+ tinycolor.random = function () {
966
+ return tinycolor.fromRatio({
967
+ r: mathRandom(),
968
+ g: mathRandom(),
969
+ b: mathRandom()
970
+ });
971
+ };
972
+
973
+ // Modification Functions
974
+ // ----------------------
975
+ // Thanks to less.js for some of the basics here
976
+ // <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>
977
+
978
+ function _desaturate(color, amount) {
979
+ amount = amount === 0 ? 0 : amount || 10;
980
+ var hsl = tinycolor(color).toHsl();
981
+ hsl.s -= amount / 100;
982
+ hsl.s = clamp01(hsl.s);
983
+ return tinycolor(hsl);
984
+ }
985
+ function _saturate(color, amount) {
986
+ amount = amount === 0 ? 0 : amount || 10;
987
+ var hsl = tinycolor(color).toHsl();
988
+ hsl.s += amount / 100;
989
+ hsl.s = clamp01(hsl.s);
990
+ return tinycolor(hsl);
991
+ }
992
+ function _greyscale(color) {
993
+ return tinycolor(color).desaturate(100);
994
+ }
995
+ function _lighten(color, amount) {
996
+ amount = amount === 0 ? 0 : amount || 10;
997
+ var hsl = tinycolor(color).toHsl();
998
+ hsl.l += amount / 100;
999
+ hsl.l = clamp01(hsl.l);
1000
+ return tinycolor(hsl);
1001
+ }
1002
+ function _brighten(color, amount) {
1003
+ amount = amount === 0 ? 0 : amount || 10;
1004
+ var rgb = tinycolor(color).toRgb();
1005
+ rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * -(amount / 100))));
1006
+ rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * -(amount / 100))));
1007
+ rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * -(amount / 100))));
1008
+ return tinycolor(rgb);
1009
+ }
1010
+ function _darken(color, amount) {
1011
+ amount = amount === 0 ? 0 : amount || 10;
1012
+ var hsl = tinycolor(color).toHsl();
1013
+ hsl.l -= amount / 100;
1014
+ hsl.l = clamp01(hsl.l);
1015
+ return tinycolor(hsl);
1016
+ }
1017
+
1018
+ // Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
1019
+ // Values outside of this range will be wrapped into this range.
1020
+ function _spin(color, amount) {
1021
+ var hsl = tinycolor(color).toHsl();
1022
+ var hue = (hsl.h + amount) % 360;
1023
+ hsl.h = hue < 0 ? 360 + hue : hue;
1024
+ return tinycolor(hsl);
1025
+ }
1026
+
1027
+ // Combination Functions
1028
+ // ---------------------
1029
+ // Thanks to jQuery xColor for some of the ideas behind these
1030
+ // <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
1031
+
1032
+ function _complement(color) {
1033
+ var hsl = tinycolor(color).toHsl();
1034
+ hsl.h = (hsl.h + 180) % 360;
1035
+ return tinycolor(hsl);
1036
+ }
1037
+ function _triad(color) {
1038
+ var hsl = tinycolor(color).toHsl();
1039
+ var h = hsl.h;
1040
+ return [tinycolor(color), tinycolor({
1041
+ h: (h + 120) % 360,
1042
+ s: hsl.s,
1043
+ l: hsl.l
1044
+ }), tinycolor({
1045
+ h: (h + 240) % 360,
1046
+ s: hsl.s,
1047
+ l: hsl.l
1048
+ })];
1049
+ }
1050
+ function _tetrad(color) {
1051
+ var hsl = tinycolor(color).toHsl();
1052
+ var h = hsl.h;
1053
+ return [tinycolor(color), tinycolor({
1054
+ h: (h + 90) % 360,
1055
+ s: hsl.s,
1056
+ l: hsl.l
1057
+ }), tinycolor({
1058
+ h: (h + 180) % 360,
1059
+ s: hsl.s,
1060
+ l: hsl.l
1061
+ }), tinycolor({
1062
+ h: (h + 270) % 360,
1063
+ s: hsl.s,
1064
+ l: hsl.l
1065
+ })];
1066
+ }
1067
+ function _splitcomplement(color) {
1068
+ var hsl = tinycolor(color).toHsl();
1069
+ var h = hsl.h;
1070
+ return [tinycolor(color), tinycolor({
1071
+ h: (h + 72) % 360,
1072
+ s: hsl.s,
1073
+ l: hsl.l
1074
+ }), tinycolor({
1075
+ h: (h + 216) % 360,
1076
+ s: hsl.s,
1077
+ l: hsl.l
1078
+ })];
1079
+ }
1080
+ function _analogous(color, results, slices) {
1081
+ results = results || 6;
1082
+ slices = slices || 30;
1083
+ var hsl = tinycolor(color).toHsl();
1084
+ var part = 360 / slices;
1085
+ var ret = [tinycolor(color)];
1086
+ for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {
1087
+ hsl.h = (hsl.h + part) % 360;
1088
+ ret.push(tinycolor(hsl));
1089
+ }
1090
+ return ret;
1091
+ }
1092
+ function _monochromatic(color, results) {
1093
+ results = results || 6;
1094
+ var hsv = tinycolor(color).toHsv();
1095
+ var h = hsv.h,
1096
+ s = hsv.s,
1097
+ v = hsv.v;
1098
+ var ret = [];
1099
+ var modification = 1 / results;
1100
+ while (results--) {
1101
+ ret.push(tinycolor({
1102
+ h: h,
1103
+ s: s,
1104
+ v: v
1105
+ }));
1106
+ v = (v + modification) % 1;
1107
+ }
1108
+ return ret;
1109
+ }
1110
+
1111
+ // Utility Functions
1112
+ // ---------------------
1113
+
1114
+ tinycolor.mix = function (color1, color2, amount) {
1115
+ amount = amount === 0 ? 0 : amount || 50;
1116
+ var rgb1 = tinycolor(color1).toRgb();
1117
+ var rgb2 = tinycolor(color2).toRgb();
1118
+ var p = amount / 100;
1119
+ var rgba = {
1120
+ r: (rgb2.r - rgb1.r) * p + rgb1.r,
1121
+ g: (rgb2.g - rgb1.g) * p + rgb1.g,
1122
+ b: (rgb2.b - rgb1.b) * p + rgb1.b,
1123
+ a: (rgb2.a - rgb1.a) * p + rgb1.a
1124
+ };
1125
+ return tinycolor(rgba);
1126
+ };
1127
+
1128
+ // Readability Functions
1129
+ // ---------------------
1130
+ // <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)
1131
+
1132
+ // `contrast`
1133
+ // Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)
1134
+ tinycolor.readability = function (color1, color2) {
1135
+ var c1 = tinycolor(color1);
1136
+ var c2 = tinycolor(color2);
1137
+ return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);
1138
+ };
1139
+
1140
+ // `isReadable`
1141
+ // Ensure that foreground and background color combinations meet WCAG2 guidelines.
1142
+ // The third argument is an optional Object.
1143
+ // the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';
1144
+ // the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.
1145
+ // If the entire object is absent, isReadable defaults to {level:"AA",size:"small"}.
1146
+
1147
+ // *Example*
1148
+ // tinycolor.isReadable("#000", "#111") => false
1149
+ // tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false
1150
+ tinycolor.isReadable = function (color1, color2, wcag2) {
1151
+ var readability = tinycolor.readability(color1, color2);
1152
+ var wcag2Parms, out;
1153
+ out = false;
1154
+ wcag2Parms = validateWCAG2Parms(wcag2);
1155
+ switch (wcag2Parms.level + wcag2Parms.size) {
1156
+ case "AAsmall":
1157
+ case "AAAlarge":
1158
+ out = readability >= 4.5;
1159
+ break;
1160
+ case "AAlarge":
1161
+ out = readability >= 3;
1162
+ break;
1163
+ case "AAAsmall":
1164
+ out = readability >= 7;
1165
+ break;
1166
+ }
1167
+ return out;
1168
+ };
1169
+
1170
+ // `mostReadable`
1171
+ // Given a base color and a list of possible foreground or background
1172
+ // colors for that base, returns the most readable color.
1173
+ // Optionally returns Black or White if the most readable color is unreadable.
1174
+ // *Example*
1175
+ // tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255"
1176
+ // tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff"
1177
+ // tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3"
1178
+ // tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff"
1179
+ tinycolor.mostReadable = function (baseColor, colorList, args) {
1180
+ var bestColor = null;
1181
+ var bestScore = 0;
1182
+ var readability;
1183
+ var includeFallbackColors, level, size;
1184
+ args = args || {};
1185
+ includeFallbackColors = args.includeFallbackColors;
1186
+ level = args.level;
1187
+ size = args.size;
1188
+ for (var i = 0; i < colorList.length; i++) {
1189
+ readability = tinycolor.readability(baseColor, colorList[i]);
1190
+ if (readability > bestScore) {
1191
+ bestScore = readability;
1192
+ bestColor = tinycolor(colorList[i]);
1193
+ }
1194
+ }
1195
+ if (tinycolor.isReadable(baseColor, bestColor, {
1196
+ "level": level,
1197
+ "size": size
1198
+ }) || !includeFallbackColors) {
1199
+ return bestColor;
1200
+ } else {
1201
+ args.includeFallbackColors = false;
1202
+ return tinycolor.mostReadable(baseColor, ["#fff", "#000"], args);
1203
+ }
1204
+ };
1205
+
1206
+ // Big List of Colors
1207
+ // ------------------
1208
+ // <http://www.w3.org/TR/css3-color/#svg-color>
1209
+ var names = tinycolor.names = {
1210
+ aliceblue: "f0f8ff",
1211
+ antiquewhite: "faebd7",
1212
+ aqua: "0ff",
1213
+ aquamarine: "7fffd4",
1214
+ azure: "f0ffff",
1215
+ beige: "f5f5dc",
1216
+ bisque: "ffe4c4",
1217
+ black: "000",
1218
+ blanchedalmond: "ffebcd",
1219
+ blue: "00f",
1220
+ blueviolet: "8a2be2",
1221
+ brown: "a52a2a",
1222
+ burlywood: "deb887",
1223
+ burntsienna: "ea7e5d",
1224
+ cadetblue: "5f9ea0",
1225
+ chartreuse: "7fff00",
1226
+ chocolate: "d2691e",
1227
+ coral: "ff7f50",
1228
+ cornflowerblue: "6495ed",
1229
+ cornsilk: "fff8dc",
1230
+ crimson: "dc143c",
1231
+ cyan: "0ff",
1232
+ darkblue: "00008b",
1233
+ darkcyan: "008b8b",
1234
+ darkgoldenrod: "b8860b",
1235
+ darkgray: "a9a9a9",
1236
+ darkgreen: "006400",
1237
+ darkgrey: "a9a9a9",
1238
+ darkkhaki: "bdb76b",
1239
+ darkmagenta: "8b008b",
1240
+ darkolivegreen: "556b2f",
1241
+ darkorange: "ff8c00",
1242
+ darkorchid: "9932cc",
1243
+ darkred: "8b0000",
1244
+ darksalmon: "e9967a",
1245
+ darkseagreen: "8fbc8f",
1246
+ darkslateblue: "483d8b",
1247
+ darkslategray: "2f4f4f",
1248
+ darkslategrey: "2f4f4f",
1249
+ darkturquoise: "00ced1",
1250
+ darkviolet: "9400d3",
1251
+ deeppink: "ff1493",
1252
+ deepskyblue: "00bfff",
1253
+ dimgray: "696969",
1254
+ dimgrey: "696969",
1255
+ dodgerblue: "1e90ff",
1256
+ firebrick: "b22222",
1257
+ floralwhite: "fffaf0",
1258
+ forestgreen: "228b22",
1259
+ fuchsia: "f0f",
1260
+ gainsboro: "dcdcdc",
1261
+ ghostwhite: "f8f8ff",
1262
+ gold: "ffd700",
1263
+ goldenrod: "daa520",
1264
+ gray: "808080",
1265
+ green: "008000",
1266
+ greenyellow: "adff2f",
1267
+ grey: "808080",
1268
+ honeydew: "f0fff0",
1269
+ hotpink: "ff69b4",
1270
+ indianred: "cd5c5c",
1271
+ indigo: "4b0082",
1272
+ ivory: "fffff0",
1273
+ khaki: "f0e68c",
1274
+ lavender: "e6e6fa",
1275
+ lavenderblush: "fff0f5",
1276
+ lawngreen: "7cfc00",
1277
+ lemonchiffon: "fffacd",
1278
+ lightblue: "add8e6",
1279
+ lightcoral: "f08080",
1280
+ lightcyan: "e0ffff",
1281
+ lightgoldenrodyellow: "fafad2",
1282
+ lightgray: "d3d3d3",
1283
+ lightgreen: "90ee90",
1284
+ lightgrey: "d3d3d3",
1285
+ lightpink: "ffb6c1",
1286
+ lightsalmon: "ffa07a",
1287
+ lightseagreen: "20b2aa",
1288
+ lightskyblue: "87cefa",
1289
+ lightslategray: "789",
1290
+ lightslategrey: "789",
1291
+ lightsteelblue: "b0c4de",
1292
+ lightyellow: "ffffe0",
1293
+ lime: "0f0",
1294
+ limegreen: "32cd32",
1295
+ linen: "faf0e6",
1296
+ magenta: "f0f",
1297
+ maroon: "800000",
1298
+ mediumaquamarine: "66cdaa",
1299
+ mediumblue: "0000cd",
1300
+ mediumorchid: "ba55d3",
1301
+ mediumpurple: "9370db",
1302
+ mediumseagreen: "3cb371",
1303
+ mediumslateblue: "7b68ee",
1304
+ mediumspringgreen: "00fa9a",
1305
+ mediumturquoise: "48d1cc",
1306
+ mediumvioletred: "c71585",
1307
+ midnightblue: "191970",
1308
+ mintcream: "f5fffa",
1309
+ mistyrose: "ffe4e1",
1310
+ moccasin: "ffe4b5",
1311
+ navajowhite: "ffdead",
1312
+ navy: "000080",
1313
+ oldlace: "fdf5e6",
1314
+ olive: "808000",
1315
+ olivedrab: "6b8e23",
1316
+ orange: "ffa500",
1317
+ orangered: "ff4500",
1318
+ orchid: "da70d6",
1319
+ palegoldenrod: "eee8aa",
1320
+ palegreen: "98fb98",
1321
+ paleturquoise: "afeeee",
1322
+ palevioletred: "db7093",
1323
+ papayawhip: "ffefd5",
1324
+ peachpuff: "ffdab9",
1325
+ peru: "cd853f",
1326
+ pink: "ffc0cb",
1327
+ plum: "dda0dd",
1328
+ powderblue: "b0e0e6",
1329
+ purple: "800080",
1330
+ rebeccapurple: "663399",
1331
+ red: "f00",
1332
+ rosybrown: "bc8f8f",
1333
+ royalblue: "4169e1",
1334
+ saddlebrown: "8b4513",
1335
+ salmon: "fa8072",
1336
+ sandybrown: "f4a460",
1337
+ seagreen: "2e8b57",
1338
+ seashell: "fff5ee",
1339
+ sienna: "a0522d",
1340
+ silver: "c0c0c0",
1341
+ skyblue: "87ceeb",
1342
+ slateblue: "6a5acd",
1343
+ slategray: "708090",
1344
+ slategrey: "708090",
1345
+ snow: "fffafa",
1346
+ springgreen: "00ff7f",
1347
+ steelblue: "4682b4",
1348
+ tan: "d2b48c",
1349
+ teal: "008080",
1350
+ thistle: "d8bfd8",
1351
+ tomato: "ff6347",
1352
+ turquoise: "40e0d0",
1353
+ violet: "ee82ee",
1354
+ wheat: "f5deb3",
1355
+ white: "fff",
1356
+ whitesmoke: "f5f5f5",
1357
+ yellow: "ff0",
1358
+ yellowgreen: "9acd32"
1359
+ };
1360
+
1361
+ // Make it easy to access colors via `hexNames[hex]`
1362
+ var hexNames = tinycolor.hexNames = flip(names);
1363
+
1364
+ // Utilities
1365
+ // ---------
1366
+
1367
+ // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
1368
+ function flip(o) {
1369
+ var flipped = {};
1370
+ for (var i in o) {
1371
+ if (o.hasOwnProperty(i)) {
1372
+ flipped[o[i]] = i;
1373
+ }
1374
+ }
1375
+ return flipped;
1376
+ }
1377
+
1378
+ // Return a valid alpha value [0,1] with all invalid values being set to 1
1379
+ function boundAlpha(a) {
1380
+ a = parseFloat(a);
1381
+ if (isNaN(a) || a < 0 || a > 1) {
1382
+ a = 1;
1383
+ }
1384
+ return a;
1385
+ }
1386
+
1387
+ // Take input from [0, n] and return it as [0, 1]
1388
+ function bound01(n, max) {
1389
+ if (isOnePointZero(n)) {
1390
+ n = "100%";
1391
+ }
1392
+ var processPercent = isPercentage(n);
1393
+ n = mathMin(max, mathMax(0, parseFloat(n)));
1394
+
1395
+ // Automatically convert percentage into number
1396
+ if (processPercent) {
1397
+ n = parseInt(n * max, 10) / 100;
1398
+ }
1399
+
1400
+ // Handle floating point rounding errors
1401
+ if (Math.abs(n - max) < 0.000001) {
1402
+ return 1;
1403
+ }
1404
+
1405
+ // Convert into [0, 1] range if it isn't already
1406
+ return n % max / parseFloat(max);
1407
+ }
1408
+
1409
+ // Force a number between 0 and 1
1410
+ function clamp01(val) {
1411
+ return mathMin(1, mathMax(0, val));
1412
+ }
1413
+
1414
+ // Parse a base-16 hex value into a base-10 integer
1415
+ function parseIntFromHex(val) {
1416
+ return parseInt(val, 16);
1417
+ }
1418
+
1419
+ // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
1420
+ // <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
1421
+ function isOnePointZero(n) {
1422
+ return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
1423
+ }
1424
+
1425
+ // Check to see if string passed in is a percentage
1426
+ function isPercentage(n) {
1427
+ return typeof n === "string" && n.indexOf('%') != -1;
1428
+ }
1429
+
1430
+ // Force a hex value to have 2 characters
1431
+ function pad2(c) {
1432
+ return c.length == 1 ? '0' + c : '' + c;
1433
+ }
1434
+
1435
+ // Replace a decimal with it's percentage value
1436
+ function convertToPercentage(n) {
1437
+ if (n <= 1) {
1438
+ n = n * 100 + "%";
1439
+ }
1440
+ return n;
1441
+ }
1442
+
1443
+ // Converts a decimal to a hex value
1444
+ function convertDecimalToHex(d) {
1445
+ return Math.round(parseFloat(d) * 255).toString(16);
1446
+ }
1447
+ // Converts a hex value to a decimal
1448
+ function convertHexToDecimal(h) {
1449
+ return parseIntFromHex(h) / 255;
1450
+ }
1451
+ var matchers = function () {
1452
+ // <http://www.w3.org/TR/css3-values/#integers>
1453
+ var CSS_INTEGER = "[-\\+]?\\d+%?";
1454
+
1455
+ // <http://www.w3.org/TR/css3-values/#number-value>
1456
+ var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
1457
+
1458
+ // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
1459
+ var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
1460
+
1461
+ // Actual matching.
1462
+ // Parentheses and commas are optional, but not required.
1463
+ // Whitespace can take the place of commas or opening paren
1464
+ var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
1465
+ var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
1466
+ return {
1467
+ CSS_UNIT: new RegExp(CSS_UNIT),
1468
+ rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
1469
+ rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
1470
+ hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
1471
+ hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
1472
+ hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
1473
+ hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
1474
+ hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
1475
+ hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
1476
+ hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
1477
+ hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
1478
+ };
1479
+ }();
1480
+
1481
+ // `isValidCSSUnit`
1482
+ // Take in a single string / number and check to see if it looks like a CSS unit
1483
+ // (see `matchers` above for definition).
1484
+ function isValidCSSUnit(color) {
1485
+ return !!matchers.CSS_UNIT.exec(color);
1486
+ }
1487
+
1488
+ // `stringInputToObject`
1489
+ // Permissive string parsing. Take in a number of formats, and output an object
1490
+ // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
1491
+ function stringInputToObject(color) {
1492
+ color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();
1493
+ var named = false;
1494
+ if (names[color]) {
1495
+ color = names[color];
1496
+ named = true;
1497
+ } else if (color == 'transparent') {
1498
+ return {
1499
+ r: 0,
1500
+ g: 0,
1501
+ b: 0,
1502
+ a: 0,
1503
+ format: "name"
1504
+ };
1505
+ }
1506
+
1507
+ // Try to match string input using regular expressions.
1508
+ // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
1509
+ // Just return an object and let the conversion functions handle that.
1510
+ // This way the result will be the same whether the tinycolor is initialized with string or object.
1511
+ var match;
1512
+ if (match = matchers.rgb.exec(color)) {
1513
+ return {
1514
+ r: match[1],
1515
+ g: match[2],
1516
+ b: match[3]
1517
+ };
1518
+ }
1519
+ if (match = matchers.rgba.exec(color)) {
1520
+ return {
1521
+ r: match[1],
1522
+ g: match[2],
1523
+ b: match[3],
1524
+ a: match[4]
1525
+ };
1526
+ }
1527
+ if (match = matchers.hsl.exec(color)) {
1528
+ return {
1529
+ h: match[1],
1530
+ s: match[2],
1531
+ l: match[3]
1532
+ };
1533
+ }
1534
+ if (match = matchers.hsla.exec(color)) {
1535
+ return {
1536
+ h: match[1],
1537
+ s: match[2],
1538
+ l: match[3],
1539
+ a: match[4]
1540
+ };
1541
+ }
1542
+ if (match = matchers.hsv.exec(color)) {
1543
+ return {
1544
+ h: match[1],
1545
+ s: match[2],
1546
+ v: match[3]
1547
+ };
1548
+ }
1549
+ if (match = matchers.hsva.exec(color)) {
1550
+ return {
1551
+ h: match[1],
1552
+ s: match[2],
1553
+ v: match[3],
1554
+ a: match[4]
1555
+ };
1556
+ }
1557
+ if (match = matchers.hex8.exec(color)) {
1558
+ return {
1559
+ r: parseIntFromHex(match[1]),
1560
+ g: parseIntFromHex(match[2]),
1561
+ b: parseIntFromHex(match[3]),
1562
+ a: convertHexToDecimal(match[4]),
1563
+ format: named ? "name" : "hex8"
1564
+ };
1565
+ }
1566
+ if (match = matchers.hex6.exec(color)) {
1567
+ return {
1568
+ r: parseIntFromHex(match[1]),
1569
+ g: parseIntFromHex(match[2]),
1570
+ b: parseIntFromHex(match[3]),
1571
+ format: named ? "name" : "hex"
1572
+ };
1573
+ }
1574
+ if (match = matchers.hex4.exec(color)) {
1575
+ return {
1576
+ r: parseIntFromHex(match[1] + '' + match[1]),
1577
+ g: parseIntFromHex(match[2] + '' + match[2]),
1578
+ b: parseIntFromHex(match[3] + '' + match[3]),
1579
+ a: convertHexToDecimal(match[4] + '' + match[4]),
1580
+ format: named ? "name" : "hex8"
1581
+ };
1582
+ }
1583
+ if (match = matchers.hex3.exec(color)) {
1584
+ return {
1585
+ r: parseIntFromHex(match[1] + '' + match[1]),
1586
+ g: parseIntFromHex(match[2] + '' + match[2]),
1587
+ b: parseIntFromHex(match[3] + '' + match[3]),
1588
+ format: named ? "name" : "hex"
1589
+ };
1590
+ }
1591
+ return false;
1592
+ }
1593
+ function validateWCAG2Parms(parms) {
1594
+ // return valid WCAG2 parms for isReadable.
1595
+ // If input parms are invalid, return {"level":"AA", "size":"small"}
1596
+ var level, size;
1597
+ parms = parms || {
1598
+ "level": "AA",
1599
+ "size": "small"
1600
+ };
1601
+ level = (parms.level || "AA").toUpperCase();
1602
+ size = (parms.size || "small").toLowerCase();
1603
+ if (level !== "AA" && level !== "AAA") {
1604
+ level = "AA";
1605
+ }
1606
+ if (size !== "small" && size !== "large") {
1607
+ size = "small";
1608
+ }
1609
+ return {
1610
+ "level": level,
1611
+ "size": size
1612
+ };
1613
+ }
1614
+
1615
+ /*// Node: Export function
1616
+ if (typeof module !== "undefined" && module.exports) {
1617
+ module.exports = tinycolor;
1618
+ }
1619
+ // AMD/requirejs: Define the module
1620
+ else if (typeof define === 'function' && define.amd) {
1621
+ define(function () {return tinycolor;});
1622
+ }
1623
+ // Browser: Expose to window
1624
+ else {
1625
+ window.tinycolor = tinycolor;
1626
+ }*/
1627
+
1628
+ return tinycolor;
1629
+ }(Math);
1630
+ /* harmony default export */ __webpack_exports__["default"] = (tinycolor);
1631
+
1632
+ /***/ })
1633
+
1634
+ }]);
1635
+ //# sourceMappingURL=addon-entry-2d-color-picker.js.map
js/addon-entry-2d-color-picker.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-2d-color-picker.js","sources":["webpack://GUI/./src/addons/addons/2d-color-picker/style.css","webpack://GUI/./src/addons/addons/2d-color-picker/assets/sv-gr.png","webpack://GUI/./src/addons/addons/2d-color-picker/_runtime_entry.js","webpack://GUI/./src/addons/addons/2d-color-picker/paint-editor.js","webpack://GUI/./src/addons/addons/2d-color-picker/userscript.js","webpack://GUI/./src/addons/libraries/common/cs/normalize-color.js","webpack://GUI/./src/addons/libraries/common/cs/rate-limiter.js","webpack://GUI/./src/addons/libraries/thirdparty/cs/tinycolor-min.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".sa-2dcolor-picker {\\n width: 150px;\\n height: 150px;\\n border-radius: 8px;\\n margin: 8px;\\n position: relative;\\n user-select: none;\\n}\\n\\n.sa-2dcolor-picker-image {\\n border-radius: 8px;\\n width: 150px;\\n height: 150px;\\n user-select: none;\\n}\\n\", \"\"]);\n\n// exports\n","export default \"data:image/png;base64,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\"","/* generated by pull.js */\nimport _js from \"./userscript.js\";\nimport _css from \"!css-loader!./style.css\";\nimport _asset from \"!url-loader!./assets/sv-gr.png\";\nexport const resources = {\n \"userscript.js\": _js,\n \"style.css\": _css,\n \"assets/sv-gr.png\": _asset,\n};\n","// this script was happily stolen from the color-picker addon, developed by Richie Bendall and apple502j\n\n// import required libraries\nimport { normalizeHex } from \"../../libraries/common/cs/normalize-color.js\";\nimport RateLimiter from \"../../libraries/common/cs/rate-limiter.js\";\nimport tinycolor from \"../../libraries/thirdparty/cs/tinycolor-min.js\";\n\nexport default async ({ addon, console, msg }) => {\n let prevEventHandler;\n // 250-ms rate limit\n const rateLimiter = new RateLimiter(250);\n\n // get the color from scratch\n const getColor = (element) => {\n let fillOrStroke;\n const state = addon.tab.redux.state;\n if (state.scratchPaint.modals.fillColor) {\n fillOrStroke = \"fill\";\n } else if (state.scratchPaint.modals.strokeColor) {\n fillOrStroke = \"stroke\";\n } else {\n return;\n }\n const colorType = state.scratchPaint.fillMode.colorIndex;\n const primaryOrSecondary = [\"primary\", \"secondary\"][colorType];\n const color = state.scratchPaint.color[`${fillOrStroke}Color`][primaryOrSecondary];\n if (color === null || color === \"scratch-paint/style-path/mixed\") return;\n // This value can be arbitrary - it can be HEX, RGB, etc.\n // Use tinycolor to convert them.\n return tinycolor(color).toHex8();\n };\n\n // load the new color to scratch\n const setColor = (hex, element) => {\n hex = normalizeHex(hex);\n if (!addon.tab.redux.state || !addon.tab.redux.state.scratchPaint) return;\n // The only way to reliably set color is to invoke eye dropper via click()\n // then faking that the eye dropper reported the value.\n const onEyeDropperOpened = ({ detail }) => {\n if (detail.action.type !== \"scratch-paint/eye-dropper/ACTIVATE_COLOR_PICKER\") return;\n addon.tab.redux.removeEventListener(\"statechanged\", onEyeDropperOpened);\n setTimeout(() => {\n const previousTool = addon.tab.redux.state.scratchPaint.color.eyeDropper.previousTool;\n if (previousTool) previousTool.activate();\n addon.tab.redux.state.scratchPaint.color.eyeDropper.callback(hex);\n addon.tab.redux.dispatch({\n type: \"scratch-paint/eye-dropper/DEACTIVATE_COLOR_PICKER\",\n });\n }, 50);\n };\n addon.tab.redux.addEventListener(\"statechanged\", onEyeDropperOpened);\n element.children[1].children[0].click();\n };\n\n // for the color picker's background color\n const convertToGeneralColor = (hex) => {\n let h = tinycolor(hex).toHsv();\n h.s = 1;\n h.v = 1;\n return tinycolor(h).toHex();\n };\n\n // le loop\n while (true) {\n // wait for color dialog box appearance\n const element = await addon.tab.waitForElement('div[class*=\"color-picker_swatch-row\"]', {\n markAsSeen: true,\n reduxCondition: (state) => state.scratchGui.editorTab.activeTabIndex === 1 && !state.scratchGui.mode.isPlayerOnly,\n });\n rateLimiter.abort(false);\n if (!(\"colorIndex\" in addon.tab.redux.state.scratchPaint.fillMode)) {\n console.error(\"Detected new paint editor; this will be supported in future versions.\");\n return;\n }\n\n // update the bg color of the picker\n function updateColor() {\n rateLimiter.limit(() => {\n let c = getColor(element);\n let chsv = tinycolor(c).toHsv();\n updateHandleFinal(chsv.s, chsv.v);\n saColorPicker.style.background = \"#\" + convertToGeneralColor(getColor(element));\n });\n }\n\n // redux stuff\n addon.tab.redux.initialize();\n addon.tab.redux.addEventListener(\"statechanged\", (e) =>\n e.detail.action.type === \"scratch-paint/fill-style/CHANGE_FILL_COLOR\" ||\n e.detail.action.type === \"scratch-paint/fill-style/CHANGE_FILL_COLOR_2\" ||\n e.detail.action.type === \"scratch-paint/stroke-style/CHANGE_STROKE_COLOR\" ||\n e.detail.action.type === \"scratch-paint/stroke-style/CHANGE_STROKE_COLOR_2\"\n ? updateColor()\n : 0\n );\n if (addon.tab.redux && typeof prevEventHandler === \"function\") {\n addon.tab.redux.removeEventListener(\"statechanged\", prevEventHandler);\n prevEventHandler = null;\n }\n\n // get the color\n if (addon.tab.editorMode !== \"editor\") continue;\n let defaultColor = getColor(element);\n\n // create the color picker element and all it's child elements\n const saColorPicker = document.createElement(\"div\");\n saColorPicker.className = \"sa-2dcolor-picker\";\n saColorPicker.style.background = \"#\" + convertToGeneralColor(defaultColor || \"ff0000\");\n\n const saColorPickerImage = Object.assign(document.createElement(\"img\"), {\n className: \"sa-2dcolor-picker-image\",\n src: addon.self.getResource(\"/assets/sv-gr.png\") /* rewritten by pull.js */,\n draggable: false,\n });\n const saColorPickerHandle = Object.assign(document.createElement(\"div\"), {\n className: addon.tab.scratchClass(\"slider_handle\"),\n });\n saColorPickerHandle.style.pointerEvents = \"none\";\n\n // create the label\n const saColorLabel = document.createElement(\"div\");\n saColorLabel.className = addon.tab.scratchClass(\"color-picker_row-header\", { others: \"sa-2dcolor-label\" });\n const saColorLabelName = document.createElement(\"span\");\n saColorLabelName.className = addon.tab.scratchClass(\"color-picker_label-name\", { others: \"sa-2dcolor-label-name\" });\n saColorLabelName.innerText = msg(\"shade\");\n const saColorLabelVal = document.createElement(\"span\");\n saColorLabelVal.className = addon.tab.scratchClass(\"color-picker_label-readout\", {\n others: \"sa-2dcolor-label-val\",\n });\n saColorLabel.appendChild(saColorLabelName);\n saColorLabel.appendChild(saColorLabelVal);\n\n let keyPressed = -1;\n let originalPos = { x: 0, y: 0 };\n window.addEventListener(\"keydown\", (e) => (keyPressed = e.keyCode));\n window.addEventListener(\"keyup\", () => (keyPressed = -1));\n\n let origHue = 0;\n let el = null;\n\n let mousemovefunc = function (e) {\n updateHandle(e, keyPressed, originalPos);\n return false;\n };\n\n let mouseupfunc = function (e) {\n updateFinal(e, keyPressed, originalPos);\n };\n\n function updateHandle(e, keyPressed, originalPos) {\n let cx = Math.min(Math.max(e.clientX - saColorPicker.getBoundingClientRect().x, 0), 150);\n let cy = Math.min(Math.max(e.clientY - saColorPicker.getBoundingClientRect().y, 0), 150);\n if (keyPressed === 16) {\n if (Math.abs(cx - originalPos.x) > Math.abs(cy - originalPos.y)) cy = originalPos.y;\n else cx = originalPos.x;\n }\n saColorPickerHandle.style.left = cx - 8 + \"px\";\n saColorPickerHandle.style.top = cy - 8 + \"px\";\n saColorLabelVal.innerText = `${Math.round((cx / 150) * 100)}, ${100 - Math.round((cy / 150) * 100)}`;\n\n //update color in real-time (i only bothered to do that for solid colors)\n if (\n (!addon.tab.redux.state.scratchPaint.fillMode.gradientType ||\n addon.tab.redux.state.scratchPaint.fillMode.gradientType === \"SOLID\") &&\n el\n ) {\n let c = tinycolor({ h: origHue, s: cx / 150, v: 1 - cy / 150 }).toHex();\n if (c.startsWith(\"#\")) el.style.background = c;\n else el.style.background = \"#\" + c;\n }\n }\n\n function updateHandleFinal(s, v) {\n saColorPickerHandle.style.left = s * 150 - 8 + \"px\";\n saColorPickerHandle.style.top = (1 - v) * 150 - 8 + \"px\";\n saColorLabelVal.innerText = `${Math.round(s * 100)}, ${Math.round(v * 100)}`;\n }\n\n function updateFinal(e, keyPressed, originalPos) {\n rateLimiter.limit(() => {\n let ox = Math.min(Math.max(e.clientX - saColorPicker.getBoundingClientRect().x, 0), 150);\n let oy = Math.min(Math.max(e.clientY - saColorPicker.getBoundingClientRect().y, 0), 150);\n if (keyPressed === 16) {\n if (Math.abs(ox - originalPos.x) > Math.abs(oy - originalPos.y)) oy = originalPos.y;\n else ox = originalPos.x;\n }\n\n let color = tinycolor(getColor(element)).toHsv();\n let s = ox / 150;\n let v = 1 - oy / 150;\n let newColor = tinycolor({ h: color.h, s: s, v: v, a: color.a }).toHex8();\n setColor(newColor, element);\n updateHandleFinal(s, v);\n });\n\n window.removeEventListener(\"pointermove\", mousemovefunc);\n window.removeEventListener(\"pointerup\", mouseupfunc);\n }\n\n if (defaultColor) {\n let defaultHexColor = tinycolor(defaultColor).toHsv();\n updateHandleFinal(defaultHexColor.s, defaultHexColor.v);\n } else updateHandleFinal(1, 1);\n\n saColorPicker.addEventListener(\"pointerdown\", (e) => {\n e.preventDefault();\n\n originalPos = {\n x: parseFloat(saColorPickerHandle.style.left) + 8,\n y: parseFloat(saColorPickerHandle.style.top) + 8,\n };\n\n let fillOrStroke;\n const state = addon.tab.redux.state;\n if (state.scratchPaint.modals.fillColor) {\n fillOrStroke = \"fill\";\n } else if (state.scratchPaint.modals.strokeColor) {\n fillOrStroke = \"stroke\";\n } else {\n fillOrStroke = \"wh\";\n }\n\n el = null;\n if (fillOrStroke === \"fill\")\n el = document.getElementsByClassName(addon.tab.scratchClass(\"color-button_color-button-swatch\"))[0];\n else if (fillOrStroke === \"stroke\")\n el = document.getElementsByClassName(addon.tab.scratchClass(\"color-button_color-button-swatch\"))[1];\n if (el) origHue = tinycolor(el.style.background).toHsv().h;\n\n updateHandle(e);\n\n window.addEventListener(\"pointermove\", mousemovefunc);\n window.addEventListener(\"pointerup\", mouseupfunc);\n });\n prevEventHandler = ({ detail }) => {\n if (detail.action.type === \"scratch-paint/color-index/CHANGE_COLOR_INDEX\") {\n setTimeout(() => {\n updateColor();\n }, 100);\n }\n };\n addon.tab.redux.addEventListener(\"statechanged\", prevEventHandler);\n saColorPicker.appendChild(saColorPickerImage);\n saColorPicker.appendChild(saColorPickerHandle);\n\n const [colorSlider, saturationSlider, brightnessSlider] = [\n ...element.parentElement.querySelectorAll('[class^=\"color-picker_row-header\"]'),\n ].map((i) => i.parentElement);\n saturationSlider.style.display = \"none\";\n brightnessSlider.style.display = \"none\";\n colorSlider.insertAdjacentElement(\"afterend\", saColorPicker);\n colorSlider.insertAdjacentElement(\"afterend\", saColorLabel);\n }\n};\n","import paintEditorHandler from \"./paint-editor.js\";\n\nexport default async (api) => {\n paintEditorHandler(api);\n};\n","export const getHexRegex = () => /^#?[0-9a-fA-F]{3,8}$/;\n\nexport const normalizeHex = (input) => {\n let hex = String(input);\n if (!getHexRegex().test(hex)) return \"#000000\";\n if (!hex.startsWith(\"#\")) hex = `#${hex}`;\n if (hex.length === 4) {\n const [_, r, g, b] = hex;\n hex = `#${r}${r}${g}${g}${b}${b}`;\n }\n return hex.toLowerCase();\n};\n","export default class RateLimiter {\n constructor(wait) {\n this.timeout = null;\n this.callback = null;\n this.wait = wait;\n }\n\n abort(call = true) {\n if (this.timeout) {\n clearTimeout(this.timeout);\n if (call) this.callback();\n this.timeout = this.callback = null;\n }\n }\n\n limit(callback) {\n this.abort(false);\n this.callback = callback;\n this.timeout = setTimeout(() => {\n this.timeout = this.callback = null;\n callback();\n }, this.wait);\n }\n}\n","// TinyColor v1.4.2\n// https://github.com/bgrins/TinyColor\n// Brian Grinstead, MIT License\n// Modified to use ES6 export\n\nconst tinycolor = (function(Math) {\n\nvar trimLeft = /^\\s+/,\n trimRight = /\\s+$/,\n tinyCounter = 0,\n mathRound = Math.round,\n mathMin = Math.min,\n mathMax = Math.max,\n mathRandom = Math.random;\n\nfunction tinycolor (color, opts) {\n\n color = (color) ? color : '';\n opts = opts || { };\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n\n var rgb = inputToRGB(color);\n this._originalInput = color,\n this._r = rgb.r,\n this._g = rgb.g,\n this._b = rgb.b,\n this._a = rgb.a,\n this._roundA = mathRound(100*this._a) / 100,\n this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this._r < 1) { this._r = mathRound(this._r); }\n if (this._g < 1) { this._g = mathRound(this._g); }\n if (this._b < 1) { this._b = mathRound(this._b); }\n\n this._ok = rgb.ok;\n this._tc_id = tinyCounter++;\n}\n\ntinycolor.prototype = {\n isDark: function() {\n return this.getBrightness() < 128;\n },\n isLight: function() {\n return !this.isDark();\n },\n isValid: function() {\n return this._ok;\n },\n getOriginalInput: function() {\n return this._originalInput;\n },\n getFormat: function() {\n return this._format;\n },\n getAlpha: function() {\n return this._a;\n },\n getBrightness: function() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r/255;\n GsRGB = rgb.g/255;\n BsRGB = rgb.b/255;\n\n if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);}\n if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);}\n if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);}\n return (0.2126 * R) + (0.7152 * G) + (0.0722 * B);\n },\n setAlpha: function(value) {\n this._a = boundAlpha(value);\n this._roundA = mathRound(100*this._a) / 100;\n return this;\n },\n toHsv: function() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };\n },\n toHsvString: function() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);\n return (this._a == 1) ?\n \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" :\n \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \"+ this._roundA + \")\";\n },\n toHsl: function() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };\n },\n toHslString: function() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);\n return (this._a == 1) ?\n \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" :\n \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \"+ this._roundA + \")\";\n },\n toHex: function(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function(allow3Char) {\n return '#' + this.toHex(allow3Char);\n },\n toHex8: function(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function(allow4Char) {\n return '#' + this.toHex8(allow4Char);\n },\n toRgb: function() {\n return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };\n },\n toRgbString: function() {\n return (this._a == 1) ?\n \"rgb(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \")\" :\n \"rgba(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \", \" + this._roundA + \")\";\n },\n toPercentageRgb: function() {\n return { r: mathRound(bound01(this._r, 255) * 100) + \"%\", g: mathRound(bound01(this._g, 255) * 100) + \"%\", b: mathRound(bound01(this._b, 255) * 100) + \"%\", a: this._a };\n },\n toPercentageRgbString: function() {\n return (this._a == 1) ?\n \"rgb(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%)\" :\n \"rgba(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n },\n toName: function() {\n if (this._a === 0) {\n return \"transparent\";\n }\n\n if (this._a < 1) {\n return false;\n }\n\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function(secondColor) {\n var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n\n return \"progid:DXImageTransform.Microsoft.gradient(\"+gradientType+\"startColorstr=\"+hex8String+\",endColorstr=\"+secondHex8String+\")\";\n },\n toString: function(format) {\n var formatSet = !!format;\n format = format || this._format;\n\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === \"name\" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === \"rgb\") {\n formattedString = this.toRgbString();\n }\n if (format === \"prgb\") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === \"hex\" || format === \"hex6\") {\n formattedString = this.toHexString();\n }\n if (format === \"hex3\") {\n formattedString = this.toHexString(true);\n }\n if (format === \"hex4\") {\n formattedString = this.toHex8String(true);\n }\n if (format === \"hex8\") {\n formattedString = this.toHex8String();\n }\n if (format === \"name\") {\n formattedString = this.toName();\n }\n if (format === \"hsl\") {\n formattedString = this.toHslString();\n }\n if (format === \"hsv\") {\n formattedString = this.toHsvString();\n }\n\n return formattedString || this.toHexString();\n },\n clone: function() {\n return tinycolor(this.toString());\n },\n\n _applyModification: function(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function() {\n return this._applyModification(lighten, arguments);\n },\n brighten: function() {\n return this._applyModification(brighten, arguments);\n },\n darken: function() {\n return this._applyModification(darken, arguments);\n },\n desaturate: function() {\n return this._applyModification(desaturate, arguments);\n },\n saturate: function() {\n return this._applyModification(saturate, arguments);\n },\n greyscale: function() {\n return this._applyModification(greyscale, arguments);\n },\n spin: function() {\n return this._applyModification(spin, arguments);\n },\n\n _applyCombination: function(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function() {\n return this._applyCombination(analogous, arguments);\n },\n complement: function() {\n return this._applyCombination(complement, arguments);\n },\n monochromatic: function() {\n return this._applyCombination(monochromatic, arguments);\n },\n splitcomplement: function() {\n return this._applyCombination(splitcomplement, arguments);\n },\n triad: function() {\n return this._applyCombination(triad, arguments);\n },\n tetrad: function() {\n return this._applyCombination(tetrad, arguments);\n }\n};\n\n// If input is an object, force 1 into \"1.0\" to handle ratios properly\n// String input requires \"1.0\" as input, so 1 will be treated as 1\ntinycolor.fromRatio = function(color, opts) {\n if (typeof color == \"object\") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === \"a\") {\n newColor[i] = color[i];\n }\n else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n\n return tinycolor(color, opts);\n};\n\n// Given a string or object, convert that input to RGB\n// Possible string inputs:\n//\n// \"red\"\n// \"#f00\" or \"f00\"\n// \"#ff0000\" or \"ff0000\"\n// \"#ff000000\" or \"ff000000\"\n// \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n// \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n// \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n// \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n// \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n// \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n// \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n//\nfunction inputToRGB(color) {\n\n var rgb = { r: 0, g: 0, b: 0 };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n\n if (typeof color == \"string\") {\n color = stringInputToObject(color);\n }\n\n if (typeof color == \"object\") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = \"hsv\";\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = \"hsl\";\n }\n\n if (color.hasOwnProperty(\"a\")) {\n a = color.a;\n }\n }\n\n a = boundAlpha(a);\n\n return {\n ok: ok,\n format: color.format || format,\n r: mathMin(255, mathMax(rgb.r, 0)),\n g: mathMin(255, mathMax(rgb.g, 0)),\n b: mathMin(255, mathMax(rgb.b, 0)),\n a: a\n };\n}\n\n\n// Conversion Functions\n// --------------------\n\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n\n// `rgbToRgb`\n// Handle bounds / percentage checking to conform to CSS color spec\n// <http://www.w3.org/TR/css3-color/>\n// *Assumes:* r, g, b in [0, 255] or [0, 1]\n// *Returns:* { r, g, b } in [0, 255]\nfunction rgbToRgb(r, g, b){\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n}\n\n// `rgbToHsl`\n// Converts an RGB color value to HSL.\n// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n// *Returns:* { h, s, l } in [0,1]\nfunction rgbToHsl(r, g, b) {\n\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = mathMax(r, g, b), min = mathMin(r, g, b);\n var h, s, l = (max + min) / 2;\n\n if(max == min) {\n h = s = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n\n h /= 6;\n }\n\n return { h: h, s: s, l: l };\n}\n\n// `hslToRgb`\n// Converts an HSL color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hslToRgb(h, s, l) {\n var r, g, b;\n\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n\n function hue2rgb(p, q, t) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n if(s === 0) {\n r = g = b = l; // achromatic\n }\n else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n\n// `rgbToHsv`\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nfunction rgbToHsv(r, g, b) {\n\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = mathMax(r, g, b), min = mathMin(r, g, b);\n var h, s, v = max;\n\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n\n if(max == min) {\n h = 0; // achromatic\n }\n else {\n switch(max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h, s: s, v: v };\n}\n\n// `hsvToRgb`\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\n function hsvToRgb(h, s, v) {\n\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n\n// `rgbToHex`\n// Converts an RGB color to hex\n// Assumes r, g, and b are contained in the set [0, 255]\n// Returns a 3 or 6 character hex\nfunction rgbToHex(r, g, b, allow3Char) {\n\n var hex = [\n pad2(mathRound(r).toString(16)),\n pad2(mathRound(g).toString(16)),\n pad2(mathRound(b).toString(16))\n ];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n\n return hex.join(\"\");\n}\n\n// `rgbaToHex`\n// Converts an RGBA color plus alpha transparency to hex\n// Assumes r, g, b are contained in the set [0, 255] and\n// a in [0, 1]. Returns a 4 or 8 character rgba hex\nfunction rgbaToHex(r, g, b, a, allow4Char) {\n\n var hex = [\n pad2(mathRound(r).toString(16)),\n pad2(mathRound(g).toString(16)),\n pad2(mathRound(b).toString(16)),\n pad2(convertDecimalToHex(a))\n ];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n\n return hex.join(\"\");\n}\n\n// `rgbaToArgbHex`\n// Converts an RGBA color to an ARGB Hex8 string\n// Rarely used, but required for \"toFilter()\"\nfunction rgbaToArgbHex(r, g, b, a) {\n\n var hex = [\n pad2(convertDecimalToHex(a)),\n pad2(mathRound(r).toString(16)),\n pad2(mathRound(g).toString(16)),\n pad2(mathRound(b).toString(16))\n ];\n\n return hex.join(\"\");\n}\n\n// `equals`\n// Can be called with any tinycolor input\ntinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) { return false; }\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n};\n\ntinycolor.random = function() {\n return tinycolor.fromRatio({\n r: mathRandom(),\n g: mathRandom(),\n b: mathRandom()\n });\n};\n\n\n// Modification Functions\n// ----------------------\n// Thanks to less.js for some of the basics here\n// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>\n\nfunction desaturate(color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\n\nfunction saturate(color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\n\nfunction greyscale(color) {\n return tinycolor(color).desaturate(100);\n}\n\nfunction lighten (color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\nfunction brighten(color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var rgb = tinycolor(color).toRgb();\n rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100))));\n rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100))));\n rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100))));\n return tinycolor(rgb);\n}\n\nfunction darken (color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\n// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n// Values outside of this range will be wrapped into this range.\nfunction spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n}\n\n// Combination Functions\n// ---------------------\n// Thanks to jQuery xColor for some of the ideas behind these\n// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>\n\nfunction complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n}\n\nfunction triad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [\n tinycolor(color),\n tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),\n tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })\n ];\n}\n\nfunction tetrad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [\n tinycolor(color),\n tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),\n tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),\n tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })\n ];\n}\n\nfunction splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [\n tinycolor(color),\n tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),\n tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})\n ];\n}\n\nfunction analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n\n for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n}\n\nfunction monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h, s = hsv.s, v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n\n while (results--) {\n ret.push(tinycolor({ h: h, s: s, v: v}));\n v = (v + modification) % 1;\n }\n\n return ret;\n}\n\n// Utility Functions\n// ---------------------\n\ntinycolor.mix = function(color1, color2, amount) {\n amount = (amount === 0) ? 0 : (amount || 50);\n\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n\n var p = amount / 100;\n\n var rgba = {\n r: ((rgb2.r - rgb1.r) * p) + rgb1.r,\n g: ((rgb2.g - rgb1.g) * p) + rgb1.g,\n b: ((rgb2.b - rgb1.b) * p) + rgb1.b,\n a: ((rgb2.a - rgb1.a) * p) + rgb1.a\n };\n\n return tinycolor(rgba);\n};\n\n\n// Readability Functions\n// ---------------------\n// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)\n\n// `contrast`\n// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)\ntinycolor.readability = function(color1, color2) {\n var c1 = tinycolor(color1);\n var c2 = tinycolor(color2);\n return (Math.max(c1.getLuminance(),c2.getLuminance())+0.05) / (Math.min(c1.getLuminance(),c2.getLuminance())+0.05);\n};\n\n// `isReadable`\n// Ensure that foreground and background color combinations meet WCAG2 guidelines.\n// The third argument is an optional Object.\n// the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';\n// the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.\n// If the entire object is absent, isReadable defaults to {level:\"AA\",size:\"small\"}.\n\n// *Example*\n// tinycolor.isReadable(\"#000\", \"#111\") => false\n// tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\ntinycolor.isReadable = function(color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n\n out = false;\n\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case \"AAsmall\":\n case \"AAAlarge\":\n out = readability >= 4.5;\n break;\n case \"AAlarge\":\n out = readability >= 3;\n break;\n case \"AAAsmall\":\n out = readability >= 7;\n break;\n }\n return out;\n\n};\n\n// `mostReadable`\n// Given a base color and a list of possible foreground or background\n// colors for that base, returns the most readable color.\n// Optionally returns Black or White if the most readable color is unreadable.\n// *Example*\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString(); // \"#ffffff\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\ntinycolor.mostReadable = function(baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size ;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors ;\n level = args.level;\n size = args.size;\n\n for (var i= 0; i < colorList.length ; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n\n if (tinycolor.isReadable(baseColor, bestColor, {\"level\":level,\"size\":size}) || !includeFallbackColors) {\n return bestColor;\n }\n else {\n args.includeFallbackColors=false;\n return tinycolor.mostReadable(baseColor,[\"#fff\", \"#000\"],args);\n }\n};\n\n\n// Big List of Colors\n// ------------------\n// <http://www.w3.org/TR/css3-color/#svg-color>\nvar names = tinycolor.names = {\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"0ff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000\",\n blanchedalmond: \"ffebcd\",\n blue: \"00f\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n burntsienna: \"ea7e5d\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"0ff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"f0f\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"789\",\n lightslategrey: \"789\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"0f0\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"f0f\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"f00\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"fff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ff0\",\n yellowgreen: \"9acd32\"\n};\n\n// Make it easy to access colors via `hexNames[hex]`\nvar hexNames = tinycolor.hexNames = flip(names);\n\n\n// Utilities\n// ---------\n\n// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\nfunction flip(o) {\n var flipped = { };\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n}\n\n// Return a valid alpha value [0,1] with all invalid values being set to 1\nfunction boundAlpha(a) {\n a = parseFloat(a);\n\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n\n return a;\n}\n\n// Take input from [0, n] and return it as [0, 1]\nfunction bound01(n, max) {\n if (isOnePointZero(n)) { n = \"100%\"; }\n\n var processPercent = isPercentage(n);\n n = mathMin(max, mathMax(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if ((Math.abs(n - max) < 0.000001)) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return (n % max) / parseFloat(max);\n}\n\n// Force a number between 0 and 1\nfunction clamp01(val) {\n return mathMin(1, mathMax(0, val));\n}\n\n// Parse a base-16 hex value into a base-10 integer\nfunction parseIntFromHex(val) {\n return parseInt(val, 16);\n}\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\nfunction isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf('.') != -1 && parseFloat(n) === 1;\n}\n\n// Check to see if string passed in is a percentage\nfunction isPercentage(n) {\n return typeof n === \"string\" && n.indexOf('%') != -1;\n}\n\n// Force a hex value to have 2 characters\nfunction pad2(c) {\n return c.length == 1 ? '0' + c : '' + c;\n}\n\n// Replace a decimal with it's percentage value\nfunction convertToPercentage(n) {\n if (n <= 1) {\n n = (n * 100) + \"%\";\n }\n\n return n;\n}\n\n// Converts a decimal to a hex value\nfunction convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n// Converts a hex value to a decimal\nfunction convertHexToDecimal(h) {\n return (parseIntFromHex(h) / 255);\n}\n\nvar matchers = (function() {\n\n // <http://www.w3.org/TR/css3-values/#integers>\n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // <http://www.w3.org/TR/css3-values/#number-value>\n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n})();\n\n// `isValidCSSUnit`\n// Take in a single string / number and check to see if it looks like a CSS unit\n// (see `matchers` above for definition).\nfunction isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n}\n\n// `stringInputToObject`\n// Permissive string parsing. Take in a number of formats, and output an object\n// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\nfunction stringInputToObject(color) {\n\n color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n }\n else if (color == 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: \"name\" };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if ((match = matchers.rgb.exec(color))) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n if ((match = matchers.rgba.exec(color))) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n if ((match = matchers.hsl.exec(color))) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n if ((match = matchers.hsla.exec(color))) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n if ((match = matchers.hsv.exec(color))) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n if ((match = matchers.hsva.exec(color))) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n if ((match = matchers.hex8.exec(color))) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if ((match = matchers.hex6.exec(color))) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n if ((match = matchers.hex4.exec(color))) {\n return {\n r: parseIntFromHex(match[1] + '' + match[1]),\n g: parseIntFromHex(match[2] + '' + match[2]),\n b: parseIntFromHex(match[3] + '' + match[3]),\n a: convertHexToDecimal(match[4] + '' + match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if ((match = matchers.hex3.exec(color))) {\n return {\n r: parseIntFromHex(match[1] + '' + match[1]),\n g: parseIntFromHex(match[2] + '' + match[2]),\n b: parseIntFromHex(match[3] + '' + match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n\n return false;\n}\n\nfunction validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n var level, size;\n parms = parms || {\"level\":\"AA\", \"size\":\"small\"};\n level = (parms.level || \"AA\").toUpperCase();\n size = (parms.size || \"small\").toLowerCase();\n if (level !== \"AA\" && level !== \"AAA\") {\n level = \"AA\";\n }\n if (size !== \"small\" && size !== \"large\") {\n size = \"small\";\n }\n return {\"level\":level, \"size\":size};\n}\n\n/*// Node: Export function\nif (typeof module !== \"undefined\" && module.exports) {\n module.exports = tinycolor;\n}\n// AMD/requirejs: Define the module\nelse if (typeof define === 'function' && define.amd) {\n define(function () {return tinycolor;});\n}\n// Browser: Expose to window\nelse {\n window.tinycolor = tinycolor;\n}*/\n\nreturn tinycolor;\n\n})(Math);\n\nexport default tinycolor;\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACRA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAIA;AAEA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC7PA;AAAA;AAAA;AAEA;AACA;AACA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACXA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAGA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAGA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAKA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAMA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;;;;A","sourceRoot":""}
js/addon-entry-better-img-uploads.js ADDED
@@ -0,0 +1,271 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-better-img-uploads"],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/better-img-uploads/style.css":
4
+ /*!**********************************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/better-img-uploads/style.css ***!
6
+ \**********************************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
11
+ // imports
12
+
13
+
14
+ // module
15
+ exports.push([module.i, "[data-for*=\"HD Upload\"]:hover + .__react_component_tooltip {\n visibility: visible;\n}\n\n.sa-better-img-uploads-btn:not([id*=\"_right\"]) + .__react_component_tooltip {\n left: auto;\n}\n\n.sa-better-img-uploads-btn[id*=\"_right\"] + .__react_component_tooltip,\n[data-for=\"sa-Choose_a_Backdrop-HD Upload\"] + .__react_component_tooltip {\n right: auto;\n}\n", ""]);
16
+
17
+ // exports
18
+
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/better-img-uploads/icon.svg":
23
+ /*!*********************************************************************************************!*\
24
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/better-img-uploads/icon.svg ***!
25
+ \*********************************************************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjY0MCI+PGRlZnM+PHBhdGggZD0iTTAgMGg2NDN2NjQzSDBWMHoiIGlkPSJhIi8+PHBhdGggZD0ibTUyMC41NyAzMzkuMjggMS4zNS4xOSAxLjMzLjI0IDEuMzEuMjkgMS4zLjM0IDEuMjYuMzggMS4yNS40NCAxLjIyLjQ4IDEuMi41MyAxLjE3LjU3IDEuMTQuNjEgMS4xMi42NiAxLjA4LjY5IDEuMDYuNzQgMS4wMi43OC45OS44Mi45Ni44NS45My44OS44OS45Mi44NS45Ni44Mi45OS43NyAxLjAzLjc0IDEuMDUuNyAxLjA5LjY2IDEuMTEuNjEgMS4xNS41NyAxLjE3LjUzIDEuMTkuNDggMS4yMy40MyAxLjI0LjM5IDEuMjcuMzQgMS4yOS4yOSAxLjMxLjI0IDEuMzQuMTkgMS4zNS4xMyAxLjM3LjA4IDEuMzkuMDMgMS40djczLjlsLS4wOSA0LjI1LS4yNSA0LjItLjQyIDQuMTYtLjU5IDQuMTEtLjc0IDQuMDYtLjkgNC0xLjA2IDMuOTUtMS4yIDMuODgtMS4zNSAzLjgxLTEuNSAzLjc1LTEuNjMgMy42Ny0xLjc3IDMuNi0xLjkgMy41Mi0yLjA0IDMuNDMtMi4xNiAzLjM1LTIuMjggMy4yNi0yLjQgMy4xNi0yLjUyIDMuMDctMi42MyAyLjk3LTIuNzUgMi44Ny0yLjg1IDIuNzYtMi45NSAyLjY1LTMuMDUgMi41My0zLjE1IDIuNDItMy4yNCAyLjMtMy4zNCAyLjE4LTMuNDIgMi4wNC0zLjUgMS45Mi0zLjU4IDEuNzktMy42NiAxLjY0LTMuNzQgMS41MS0zLjggMS4zNi0zLjg3IDEuMjEtMy45NCAxLjA3LTMuOTkuOTEtNC4wNS43NS00LjExLjU5LTQuMTUuNDMtNC4yLjI1LTQuMjUuMDlIMTkzLjQ3bC00LjI4LS4wOS00LjI0LS4yNS00LjE4LS40My00LjEzLS41OS00LjA4LS43NS00LjAyLS45MS0zLjk2LTEuMDctMy44OS0xLjIxLTMuODItMS4zNi0zLjc2LTEuNTEtMy42OC0xLjY0LTMuNi0xLjc5LTMuNTEtMS45Mi0zLjQ0LTIuMDQtMy4zNS0yLjE4LTMuMjUtMi4zLTMuMTYtMi40Mi0zLjA3LTIuNTMtMi45Ni0yLjY1LTIuODYtMi43Ni0yLjc1LTIuODctMi42NC0yLjk3LTIuNTItMy4wNy0yLjQxLTMuMTYtMi4yOS0zLjI2LTIuMTYtMy4zNS0yLjA0LTMuNDMtMS45MS0zLjUyLTEuNzctMy42LTEuNjQtMy42Ny0xLjQ5LTMuNzUtMS4zNS0zLjgxLTEuMjEtMy44OC0xLjA1LTMuOTUtLjkxLTQtLjc0LTQuMDYtLjU5LTQuMTEtLjQyLTQuMTYtLjI1LTQuMi0uMDktNC4yNXYtNzMuOWwuMDMtMS40LjA4LTEuMzkuMTQtMS4zNy4xOS0xLjM1LjI1LTEuMzQuMy0xLjMxLjM0LTEuMjkuNC0xLjI3LjQ1LTEuMjQuNDktMS4yMy41My0xLjE5LjU5LTEuMTcuNjItMS4xNS42Ny0xLjExLjcxLTEuMDkuNzUtMS4wNS43OC0xLjAzLjgzLS45OS44Ni0uOTYuOS0uOTIuOTMtLjg5Ljk3LS44NSAxLS44MiAxLjAyLS43OCAxLjA2LS43NCAxLjA5LS42OSAxLjEyLS42NiAxLjE0LS42MSAxLjE3LS41NyAxLjE5LS41MyAxLjIxLS40OCAxLjI0LS40NCAxLjI1LS4zOCAxLjI4LS4zNCAxLjMtLjI5IDEuMzEtLjI0IDEuMzMtLjE5IDEuMzQtLjEzIDEuMzYtLjA5IDEuMzctLjAyIDEuMzcuMDIgMS4zNi4wOSAxLjM1LjEzIDEuMzMuMTkgMS4zMS4yNCAxLjI5LjI5IDEuMjguMzQgMS4yNi4zOCAxLjIzLjQ0IDEuMjIuNDggMS4xOS41MyAxLjE3LjU3IDEuMTQuNjEgMS4xMS42NiAxLjA5LjY5IDEuMDYuNzQgMS4wMy43OCAxIC44Mi45Ni44NS45NC44OS44OS45Mi44Ny45Ni44Mi45OS43OSAxLjAzLjc1IDEuMDUuNzEgMS4wOS42NyAxLjExLjYyIDEuMTUuNTggMS4xNy41NCAxLjE5LjQ5IDEuMjMuNDUgMS4yNC4zOSAxLjI3LjM1IDEuMjkuMyAxLjMxLjI0IDEuMzQuMTkgMS4zNS4xNCAxLjM3LjA5IDEuMzkuMDMgMS40djczLjlsLjAzIDEuNDguMDkgMS40NS4xNCAxLjQ1LjIxIDEuNDMuMjYgMS40MS4zMSAxLjQuMzcgMS4zNy40MiAxLjM1LjQ4IDEuMzQuNTIgMS4zMS41NyAxLjI4LjYyIDEuMjYuNjcgMS4yMy43MSAxLjIxLjc2IDEuMTcuOCAxLjE1Ljg1IDEuMTEuODggMS4wOC45MiAxLjA1Ljk3IDEgMSAuOTggMS4wNC45MyAxLjA3LjkgMS4xMS44NSAxLjE0LjgxIDEuMTcuNzcgMS4yMS43MiAxLjIzLjY4IDEuMjYuNjMgMS4yOS41OSAxLjMyLjUzIDEuMzQuNDggMS4zNy40MyAxLjM5LjM4IDEuNDEuMzIgMS40My4yNyAxLjQ1LjIxIDEuNDcuMTUgMS40OS4wOSAxLjUxLjAzaDI1My41MWwxLjQ3LS4wMyAxLjQ2LS4wOSAxLjQ0LS4xNSAxLjQyLS4yMSAxLjQxLS4yNyAxLjM5LS4zMiAxLjM2LS4zOCAxLjM1LS40MyAxLjMyLS40OCAxLjI5LS41MyAxLjI4LS41OSAxLjI0LS42MyAxLjIyLS42OCAxLjE5LS43MiAxLjE2LS43NyAxLjEzLS44MSAxLjA5LS44NSAxLjA3LS45IDEuMDMtLjkzLjk5LS45OC45NS0xIC45Mi0xLjA1Ljg4LTEuMDguODQtMS4xMS43OS0xLjE1Ljc2LTEuMTcuNzEtMS4yMS42Ni0xLjIzLjYyLTEuMjYuNTctMS4yOC41Mi0xLjMxLjQ3LTEuMzQuNDItMS4zNS4zNy0xLjM3LjMxLTEuNC4yNi0xLjQxLjIxLTEuNDMuMTQtMS40NS4wOS0xLjQ1LjAzLTEuNDh2LTczLjlsLjAzLTEuNC4wOS0xLjM5LjE0LTEuMzcuMTktMS4zNS4yNC0xLjM0LjMtMS4zMS4zNS0xLjI5LjM5LTEuMjcuNDUtMS4yNC40OS0xLjIzLjU0LTEuMTkuNTgtMS4xNy42Mi0xLjE1LjY3LTEuMTEuNzEtMS4wOS43NS0xLjA1Ljc5LTEuMDMuODItLjk5Ljg3LS45Ni44OS0uOTIuOTQtLjg5Ljk2LS44NSAxLS44MiAxLjAzLS43OCAxLjA2LS43NCAxLjA5LS42OSAxLjExLS42NiAxLjE0LS42MSAxLjE3LS41NyAxLjE5LS41MyAxLjIyLS40OCAxLjIzLS40NCAxLjI2LS4zOCAxLjI4LS4zNCAxLjI5LS4yOSAxLjMxLS4yNCAxLjMzLS4xOSAxLjM1LS4xMyAxLjM2LS4wOSAxLjM3LS4wMiAxLjQuMDIgMS4zOS4wOSAxLjM3LjEzem0tMTI2LjQ2LTY0LjM2LjUxLjAxLjUxLjAxLjUxLjAxLjUxLjAxLjUxLjAxLjUxLjAyLjUxLjAyLjUxLjAyLjUxLjAyLjUxLjAyLjUxLjAzLjUxLjAyLjUxLjAzLjUxLjAzLjUxLjAzLjUxLjA0LjUxLjAzLjUxLjA0LjUxLjA0LjUxLjA0LjUxLjA0LjUxLjA1LjUuMDQuNTEuMDUuNTEuMDUuNTEuMDUuNTEuMDYuNS4wNS41MS4wNi41MS4wNi41MS4wNi41LjA2LjUxLjA3LjUxLjA3LjUuMDYuNTEuMDcuNDEuMDYuNDEuMDYuNDEuMDYuNDEuMDcuNDEuMDYuNDEuMDcuNDEuMDcuNDEuMDcuNDEuMDcuNDEuMDcuNDEuMDcuNC4wOC40MS4wNy40MS4wOC40MS4wOC40LjA4LjQxLjA5LjQxLjA4LjQuMDkuNDEuMDguNC4wOS40MS4wOS40LjEuNDEuMDkuNC4wOS40MS4xLjQuMS40LjEuNDEuMS40LjEuNC4xMS40LjEuNC4xMS40LjExLjQuMTEuNC4xMS40LjExLjQuMTEuNC4xMi40LjEyLjQ5LjE0LjQ5LjE1LjQ5LjE1LjQ5LjE2LjQ5LjE2LjQ4LjE2LjQ5LjE2LjQ4LjE3LjQ4LjE3LjQ5LjE4LjQ4LjE3LjQ3LjE4LjQ4LjE4LjQ4LjE5LjQ3LjE5LjQ4LjE5LjQ3LjIuNDcuMTkuNDcuMjEuNDcuMi40Ny4yMS40Ny4yMS40Ni4yMS40Ny4yMi40Ni4yMi40Ni4yMi40Ni4yMi40Ni4yMy40NS4yMy40Ni4yNC40NS4yMy40NS4yNC40Ni4yNS40NC4yNC40NS4yNS40NS4yNS40NC4yNi40NS4yNS40NC4yNi40NC4yNy4yNS4xNS4yNS4xNS4yNS4xNi4yNS4xNS4yNS4xNi4yNC4xNi4yNS4xNi4yNC4xNi4yNS4xNi4yNC4xNi4yNS4xNy4yNC4xNi4yNC4xNy4yNS4xNi4yNC4xNy4yNC4xNy4yNC4xNy4yNC4xNy4yMy4xNy4yNC4xNy4yNC4xOC4yMy4xNy4yNC4xOC4yMy4xNy4yNC4xOC4yMy4xOC4yMy4xOC4yNC4xOC4yMy4xOC4yMy4xOC4yMy4xOC4yMi4xOS4yMy4xOC4yMy4xOS4yMi4xOS4yMy4xOS4yMi4xOC4yMy4yLjIyLjE5LjIyLjE5LjUyLjQ2LjUyLjQ2LjUxLjQ3LjUuNDguNS40OC41LjQ4LjQ4LjQ5LjQ5LjQ5LjQ4LjUuNDcuNTEuNDcuNS40Ni41Mi40Ni41Mi40NS41Mi40NC41Mi40NC41NC40NC41My40My41NC40Mi41NS40Mi41NS40MS41NS40MS41Ni40LjU2LjQuNTYuMzkuNTcuMzguNTguMzguNTcuMzcuNTkuMzcuNTguMzYuNTkuMzUuNi4zNS41OS4zNC42LjMzLjYxLjMzLjYxLjMzLjYxLjMxLjYxLjMyLjYyLjMuNjMuMy42Mi4wNC4xLjA1LjA5LjA0LjA5LjA1LjEuMDQuMDkuMDUuMS4wNC4wOS4wNC4wOS4wNS4xLjA0LjA5LjA1LjEuMDQuMDkuMDQuMS4wNS4wOS4wNC4wOS4wNC4xLjA0LjA5LjA1LjEuMDQuMDkuMDQuMS4wNS4wOS4wNC4xLjA0LjA5LjA0LjEuMDQuMDkuMDUuMS4wNC4wOS4wNC4xLjA0LjA5LjA0LjEuMDQuMS4wNC4wOS4wNC4xLjA1LjA5LjA0LjEuMDQuMDkuMDQuMS4wNC4wOS4wNC4xLjA0LjEuMTcuNDIuMTcuNDIuMTYuNDMuMTcuNDIuMTYuNDMuMTYuNDMuMTYuNDIuMTUuNDMuMTUuNDMuMTUuNDMuMTUuNDMuMTUuNDQuMTQuNDMuMTQuNDMuMTQuNDQuMTMuNDMuMTMuNDQuMTMuNDMuMTMuNDQuMTMuNDQuMTIuNDQuMTIuNDQuMTIuNDQuMTEuNDQuMTEuNDQuMTEuNDQuMTEuNDUuMTEuNDQuMS40NC4xLjQ1LjEuNDQuMDkuNDUuMS40NC4wOC40NS4wOS40NS4wOS40NS4wOC40NS4wOC40NC4wOC40NS4wNy40NS4xMS42Ny4xMS42Ny4xLjY2LjA5LjY2LjA5LjY1LjA4LjY1LjA4LjY1LjA3LjY0LjA2LjYzLjA3LjYyLjA2LjYyLjA1LjYxLjA1LjYuMDUuNTkuMDQuNTguMDQuNTcuMDMuNTYuMDQuNTQuMDMuNTQuMDIuNTIuMDMuNTEuMDIuNS4wMi40OC4wMi40Ny4wMS40NS4wMi40My4wMS40Mi4wMS40MS4wMS4zOC4wMS4zNy4wMS4zNS4wMS4zMi4wMS4zMXYuMjlsLjAxLjI3LjAxLjI1LjAxLjIyLjAxLjIxLjAxLjE4LjAxLjE1djEuMzNsLS4wMS40NXYuNDRsLS4wMS40NC0uMDEuNDUtLjAxLjQ0LS4wMS40NC0uMDIuNDUtLjAxLjQ0LS4wMi40NC0uMDIuNDUtLjAyLjQ0LS4wMi40NC0uMDMuNDUtLjAyLjQ0LS4wMy40NC0uMDMuNDQtLjAzLjQ1LS4wMy40NC0uMDQuNDQtLjA0LjQ0LS4wMy40NC0uMDQuNDUtLjA0LjQ0LS4wNS40NC0uMDQuNDQtLjA1LjQ0LS4wNC40NC0uMDUuNDQtLjA2LjQ0LS4wNS40NC0uMDUuNDQtLjA2LjQ0LS4wNi40NC0uMDYuNDQtLjA2LjQ0LS4wNi40NC0uMDcuNDQtLjExLjcyLS4xMi43MS0uMTIuNy0uMTMuNjktLjEzLjY3LS4xMy42Ni0uMTMuNjQtLjE0LjY0LS4xNC42Mi0uMTQuNjEtLjE1LjU5LS4xNC41OC0uMTUuNTYtLjE0LjU2LS4xNS41My0uMTQuNTMtLjE1LjUxLS4xNC40OS0uMTUuNDgtLjE0LjQ3LS4xNC40NS0uMTMuNDQtLjE0LjQyLS4xMy40LS4xMy4zOS0uMTIuMzgtLjEyLjM2LS4xMi4zNC0uMTEuMzMtLjExLjMxLS4xLjI5LS4xLjI4LS4wOS4yNi0uMDguMjUtLjA4LjIzLS4wNy4yMS0uMDYuMi0uMDYuMTctLjA1LjE2LS4wNC4xNS0uMDMuMDgtLjAxLjAyLS4wMy4wOC0uMDIuMDYtLjAxLjA0LS4wMy4wNS0uMDIuMDctLjAyLjA0LS4wMi4wNi0uMDEuMDMtLjIxLjUxLS4yLjUxLS4yMS41LS4yMi41MS0uMjEuNS0uMjMuNS0uMjIuNS0uMjMuNS0uMjMuNDktLjI0LjUtLjI0LjQ5LS4yNS40OS0uMjQuNDgtLjI2LjQ5LS4yNS40OC0uMjYuNDktLjI2LjQ4LS4yNy40Ny0uMjcuNDgtLjI3LjQ3LS4yOC40Ny0uMjguNDctLjI5LjQ3LS4yOS40Ni0uMjkuNDctLjI5LjQ2LS4zLjQ1LS4zLjQ2LS4zMS40NS0uMzEuNDUtLjMxLjQ1LS4zMi40NS0uMzIuNDQtLjMyLjQ1LS4zMy40My0uMzMuNDQtLjM0LjQ0LS4zMy40My0uMzUuNDMtLjM0LjQyLS4xNS4xOS0uMTYuMTktLjE2LjE4LS4xNS4xOS0uMTYuMTgtLjE2LjE5LS4xNi4xOC0uMTYuMTktLjE2LjE4LS4xNi4xOC0uMTYuMTgtLjE2LjE4LS4xNi4xOC0uMTcuMTgtLjE2LjE4LS4xNy4xOC0uMTYuMTgtLjE3LjE3LS4xNy4xOC0uMTYuMTgtLjE3LjE3LS4xNy4xOC0uMTcuMTctLjE3LjE3LS4xNy4xOC0uMTcuMTctLjE3LjE3LS4xOC4xNy0uMTcuMTctLjE3LjE3LS4xOC4xNy0uMTcuMTctLjE4LjE2LS4xOC4xNy0uMTcuMTctLjE4LjE2LS4xOC4xNy0uMTguMTYtLjE4LjE2LS4xOC4xNy0uNS40NC0uNS40NC0uNTEuNDMtLjUxLjQzLS41Mi40Mi0uNTIuNDItLjUyLjQxLS41My40MS0uNTMuNC0uNTMuNC0uNTQuMzktLjU0LjM5LS41NC4zOC0uNTUuMzgtLjU1LjM4LS41NS4zNy0uNTYuMzYtLjU2LjM2LS41Ni4zNS0uNTcuMzUtLjU3LjM0LS41Ny4zNC0uNTguMzMtLjU4LjMzLS41OC4zMi0uNTguMzItLjU5LjMxLS41OS4zMS0uNTkuMy0uNi4yOS0uNi4yOS0uNi4yOS0uNjEuMjgtLjYuMjctLjYxLjI3LS42Mi4yNy0uNjEuMjUtLjYyLjI2LS42Mi4yNC0uNjIuMjQtLjEyLjA1LS4xMi4wNS0uMTIuMDQtLjEzLjA1LS4xMi4wNS0uMTIuMDQtLjEyLjA1LS4xMi4wNC0uMTIuMDUtLjEzLjA1LS4xMi4wNC0uMTIuMDUtLjEyLjA0LS4xMi4wNS0uMTIuMDQtLjEzLjA1LS4xMi4wNC0uMTIuMDQtLjEyLjA1LS4xMy4wNC0uMTIuMDQtLjEyLjA1LS4xMi4wNC0uMTMuMDQtLjEyLjA1LS4xMi4wNC0uMTMuMDQtLjEyLjA0LS4xMi4wNS0uMTIuMDQtLjEzLjA0LS4xMi4wNC0uMTIuMDQtLjEzLjA0LS4xMi4wNC0uMTIuMDQtLjEzLjA0LS4xMi4wNS0uMTIuMDQtLjEzLjA0LS41NC4xNy0uNTQuMTYtLjU1LjE3LS41NC4xNi0uNTUuMTYtLjU0LjE2LS41NS4xNS0uNTQuMTUtLjU1LjE1LS41NS4xNC0uNTUuMTQtLjU1LjE0LS41NS4xNC0uNTUuMTMtLjU2LjEzLS41NS4xMi0uNTUuMTMtLjU2LjEyLS41NS4xMi0uNTYuMTEtLjU1LjExLS41Ni4xMS0uNTYuMTEtLjU1LjEtLjU2LjEtLjU2LjEtLjU2LjA5LS41Ni4wOS0uNTYuMDktLjU2LjA5LS41Ni4wOC0uNTYuMDgtLjU3LjA4LS41Ni4wNy0uNTYuMDctLjU3LjA3LS41Ni4wNi0uNTYuMDYtLjU3LjA2LS41Ni4wNi0uMzMuMDMtLjMzLjAzLS4zMy4wMy0uMzMuMDMtLjMzLjAzLS4zMy4wMy0uMzMuMDItLjMzLjAzLS4zMy4wMi0uMzMuMDMtLjMzLjAyLS4zMy4wMy0uMzMuMDItLjMzLjAyLS4zMy4wMi0uMzMuMDItLjMzLjAyLS4zMy4wMi0uMzMuMDEtLjMzLjAyLS4zMy4wMi0uMzQuMDEtLjMzLjAxLS4zMy4wMi0uMzMuMDEtLjMzLjAxLS4zMy4wMS0uMzMuMDEtLjMzLjAxLS4zMy4wMS0uMzMuMDFoLS4zM2wtLjMzLjAxaC0uMzNsLS4zNC4wMWgtMy4wN2wtLjI4LS4wMWgtLjU1bC0uMjgtLjAxaC0uMjdsLS4yNy0uMDFoLS4yN2wtLjI3LS4wMWgtLjI2bC0uMjYtLjAxLS4yNS0uMDFoLS4yNWwtLjI1LS4wMS0uMjQtLjAxaC0uMjNsLS4yMy0uMDEtLjIyLS4wMWgtLjIybC0uMjEtLjAxLS4yMS0uMDFoLS4ybC0uMTktLjAxLS4xOC0uMDFoLS4xN2wtLjE3LS4wMWgtLjE2bC0uMTUtLjAxaC0uMTRsLS4xMy0uMDFoLS4xMmwtLjExLS4wMWgtLjI4bC0uMDctLjAxaC0uMTVsLS4xMi0uMDFoLS4wOGwtLjEyLS4wMWgtLjJsLS4wNy0uMDFoLS4xMmwtLjA4LS4wMWgtLjEybC0uMTItLjAxaC0uMTlsLS4wOC0uMDFoLS4xMmwtLjI1LS4wMi0uMjUtLjAxLS4yNC0uMDEtLjI1LS4wMS0uMjUtLjAyLS4yNS0uMDEtLjI0LS4wMS0uMjUtLjAyLS4yNS0uMDEtLjI0LS4wMi0uMjUtLjAyLS4yNS0uMDEtLjI1LS4wMi0uMjQtLjAyLS4yNS0uMDEtLjI1LS4wMi0uMjQtLjAyLS4yNS0uMDItLjI1LS4wMi0uMjQtLjAyLS4yNS0uMDItLjI1LS4wMi0uMjQtLjAyLS4yNS0uMDItLjI1LS4wMy0uMjQtLjAyLS4yNS0uMDItLjI1LS4wMi0uMjQtLjAzLS4yNS0uMDItLjI1LS4wMy0uMjQtLjAyLS4yNS0uMDMtLjI1LS4wMi0uMjQtLjAzLS4yNS0uMDMtLjI0LS4wMi0uMjUtLjAzLS4yNS0uMDMtLjI0LS4wM2gtLjA1bC0uMDUtLjAxLS4wOS0uMDEtLjA1LS4wMS0uMDktLjAxaC0uMDVsLS4xLS4wMS0uMDQtLjAxLS4xLS4wMS0uMDQtLjAxLS4xLS4wMWgtLjA1bC0uMDktLjAxLS4wNS0uMDEtLjA0LS4wMWgtLjA1bC0uMS0uMDEtLjA0LS4wMS0uMS0uMDEtLjA1LS4wMS0uMDktLjAxaC0uMDVsLS4wOS0uMDJoLS4wNWwtLjA5LS4wMS0uMDUtLjAxLS4wOS0uMDEtLjA1LS4wMS0uNDYtLjA2LS40NC0uMDYtLjQ1LS4wNS0uNDQtLjA3LS40My0uMDYtLjQzLS4wNi0uNDItLjA2LS40MS0uMDYtLjQxLS4wNi0uNC0uMDYtLjQtLjA2LS4zOS0uMDYtLjM4LS4wNi0uMzctLjA2LS4zNy0uMDYtLjM1LS4wNi0uMzUtLjA2LS4zNC0uMDUtLjM0LS4wNi0uMzItLjA1LS4zMS0uMDYtLjMxLS4wNS0uMjktLjA1LS4yOS0uMDUtLjI3LS4wNS0uMjctLjA1LS4yNS0uMDQtLjI1LS4wNS0uMjMtLjA0LS4yMi0uMDQtLjIxLS4wNC0uMi0uMDMtLjE5LS4wNC0uMTgtLjAzLS4xNi0uMDMtLjE1LS4wMy0uMTQtLjAyLS4xMi0uMDItLjExLS4wMi0uMS0uMDItLjItLjAzLS4yLS4wNC0uMi0uMDQtLjItLjA0LS4yLS4wNC0uMjEtLjA1LS4yLS4wNC0uMi0uMDQtLjItLjA0LS4yLS4wNS0uMi0uMDQtLjE5LS4wNS0uMi0uMDQtLjItLjA1LS4yLS4wNS0uMi0uMDUtLjItLjA0LS4yLS4wNS0uMi0uMDUtLjItLjA1LS4xOS0uMDUtLjItLjA2LS4yLS4wNS0uMi0uMDUtLjE5LS4wNS0uMi0uMDYtLjItLjA1LS4yLS4wNi0uMTktLjA2LS4yLS4wNS0uMi0uMDYtLjE5LS4wNi0uMi0uMDYtLjE5LS4wNS0uMi0uMDYtLjItLjA2LS4xOS0uMDctLjItLjA2LS4xOS0uMDYtLjItLjA2LS4wOC0uMDMtLjA4LS4wMy0uMDktLjAzLS4wOC0uMDItLjA4LS4wMy0uMDktLjAzLS4wOC0uMDMtLjA5LS4wMy0uMDgtLjAzLS4wOC0uMDItLjA5LS4wMy0uMDgtLjAzLS4wOC0uMDMtLjA5LS4wMy0uMDgtLjAzLS4wOC0uMDMtLjA5LS4wMy0uMDgtLjAzLS4wOC0uMDMtLjA4LS4wMy0uMDktLjAzLS4wOC0uMDMtLjA4LS4wMy0uMDktLjAzLS4wOC0uMDMtLjA4LS4wMy0uMDgtLjAzLS4wOS0uMDMtLjA4LS4wMy0uMDgtLjA0LS4wOC0uMDMtLjA5LS4wMy0uMDgtLjAzLS4wOC0uMDMtLjA4LS4wMy0uMDktLjA0LS4wOC0uMDMtLjA4LS4wMy0uMDgtLjAzLS4wOC0uMDQtLjE5LS4wNi0uMTgtLjA3LS4xOC0uMDctLjE4LS4wNy0uMTgtLjA4LS4xNy0uMDctLjE4LS4wOC0uMTgtLjA3LS4xOC0uMDgtLjE3LS4wOC0uMTgtLjA4LS4xNy0uMDgtLjE4LS4wOC0uMTctLjA4LS4xOC0uMDktLjE3LS4wOC0uMTctLjA5LS4xNy0uMDktLjE4LS4wOS0uMTctLjA5LS4xNy0uMDktLjE3LS4wOS0uMTYtLjA5LS4xNy0uMS0uMTctLjEtLjE3LS4wOS0uMTYtLjEtLjE3LS4xLS4xNi0uMS0uMTctLjEtLjE2LS4xMS0uMTYtLjEtLjE2LS4xMS0uMTctLjEtLjE2LS4xMS0uMTYtLjExLS4xNS0uMTEtLjE2LS4xMS0uMTYtLjExLS4xNi0uMTEtLjUzLS40Mi0uNTEtLjQyLS40Ny0uNDMtLjQ1LS40My0uNDItLjQ1LS40LS40NC0uMzctLjQ2LS4zNS0uNDUtLjMzLS40Ni0uMzEtLjQ2LS4yOC0uNDctLjI2LS40Ni0uMjUtLjQ2LS4yMi0uNDYtLjIxLS40Ni0uMTktLjQ1LS4xOC0uNDUtLjE2LS40NS0uMTUtLjQ0LS4xMy0uNDMtLjEyLS40My0uMTEtLjQyLS4xLS40MS0uMDktLjQtLjA4LS4zOC0uMDctLjM4LS4wNy0uMzctLjA2LS4zNS0uMDUtLjMzLS4wNS0uMzItLjA1LS4zMS0uMDQtLjI5LS4wNC0uMjctLjA1LS4yNS0uMDQtLjI0LS4wNC0uMjEtLjA0LS4xOS0uMDUtLjE3LS4wNS0uMTUtLjA1LS4xMlYyOTMuNTNsLjAxLS4wOHYtLjE3bC4wMS0uMDh2LS4xN2wuMDEtLjA5di0uMDhsLjAxLS4wOS4wMS0uMDh2LS4wOWwuMDEtLjA4LjAxLS4wOS4wMS0uMDguMDEtLjA4di0uMDlsLjAxLS4wOC4wMS0uMDkuMDEtLjA4LjAyLS4wOC4wMS0uMDkuMDEtLjA4LjAxLS4wOS4wMS0uMDguMDItLjA4LjAxLS4wOS4wMS0uMDguMDItLjA4LjAxLS4wOS4wMi0uMDguMDEtLjA5LjAyLS4wOC4wMi0uMDguMDItLjA4LjAzLS4xNi4wNC0uMTYuMDQtLjE1LjA0LS4xNS4wNC0uMTUuMDQtLjE0LjA1LS4xNC4wNC0uMTQuMDUtLjEzLjA1LS4xMy4wNC0uMTIuMDUtLjEyLjA1LS4xMi4wNS0uMTIuMDUtLjExLjA1LS4xMS4wNS0uMTEuMDQtLjEuMDUtLjEuMDUtLjA5LjA1LS4wOS4wNC0uMDkuMDUtLjA5LjA0LS4wOC4wNS0uMDguMDQtLjA3LjA0LS4wOC4wNC0uMDcuMDQtLjA2LjA0LS4wNi4wMy0uMDYuMDMtLjA2LjAzLS4wNS4wMy0uMDUuMDMtLjA1LjAyLS4wNC4wMy0uMDQuMDEtLjA0LjAyLS4wMy4wMS0uMDMuMDMtLjAzLjAyLS4wNC4wMy0uMDMuMDItLjAzLjAyLS4wNC4wMy0uMDMuMDItLjAzLjAzLS4wNC4wMi0uMDMuMDMtLjAzLjAyLS4wNC4wMy0uMDMuMDItLjAzLjAzLS4wMy4wMi0uMDQuMDMtLjAzLjAzLS4wMy4wMi0uMDMuMDMtLjAzLjAyLS4wNC4wMy0uMDMuMDMtLjAzLjAyLS4wMy4wMy0uMDMuMDMtLjAzLjAzLS4wNC4wMi0uMDMuMDMtLjAzLjAzLS4wMy4wMy0uMDMuMDItLjAzLjAzLS4wMy4wMy0uMDMuMDMtLjAzLjAzLS4wMy4wMy0uMDMuMDItLjAzLjAzLS4wMy4wMy0uMDMuMDMtLjAzLjIxLS4yLjItLjE5LjIxLS4xOS4yMi0uMTguMjEtLjE4LjIyLS4xNy4yMi0uMTcuMjItLjE3LjIyLS4xNi4yMy0uMTUuMjItLjE1LjIyLS4xNS4yMy0uMTQuMjItLjEzLjIyLS4xMy4yMS0uMTMuMjItLjEyLjIxLS4xMi4yMS0uMTEuMjEtLjExLjItLjExLjItLjEuMi0uMS4xOS0uMDkuMTgtLjA5LjE4LS4wOC4xNy0uMDguMTctLjA4LjE2LS4wNy4xNS0uMDcuMTUtLjA3LjE0LS4wNi4xMi0uMDYuMTItLjA1LjEyLS4wNi4xLS4wNC4wOS0uMDUuMDgtLjA0LjA3LS4wNC4wNi0uMDMuMDUtLjAyLjAyLS4wMS4wNS0uMDIuMDUtLjAyLjAyLS4wMS4wNS0uMDEuMDUtLjAyLjAyLS4wMS4wNS0uMDIuMDUtLjAyLjAyLS4wMS4wNS0uMDEuMDUtLjAyLjA1LS4wMi4wMi0uMDEuMDUtLjAyLjA1LS4wMS4wMi0uMDEuMDUtLjAyLjA1LS4wMi4wMi0uMDEuMDUtLjAxLjA1LS4wMi4wMi0uMDEuNTMtLjE3LjUzLS4xNi41My0uMTcuNTMtLjE2LjUzLS4xNS41My0uMTYuNTMtLjE1LjUzLS4xNS41My0uMTUuNTQtLjE0LjUzLS4xNC41NC0uMTQuNTMtLjE0LjU0LS4xMy41NC0uMTMuNTMtLjEzLjU0LS4xMi41NC0uMTIuNTQtLjEyLjU0LS4xMi41NC0uMTEuNTQtLjExLjU1LS4xMS41NC0uMS41NC0uMTEuNTQtLjEuNTUtLjA5LjU0LS4xLjU1LS4wOS41NC0uMDkuNTUtLjA4LjU1LS4wOC41NC0uMDguNTUtLjA4LjU1LS4wOC41NS0uMDcuNTUtLjA3LjU1LS4wNi41NC0uMDYuNTUtLjA2LjA1LS4wMS4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNC0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNC0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA0bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA0bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA5bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNC0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC44Ni0uMDguODQtLjA4LjgzLS4wNy44MS0uMDYuNzktLjA3Ljc4LS4wNi43Ni0uMDUuNzUtLjA2LjcyLS4wNS43Mi0uMDQuNjktLjA1LjY4LS4wNC42NS0uMDQuNjUtLjAzLjYyLS4wMy42MS0uMDMuNTktLjAzLjU3LS4wMy41NS0uMDIuNTQtLjAyLjUyLS4wMi41LS4wMi40OC0uMDIuNDctLjAxLjQ1LS4wMi40My0uMDEuNDEtLjAxLjM5LS4wMS4zNy0uMDEuMzYtLjAxLjMzLS4wMS4zMi0uMDEuMy0uMDFoLjI4bC4yNy0uMDEuMjQtLjAxLjIyLS4wMWguMjFsLjE4LS4wMS4xNy0uMDFoMy4zNnptLTExNi4xNyAxLjU1aC40N2wuMTYuMDFoLjMybC4xNi4wMWguMTZsLjE2LjAxaC4xNmwuMTYuMDFoLjE2bC4xNS4wMS4xNi4wMWguMTZsLjE2LjAxLjE2LjAxLjE2LjAxLjE2LjAxLjE2LjAxLjE2LjAxLjE2LjAxLjE1LjAxLjE2LjAxLjE2LjAxLjE2LjAyLjE2LjAxLjE2LjAxLjE2LjAyLjE1LjAxLjE2LjAyLjE2LjAxLjE2LjAyLjE2LjAxLjE2LjAyLjE2LjAxLjUuMDYuNDguMDcuNDcuMDcuNDYuMDcuNDUuMDguNDMuMDguNDIuMDkuNC4wOS40LjA5LjM4LjA5LjM2LjEuMzYuMS4zNC4xLjMzLjEuMzIuMS4zMS4xMS4zLjEuMjguMS4yOC4xMS4yNi4xLjI1LjEuMjQuMS4yMy4xLjIzLjEuMjEuMS4yLjA5LjE5LjA5LjE5LjA5LjE3LjA4LjE2LjA5LjE2LjA3LjE1LjA4LjE0LjA2LjEzLjA3LjEyLjA2LjExLjA1LjExLjA1LjEuMDQuMDkuMDMuMDguMDMuMDQuMDIuMDQuMDMuMDQuMDIuMDQuMDMuMDMuMDIuMDQuMDIuMDQuMDMuMDQuMDIuMDMuMDMuMDQuMDIuMDQuMDMuMDMuMDIuMDQuMDMuMDQuMDIuMDQuMDMuMDMuMDIuMDQuMDMuMDQuMDIuMDMuMDMuMDQuMDMuMDQuMDIuMDMuMDMuMDQuMDMuMDMuMDIuMDQuMDMuMDQuMDIuMDMuMDMuMDQuMDMuMDMuMDMuMDQuMDIuMDMuMDMuMDQuMDMuMDMuMDIuMDQuMDMuMDQuMDMuMDMuMDMuMDQuMDMuMDMuMDIuMDQuMDMuMDMuMDMuMjguMjQuMjcuMjQuMjcuMjYuMjYuMjcuMjUuMjguMjUuMjkuMjQuMjkuMjMuMzEuMjIuMzIuMjIuMzMuMjEuMzMuMi4zNS4yLjM2LjE4LjM3LjE5LjM4LjE3LjM4LjE3LjQuMTYuNDEuMTUuNDIuMTQuNDMuMTQuNDMuMTMuNDUuMTMuNDYuMTIuNDcuMTEuNDguMS40OC4xLjUuMDguNTEuMDkuNTIuMDcuNTMuMDcuNTMuMDYuNTUuMDUuNTYuMDUuNTcuMDQuNTguMDMuNTguMDIuNi4wMi42MS4wMS42Mi4wMS42M3YxMzcuMjVsLS4xNy4wNS0uMTcuMDQtLjE3LjA0LS4xOC4wNS0uMTguMDQtLjE4LjA0LS4xOC4wNC0uMTkuMDQtLjE5LjA0LS4xOS4wNC0uMTkuMDQtLjE5LjA0LS4xOS4wMy0uMTkuMDQtLjE4LjA0LS4xOS4wMy0uMTkuMDQtLjE4LjAzLS4xOS4wMy0uMTguMDMtLjE3LjAzLS4xOC4wMy0uMTcuMDMtLjE2LjAzLS4xNi4wMy0uMTYuMDItLjE1LjAzLS4xNS4wMi0uMTQuMDItLjEzLjAzLS4xMy4wMi0uMTIuMDItLjEyLjAxLS4xLjAyLS4xLjAyLS4wOS4wMS0uMDguMDEtLjA3LjAyLS4wNi4wMS0uMDUuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA2LjAxLS4wNy4wMWgtLjA2bC0uMDcuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA2LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA3LjAxaC0uMDZsLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDFoLS4wNmwtLjA3LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA2LjAxaC0uMDdsLS4wNy4wMS0uMDYuMDEtLjQ1LjA2LS40NC4wNS0uNDMuMDUtLjQzLjA1LS40My4wNC0uNDIuMDUtLjQyLjA0LS40MS4wMy0uNDEuMDQtLjQuMDMtLjM5LjAzLS4zOS4wMy0uMzguMDItLjM3LjAzLS4zNy4wMi0uMzYuMDItLjM1LjAyLS4zNC4wMS0uMzMuMDItLjMzLjAxLS4zMi4wMS0uMy4wMS0uMy4wMS0uMjkuMDEtLjI4LjAxLS4yNy4wMS0uMjYuMDFoLS4yNGwtLjI0LjAxaC0uMjNsLS4yMS4wMWgtLjJsLS4xOS4wMWgtLjM0bC0uMTYuMDFIMjgxbC0uMTMuMDFoLS4xMWwtLjEuMDEtMS4wMS0uMDEtLjk3LS4wMi0uOTMtLjA0LS45LS4wNS0uODYtLjA2LS44My0uMDgtLjc5LS4wOS0uNzYtLjA5LS43My0uMTEtLjctLjExLS42Ny0uMTMtLjY0LS4xMy0uNjEtLjE0LS41OC0uMTQtLjU1LS4xNS0uNTMtLjE2LS41LS4xNS0uNDgtLjE3LS40NS0uMTYtLjQzLS4xNi0uNDEtLjE3LS4zOS0uMTctLjM3LS4xNi0uMzUtLjE3LS4zMi0uMTYtLjMyLS4xNi0uMjktLjE1LS4yOC0uMTYtLjI2LS4xNC0uMjUtLjE0LS4yMy0uMTQtLjIyLS4xMi0uMjEtLjEyLS4xOS0uMTEtLjE5LS4xLS4xOC0uMDktLjE2LS4wOC0uMTYtLjA3LS4xNS0uMDUtLjE1LS4wNS0uMTEtLjEtLjEtLjEtLjExLS4xLS4xMS0uMS0uMS0uMTEtLjEtLjEtLjEtLjExLS4xLS4xLS4xLS4xMS0uMS0uMTEtLjEtLjExLS4wOS0uMTItLjEtLjExLS4wOS0uMTEtLjA5LS4xMi0uMDktLjExLS4wOS0uMTItLjA4LS4xMi0uMDktLjEyLS4wOS0uMTItLjA4LS4xMi0uMDgtLjEyLS4wOC0uMTItLjA4LS4xMi0uMDgtLjEzLS4wNy0uMTItLjA4LS4xMy0uMDctLjEzLS4wNy0uMTItLjA3LS4xMy0uMDctLjEzLS4wNy0uMTMtLjA3LS4xMy0uMDYtLjE0LS4wNy0uMTMtLjA2LS4xMy0uMDYtLjE0LS4wNi0uMTMtLjA1LS4xNC0uMDYtLjEzLS4xMy0uMzItLjEyLS4zMS0uMTItLjMzLS4xMS0uMzItLjEtLjMzLS4xLS4zMy0uMS0uMzMtLjA4LS4zMy0uMDktLjMzLS4wNy0uMzMtLjA4LS4zMy0uMDctLjMzLS4wNi0uMzMtLjA2LS4zMy0uMDUtLjMyLS4wNS0uMzItLjA1LS4zMS0uMDUtLjMyLS4wNC0uMy0uMDMtLjMtLjA0LS4zLS4wMy0uMjktLjAzLS4yOC0uMDMtLjI4LS4wMi0uMjctLjAzLS4yNS0uMDItLjI1LS4wMi0uMjQtLjAxLS4yNC0uMDItLjIyLS4wMi0uMi0uMDEtLjItLjAxLS4xOS0uMDItLjE3LS4wMS0uMTYtLjAxLS4xNS0uMDItLjEzLS4wMS0uMTItLjAxLS4xLS4wMi0uMDl2LS4yNWwtLjAxLS4wOHYtLjYxbC0uMDEtLjA0di00MS41N2gtNDkuNjN2NjAuMjNsLS4xNi4wNS0uMTcuMDQtLjE3LjA0LS4xOC4wNS0uMTguMDQtLjE4LjA0LS4xOS4wNC0uMTguMDQtLjE5LjA0LS4xOS4wNC0uMTkuMDQtLjE5LjA0LS4xOS4wMy0uMTkuMDQtLjE5LjA0LS4xOC4wMy0uMTkuMDQtLjE5LjAzLS4xOC4wMy0uMTguMDMtLjE4LjAzLS4xNy4wMy0uMTcuMDMtLjE3LjAzLS4xNi4wMy0uMTUuMDItLjE2LjAzLS4xNC4wMi0uMTQuMDItLjE0LjAzLS4xMi4wMi0uMTIuMDItLjEyLjAxLS4xLjAyLS4xLjAyLS4wOS4wMS0uMDguMDEtLjA3LjAyLS4wNi4wMS0uMDUuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA3LjAxLS4wNi4wMWgtLjA3bC0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA2LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxaC0uMDZsLS4wNy4wMS0uMDcuMDEtLjA2LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDFoLS4wN2wtLjA2LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA3LjAxaC0uMDZsLS4wNy4wMS0uMDYuMDEtLjQ1LjA2LS40NC4wNS0uNDMuMDUtLjQ0LjA1LS40Mi4wNC0uNDMuMDUtLjQxLjA0LS40MS4wMy0uNDEuMDQtLjQuMDMtLjM5LjAzLS4zOS4wMy0uMzguMDItLjM3LjAzLS4zNy4wMi0uMzYuMDItLjM1LjAyLS4zNC4wMS0uMzQuMDItLjMyLjAxLS4zMi4wMS0uMzEuMDEtLjMuMDEtLjI4LjAxLS4yOC4wMS0uMjcuMDEtLjI2LjAxaC0uMjVsLS4yMy4wMWgtLjIzbC0uMjEuMDFoLS4ybC0uMTkuMDFoLS4zNWwtLjE1LjAxaC0uMTRsLS4xMi4wMWgtLjExbC0uMS4wMS0xLjAxLS4wMS0uOTctLjAyLS45NC0uMDQtLjg5LS4wNS0uODYtLjA2LS44My0uMDgtLjgtLjA5LS43Ni0uMDktLjczLS4xMS0uNjktLjExLS42Ny0uMTMtLjY0LS4xMy0uNjEtLjE0LS41OC0uMTQtLjU1LS4xNS0uNTMtLjE2LS41LS4xNS0uNDgtLjE3LS40Ni0uMTYtLjQzLS4xNi0uNDEtLjE3LS4zOC0uMTctLjM3LS4xNi0uMzUtLjE3LS4zMy0uMTYtLjMxLS4xNi0uMjktLjE1LS4yOC0uMTYtLjI2LS4xNC0uMjUtLjE0LS4yMy0uMTQtLjIyLS4xMi0uMjEtLjEyLS4yLS4xMS0uMTgtLjEtLjE4LS4wOS0uMTYtLjA4LS4xNi0uMDctLjE2LS4wNS0uMTQtLjA1LS4xMS0uMS0uMTEtLjEtLjEtLjEtLjExLS4xLS4xLS4xMS0uMTEtLjEtLjEtLjExLS4xLS4xLS4xLS4xMS0uMDktLjExLS4xLS4xMS0uMDktLjEyLS4xLS4xMS0uMDktLjExLS4wOS0uMTItLjA5LS4xMS0uMDktLjEyLS4wOS0uMTItLjA4LS4xMi0uMDktLjEyLS4wOC0uMTItLjA4LS4xMi0uMDgtLjEyLS4wOC0uMTItLjA4LS4xMy0uMDgtLjEyLS4wNy0uMTMtLjA3LS4xMy0uMDgtLjEyLS4wNy0uMTMtLjA3LS4xMy0uMDYtLjEzLS4wNy0uMTMtLjA2LS4xNC0uMDctLjEzLS4wNi0uMTMtLjA2LS4xNC0uMDYtLjEzLS4wNi0uMTQtLjA1LS4xMy0uMTMtLjMyLS4xMy0uMzEtLjExLS4zMy0uMTEtLjMyLS4xMS0uMzMtLjEtLjMzLS4wOS0uMzMtLjA5LS4zMy0uMDgtLjMzLS4wOC0uMzMtLjA3LS4zMy0uMDctLjMzLS4wNi0uMzMtLjA2LS4zMy0uMDYtLjMyLS4wNS0uMzItLjA0LS4zMS0uMDUtLjMyLS4wNC0uMy0uMDQtLjMtLjAzLS4zLS4wMy0uMjktLjAzLS4yOC0uMDMtLjI4LS4wMi0uMjctLjAzLS4yNS0uMDItLjI1LS4wMi0uMjQtLjAyLS4yNC0uMDEtLjIyLS4wMi0uMi0uMDEtLjItLjAyLS4xOS0uMDEtLjE3LS4wMS0uMTYtLjAyLS4xNS0uMDEtLjEzLS4wMS0uMTItLjAyLS4xLS4wMS0uMDl2LS4yMmwtLjAxLS4wM3YtLjQ3bC0uMDEtLjA0VjI3OC43OWwuMTgtLjAzLjE4LS4wMy4xOS0uMDMuMTktLjAzLjE5LS4wMy4yLS4wMy4xOS0uMDMuMi0uMDQuMi0uMDMuMTktLjAzLjItLjAzLjItLjAzLjItLjAzLjItLjA0LjE5LS4wMy4yLS4wMy4xOS0uMDMuMTktLjAzLjE5LS4wMy4xOS0uMDMuMTgtLjAyLjE4LS4wMy4xNy0uMDMuMTctLjAzLjE3LS4wMi4xNi0uMDMuMTYtLjAyLjE1LS4wMy4xNC0uMDIuMjctLjA0LjEyLS4wMi4xMi0uMDIuMS0uMDEuMS0uMDIuMDktLjAxLjA5LS4wMi4wNy0uMDEuMDYtLjAxLjA2LS4wMS4wNi0uMDEuMi0uMDMuMTMtLjAyLjItLjAzLjEzLS4wMi4xMy0uMDIuMi0uMDMuMTMtLjAyLjItLjAzLjEzLS4wMi4yLS4wMy4xMy0uMDIuMTMtLjAyLjItLjAzLjEzLS4wMi4yLS4wMy4xMy0uMDIuNDQtLjA2LjQ0LS4wNy40My0uMDYuNDMtLjA1LjQzLS4wNS40MS0uMDUuNDItLjA1LjQtLjA0LjQtLjA0LjQtLjA0LjM4LS4wMy4zOC0uMDQuMzctLjAzLjM3LS4wMi4zNi0uMDMuMzUtLjAyLjM0LS4wMi4zMy0uMDIuMzMtLjAyLjMyLS4wMi4zLS4wMS4zLS4wMS4yOS0uMDIuMjgtLjAxLjI3LS4wMWguMjZsLjI1LS4wMS4yNC0uMDEuMjMtLjAxaC4yMWwuMjEtLjAxaC4xOWwuMTktLjAxaC4xN2wuMTYtLjAxaC4xNWwuMTMtLjAxaC4xMmwuMTEtLjAxaDEuMjFsLjE2LjAxaC4zMmwuMTYuMDFoLjMybC4xNS4wMWguMTZsLjE2LjAxLjE2LjAxaC4xNmwuMTYuMDEuMTYuMDEuMTYuMDFoLjE2bC4xNi4wMS4xNS4wMS4xNi4wMS4xNi4wMS4xNi4wMS4xNi4wMS4xNi4wMS4xNi4wMi4xNi4wMS4xNS4wMS4xNi4wMS4xNi4wMi4xNi4wMS4xNi4wMi4xNi4wMS4xNi4wMi4xNS4wMS4xNi4wMi40OC4wNS40Ny4wNi40Ni4wNi40NC4wNy40My4wNy40MS4wNy40MS4wOC4zOS4wOC4zOC4wOC4zNi4wOC4zNi4wOS4zNC4wOS4zNC4wOC4zMi4wOS4zMS4xLjMuMDkuMjguMDkuMjguMDkuMjcuMDkuMjUuMDkuMjUuMDkuMjQuMDkuMjIuMDkuMjIuMDkuMjEuMDguMTkuMDkuMTkuMDguMTguMDcuMTcuMDguMTYuMDcuMTYuMDcuMTQuMDYuMTQuMDYuMTIuMDYuMTIuMDUuMTEuMDUuMTEuMDQuMS4wNC4wOC4wMy4wOS4wMi4wNC4wMy4wNS4wMi4wNS4wMy4wNC4wMy4wNS4wMi4wNC4wMy4wNS4wMy4wNS4wMi4wNC4wMy4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMi4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMi4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNC4wNC4wNS4wMy4wNC4wMy4wNC4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNC4wNC4wNS4wMy4wNC4wMy4zOC4zMS4zNi4zNC4zNC4zNS4zMy4zNi4zMS4zOC4yOC40LjI4LjQxLjI1LjQyLjI1LjQzLjIyLjQ0LjIxLjQ1LjIuNDUuMTkuNDYuMTcuNDcuMTYuNDYuMTUuNDcuMTMuNDcuMTMuNDcuMTIuNDcuMTEuNDYuMS40Ni4wOS40NS4wOC40NC4wOC40NC4wNy40Mi4wNi40Mi4wNi40LjA1LjM5LjA1LjM3LjA1LjM2LjA0LjM0LjA0LjMyLjA0LjMuMDQuMjkuMDMuMjUuMDQuMjQuMDQuMjEuMDQuMTguMDMuMTYuMDUuMTN2LjI1bC4wMS4wNXYuMjVsLjAxLjA1di40MWwuMDEuMDV2NDIuODNoNDkuNjN2LTYxbC4wOS0uMDEuMDktLjAyLjA4LS4wMS4wOS0uMDEuMDgtLjAyLjA5LS4wMS4wOS0uMDIuMDgtLjAxLjA5LS4wMi4wOS0uMDEuMDgtLjAxLjA5LS4wMi4wOS0uMDEuMDgtLjAyLjA5LS4wMS4wOS0uMDEuMDgtLjAyLjA5LS4wMS4wOS0uMDEuMDgtLjAyLjE1LS4wMi4xNS0uMDMuMTUtLjAyLjE1LS4wMi4xNS0uMDMuMTUtLjAyLjE1LS4wMy4xNS0uMDIuMTUtLjAyLjE1LS4wMy4xNC0uMDIuMTUtLjAyLjE1LS4wMy4xNC0uMDIuMTQtLjAyLjE0LS4wMi4xNC0uMDMuMTQtLjAyLjEzLS4wMi4xNC0uMDIuMTItLjAyLjEzLS4wMi4xMi0uMDIuMTItLjAyLjEyLS4wMS4xMS0uMDIuMTEtLjAyLjItLjAzLjM1LS4wNS4wNy0uMDEuMTQtLjAzaC4wNWwuMDUtLjAxLjA1LS4wMS4wNC0uMDEuMDYtLjAxLjItLjAzLjEzLS4wMi4yLS4wMy4xMy0uMDIuMTMtLjAyLjItLjAzLjEzLS4wMi4yLS4wMy4xMy0uMDIuMi0uMDMuMTMtLjAyLjEzLS4wMi4yLS4wMy4xMy0uMDIuMi0uMDMuMTMtLjAyLjQ0LS4wNi40NC0uMDcuNDQtLjA2LjQyLS4wNS40My0uMDUuNDItLjA1LjQxLS4wNS40LS4wNC40LS4wNC40LS4wNC4zOC0uMDMuMzgtLjA0LjM4LS4wMy4zNi0uMDIuMzYtLjAzLjM1LS4wMi4zNC0uMDIuMzQtLjAyLjMyLS4wMi4zMi0uMDIuMzEtLjAxLjI5LS4wMS4yOS0uMDIuMjgtLjAxLjI3LS4wMWguMjZsLjI1LS4wMS4yNC0uMDEuMjMtLjAxaC4yMmwuMi0uMDFoLjJsLjE4LS4wMWguMTdsLjE2LS4wMWguMTVsLjEzLS4wMWguMTJsLjExLS4wMWguNzR6bTExNi42OSAzNC44OS0uMjcuMDFoLS41MmwtLjI2LjAxaC0uMjVsLS4yNS4wMWgtLjI0bC0uMjUuMDEtLjI0LjAxaC0uMjNsLS4yMy4wMS0uMjMuMDEtLjIyLjAxLS4yMi4wMWgtLjIxbC0uMjEuMDEtLjIuMDEtLjIuMDEtLjE5LjAxLS4xOS4wMS0uMTguMDEtLjE3LjAxLS4xNy4wMS0uMTYuMDFoLS4xNmwtLjE1LjAxLS4xNC4wMS0uMTQuMDEtLjI1LjAxLS4xMS4wMS0uMTEuMDFoLS4xbC0uMDkuMDFoLS4xNmwtLjA3LjAxaC0uMDZsLS4xOS4wMS0uMTkuMDItLjE4LjAxLS4xOS4wMS0uMTkuMDItLjE5LjAxLS4xOS4wMi0uMTguMDEtLjE5LjAyLS4xOS4wMi0uMTkuMDEtLjE5LjAyLS4xOS4wMi0uMTkuMDEtLjE5LjAyLS4xOS4wMi0uMTkuMDItLjE5LjAxLS4xOS4wMi0uMTkuMDItLjE5LjAyLS4xOS4wMi0uMTkuMDItLjE5LjAyLS4yLjAyLS4xOS4wMy0uMTkuMDItLjE5LjAyLS4xOS4wMi0uMTkuMDItLjIuMDMtLjE5LjAyLS4xOS4wMi0uMi4wMy0uMTkuMDItLjE5LjAyLS4xOS4wMy0uMi4wMi0uMTkuMDMtLjIuMDN2ODkuOTVsLjE1LjAyLjE1LjAzLjE1LjAyLjE0LjAzLjE1LjAyLjE1LjAzLjE1LjAyLjE0LjAzLjE1LjAyLjE0LjAyLjE1LjAyLjE0LjAyLjE0LjAyLjE0LjAyLjEzLjAyLjE0LjAyLjEzLjAyLjEzLjAyLjEzLjAxLjEzLjAyLjEyLjAyLjEyLjAxLjEyLjAyLjExLjAxLjExLjAyLjExLjAxLjEuMDEuMS4wMi4wOS4wMS4wOS4wMS4xNy4wMi4wOC4wMS4wNy4wMS4wNi4wMWguMDZsLjA2LjAxLjA1LjAxaC4wNGwuMDQuMDEuMDYuMDFoLjA2bC4wNi4wMS4wNi4wMWguMDZsLjA2LjAxLjA3LjAxaC4wNmwuMDYuMDEuMDYuMDFoLjA2bC4wNi4wMS4wNi4wMWguMDdsLjA2LjAxLjA2LjAxaC4wNmwuMDYuMDFoLjA2bC4wNi4wMS4wNy4wMWguMDZsLjA2LjAxLjA2LjAxaC4wNmwuMDYuMDFoLjA2bC4wNy4wMS4wNi4wMWguMDZsLjA2LjAxaC4wNmwuMDYuMDEuMDYuMDFoLjA3bC4wNi4wMWguMDZsLjA2LjAxLjA2LjAxaC4wNmwuMzEuMDMuMy4wMy4zLjAyLjI5LjAzLjI5LjAyLjI4LjAyLjI4LjAyLjI3LjAyLjI3LjAxLjI2LjAyLjI2LjAxLjI1LjAyLjI0LjAxLjI0LjAxLjIzLjAxLjIzLjAxLjIyLjAxLjIxLjAxLjIxLjAxLjIuMDFoLjJsLjE5LjAxaC4xOGwuMTcuMDFoLjE3bC4xNy4wMWguNDVsLjEzLjAxaC4zN2wuMS4wMWguMzZsLjA3LjAxaDEuMDhsLjM0LS4wMS4zNC0uMDEuMzMtLjAxLjM0LS4wMS4zNC0uMDIuMzQtLjAxLjM0LS4wMi4zNC0uMDMuMzMtLjAyLjM0LS4wMy4zNC0uMDMuMzQtLjA0LjMzLS4wMy4zNC0uMDQuMzQtLjA0LjMzLS4wNC4zNC0uMDUuMzMtLjA1LjM0LS4wNS4zMy0uMDUuMzQtLjA2LjMzLS4wNi4zMy0uMDYuMzQtLjA2LjMzLS4wNy4zMy0uMDYuMzMtLjA4LjMzLS4wNy4zNC0uMDcuMzMtLjA4LjMyLS4wOC4zMy0uMDkuMzMtLjA4LjMzLS4wOS4zMy0uMDkuMzItLjA5LjMzLS4xLjQ0LS4xMy40NC0uMTUuNDQtLjE0LjQ0LS4xNi40My0uMTYuNDMtLjE2LjQzLS4xNy40My0uMTguNDItLjE4LjQyLS4xOC40Mi0uMTkuNDItLjIuNDEtLjIuNDEtLjIxLjQxLS4yMS40MS0uMjEuNC0uMjMuNC0uMjIuNC0uMjQuMzktLjIzLjM5LS4yNC4zOS0uMjUuMzgtLjI1LjM4LS4yNi4zOC0uMjYuMzgtLjI3LjM3LS4yNy4zNy0uMjcuMzYtLjI4LjM2LS4yOS4zNi0uMjkuMzYtLjI5LjM1LS4zLjM0LS4zMS4zNS0uMy4zNC0uMzIuMzMtLjMyLjM0LS4zMi4zMi0uMzIuMzMtLjMzLjI4LS4zLjI3LS4yOS4yNy0uMy4yNy0uMy4yNi0uMzEuMjYtLjMxLjI1LS4zMS4yNi0uMzEuMjQtLjMxLjI1LS4zMi4yNC0uMzIuMjQtLjMzLjIzLS4zMi4yMy0uMzMuMjMtLjMzLjIyLS4zNC4yMi0uMzMuMjEtLjM0LjIyLS4zNC4yLS4zNS4yMS0uMzQuMi0uMzUuMTktLjM1LjE5LS4zNS4xOS0uMzYuMTgtLjM1LjE4LS4zNi4xOC0uMzYuMTctLjM2LjE3LS4zNy4xNi0uMzcuMTYtLjM2LjE2LS4zOC4xNS0uMzcuMTUtLjM3LjE0LS4zOC4xNC0uMzguMTMtLjM4LjEzLS4zOC4xMy0uMzguMjEtLjY2LjIxLS42NS4xOS0uNjYuMTgtLjY2LjE3LS42Ni4xNi0uNjYuMTUtLjY2LjE0LS42Ni4xMy0uNjYuMTItLjY1LjEyLS42NC4xLS42NS4xLS42My4wOS0uNjMuMDgtLjYyLjA4LS42MS4wNy0uNjEuMDYtLjU5LjA2LS41OC4wNS0uNTcuMDUtLjU2LjA0LS41NS4wNC0uNTMuMDQtLjUxLjAzLS41MS4wMi0uNDguMDMtLjQ3LjAyLS40NC4wMi0uNDMuMDItLjQxLjAyLS4zOS4wMi0uMzcuMDEtLjM0LjAyLS4zMy4wMS0uMy4wMi0uMjcuMDEtLjI1LjAyLS4yMi4wMi0uMi4wMi0uMTYtLjAxLTEuMTQtLjAyLTEuMS0uMDQtMS4wOC0uMDUtMS4wNS0uMDYtMS4wMi0uMDgtMS0uMDgtLjk3LS4xLS45NC0uMTEtLjkxLS4xMi0uODktLjEyLS44Ny0uMTMtLjgzLS4xNC0uODEtLjE1LS43OS0uMTUtLjc2LS4xNi0uNzQtLjE2LS43MS0uMTYtLjY4LS4xNi0uNjctLjE3LS42My0uMTctLjYyLS4xNy0uNTktLjE2LS41Ny0uMTctLjU0LS4xNi0uNTItLjE2LS41LS4xNi0uNDctLjE1LS40Ni0uMTUtLjQzLS4xNC0uNDEtLjE0LS4zOC0uMTMtLjM3LS4xMi0uMzQtLjExLS4zMy0uMS0uMy0uMDktLjI4LS4wOC0uMjYtLjA3LS4yNS0uMDUtLjIyLS4wNC0uMi0uMTItLjI2LS4xMi0uMjUtLjEyLS4yNi0uMTItLjI1LS4xMy0uMjYtLjEyLS4yNS0uMTMtLjI1LS4xMy0uMjUtLjEzLS4yNS0uMTQtLjI1LS4xMy0uMjUtLjE0LS4yNC0uMTQtLjI1LS4xNC0uMjQtLjE1LS4yNC0uMTQtLjI0LS4xNS0uMjQtLjE1LS4yNC0uMTUtLjI0LS4xNi0uMjQtLjE1LS4yMy0uMTYtLjIzLS4xNi0uMjQtLjE2LS4yMy0uMTYtLjIzLS4xNy0uMjMtLjE2LS4yMi0uMTctLjIzLS4xNy0uMjMtLjE3LS4yMi0uMTgtLjIyLS4xNy0uMjItLjE4LS4yMi0uMTgtLjIyLS4xOC0uMjItLjE4LS4yMS0uMTktLjIxLS4xOS0uMjItLjE4LS4yMS0uMTktLjIxLS40Ni0uNDgtLjQ2LS40Ny0uNDctLjQ3LS40Ny0uNDUtLjQ5LS40NS0uNDktLjQzLS41LS40My0uNTEtLjQxLS41MS0uNDEtLjUyLS40LS41My0uMzktLjUzLS4zNy0uNTQtLjM3LS41NC0uMzYtLjU2LS4zNC0uNTYtLjM0LS41Ni0uMzMtLjU3LS4zMS0uNTctLjMxLS41OC0uMy0uNTktLjI4LS41OS0uMjctLjYtLjI3LS42LS4yNS0uNi0uMjQtLjYxLS4yMy0uNjItLjIyLS42Mi0uMjEtLjYyLS4yLS42My0uMTktLjYzLS4xNy0uNjMtLjE3LS42NC0uMTUtLjY0LS4xNC0uNjQtLjEzLS42NS0uMTItLjY1LS4xLS42NS0uMS0uNjYtLjA4LS42Ni0uMDctLjE1LS4wMi0uMTUtLjAxLS4xNS0uMDItLjE0LS4wMi0uMTUtLjAxLS4xNS0uMDItLjE1LS4wMS0uMTUtLjAyLS4xNS0uMDEtLjE1LS4wMS0uMTUtLjAyLS4xNS0uMDEtLjE1LS4wMS0uMTUtLjAxLS4xNS0uMDEtLjE1LS4wMi0uMTUtLjAxLS4xNS0uMDFoLS4xNWwtLjE1LS4wMS0uMTUtLjAxLS4xNi0uMDEtLjE1LS4wMS0uMTUtLjAxaC0uMTVsLS4xNS0uMDFoLS4xNWwtLjE1LS4wMWgtLjE1bC0uMTUtLjAxaC0uMTVsLS4xNS0uMDFoLS40NWwtLjE1LS4wMWgtMS4xNHpNMzIyLjk2IDkwLjEybC42OS4xLjY4LjEyLjY4LjE1LjY3LjE3LjY3LjIxLjY2LjIzLjY1LjI1LjY1LjI5LjY0LjMxLjYzLjM0LjYyLjM2LjYuMzkuNi40Mi41OS40NS41Ny40Ny41Ni41LjU1LjUzIDEyMi4yNyAxMjIuMjguODQuODguNzYuOTIuNjkuOTMuNjIuOTYuNTQuOTguNDguOTkuNCAxIC4zNCAxLjAyLjI4IDEuMDIuMjEgMS4wMy4xNCAxLjAzLjA4IDEuMDQuMDIgMS4wMy0uMDQgMS4wMy0uMSAxLjAyLS4xNSAxLjAxLS4yMiAxLS4wNy4yNkgxODEuMDRsLS4wNy0uMjYtLjIyLTEtLjE1LTEuMDEtLjEtMS4wMi0uMDQtMS4wMy4wMi0xLjAzLjA4LTEuMDQuMTUtMS4wMy4yLTEuMDMuMjgtMS4wMi4zNC0xLjAyLjQtMSAuNDgtLjk5LjU0LS45OC42Mi0uOTYuNjktLjkzLjc2LS45Mi44NC0uODhMMzA4LjEzIDk1LjQxbC41NS0uNTMuNTYtLjUuNTctLjQ3LjU5LS40NS42LS40Mi42LS4zOS42Mi0uMzYuNjMtLjM0LjY0LS4zMS42NS0uMjkuNjUtLjI1LjY3LS4yMy42Ni0uMjEuNjgtLjE3LjY3LS4xNS42OC0uMTIuNjktLjEuNjgtLjA3LjY5LS4wNC42OS0uMDEuNjkuMDEuNjkuMDQuNjguMDd6IiBpZD0iYiIvPjwvZGVmcz48dXNlIHhsaW5rOmhyZWY9IiNhIiBmaWxsLW9wYWNpdHk9IjAiLz48dXNlIHhsaW5rOmhyZWY9IiNiIiBmaWxsPSIjZmZmIi8+PHVzZSB4bGluazpocmVmPSIjYiIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwIi8+PC9zdmc+");
32
+
33
+ /***/ }),
34
+
35
+ /***/ "./src/addons/addons/better-img-uploads/_runtime_entry.js":
36
+ /*!****************************************************************!*\
37
+ !*** ./src/addons/addons/better-img-uploads/_runtime_entry.js ***!
38
+ \****************************************************************/
39
+ /*! exports provided: resources */
40
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
41
+
42
+ "use strict";
43
+ __webpack_require__.r(__webpack_exports__);
44
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
45
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/better-img-uploads/userscript.js");
46
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./style.css */ "./node_modules/css-loader/index.js!./src/addons/addons/better-img-uploads/style.css");
47
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__);
48
+ /* harmony import */ var _url_loader_icon_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! url-loader!./icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/better-img-uploads/icon.svg");
49
+ /* generated by pull.js */
50
+
51
+
52
+
53
+ const resources = {
54
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"],
55
+ "style.css": _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default.a,
56
+ "icon.svg": _url_loader_icon_svg__WEBPACK_IMPORTED_MODULE_2__["default"]
57
+ };
58
+
59
+ /***/ }),
60
+
61
+ /***/ "./src/addons/addons/better-img-uploads/userscript.js":
62
+ /*!************************************************************!*\
63
+ !*** ./src/addons/addons/better-img-uploads/userscript.js ***!
64
+ \************************************************************/
65
+ /*! exports provided: default */
66
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
67
+
68
+ "use strict";
69
+ __webpack_require__.r(__webpack_exports__);
70
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
71
+ let {
72
+ addon,
73
+ console,
74
+ msg
75
+ } = _ref;
76
+ let mode = addon.settings.get("fitting");
77
+ addon.settings.addEventListener("change", () => {
78
+ mode = addon.settings.get("fitting");
79
+ });
80
+ const createItem = (id, right) => {
81
+ const uploadMsg = msg("upload");
82
+ const wrapper = Object.assign(document.createElement("div"), {
83
+ id
84
+ });
85
+ const button = Object.assign(document.createElement("button"), {
86
+ className: "".concat(addon.tab.scratchClass("action-menu_button"), " ").concat(addon.tab.scratchClass("action-menu_more-button"), " sa-better-img-uploads-btn"),
87
+ currentitem: "false"
88
+ });
89
+ button.dataset.for = "sa-".concat(id, "-HD Upload");
90
+ button.dataset.tip = uploadMsg;
91
+ const img = Object.assign(document.createElement("img"), {
92
+ className: "".concat(addon.tab.scratchClass("action-menu_more-icon"), " sa-better-img-uploader"),
93
+ draggable: "false",
94
+ src: addon.self.getResource("/icon.svg") /* rewritten by pull.js */,
95
+ height: "10",
96
+ width: "10"
97
+ });
98
+ button.append(img);
99
+ const input = Object.assign(document.createElement("input"), {
100
+ accept: ".svg, .png, .bmp, .jpg, .jpeg",
101
+ className: "".concat(addon.tab.scratchClass("action-menu_file-input" /* TODO: when adding dynamicDisable, ensure compat with drag-drop */), " sa-better-img-uploads-input"),
102
+ multiple: "true",
103
+ type: "file"
104
+ });
105
+ button.append(input);
106
+ wrapper.append(button);
107
+ const tooltip = Object.assign(document.createElement("div"), {
108
+ className: "__react_component_tooltip place-".concat(right ? "left" : "right", " type-dark ").concat(addon.tab.scratchClass("action-menu_tooltip"), " sa-better-img-uploads-tooltip"),
109
+ id: "sa-".concat(id, "-HD Upload"),
110
+ textContent: uploadMsg
111
+ });
112
+ tooltip.dataset.id = "tooltip";
113
+ wrapper.append(tooltip);
114
+ addon.tab.displayNoneWhileDisabled(wrapper);
115
+ return [wrapper, button, input, tooltip];
116
+ };
117
+ while (true) {
118
+ //Catch all upload menus as they are created
119
+ const spriteSelector = '[class*="sprite-selector_sprite-selector_"] [class*="action-menu_more-buttons_"]';
120
+ const stageSelector = '[class*="stage-selector_stage-selector_"] [class*="action-menu_more-buttons_"]';
121
+ const costumeSelector = '[data-tabs] > :nth-child(3) [class*="action-menu_more-buttons_"]';
122
+ let menu = await addon.tab.waitForElement("".concat(spriteSelector, ", ").concat(stageSelector, ", ").concat(costumeSelector), {
123
+ markAsSeen: true,
124
+ reduxCondition: state => !state.scratchGui.mode.isPlayerOnly,
125
+ reduxEvents: ["scratch-gui/mode/SET_PLAYER", "fontsLoaded/SET_FONTS_LOADED", "scratch-gui/locales/SELECT_LOCALE", "scratch-gui/navigation/ACTIVATE_TAB"]
126
+ });
127
+ let button = menu.parentElement.previousElementSibling.previousElementSibling; //The base button that the popup menu is from
128
+
129
+ let id = button.getAttribute("aria-label").replace(/\s+/g, "_");
130
+ let isRight =
131
+ //Is it on the right side of the screen?
132
+ button.parentElement.classList.contains(addon.tab.scratchClass("sprite-selector_add-button")) || button.parentElement.classList.contains(addon.tab.scratchClass("stage-selector_add-button"));
133
+ if (isRight) {
134
+ id += "_right";
135
+ }
136
+ const [menuItem, hdButton, input, tooltip] = createItem(id, isRight);
137
+ menu.prepend(menuItem);
138
+ hdButton.addEventListener("click", e => {
139
+ // When clicking on the button in the "add backdrop menu", don't switch to the stage before
140
+ // a file was selected.
141
+ e.stopPropagation();
142
+ input.files = new FileList(); //Empty the input to make sure the change event fires even if the same file was uploaded.
143
+ input.click();
144
+ });
145
+ input.addEventListener("change", e => {
146
+ onchange(e, id);
147
+ });
148
+ let observer = new MutationObserver(() => doresize(id, menu, menuItem, isRight));
149
+ observer.observe(menu, {
150
+ attributes: true,
151
+ subtree: true
152
+ });
153
+ function doresize(id, menu, menuItem, isRight) {
154
+ let rect = menuItem.getBoundingClientRect();
155
+ tooltip.style.top = rect.top + 2 + "px";
156
+ tooltip.style[isRight ? "right" : "left"] = isRight ? window.innerWidth - rect.right + rect.width + 10 + "px" : rect.left + rect.width + "px";
157
+ }
158
+ }
159
+ async function onchange(e, id) {
160
+ let iD = id; //Save the id, not sure if this is really necessary?
161
+ let el = e.target;
162
+ let files = Array.from(el.files);
163
+ let processed = new Array();
164
+ for (let file of files) {
165
+ if (file.type.includes("svg")) {
166
+ //The file is already a svg, we should not change it...
167
+ processed.push(file);
168
+ continue;
169
+ }
170
+ let blob = await new Promise(resolve => {
171
+ //Get the Blob data url for the image so that we can add it to the svg
172
+ let reader = new FileReader();
173
+ reader.addEventListener("load", () => resolve(reader.result));
174
+ reader.readAsDataURL(file);
175
+ });
176
+ let i = new Image(); //New image to get the image's size
177
+ i.src = blob;
178
+ await new Promise(resolve => {
179
+ i.onload = resolve;
180
+ });
181
+ let dim = {
182
+ width: i.width,
183
+ height: i.height
184
+ };
185
+ const originalDim = JSON.parse(JSON.stringify(dim));
186
+ if (mode === "fit") {
187
+ //Make sure the image fits completely in the stage
188
+ dim = getResizedWidthHeight(dim.width, dim.height);
189
+ } else if (mode === "fill") {
190
+ //Fill the stage with the image
191
+ dim.height = dim.height / dim.width * 480;
192
+ dim.width = 480;
193
+ if (dim.height < 360) {
194
+ dim.width = dim.width / dim.height * 360;
195
+ dim.height = 360;
196
+ }
197
+ if (dim.width < 480) {
198
+ dim.height = dim.height / dim.width * 480;
199
+ dim.width = 480;
200
+ }
201
+ } //Otherwise just leave the image the same size
202
+
203
+ function getResizedWidthHeight(oldWidth, oldHeight) {
204
+ const STAGE_WIDTH = 479;
205
+ const STAGE_HEIGHT = 360;
206
+ const STAGE_RATIO = STAGE_WIDTH / STAGE_HEIGHT;
207
+
208
+ // If both dimensions are smaller than or equal to corresponding stage dimension,
209
+ // double both dimensions
210
+ if (oldWidth <= STAGE_WIDTH && oldHeight <= STAGE_HEIGHT) {
211
+ return {
212
+ width: oldWidth,
213
+ height: oldHeight
214
+ };
215
+ }
216
+
217
+ // If neither dimension is larger than 2x corresponding stage dimension,
218
+ // this is an in-between image, return it as is
219
+ if (oldWidth <= STAGE_WIDTH && oldHeight <= STAGE_HEIGHT) {
220
+ return {
221
+ width: oldWidth,
222
+ height: oldHeight
223
+ };
224
+ }
225
+ const imageRatio = oldWidth / oldHeight;
226
+ // Otherwise, figure out how to resize
227
+ if (imageRatio >= STAGE_RATIO) {
228
+ // Wide Image
229
+ return {
230
+ width: STAGE_WIDTH,
231
+ height: Math.floor(STAGE_WIDTH / imageRatio)
232
+ };
233
+ }
234
+ // In this case we have either:
235
+ // - A wide image, but not with as big a ratio between width and height,
236
+ // making it so that fitting the width to double stage size would leave
237
+ // the height too big to fit in double the stage height
238
+ // - A square image that's still larger than the double at least
239
+ // one of the stage dimensions, so pick the smaller of the two dimensions (to fit)
240
+ // - A tall image
241
+ // In any of these cases, resize the image to fit the height to double the stage height
242
+ return {
243
+ width: Math.floor(STAGE_HEIGHT * imageRatio),
244
+ height: STAGE_HEIGHT
245
+ };
246
+ }
247
+ processed.push(new File(
248
+ //Create the svg file
249
+ ["<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewbox=\"0,0,".concat(dim.width, ",").concat(dim.height, "\" width=\"").concat(dim.width, "\" height=\"").concat(dim.height, "\">\n <g>\n <g\n data-paper-data='{\"isPaintingLayer\":true}'\n fill=\"none\"\n fill-rule=\"nonzero\"\n stroke=\"none\"\n stroke-width=\"0.5\"\n stroke-linecap=\"butt\"\n stroke-linejoin=\"miter\"\n stroke-miterlimit=\"10\"\n stroke-dasharray=\"\"\n stroke-dashoffset=\"0\"\n style=\"mix-blend-mode: normal;\"\n >\n <image\n width=\"").concat(originalDim.width, "\"\n height=\"").concat(originalDim.height, "\"\n\t\t\t\ttransform=\"scale(").concat(dim.width / originalDim.width, ",").concat(dim.height / originalDim.height, ")\"\n xlink:href=\"").concat(blob, "\"\n />\n </g>\n </g>\n </svg>")], "".concat(file.name.replace(/(.*)\..*/, "$1"), ".svg"), {
250
+ type: "image/svg+xml"
251
+ }));
252
+ }
253
+ (el = document.getElementById(iD).nextElementSibling.querySelector("input")).files = new FileList(processed); //Convert processed image array to a FileList, which is not normally constructible.
254
+
255
+ el.dispatchEvent(new e.constructor(e.type, e)); //Start a new, duplicate, event, but allow scratch to receive it this time.
256
+ }
257
+ function FileList() {
258
+ let arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
259
+ //File list constructor. Does not need the `new` keyword, but it is easier to read
260
+ let filelist = new DataTransfer(); //This "creates" a FileList that we can add files to
261
+ for (let file of arr) {
262
+ filelist.items.add(file);
263
+ }
264
+ return filelist.files; //Completed FileList
265
+ }
266
+ });
267
+
268
+ /***/ })
269
+
270
+ }]);
271
+ //# sourceMappingURL=addon-entry-better-img-uploads.js.map
js/addon-entry-better-img-uploads.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-better-img-uploads.js","sources":["webpack://GUI/./src/addons/addons/better-img-uploads/style.css","webpack://GUI/./src/addons/addons/better-img-uploads/icon.svg","webpack://GUI/./src/addons/addons/better-img-uploads/_runtime_entry.js","webpack://GUI/./src/addons/addons/better-img-uploads/userscript.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"[data-for*=\\\"HD Upload\\\"]:hover + .__react_component_tooltip {\\n visibility: visible;\\n}\\n\\n.sa-better-img-uploads-btn:not([id*=\\\"_right\\\"]) + .__react_component_tooltip {\\n left: auto;\\n}\\n\\n.sa-better-img-uploads-btn[id*=\\\"_right\\\"] + .__react_component_tooltip,\\n[data-for=\\\"sa-Choose_a_Backdrop-HD Upload\\\"] + .__react_component_tooltip {\\n right: auto;\\n}\\n\", \"\"]);\n\n// exports\n","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjY0MCI+PGRlZnM+PHBhdGggZD0iTTAgMGg2NDN2NjQzSDBWMHoiIGlkPSJhIi8+PHBhdGggZD0ibTUyMC41NyAzMzkuMjggMS4zNS4xOSAxLjMzLjI0IDEuMzEuMjkgMS4zLjM0IDEuMjYuMzggMS4yNS40NCAxLjIyLjQ4IDEuMi41MyAxLjE3LjU3IDEuMTQuNjEgMS4xMi42NiAxLjA4LjY5IDEuMDYuNzQgMS4wMi43OC45OS44Mi45Ni44NS45My44OS44OS45Mi44NS45Ni44Mi45OS43NyAxLjAzLjc0IDEuMDUuNyAxLjA5LjY2IDEuMTEuNjEgMS4xNS41NyAxLjE3LjUzIDEuMTkuNDggMS4yMy40MyAxLjI0LjM5IDEuMjcuMzQgMS4yOS4yOSAxLjMxLjI0IDEuMzQuMTkgMS4zNS4xMyAxLjM3LjA4IDEuMzkuMDMgMS40djczLjlsLS4wOSA0LjI1LS4yNSA0LjItLjQyIDQuMTYtLjU5IDQuMTEtLjc0IDQuMDYtLjkgNC0xLjA2IDMuOTUtMS4yIDMuODgtMS4zNSAzLjgxLTEuNSAzLjc1LTEuNjMgMy42Ny0xLjc3IDMuNi0xLjkgMy41Mi0yLjA0IDMuNDMtMi4xNiAzLjM1LTIuMjggMy4yNi0yLjQgMy4xNi0yLjUyIDMuMDctMi42MyAyLjk3LTIuNzUgMi44Ny0yLjg1IDIuNzYtMi45NSAyLjY1LTMuMDUgMi41My0zLjE1IDIuNDItMy4yNCAyLjMtMy4zNCAyLjE4LTMuNDIgMi4wNC0zLjUgMS45Mi0zLjU4IDEuNzktMy42NiAxLjY0LTMuNzQgMS41MS0zLjggMS4zNi0zLjg3IDEuMjEtMy45NCAxLjA3LTMuOTkuOTEtNC4wNS43NS00LjExLjU5LTQuMTUuNDMtNC4yLjI1LTQuMjUuMDlIMTkzLjQ3bC00LjI4LS4wOS00LjI0LS4yNS00LjE4LS40My00LjEzLS41OS00LjA4LS43NS00LjAyLS45MS0zLjk2LTEuMDctMy44OS0xLjIxLTMuODItMS4zNi0zLjc2LTEuNTEtMy42OC0xLjY0LTMuNi0xLjc5LTMuNTEtMS45Mi0zLjQ0LTIuMDQtMy4zNS0yLjE4LTMuMjUtMi4zLTMuMTYtMi40Mi0zLjA3LTIuNTMtMi45Ni0yLjY1LTIuODYtMi43Ni0yLjc1LTIuODctMi42NC0yLjk3LTIuNTItMy4wNy0yLjQxLTMuMTYtMi4yOS0zLjI2LTIuMTYtMy4zNS0yLjA0LTMuNDMtMS45MS0zLjUyLTEuNzctMy42LTEuNjQtMy42Ny0xLjQ5LTMuNzUtMS4zNS0zLjgxLTEuMjEtMy44OC0xLjA1LTMuOTUtLjkxLTQtLjc0LTQuMDYtLjU5LTQuMTEtLjQyLTQuMTYtLjI1LTQuMi0uMDktNC4yNXYtNzMuOWwuMDMtMS40LjA4LTEuMzkuMTQtMS4zNy4xOS0xLjM1LjI1LTEuMzQuMy0xLjMxLjM0LTEuMjkuNC0xLjI3LjQ1LTEuMjQuNDktMS4yMy41My0xLjE5LjU5LTEuMTcuNjItMS4xNS42Ny0xLjExLjcxLTEuMDkuNzUtMS4wNS43OC0xLjAzLjgzLS45OS44Ni0uOTYuOS0uOTIuOTMtLjg5Ljk3LS44NSAxLS44MiAxLjAyLS43OCAxLjA2LS43NCAxLjA5LS42OSAxLjEyLS42NiAxLjE0LS42MSAxLjE3LS41NyAxLjE5LS41MyAxLjIxLS40OCAxLjI0LS40NCAxLjI1LS4zOCAxLjI4LS4zNCAxLjMtLjI5IDEuMzEtLjI0IDEuMzMtLjE5IDEuMzQtLjEzIDEuMzYtLjA5IDEuMzctLjAyIDEuMzcuMDIgMS4zNi4wOSAxLjM1LjEzIDEuMzMuMTkgMS4zMS4yNCAxLjI5LjI5IDEuMjguMzQgMS4yNi4zOCAxLjIzLjQ0IDEuMjIuNDggMS4xOS41MyAxLjE3LjU3IDEuMTQuNjEgMS4xMS42NiAxLjA5LjY5IDEuMDYuNzQgMS4wMy43OCAxIC44Mi45Ni44NS45NC44OS44OS45Mi44Ny45Ni44Mi45OS43OSAxLjAzLjc1IDEuMDUuNzEgMS4wOS42NyAxLjExLjYyIDEuMTUuNTggMS4xNy41NCAxLjE5LjQ5IDEuMjMuNDUgMS4yNC4zOSAxLjI3LjM1IDEuMjkuMyAxLjMxLjI0IDEuMzQuMTkgMS4zNS4xNCAxLjM3LjA5IDEuMzkuMDMgMS40djczLjlsLjAzIDEuNDguMDkgMS40NS4xNCAxLjQ1LjIxIDEuNDMuMjYgMS40MS4zMSAxLjQuMzcgMS4zNy40MiAxLjM1LjQ4IDEuMzQuNTIgMS4zMS41NyAxLjI4LjYyIDEuMjYuNjcgMS4yMy43MSAxLjIxLjc2IDEuMTcuOCAxLjE1Ljg1IDEuMTEuODggMS4wOC45MiAxLjA1Ljk3IDEgMSAuOTggMS4wNC45MyAxLjA3LjkgMS4xMS44NSAxLjE0LjgxIDEuMTcuNzcgMS4yMS43MiAxLjIzLjY4IDEuMjYuNjMgMS4yOS41OSAxLjMyLjUzIDEuMzQuNDggMS4zNy40MyAxLjM5LjM4IDEuNDEuMzIgMS40My4yNyAxLjQ1LjIxIDEuNDcuMTUgMS40OS4wOSAxLjUxLjAzaDI1My41MWwxLjQ3LS4wMyAxLjQ2LS4wOSAxLjQ0LS4xNSAxLjQyLS4yMSAxLjQxLS4yNyAxLjM5LS4zMiAxLjM2LS4zOCAxLjM1LS40MyAxLjMyLS40OCAxLjI5LS41MyAxLjI4LS41OSAxLjI0LS42MyAxLjIyLS42OCAxLjE5LS43MiAxLjE2LS43NyAxLjEzLS44MSAxLjA5LS44NSAxLjA3LS45IDEuMDMtLjkzLjk5LS45OC45NS0xIC45Mi0xLjA1Ljg4LTEuMDguODQtMS4xMS43OS0xLjE1Ljc2LTEuMTcuNzEtMS4yMS42Ni0xLjIzLjYyLTEuMjYuNTctMS4yOC41Mi0xLjMxLjQ3LTEuMzQuNDItMS4zNS4zNy0xLjM3LjMxLTEuNC4yNi0xLjQxLjIxLTEuNDMuMTQtMS40NS4wOS0xLjQ1LjAzLTEuNDh2LTczLjlsLjAzLTEuNC4wOS0xLjM5LjE0LTEuMzcuMTktMS4zNS4yNC0xLjM0LjMtMS4zMS4zNS0xLjI5LjM5LTEuMjcuNDUtMS4yNC40OS0xLjIzLjU0LTEuMTkuNTgtMS4xNy42Mi0xLjE1LjY3LTEuMTEuNzEtMS4wOS43NS0xLjA1Ljc5LTEuMDMuODItLjk5Ljg3LS45Ni44OS0uOTIuOTQtLjg5Ljk2LS44NSAxLS44MiAxLjAzLS43OCAxLjA2LS43NCAxLjA5LS42OSAxLjExLS42NiAxLjE0LS42MSAxLjE3LS41NyAxLjE5LS41MyAxLjIyLS40OCAxLjIzLS40NCAxLjI2LS4zOCAxLjI4LS4zNCAxLjI5LS4yOSAxLjMxLS4yNCAxLjMzLS4xOSAxLjM1LS4xMyAxLjM2LS4wOSAxLjM3LS4wMiAxLjQuMDIgMS4zOS4wOSAxLjM3LjEzem0tMTI2LjQ2LTY0LjM2LjUxLjAxLjUxLjAxLjUxLjAxLjUxLjAxLjUxLjAxLjUxLjAyLjUxLjAyLjUxLjAyLjUxLjAyLjUxLjAyLjUxLjAzLjUxLjAyLjUxLjAzLjUxLjAzLjUxLjAzLjUxLjA0LjUxLjAzLjUxLjA0LjUxLjA0LjUxLjA0LjUxLjA0LjUxLjA1LjUuMDQuNTEuMDUuNTEuMDUuNTEuMDUuNTEuMDYuNS4wNS41MS4wNi41MS4wNi41MS4wNi41LjA2LjUxLjA3LjUxLjA3LjUuMDYuNTEuMDcuNDEuMDYuNDEuMDYuNDEuMDYuNDEuMDcuNDEuMDYuNDEuMDcuNDEuMDcuNDEuMDcuNDEuMDcuNDEuMDcuNDEuMDcuNC4wOC40MS4wNy40MS4wOC40MS4wOC40LjA4LjQxLjA5LjQxLjA4LjQuMDkuNDEuMDguNC4wOS40MS4wOS40LjEuNDEuMDkuNC4wOS40MS4xLjQuMS40LjEuNDEuMS40LjEuNC4xMS40LjEuNC4xMS40LjExLjQuMTEuNC4xMS40LjExLjQuMTEuNC4xMi40LjEyLjQ5LjE0LjQ5LjE1LjQ5LjE1LjQ5LjE2LjQ5LjE2LjQ4LjE2LjQ5LjE2LjQ4LjE3LjQ4LjE3LjQ5LjE4LjQ4LjE3LjQ3LjE4LjQ4LjE4LjQ4LjE5LjQ3LjE5LjQ4LjE5LjQ3LjIuNDcuMTkuNDcuMjEuNDcuMi40Ny4yMS40Ny4yMS40Ni4yMS40Ny4yMi40Ni4yMi40Ni4yMi40Ni4yMi40Ni4yMy40NS4yMy40Ni4yNC40NS4yMy40NS4yNC40Ni4yNS40NC4yNC40NS4yNS40NS4yNS40NC4yNi40NS4yNS40NC4yNi40NC4yNy4yNS4xNS4yNS4xNS4yNS4xNi4yNS4xNS4yNS4xNi4yNC4xNi4yNS4xNi4yNC4xNi4yNS4xNi4yNC4xNi4yNS4xNy4yNC4xNi4yNC4xNy4yNS4xNi4yNC4xNy4yNC4xNy4yNC4xNy4yNC4xNy4yMy4xNy4yNC4xNy4yNC4xOC4yMy4xNy4yNC4xOC4yMy4xNy4yNC4xOC4yMy4xOC4yMy4xOC4yNC4xOC4yMy4xOC4yMy4xOC4yMy4xOC4yMi4xOS4yMy4xOC4yMy4xOS4yMi4xOS4yMy4xOS4yMi4xOC4yMy4yLjIyLjE5LjIyLjE5LjUyLjQ2LjUyLjQ2LjUxLjQ3LjUuNDguNS40OC41LjQ4LjQ4LjQ5LjQ5LjQ5LjQ4LjUuNDcuNTEuNDcuNS40Ni41Mi40Ni41Mi40NS41Mi40NC41Mi40NC41NC40NC41My40My41NC40Mi41NS40Mi41NS40MS41NS40MS41Ni40LjU2LjQuNTYuMzkuNTcuMzguNTguMzguNTcuMzcuNTkuMzcuNTguMzYuNTkuMzUuNi4zNS41OS4zNC42LjMzLjYxLjMzLjYxLjMzLjYxLjMxLjYxLjMyLjYyLjMuNjMuMy42Mi4wNC4xLjA1LjA5LjA0LjA5LjA1LjEuMDQuMDkuMDUuMS4wNC4wOS4wNC4wOS4wNS4xLjA0LjA5LjA1LjEuMDQuMDkuMDQuMS4wNS4wOS4wNC4wOS4wNC4xLjA0LjA5LjA1LjEuMDQuMDkuMDQuMS4wNS4wOS4wNC4xLjA0LjA5LjA0LjEuMDQuMDkuMDUuMS4wNC4wOS4wNC4xLjA0LjA5LjA0LjEuMDQuMS4wNC4wOS4wNC4xLjA1LjA5LjA0LjEuMDQuMDkuMDQuMS4wNC4wOS4wNC4xLjA0LjEuMTcuNDIuMTcuNDIuMTYuNDMuMTcuNDIuMTYuNDMuMTYuNDMuMTYuNDIuMTUuNDMuMTUuNDMuMTUuNDMuMTUuNDMuMTUuNDQuMTQuNDMuMTQuNDMuMTQuNDQuMTMuNDMuMTMuNDQuMTMuNDMuMTMuNDQuMTMuNDQuMTIuNDQuMTIuNDQuMTIuNDQuMTEuNDQuMTEuNDQuMTEuNDQuMTEuNDUuMTEuNDQuMS40NC4xLjQ1LjEuNDQuMDkuNDUuMS40NC4wOC40NS4wOS40NS4wOS40NS4wOC40NS4wOC40NC4wOC40NS4wNy40NS4xMS42Ny4xMS42Ny4xLjY2LjA5LjY2LjA5LjY1LjA4LjY1LjA4LjY1LjA3LjY0LjA2LjYzLjA3LjYyLjA2LjYyLjA1LjYxLjA1LjYuMDUuNTkuMDQuNTguMDQuNTcuMDMuNTYuMDQuNTQuMDMuNTQuMDIuNTIuMDMuNTEuMDIuNS4wMi40OC4wMi40Ny4wMS40NS4wMi40My4wMS40Mi4wMS40MS4wMS4zOC4wMS4zNy4wMS4zNS4wMS4zMi4wMS4zMXYuMjlsLjAxLjI3LjAxLjI1LjAxLjIyLjAxLjIxLjAxLjE4LjAxLjE1djEuMzNsLS4wMS40NXYuNDRsLS4wMS40NC0uMDEuNDUtLjAxLjQ0LS4wMS40NC0uMDIuNDUtLjAxLjQ0LS4wMi40NC0uMDIuNDUtLjAyLjQ0LS4wMi40NC0uMDMuNDUtLjAyLjQ0LS4wMy40NC0uMDMuNDQtLjAzLjQ1LS4wMy40NC0uMDQuNDQtLjA0LjQ0LS4wMy40NC0uMDQuNDUtLjA0LjQ0LS4wNS40NC0uMDQuNDQtLjA1LjQ0LS4wNC40NC0uMDUuNDQtLjA2LjQ0LS4wNS40NC0uMDUuNDQtLjA2LjQ0LS4wNi40NC0uMDYuNDQtLjA2LjQ0LS4wNi40NC0uMDcuNDQtLjExLjcyLS4xMi43MS0uMTIuNy0uMTMuNjktLjEzLjY3LS4xMy42Ni0uMTMuNjQtLjE0LjY0LS4xNC42Mi0uMTQuNjEtLjE1LjU5LS4xNC41OC0uMTUuNTYtLjE0LjU2LS4xNS41My0uMTQuNTMtLjE1LjUxLS4xNC40OS0uMTUuNDgtLjE0LjQ3LS4xNC40NS0uMTMuNDQtLjE0LjQyLS4xMy40LS4xMy4zOS0uMTIuMzgtLjEyLjM2LS4xMi4zNC0uMTEuMzMtLjExLjMxLS4xLjI5LS4xLjI4LS4wOS4yNi0uMDguMjUtLjA4LjIzLS4wNy4yMS0uMDYuMi0uMDYuMTctLjA1LjE2LS4wNC4xNS0uMDMuMDgtLjAxLjAyLS4wMy4wOC0uMDIuMDYtLjAxLjA0LS4wMy4wNS0uMDIuMDctLjAyLjA0LS4wMi4wNi0uMDEuMDMtLjIxLjUxLS4yLjUxLS4yMS41LS4yMi41MS0uMjEuNS0uMjMuNS0uMjIuNS0uMjMuNS0uMjMuNDktLjI0LjUtLjI0LjQ5LS4yNS40OS0uMjQuNDgtLjI2LjQ5LS4yNS40OC0uMjYuNDktLjI2LjQ4LS4yNy40Ny0uMjcuNDgtLjI3LjQ3LS4yOC40Ny0uMjguNDctLjI5LjQ3LS4yOS40Ni0uMjkuNDctLjI5LjQ2LS4zLjQ1LS4zLjQ2LS4zMS40NS0uMzEuNDUtLjMxLjQ1LS4zMi40NS0uMzIuNDQtLjMyLjQ1LS4zMy40My0uMzMuNDQtLjM0LjQ0LS4zMy40My0uMzUuNDMtLjM0LjQyLS4xNS4xOS0uMTYuMTktLjE2LjE4LS4xNS4xOS0uMTYuMTgtLjE2LjE5LS4xNi4xOC0uMTYuMTktLjE2LjE4LS4xNi4xOC0uMTYuMTgtLjE2LjE4LS4xNi4xOC0uMTcuMTgtLjE2LjE4LS4xNy4xOC0uMTYuMTgtLjE3LjE3LS4xNy4xOC0uMTYuMTgtLjE3LjE3LS4xNy4xOC0uMTcuMTctLjE3LjE3LS4xNy4xOC0uMTcuMTctLjE3LjE3LS4xOC4xNy0uMTcuMTctLjE3LjE3LS4xOC4xNy0uMTcuMTctLjE4LjE2LS4xOC4xNy0uMTcuMTctLjE4LjE2LS4xOC4xNy0uMTguMTYtLjE4LjE2LS4xOC4xNy0uNS40NC0uNS40NC0uNTEuNDMtLjUxLjQzLS41Mi40Mi0uNTIuNDItLjUyLjQxLS41My40MS0uNTMuNC0uNTMuNC0uNTQuMzktLjU0LjM5LS41NC4zOC0uNTUuMzgtLjU1LjM4LS41NS4zNy0uNTYuMzYtLjU2LjM2LS41Ni4zNS0uNTcuMzUtLjU3LjM0LS41Ny4zNC0uNTguMzMtLjU4LjMzLS41OC4zMi0uNTguMzItLjU5LjMxLS41OS4zMS0uNTkuMy0uNi4yOS0uNi4yOS0uNi4yOS0uNjEuMjgtLjYuMjctLjYxLjI3LS42Mi4yNy0uNjEuMjUtLjYyLjI2LS42Mi4yNC0uNjIuMjQtLjEyLjA1LS4xMi4wNS0uMTIuMDQtLjEzLjA1LS4xMi4wNS0uMTIuMDQtLjEyLjA1LS4xMi4wNC0uMTIuMDUtLjEzLjA1LS4xMi4wNC0uMTIuMDUtLjEyLjA0LS4xMi4wNS0uMTIuMDQtLjEzLjA1LS4xMi4wNC0uMTIuMDQtLjEyLjA1LS4xMy4wNC0uMTIuMDQtLjEyLjA1LS4xMi4wNC0uMTMuMDQtLjEyLjA1LS4xMi4wNC0uMTMuMDQtLjEyLjA0LS4xMi4wNS0uMTIuMDQtLjEzLjA0LS4xMi4wNC0uMTIuMDQtLjEzLjA0LS4xMi4wNC0uMTIuMDQtLjEzLjA0LS4xMi4wNS0uMTIuMDQtLjEzLjA0LS41NC4xNy0uNTQuMTYtLjU1LjE3LS41NC4xNi0uNTUuMTYtLjU0LjE2LS41NS4xNS0uNTQuMTUtLjU1LjE1LS41NS4xNC0uNTUuMTQtLjU1LjE0LS41NS4xNC0uNTUuMTMtLjU2LjEzLS41NS4xMi0uNTUuMTMtLjU2LjEyLS41NS4xMi0uNTYuMTEtLjU1LjExLS41Ni4xMS0uNTYuMTEtLjU1LjEtLjU2LjEtLjU2LjEtLjU2LjA5LS41Ni4wOS0uNTYuMDktLjU2LjA5LS41Ni4wOC0uNTYuMDgtLjU3LjA4LS41Ni4wNy0uNTYuMDctLjU3LjA3LS41Ni4wNi0uNTYuMDYtLjU3LjA2LS41Ni4wNi0uMzMuMDMtLjMzLjAzLS4zMy4wMy0uMzMuMDMtLjMzLjAzLS4zMy4wMy0uMzMuMDItLjMzLjAzLS4zMy4wMi0uMzMuMDMtLjMzLjAyLS4zMy4wMy0uMzMuMDItLjMzLjAyLS4zMy4wMi0uMzMuMDItLjMzLjAyLS4zMy4wMi0uMzMuMDEtLjMzLjAyLS4zMy4wMi0uMzQuMDEtLjMzLjAxLS4zMy4wMi0uMzMuMDEtLjMzLjAxLS4zMy4wMS0uMzMuMDEtLjMzLjAxLS4zMy4wMS0uMzMuMDFoLS4zM2wtLjMzLjAxaC0uMzNsLS4zNC4wMWgtMy4wN2wtLjI4LS4wMWgtLjU1bC0uMjgtLjAxaC0uMjdsLS4yNy0uMDFoLS4yN2wtLjI3LS4wMWgtLjI2bC0uMjYtLjAxLS4yNS0uMDFoLS4yNWwtLjI1LS4wMS0uMjQtLjAxaC0uMjNsLS4yMy0uMDEtLjIyLS4wMWgtLjIybC0uMjEtLjAxLS4yMS0uMDFoLS4ybC0uMTktLjAxLS4xOC0uMDFoLS4xN2wtLjE3LS4wMWgtLjE2bC0uMTUtLjAxaC0uMTRsLS4xMy0uMDFoLS4xMmwtLjExLS4wMWgtLjI4bC0uMDctLjAxaC0uMTVsLS4xMi0uMDFoLS4wOGwtLjEyLS4wMWgtLjJsLS4wNy0uMDFoLS4xMmwtLjA4LS4wMWgtLjEybC0uMTItLjAxaC0uMTlsLS4wOC0uMDFoLS4xMmwtLjI1LS4wMi0uMjUtLjAxLS4yNC0uMDEtLjI1LS4wMS0uMjUtLjAyLS4yNS0uMDEtLjI0LS4wMS0uMjUtLjAyLS4yNS0uMDEtLjI0LS4wMi0uMjUtLjAyLS4yNS0uMDEtLjI1LS4wMi0uMjQtLjAyLS4yNS0uMDEtLjI1LS4wMi0uMjQtLjAyLS4yNS0uMDItLjI1LS4wMi0uMjQtLjAyLS4yNS0uMDItLjI1LS4wMi0uMjQtLjAyLS4yNS0uMDItLjI1LS4wMy0uMjQtLjAyLS4yNS0uMDItLjI1LS4wMi0uMjQtLjAzLS4yNS0uMDItLjI1LS4wMy0uMjQtLjAyLS4yNS0uMDMtLjI1LS4wMi0uMjQtLjAzLS4yNS0uMDMtLjI0LS4wMi0uMjUtLjAzLS4yNS0uMDMtLjI0LS4wM2gtLjA1bC0uMDUtLjAxLS4wOS0uMDEtLjA1LS4wMS0uMDktLjAxaC0uMDVsLS4xLS4wMS0uMDQtLjAxLS4xLS4wMS0uMDQtLjAxLS4xLS4wMWgtLjA1bC0uMDktLjAxLS4wNS0uMDEtLjA0LS4wMWgtLjA1bC0uMS0uMDEtLjA0LS4wMS0uMS0uMDEtLjA1LS4wMS0uMDktLjAxaC0uMDVsLS4wOS0uMDJoLS4wNWwtLjA5LS4wMS0uMDUtLjAxLS4wOS0uMDEtLjA1LS4wMS0uNDYtLjA2LS40NC0uMDYtLjQ1LS4wNS0uNDQtLjA3LS40My0uMDYtLjQzLS4wNi0uNDItLjA2LS40MS0uMDYtLjQxLS4wNi0uNC0uMDYtLjQtLjA2LS4zOS0uMDYtLjM4LS4wNi0uMzctLjA2LS4zNy0uMDYtLjM1LS4wNi0uMzUtLjA2LS4zNC0uMDUtLjM0LS4wNi0uMzItLjA1LS4zMS0uMDYtLjMxLS4wNS0uMjktLjA1LS4yOS0uMDUtLjI3LS4wNS0uMjctLjA1LS4yNS0uMDQtLjI1LS4wNS0uMjMtLjA0LS4yMi0uMDQtLjIxLS4wNC0uMi0uMDMtLjE5LS4wNC0uMTgtLjAzLS4xNi0uMDMtLjE1LS4wMy0uMTQtLjAyLS4xMi0uMDItLjExLS4wMi0uMS0uMDItLjItLjAzLS4yLS4wNC0uMi0uMDQtLjItLjA0LS4yLS4wNC0uMjEtLjA1LS4yLS4wNC0uMi0uMDQtLjItLjA0LS4yLS4wNS0uMi0uMDQtLjE5LS4wNS0uMi0uMDQtLjItLjA1LS4yLS4wNS0uMi0uMDUtLjItLjA0LS4yLS4wNS0uMi0uMDUtLjItLjA1LS4xOS0uMDUtLjItLjA2LS4yLS4wNS0uMi0uMDUtLjE5LS4wNS0uMi0uMDYtLjItLjA1LS4yLS4wNi0uMTktLjA2LS4yLS4wNS0uMi0uMDYtLjE5LS4wNi0uMi0uMDYtLjE5LS4wNS0uMi0uMDYtLjItLjA2LS4xOS0uMDctLjItLjA2LS4xOS0uMDYtLjItLjA2LS4wOC0uMDMtLjA4LS4wMy0uMDktLjAzLS4wOC0uMDItLjA4LS4wMy0uMDktLjAzLS4wOC0uMDMtLjA5LS4wMy0uMDgtLjAzLS4wOC0uMDItLjA5LS4wMy0uMDgtLjAzLS4wOC0uMDMtLjA5LS4wMy0uMDgtLjAzLS4wOC0uMDMtLjA5LS4wMy0uMDgtLjAzLS4wOC0uMDMtLjA4LS4wMy0uMDktLjAzLS4wOC0uMDMtLjA4LS4wMy0uMDktLjAzLS4wOC0uMDMtLjA4LS4wMy0uMDgtLjAzLS4wOS0uMDMtLjA4LS4wMy0uMDgtLjA0LS4wOC0uMDMtLjA5LS4wMy0uMDgtLjAzLS4wOC0uMDMtLjA4LS4wMy0uMDktLjA0LS4wOC0uMDMtLjA4LS4wMy0uMDgtLjAzLS4wOC0uMDQtLjE5LS4wNi0uMTgtLjA3LS4xOC0uMDctLjE4LS4wNy0uMTgtLjA4LS4xNy0uMDctLjE4LS4wOC0uMTgtLjA3LS4xOC0uMDgtLjE3LS4wOC0uMTgtLjA4LS4xNy0uMDgtLjE4LS4wOC0uMTctLjA4LS4xOC0uMDktLjE3LS4wOC0uMTctLjA5LS4xNy0uMDktLjE4LS4wOS0uMTctLjA5LS4xNy0uMDktLjE3LS4wOS0uMTYtLjA5LS4xNy0uMS0uMTctLjEtLjE3LS4wOS0uMTYtLjEtLjE3LS4xLS4xNi0uMS0uMTctLjEtLjE2LS4xMS0uMTYtLjEtLjE2LS4xMS0uMTctLjEtLjE2LS4xMS0uMTYtLjExLS4xNS0uMTEtLjE2LS4xMS0uMTYtLjExLS4xNi0uMTEtLjUzLS40Mi0uNTEtLjQyLS40Ny0uNDMtLjQ1LS40My0uNDItLjQ1LS40LS40NC0uMzctLjQ2LS4zNS0uNDUtLjMzLS40Ni0uMzEtLjQ2LS4yOC0uNDctLjI2LS40Ni0uMjUtLjQ2LS4yMi0uNDYtLjIxLS40Ni0uMTktLjQ1LS4xOC0uNDUtLjE2LS40NS0uMTUtLjQ0LS4xMy0uNDMtLjEyLS40My0uMTEtLjQyLS4xLS40MS0uMDktLjQtLjA4LS4zOC0uMDctLjM4LS4wNy0uMzctLjA2LS4zNS0uMDUtLjMzLS4wNS0uMzItLjA1LS4zMS0uMDQtLjI5LS4wNC0uMjctLjA1LS4yNS0uMDQtLjI0LS4wNC0uMjEtLjA0LS4xOS0uMDUtLjE3LS4wNS0uMTUtLjA1LS4xMlYyOTMuNTNsLjAxLS4wOHYtLjE3bC4wMS0uMDh2LS4xN2wuMDEtLjA5di0uMDhsLjAxLS4wOS4wMS0uMDh2LS4wOWwuMDEtLjA4LjAxLS4wOS4wMS0uMDguMDEtLjA4di0uMDlsLjAxLS4wOC4wMS0uMDkuMDEtLjA4LjAyLS4wOC4wMS0uMDkuMDEtLjA4LjAxLS4wOS4wMS0uMDguMDItLjA4LjAxLS4wOS4wMS0uMDguMDItLjA4LjAxLS4wOS4wMi0uMDguMDEtLjA5LjAyLS4wOC4wMi0uMDguMDItLjA4LjAzLS4xNi4wNC0uMTYuMDQtLjE1LjA0LS4xNS4wNC0uMTUuMDQtLjE0LjA1LS4xNC4wNC0uMTQuMDUtLjEzLjA1LS4xMy4wNC0uMTIuMDUtLjEyLjA1LS4xMi4wNS0uMTIuMDUtLjExLjA1LS4xMS4wNS0uMTEuMDQtLjEuMDUtLjEuMDUtLjA5LjA1LS4wOS4wNC0uMDkuMDUtLjA5LjA0LS4wOC4wNS0uMDguMDQtLjA3LjA0LS4wOC4wNC0uMDcuMDQtLjA2LjA0LS4wNi4wMy0uMDYuMDMtLjA2LjAzLS4wNS4wMy0uMDUuMDMtLjA1LjAyLS4wNC4wMy0uMDQuMDEtLjA0LjAyLS4wMy4wMS0uMDMuMDMtLjAzLjAyLS4wNC4wMy0uMDMuMDItLjAzLjAyLS4wNC4wMy0uMDMuMDItLjAzLjAzLS4wNC4wMi0uMDMuMDMtLjAzLjAyLS4wNC4wMy0uMDMuMDItLjAzLjAzLS4wMy4wMi0uMDQuMDMtLjAzLjAzLS4wMy4wMi0uMDMuMDMtLjAzLjAyLS4wNC4wMy0uMDMuMDMtLjAzLjAyLS4wMy4wMy0uMDMuMDMtLjAzLjAzLS4wNC4wMi0uMDMuMDMtLjAzLjAzLS4wMy4wMy0uMDMuMDItLjAzLjAzLS4wMy4wMy0uMDMuMDMtLjAzLjAzLS4wMy4wMy0uMDMuMDItLjAzLjAzLS4wMy4wMy0uMDMuMDMtLjAzLjIxLS4yLjItLjE5LjIxLS4xOS4yMi0uMTguMjEtLjE4LjIyLS4xNy4yMi0uMTcuMjItLjE3LjIyLS4xNi4yMy0uMTUuMjItLjE1LjIyLS4xNS4yMy0uMTQuMjItLjEzLjIyLS4xMy4yMS0uMTMuMjItLjEyLjIxLS4xMi4yMS0uMTEuMjEtLjExLjItLjExLjItLjEuMi0uMS4xOS0uMDkuMTgtLjA5LjE4LS4wOC4xNy0uMDguMTctLjA4LjE2LS4wNy4xNS0uMDcuMTUtLjA3LjE0LS4wNi4xMi0uMDYuMTItLjA1LjEyLS4wNi4xLS4wNC4wOS0uMDUuMDgtLjA0LjA3LS4wNC4wNi0uMDMuMDUtLjAyLjAyLS4wMS4wNS0uMDIuMDUtLjAyLjAyLS4wMS4wNS0uMDEuMDUtLjAyLjAyLS4wMS4wNS0uMDIuMDUtLjAyLjAyLS4wMS4wNS0uMDEuMDUtLjAyLjA1LS4wMi4wMi0uMDEuMDUtLjAyLjA1LS4wMS4wMi0uMDEuMDUtLjAyLjA1LS4wMi4wMi0uMDEuMDUtLjAxLjA1LS4wMi4wMi0uMDEuNTMtLjE3LjUzLS4xNi41My0uMTcuNTMtLjE2LjUzLS4xNS41My0uMTYuNTMtLjE1LjUzLS4xNS41My0uMTUuNTQtLjE0LjUzLS4xNC41NC0uMTQuNTMtLjE0LjU0LS4xMy41NC0uMTMuNTMtLjEzLjU0LS4xMi41NC0uMTIuNTQtLjEyLjU0LS4xMi41NC0uMTEuNTQtLjExLjU1LS4xMS41NC0uMS41NC0uMTEuNTQtLjEuNTUtLjA5LjU0LS4xLjU1LS4wOS41NC0uMDkuNTUtLjA4LjU1LS4wOC41NC0uMDguNTUtLjA4LjU1LS4wOC41NS0uMDcuNTUtLjA3LjU1LS4wNi41NC0uMDYuNTUtLjA2LjA1LS4wMS4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNC0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNC0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA0bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA0bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA5bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNC0uMDFoLjA1bC4wNS0uMDFoLjA1bC4wNS0uMDFoLjA1bC44Ni0uMDguODQtLjA4LjgzLS4wNy44MS0uMDYuNzktLjA3Ljc4LS4wNi43Ni0uMDUuNzUtLjA2LjcyLS4wNS43Mi0uMDQuNjktLjA1LjY4LS4wNC42NS0uMDQuNjUtLjAzLjYyLS4wMy42MS0uMDMuNTktLjAzLjU3LS4wMy41NS0uMDIuNTQtLjAyLjUyLS4wMi41LS4wMi40OC0uMDIuNDctLjAxLjQ1LS4wMi40My0uMDEuNDEtLjAxLjM5LS4wMS4zNy0uMDEuMzYtLjAxLjMzLS4wMS4zMi0uMDEuMy0uMDFoLjI4bC4yNy0uMDEuMjQtLjAxLjIyLS4wMWguMjFsLjE4LS4wMS4xNy0uMDFoMy4zNnptLTExNi4xNyAxLjU1aC40N2wuMTYuMDFoLjMybC4xNi4wMWguMTZsLjE2LjAxaC4xNmwuMTYuMDFoLjE2bC4xNS4wMS4xNi4wMWguMTZsLjE2LjAxLjE2LjAxLjE2LjAxLjE2LjAxLjE2LjAxLjE2LjAxLjE2LjAxLjE1LjAxLjE2LjAxLjE2LjAxLjE2LjAyLjE2LjAxLjE2LjAxLjE2LjAyLjE1LjAxLjE2LjAyLjE2LjAxLjE2LjAyLjE2LjAxLjE2LjAyLjE2LjAxLjUuMDYuNDguMDcuNDcuMDcuNDYuMDcuNDUuMDguNDMuMDguNDIuMDkuNC4wOS40LjA5LjM4LjA5LjM2LjEuMzYuMS4zNC4xLjMzLjEuMzIuMS4zMS4xMS4zLjEuMjguMS4yOC4xMS4yNi4xLjI1LjEuMjQuMS4yMy4xLjIzLjEuMjEuMS4yLjA5LjE5LjA5LjE5LjA5LjE3LjA4LjE2LjA5LjE2LjA3LjE1LjA4LjE0LjA2LjEzLjA3LjEyLjA2LjExLjA1LjExLjA1LjEuMDQuMDkuMDMuMDguMDMuMDQuMDIuMDQuMDMuMDQuMDIuMDQuMDMuMDMuMDIuMDQuMDIuMDQuMDMuMDQuMDIuMDMuMDMuMDQuMDIuMDQuMDMuMDMuMDIuMDQuMDMuMDQuMDIuMDQuMDMuMDMuMDIuMDQuMDMuMDQuMDIuMDMuMDMuMDQuMDMuMDQuMDIuMDMuMDMuMDQuMDMuMDMuMDIuMDQuMDMuMDQuMDIuMDMuMDMuMDQuMDMuMDMuMDMuMDQuMDIuMDMuMDMuMDQuMDMuMDMuMDIuMDQuMDMuMDQuMDMuMDMuMDMuMDQuMDMuMDMuMDIuMDQuMDMuMDMuMDMuMjguMjQuMjcuMjQuMjcuMjYuMjYuMjcuMjUuMjguMjUuMjkuMjQuMjkuMjMuMzEuMjIuMzIuMjIuMzMuMjEuMzMuMi4zNS4yLjM2LjE4LjM3LjE5LjM4LjE3LjM4LjE3LjQuMTYuNDEuMTUuNDIuMTQuNDMuMTQuNDMuMTMuNDUuMTMuNDYuMTIuNDcuMTEuNDguMS40OC4xLjUuMDguNTEuMDkuNTIuMDcuNTMuMDcuNTMuMDYuNTUuMDUuNTYuMDUuNTcuMDQuNTguMDMuNTguMDIuNi4wMi42MS4wMS42Mi4wMS42M3YxMzcuMjVsLS4xNy4wNS0uMTcuMDQtLjE3LjA0LS4xOC4wNS0uMTguMDQtLjE4LjA0LS4xOC4wNC0uMTkuMDQtLjE5LjA0LS4xOS4wNC0uMTkuMDQtLjE5LjA0LS4xOS4wMy0uMTkuMDQtLjE4LjA0LS4xOS4wMy0uMTkuMDQtLjE4LjAzLS4xOS4wMy0uMTguMDMtLjE3LjAzLS4xOC4wMy0uMTcuMDMtLjE2LjAzLS4xNi4wMy0uMTYuMDItLjE1LjAzLS4xNS4wMi0uMTQuMDItLjEzLjAzLS4xMy4wMi0uMTIuMDItLjEyLjAxLS4xLjAyLS4xLjAyLS4wOS4wMS0uMDguMDEtLjA3LjAyLS4wNi4wMS0uMDUuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA2LjAxLS4wNy4wMWgtLjA2bC0uMDcuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA2LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA3LjAxaC0uMDZsLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDFoLS4wNmwtLjA3LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA2LjAxaC0uMDdsLS4wNy4wMS0uMDYuMDEtLjQ1LjA2LS40NC4wNS0uNDMuMDUtLjQzLjA1LS40My4wNC0uNDIuMDUtLjQyLjA0LS40MS4wMy0uNDEuMDQtLjQuMDMtLjM5LjAzLS4zOS4wMy0uMzguMDItLjM3LjAzLS4zNy4wMi0uMzYuMDItLjM1LjAyLS4zNC4wMS0uMzMuMDItLjMzLjAxLS4zMi4wMS0uMy4wMS0uMy4wMS0uMjkuMDEtLjI4LjAxLS4yNy4wMS0uMjYuMDFoLS4yNGwtLjI0LjAxaC0uMjNsLS4yMS4wMWgtLjJsLS4xOS4wMWgtLjM0bC0uMTYuMDFIMjgxbC0uMTMuMDFoLS4xMWwtLjEuMDEtMS4wMS0uMDEtLjk3LS4wMi0uOTMtLjA0LS45LS4wNS0uODYtLjA2LS44My0uMDgtLjc5LS4wOS0uNzYtLjA5LS43My0uMTEtLjctLjExLS42Ny0uMTMtLjY0LS4xMy0uNjEtLjE0LS41OC0uMTQtLjU1LS4xNS0uNTMtLjE2LS41LS4xNS0uNDgtLjE3LS40NS0uMTYtLjQzLS4xNi0uNDEtLjE3LS4zOS0uMTctLjM3LS4xNi0uMzUtLjE3LS4zMi0uMTYtLjMyLS4xNi0uMjktLjE1LS4yOC0uMTYtLjI2LS4xNC0uMjUtLjE0LS4yMy0uMTQtLjIyLS4xMi0uMjEtLjEyLS4xOS0uMTEtLjE5LS4xLS4xOC0uMDktLjE2LS4wOC0uMTYtLjA3LS4xNS0uMDUtLjE1LS4wNS0uMTEtLjEtLjEtLjEtLjExLS4xLS4xMS0uMS0uMS0uMTEtLjEtLjEtLjEtLjExLS4xLS4xLS4xLS4xMS0uMS0uMTEtLjEtLjExLS4wOS0uMTItLjEtLjExLS4wOS0uMTEtLjA5LS4xMi0uMDktLjExLS4wOS0uMTItLjA4LS4xMi0uMDktLjEyLS4wOS0uMTItLjA4LS4xMi0uMDgtLjEyLS4wOC0uMTItLjA4LS4xMi0uMDgtLjEzLS4wNy0uMTItLjA4LS4xMy0uMDctLjEzLS4wNy0uMTItLjA3LS4xMy0uMDctLjEzLS4wNy0uMTMtLjA3LS4xMy0uMDYtLjE0LS4wNy0uMTMtLjA2LS4xMy0uMDYtLjE0LS4wNi0uMTMtLjA1LS4xNC0uMDYtLjEzLS4xMy0uMzItLjEyLS4zMS0uMTItLjMzLS4xMS0uMzItLjEtLjMzLS4xLS4zMy0uMS0uMzMtLjA4LS4zMy0uMDktLjMzLS4wNy0uMzMtLjA4LS4zMy0uMDctLjMzLS4wNi0uMzMtLjA2LS4zMy0uMDUtLjMyLS4wNS0uMzItLjA1LS4zMS0uMDUtLjMyLS4wNC0uMy0uMDMtLjMtLjA0LS4zLS4wMy0uMjktLjAzLS4yOC0uMDMtLjI4LS4wMi0uMjctLjAzLS4yNS0uMDItLjI1LS4wMi0uMjQtLjAxLS4yNC0uMDItLjIyLS4wMi0uMi0uMDEtLjItLjAxLS4xOS0uMDItLjE3LS4wMS0uMTYtLjAxLS4xNS0uMDItLjEzLS4wMS0uMTItLjAxLS4xLS4wMi0uMDl2LS4yNWwtLjAxLS4wOHYtLjYxbC0uMDEtLjA0di00MS41N2gtNDkuNjN2NjAuMjNsLS4xNi4wNS0uMTcuMDQtLjE3LjA0LS4xOC4wNS0uMTguMDQtLjE4LjA0LS4xOS4wNC0uMTguMDQtLjE5LjA0LS4xOS4wNC0uMTkuMDQtLjE5LjA0LS4xOS4wMy0uMTkuMDQtLjE5LjA0LS4xOC4wMy0uMTkuMDQtLjE5LjAzLS4xOC4wMy0uMTguMDMtLjE4LjAzLS4xNy4wMy0uMTcuMDMtLjE3LjAzLS4xNi4wMy0uMTUuMDItLjE2LjAzLS4xNC4wMi0uMTQuMDItLjE0LjAzLS4xMi4wMi0uMTIuMDItLjEyLjAxLS4xLjAyLS4xLjAyLS4wOS4wMS0uMDguMDEtLjA3LjAyLS4wNi4wMS0uMDUuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA3LjAxLS4wNi4wMWgtLjA3bC0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA2LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxaC0uMDZsLS4wNy4wMS0uMDcuMDEtLjA2LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDFoLS4wN2wtLjA2LjAxLS4wNy4wMS0uMDYuMDEtLjA3LjAxLS4wNi4wMS0uMDcuMDEtLjA3LjAxaC0uMDZsLS4wNy4wMS0uMDYuMDEtLjQ1LjA2LS40NC4wNS0uNDMuMDUtLjQ0LjA1LS40Mi4wNC0uNDMuMDUtLjQxLjA0LS40MS4wMy0uNDEuMDQtLjQuMDMtLjM5LjAzLS4zOS4wMy0uMzguMDItLjM3LjAzLS4zNy4wMi0uMzYuMDItLjM1LjAyLS4zNC4wMS0uMzQuMDItLjMyLjAxLS4zMi4wMS0uMzEuMDEtLjMuMDEtLjI4LjAxLS4yOC4wMS0uMjcuMDEtLjI2LjAxaC0uMjVsLS4yMy4wMWgtLjIzbC0uMjEuMDFoLS4ybC0uMTkuMDFoLS4zNWwtLjE1LjAxaC0uMTRsLS4xMi4wMWgtLjExbC0uMS4wMS0xLjAxLS4wMS0uOTctLjAyLS45NC0uMDQtLjg5LS4wNS0uODYtLjA2LS44My0uMDgtLjgtLjA5LS43Ni0uMDktLjczLS4xMS0uNjktLjExLS42Ny0uMTMtLjY0LS4xMy0uNjEtLjE0LS41OC0uMTQtLjU1LS4xNS0uNTMtLjE2LS41LS4xNS0uNDgtLjE3LS40Ni0uMTYtLjQzLS4xNi0uNDEtLjE3LS4zOC0uMTctLjM3LS4xNi0uMzUtLjE3LS4zMy0uMTYtLjMxLS4xNi0uMjktLjE1LS4yOC0uMTYtLjI2LS4xNC0uMjUtLjE0LS4yMy0uMTQtLjIyLS4xMi0uMjEtLjEyLS4yLS4xMS0uMTgtLjEtLjE4LS4wOS0uMTYtLjA4LS4xNi0uMDctLjE2LS4wNS0uMTQtLjA1LS4xMS0uMS0uMTEtLjEtLjEtLjEtLjExLS4xLS4xLS4xMS0uMTEtLjEtLjEtLjExLS4xLS4xLS4xLS4xMS0uMDktLjExLS4xLS4xMS0uMDktLjEyLS4xLS4xMS0uMDktLjExLS4wOS0uMTItLjA5LS4xMS0uMDktLjEyLS4wOS0uMTItLjA4LS4xMi0uMDktLjEyLS4wOC0uMTItLjA4LS4xMi0uMDgtLjEyLS4wOC0uMTItLjA4LS4xMy0uMDgtLjEyLS4wNy0uMTMtLjA3LS4xMy0uMDgtLjEyLS4wNy0uMTMtLjA3LS4xMy0uMDYtLjEzLS4wNy0uMTMtLjA2LS4xNC0uMDctLjEzLS4wNi0uMTMtLjA2LS4xNC0uMDYtLjEzLS4wNi0uMTQtLjA1LS4xMy0uMTMtLjMyLS4xMy0uMzEtLjExLS4zMy0uMTEtLjMyLS4xMS0uMzMtLjEtLjMzLS4wOS0uMzMtLjA5LS4zMy0uMDgtLjMzLS4wOC0uMzMtLjA3LS4zMy0uMDctLjMzLS4wNi0uMzMtLjA2LS4zMy0uMDYtLjMyLS4wNS0uMzItLjA0LS4zMS0uMDUtLjMyLS4wNC0uMy0uMDQtLjMtLjAzLS4zLS4wMy0uMjktLjAzLS4yOC0uMDMtLjI4LS4wMi0uMjctLjAzLS4yNS0uMDItLjI1LS4wMi0uMjQtLjAyLS4yNC0uMDEtLjIyLS4wMi0uMi0uMDEtLjItLjAyLS4xOS0uMDEtLjE3LS4wMS0uMTYtLjAyLS4xNS0uMDEtLjEzLS4wMS0uMTItLjAyLS4xLS4wMS0uMDl2LS4yMmwtLjAxLS4wM3YtLjQ3bC0uMDEtLjA0VjI3OC43OWwuMTgtLjAzLjE4LS4wMy4xOS0uMDMuMTktLjAzLjE5LS4wMy4yLS4wMy4xOS0uMDMuMi0uMDQuMi0uMDMuMTktLjAzLjItLjAzLjItLjAzLjItLjAzLjItLjA0LjE5LS4wMy4yLS4wMy4xOS0uMDMuMTktLjAzLjE5LS4wMy4xOS0uMDMuMTgtLjAyLjE4LS4wMy4xNy0uMDMuMTctLjAzLjE3LS4wMi4xNi0uMDMuMTYtLjAyLjE1LS4wMy4xNC0uMDIuMjctLjA0LjEyLS4wMi4xMi0uMDIuMS0uMDEuMS0uMDIuMDktLjAxLjA5LS4wMi4wNy0uMDEuMDYtLjAxLjA2LS4wMS4wNi0uMDEuMi0uMDMuMTMtLjAyLjItLjAzLjEzLS4wMi4xMy0uMDIuMi0uMDMuMTMtLjAyLjItLjAzLjEzLS4wMi4yLS4wMy4xMy0uMDIuMTMtLjAyLjItLjAzLjEzLS4wMi4yLS4wMy4xMy0uMDIuNDQtLjA2LjQ0LS4wNy40My0uMDYuNDMtLjA1LjQzLS4wNS40MS0uMDUuNDItLjA1LjQtLjA0LjQtLjA0LjQtLjA0LjM4LS4wMy4zOC0uMDQuMzctLjAzLjM3LS4wMi4zNi0uMDMuMzUtLjAyLjM0LS4wMi4zMy0uMDIuMzMtLjAyLjMyLS4wMi4zLS4wMS4zLS4wMS4yOS0uMDIuMjgtLjAxLjI3LS4wMWguMjZsLjI1LS4wMS4yNC0uMDEuMjMtLjAxaC4yMWwuMjEtLjAxaC4xOWwuMTktLjAxaC4xN2wuMTYtLjAxaC4xNWwuMTMtLjAxaC4xMmwuMTEtLjAxaDEuMjFsLjE2LjAxaC4zMmwuMTYuMDFoLjMybC4xNS4wMWguMTZsLjE2LjAxLjE2LjAxaC4xNmwuMTYuMDEuMTYuMDEuMTYuMDFoLjE2bC4xNi4wMS4xNS4wMS4xNi4wMS4xNi4wMS4xNi4wMS4xNi4wMS4xNi4wMS4xNi4wMi4xNi4wMS4xNS4wMS4xNi4wMS4xNi4wMi4xNi4wMS4xNi4wMi4xNi4wMS4xNi4wMi4xNS4wMS4xNi4wMi40OC4wNS40Ny4wNi40Ni4wNi40NC4wNy40My4wNy40MS4wNy40MS4wOC4zOS4wOC4zOC4wOC4zNi4wOC4zNi4wOS4zNC4wOS4zNC4wOC4zMi4wOS4zMS4xLjMuMDkuMjguMDkuMjguMDkuMjcuMDkuMjUuMDkuMjUuMDkuMjQuMDkuMjIuMDkuMjIuMDkuMjEuMDguMTkuMDkuMTkuMDguMTguMDcuMTcuMDguMTYuMDcuMTYuMDcuMTQuMDYuMTQuMDYuMTIuMDYuMTIuMDUuMTEuMDUuMTEuMDQuMS4wNC4wOC4wMy4wOS4wMi4wNC4wMy4wNS4wMi4wNS4wMy4wNC4wMy4wNS4wMi4wNC4wMy4wNS4wMy4wNS4wMi4wNC4wMy4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMi4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMi4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNC4wNC4wNS4wMy4wNC4wMy4wNC4wMy4wNC4wMy4wNS4wMy4wNC4wMy4wNC4wNC4wNS4wMy4wNC4wMy4zOC4zMS4zNi4zNC4zNC4zNS4zMy4zNi4zMS4zOC4yOC40LjI4LjQxLjI1LjQyLjI1LjQzLjIyLjQ0LjIxLjQ1LjIuNDUuMTkuNDYuMTcuNDcuMTYuNDYuMTUuNDcuMTMuNDcuMTMuNDcuMTIuNDcuMTEuNDYuMS40Ni4wOS40NS4wOC40NC4wOC40NC4wNy40Mi4wNi40Mi4wNi40LjA1LjM5LjA1LjM3LjA1LjM2LjA0LjM0LjA0LjMyLjA0LjMuMDQuMjkuMDMuMjUuMDQuMjQuMDQuMjEuMDQuMTguMDMuMTYuMDUuMTN2LjI1bC4wMS4wNXYuMjVsLjAxLjA1di40MWwuMDEuMDV2NDIuODNoNDkuNjN2LTYxbC4wOS0uMDEuMDktLjAyLjA4LS4wMS4wOS0uMDEuMDgtLjAyLjA5LS4wMS4wOS0uMDIuMDgtLjAxLjA5LS4wMi4wOS0uMDEuMDgtLjAxLjA5LS4wMi4wOS0uMDEuMDgtLjAyLjA5LS4wMS4wOS0uMDEuMDgtLjAyLjA5LS4wMS4wOS0uMDEuMDgtLjAyLjE1LS4wMi4xNS0uMDMuMTUtLjAyLjE1LS4wMi4xNS0uMDMuMTUtLjAyLjE1LS4wMy4xNS0uMDIuMTUtLjAyLjE1LS4wMy4xNC0uMDIuMTUtLjAyLjE1LS4wMy4xNC0uMDIuMTQtLjAyLjE0LS4wMi4xNC0uMDMuMTQtLjAyLjEzLS4wMi4xNC0uMDIuMTItLjAyLjEzLS4wMi4xMi0uMDIuMTItLjAyLjEyLS4wMS4xMS0uMDIuMTEtLjAyLjItLjAzLjM1LS4wNS4wNy0uMDEuMTQtLjAzaC4wNWwuMDUtLjAxLjA1LS4wMS4wNC0uMDEuMDYtLjAxLjItLjAzLjEzLS4wMi4yLS4wMy4xMy0uMDIuMTMtLjAyLjItLjAzLjEzLS4wMi4yLS4wMy4xMy0uMDIuMi0uMDMuMTMtLjAyLjEzLS4wMi4yLS4wMy4xMy0uMDIuMi0uMDMuMTMtLjAyLjQ0LS4wNi40NC0uMDcuNDQtLjA2LjQyLS4wNS40My0uMDUuNDItLjA1LjQxLS4wNS40LS4wNC40LS4wNC40LS4wNC4zOC0uMDMuMzgtLjA0LjM4LS4wMy4zNi0uMDIuMzYtLjAzLjM1LS4wMi4zNC0uMDIuMzQtLjAyLjMyLS4wMi4zMi0uMDIuMzEtLjAxLjI5LS4wMS4yOS0uMDIuMjgtLjAxLjI3LS4wMWguMjZsLjI1LS4wMS4yNC0uMDEuMjMtLjAxaC4yMmwuMi0uMDFoLjJsLjE4LS4wMWguMTdsLjE2LS4wMWguMTVsLjEzLS4wMWguMTJsLjExLS4wMWguNzR6bTExNi42OSAzNC44OS0uMjcuMDFoLS41MmwtLjI2LjAxaC0uMjVsLS4yNS4wMWgtLjI0bC0uMjUuMDEtLjI0LjAxaC0uMjNsLS4yMy4wMS0uMjMuMDEtLjIyLjAxLS4yMi4wMWgtLjIxbC0uMjEuMDEtLjIuMDEtLjIuMDEtLjE5LjAxLS4xOS4wMS0uMTguMDEtLjE3LjAxLS4xNy4wMS0uMTYuMDFoLS4xNmwtLjE1LjAxLS4xNC4wMS0uMTQuMDEtLjI1LjAxLS4xMS4wMS0uMTEuMDFoLS4xbC0uMDkuMDFoLS4xNmwtLjA3LjAxaC0uMDZsLS4xOS4wMS0uMTkuMDItLjE4LjAxLS4xOS4wMS0uMTkuMDItLjE5LjAxLS4xOS4wMi0uMTguMDEtLjE5LjAyLS4xOS4wMi0uMTkuMDEtLjE5LjAyLS4xOS4wMi0uMTkuMDEtLjE5LjAyLS4xOS4wMi0uMTkuMDItLjE5LjAxLS4xOS4wMi0uMTkuMDItLjE5LjAyLS4xOS4wMi0uMTkuMDItLjE5LjAyLS4yLjAyLS4xOS4wMy0uMTkuMDItLjE5LjAyLS4xOS4wMi0uMTkuMDItLjIuMDMtLjE5LjAyLS4xOS4wMi0uMi4wMy0uMTkuMDItLjE5LjAyLS4xOS4wMy0uMi4wMi0uMTkuMDMtLjIuMDN2ODkuOTVsLjE1LjAyLjE1LjAzLjE1LjAyLjE0LjAzLjE1LjAyLjE1LjAzLjE1LjAyLjE0LjAzLjE1LjAyLjE0LjAyLjE1LjAyLjE0LjAyLjE0LjAyLjE0LjAyLjEzLjAyLjE0LjAyLjEzLjAyLjEzLjAyLjEzLjAxLjEzLjAyLjEyLjAyLjEyLjAxLjEyLjAyLjExLjAxLjExLjAyLjExLjAxLjEuMDEuMS4wMi4wOS4wMS4wOS4wMS4xNy4wMi4wOC4wMS4wNy4wMS4wNi4wMWguMDZsLjA2LjAxLjA1LjAxaC4wNGwuMDQuMDEuMDYuMDFoLjA2bC4wNi4wMS4wNi4wMWguMDZsLjA2LjAxLjA3LjAxaC4wNmwuMDYuMDEuMDYuMDFoLjA2bC4wNi4wMS4wNi4wMWguMDdsLjA2LjAxLjA2LjAxaC4wNmwuMDYuMDFoLjA2bC4wNi4wMS4wNy4wMWguMDZsLjA2LjAxLjA2LjAxaC4wNmwuMDYuMDFoLjA2bC4wNy4wMS4wNi4wMWguMDZsLjA2LjAxaC4wNmwuMDYuMDEuMDYuMDFoLjA3bC4wNi4wMWguMDZsLjA2LjAxLjA2LjAxaC4wNmwuMzEuMDMuMy4wMy4zLjAyLjI5LjAzLjI5LjAyLjI4LjAyLjI4LjAyLjI3LjAyLjI3LjAxLjI2LjAyLjI2LjAxLjI1LjAyLjI0LjAxLjI0LjAxLjIzLjAxLjIzLjAxLjIyLjAxLjIxLjAxLjIxLjAxLjIuMDFoLjJsLjE5LjAxaC4xOGwuMTcuMDFoLjE3bC4xNy4wMWguNDVsLjEzLjAxaC4zN2wuMS4wMWguMzZsLjA3LjAxaDEuMDhsLjM0LS4wMS4zNC0uMDEuMzMtLjAxLjM0LS4wMS4zNC0uMDIuMzQtLjAxLjM0LS4wMi4zNC0uMDMuMzMtLjAyLjM0LS4wMy4zNC0uMDMuMzQtLjA0LjMzLS4wMy4zNC0uMDQuMzQtLjA0LjMzLS4wNC4zNC0uMDUuMzMtLjA1LjM0LS4wNS4zMy0uMDUuMzQtLjA2LjMzLS4wNi4zMy0uMDYuMzQtLjA2LjMzLS4wNy4zMy0uMDYuMzMtLjA4LjMzLS4wNy4zNC0uMDcuMzMtLjA4LjMyLS4wOC4zMy0uMDkuMzMtLjA4LjMzLS4wOS4zMy0uMDkuMzItLjA5LjMzLS4xLjQ0LS4xMy40NC0uMTUuNDQtLjE0LjQ0LS4xNi40My0uMTYuNDMtLjE2LjQzLS4xNy40My0uMTguNDItLjE4LjQyLS4xOC40Mi0uMTkuNDItLjIuNDEtLjIuNDEtLjIxLjQxLS4yMS40MS0uMjEuNC0uMjMuNC0uMjIuNC0uMjQuMzktLjIzLjM5LS4yNC4zOS0uMjUuMzgtLjI1LjM4LS4yNi4zOC0uMjYuMzgtLjI3LjM3LS4yNy4zNy0uMjcuMzYtLjI4LjM2LS4yOS4zNi0uMjkuMzYtLjI5LjM1LS4zLjM0LS4zMS4zNS0uMy4zNC0uMzIuMzMtLjMyLjM0LS4zMi4zMi0uMzIuMzMtLjMzLjI4LS4zLjI3LS4yOS4yNy0uMy4yNy0uMy4yNi0uMzEuMjYtLjMxLjI1LS4zMS4yNi0uMzEuMjQtLjMxLjI1LS4zMi4yNC0uMzIuMjQtLjMzLjIzLS4zMi4yMy0uMzMuMjMtLjMzLjIyLS4zNC4yMi0uMzMuMjEtLjM0LjIyLS4zNC4yLS4zNS4yMS0uMzQuMi0uMzUuMTktLjM1LjE5LS4zNS4xOS0uMzYuMTgtLjM1LjE4LS4zNi4xOC0uMzYuMTctLjM2LjE3LS4zNy4xNi0uMzcuMTYtLjM2LjE2LS4zOC4xNS0uMzcuMTUtLjM3LjE0LS4zOC4xNC0uMzguMTMtLjM4LjEzLS4zOC4xMy0uMzguMjEtLjY2LjIxLS42NS4xOS0uNjYuMTgtLjY2LjE3LS42Ni4xNi0uNjYuMTUtLjY2LjE0LS42Ni4xMy0uNjYuMTItLjY1LjEyLS42NC4xLS42NS4xLS42My4wOS0uNjMuMDgtLjYyLjA4LS42MS4wNy0uNjEuMDYtLjU5LjA2LS41OC4wNS0uNTcuMDUtLjU2LjA0LS41NS4wNC0uNTMuMDQtLjUxLjAzLS41MS4wMi0uNDguMDMtLjQ3LjAyLS40NC4wMi0uNDMuMDItLjQxLjAyLS4zOS4wMi0uMzcuMDEtLjM0LjAyLS4zMy4wMS0uMy4wMi0uMjcuMDEtLjI1LjAyLS4yMi4wMi0uMi4wMi0uMTYtLjAxLTEuMTQtLjAyLTEuMS0uMDQtMS4wOC0uMDUtMS4wNS0uMDYtMS4wMi0uMDgtMS0uMDgtLjk3LS4xLS45NC0uMTEtLjkxLS4xMi0uODktLjEyLS44Ny0uMTMtLjgzLS4xNC0uODEtLjE1LS43OS0uMTUtLjc2LS4xNi0uNzQtLjE2LS43MS0uMTYtLjY4LS4xNi0uNjctLjE3LS42My0uMTctLjYyLS4xNy0uNTktLjE2LS41Ny0uMTctLjU0LS4xNi0uNTItLjE2LS41LS4xNi0uNDctLjE1LS40Ni0uMTUtLjQzLS4xNC0uNDEtLjE0LS4zOC0uMTMtLjM3LS4xMi0uMzQtLjExLS4zMy0uMS0uMy0uMDktLjI4LS4wOC0uMjYtLjA3LS4yNS0uMDUtLjIyLS4wNC0uMi0uMTItLjI2LS4xMi0uMjUtLjEyLS4yNi0uMTItLjI1LS4xMy0uMjYtLjEyLS4yNS0uMTMtLjI1LS4xMy0uMjUtLjEzLS4yNS0uMTQtLjI1LS4xMy0uMjUtLjE0LS4yNC0uMTQtLjI1LS4xNC0uMjQtLjE1LS4yNC0uMTQtLjI0LS4xNS0uMjQtLjE1LS4yNC0uMTUtLjI0LS4xNi0uMjQtLjE1LS4yMy0uMTYtLjIzLS4xNi0uMjQtLjE2LS4yMy0uMTYtLjIzLS4xNy0uMjMtLjE2LS4yMi0uMTctLjIzLS4xNy0uMjMtLjE3LS4yMi0uMTgtLjIyLS4xNy0uMjItLjE4LS4yMi0uMTgtLjIyLS4xOC0uMjItLjE4LS4yMS0uMTktLjIxLS4xOS0uMjItLjE4LS4yMS0uMTktLjIxLS40Ni0uNDgtLjQ2LS40Ny0uNDctLjQ3LS40Ny0uNDUtLjQ5LS40NS0uNDktLjQzLS41LS40My0uNTEtLjQxLS41MS0uNDEtLjUyLS40LS41My0uMzktLjUzLS4zNy0uNTQtLjM3LS41NC0uMzYtLjU2LS4zNC0uNTYtLjM0LS41Ni0uMzMtLjU3LS4zMS0uNTctLjMxLS41OC0uMy0uNTktLjI4LS41OS0uMjctLjYtLjI3LS42LS4yNS0uNi0uMjQtLjYxLS4yMy0uNjItLjIyLS42Mi0uMjEtLjYyLS4yLS42My0uMTktLjYzLS4xNy0uNjMtLjE3LS42NC0uMTUtLjY0LS4xNC0uNjQtLjEzLS42NS0uMTItLjY1LS4xLS42NS0uMS0uNjYtLjA4LS42Ni0uMDctLjE1LS4wMi0uMTUtLjAxLS4xNS0uMDItLjE0LS4wMi0uMTUtLjAxLS4xNS0uMDItLjE1LS4wMS0uMTUtLjAyLS4xNS0uMDEtLjE1LS4wMS0uMTUtLjAyLS4xNS0uMDEtLjE1LS4wMS0uMTUtLjAxLS4xNS0uMDEtLjE1LS4wMi0uMTUtLjAxLS4xNS0uMDFoLS4xNWwtLjE1LS4wMS0uMTUtLjAxLS4xNi0uMDEtLjE1LS4wMS0uMTUtLjAxaC0uMTVsLS4xNS0uMDFoLS4xNWwtLjE1LS4wMWgtLjE1bC0uMTUtLjAxaC0uMTVsLS4xNS0uMDFoLS40NWwtLjE1LS4wMWgtMS4xNHpNMzIyLjk2IDkwLjEybC42OS4xLjY4LjEyLjY4LjE1LjY3LjE3LjY3LjIxLjY2LjIzLjY1LjI1LjY1LjI5LjY0LjMxLjYzLjM0LjYyLjM2LjYuMzkuNi40Mi41OS40NS41Ny40Ny41Ni41LjU1LjUzIDEyMi4yNyAxMjIuMjguODQuODguNzYuOTIuNjkuOTMuNjIuOTYuNTQuOTguNDguOTkuNCAxIC4zNCAxLjAyLjI4IDEuMDIuMjEgMS4wMy4xNCAxLjAzLjA4IDEuMDQuMDIgMS4wMy0uMDQgMS4wMy0uMSAxLjAyLS4xNSAxLjAxLS4yMiAxLS4wNy4yNkgxODEuMDRsLS4wNy0uMjYtLjIyLTEtLjE1LTEuMDEtLjEtMS4wMi0uMDQtMS4wMy4wMi0xLjAzLjA4LTEuMDQuMTUtMS4wMy4yLTEuMDMuMjgtMS4wMi4zNC0xLjAyLjQtMSAuNDgtLjk5LjU0LS45OC42Mi0uOTYuNjktLjkzLjc2LS45Mi44NC0uODhMMzA4LjEzIDk1LjQxbC41NS0uNTMuNTYtLjUuNTctLjQ3LjU5LS40NS42LS40Mi42LS4zOS42Mi0uMzYuNjMtLjM0LjY0LS4zMS42NS0uMjkuNjUtLjI1LjY3LS4yMy42Ni0uMjEuNjgtLjE3LjY3LS4xNS42OC0uMTIuNjktLjEuNjgtLjA3LjY5LS4wNC42OS0uMDEuNjkuMDEuNjkuMDQuNjguMDd6IiBpZD0iYiIvPjwvZGVmcz48dXNlIHhsaW5rOmhyZWY9IiNhIiBmaWxsLW9wYWNpdHk9IjAiLz48dXNlIHhsaW5rOmhyZWY9IiNiIiBmaWxsPSIjZmZmIi8+PHVzZSB4bGluazpocmVmPSIjYiIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwIi8+PC9zdmc+\"","/* generated by pull.js */\nimport _js from \"./userscript.js\";\nimport _css from \"!css-loader!./style.css\";\nimport _asset from \"!url-loader!./icon.svg\";\nexport const resources = {\n \"userscript.js\": _js,\n \"style.css\": _css,\n \"icon.svg\": _asset,\n};\n","export default async function ({ addon, console, msg }) {\n let mode = addon.settings.get(\"fitting\");\n\n addon.settings.addEventListener(\"change\", () => {\n mode = addon.settings.get(\"fitting\");\n });\n\n const createItem = (id, right) => {\n const uploadMsg = msg(\"upload\");\n const wrapper = Object.assign(document.createElement(\"div\"), { id });\n const button = Object.assign(document.createElement(\"button\"), {\n className: `${addon.tab.scratchClass(\"action-menu_button\")} ${addon.tab.scratchClass(\n \"action-menu_more-button\"\n )} sa-better-img-uploads-btn`,\n currentitem: \"false\",\n });\n button.dataset.for = `sa-${id}-HD Upload`;\n button.dataset.tip = uploadMsg;\n const img = Object.assign(document.createElement(\"img\"), {\n className: `${addon.tab.scratchClass(\"action-menu_more-icon\")} sa-better-img-uploader`,\n draggable: \"false\",\n src: addon.self.getResource(\"/icon.svg\") /* rewritten by pull.js */,\n height: \"10\",\n width: \"10\",\n });\n button.append(img);\n const input = Object.assign(document.createElement(\"input\"), {\n accept: \".svg, .png, .bmp, .jpg, .jpeg\",\n className: `${addon.tab.scratchClass(\n \"action-menu_file-input\" /* TODO: when adding dynamicDisable, ensure compat with drag-drop */\n )} sa-better-img-uploads-input`,\n multiple: \"true\",\n type: \"file\",\n });\n button.append(input);\n wrapper.append(button);\n const tooltip = Object.assign(document.createElement(\"div\"), {\n className: `__react_component_tooltip place-${right ? \"left\" : \"right\"} type-dark ${addon.tab.scratchClass(\n \"action-menu_tooltip\"\n )} sa-better-img-uploads-tooltip`,\n id: `sa-${id}-HD Upload`,\n textContent: uploadMsg,\n });\n tooltip.dataset.id = \"tooltip\";\n wrapper.append(tooltip);\n addon.tab.displayNoneWhileDisabled(wrapper);\n return [wrapper, button, input, tooltip];\n };\n\n while (true) {\n //Catch all upload menus as they are created\n const spriteSelector = '[class*=\"sprite-selector_sprite-selector_\"] [class*=\"action-menu_more-buttons_\"]';\n const stageSelector = '[class*=\"stage-selector_stage-selector_\"] [class*=\"action-menu_more-buttons_\"]';\n const costumeSelector = '[data-tabs] > :nth-child(3) [class*=\"action-menu_more-buttons_\"]';\n let menu = await addon.tab.waitForElement(`${spriteSelector}, ${stageSelector}, ${costumeSelector}`, {\n markAsSeen: true,\n reduxCondition: (state) => !state.scratchGui.mode.isPlayerOnly,\n reduxEvents: [\n \"scratch-gui/mode/SET_PLAYER\",\n \"fontsLoaded/SET_FONTS_LOADED\",\n \"scratch-gui/locales/SELECT_LOCALE\",\n \"scratch-gui/navigation/ACTIVATE_TAB\",\n ],\n });\n let button = menu.parentElement.previousElementSibling.previousElementSibling; //The base button that the popup menu is from\n\n let id = button.getAttribute(\"aria-label\").replace(/\\s+/g, \"_\");\n\n let isRight = //Is it on the right side of the screen?\n button.parentElement.classList.contains(addon.tab.scratchClass(\"sprite-selector_add-button\")) ||\n button.parentElement.classList.contains(addon.tab.scratchClass(\"stage-selector_add-button\"));\n\n if (isRight) {\n id += \"_right\";\n }\n\n const [menuItem, hdButton, input, tooltip] = createItem(id, isRight);\n menu.prepend(menuItem);\n\n hdButton.addEventListener(\"click\", (e) => {\n // When clicking on the button in the \"add backdrop menu\", don't switch to the stage before\n // a file was selected.\n e.stopPropagation();\n\n input.files = new FileList(); //Empty the input to make sure the change event fires even if the same file was uploaded.\n input.click();\n });\n\n input.addEventListener(\"change\", (e) => {\n onchange(e, id);\n });\n\n let observer = new MutationObserver(() => doresize(id, menu, menuItem, isRight));\n\n observer.observe(menu, { attributes: true, subtree: true });\n\n function doresize(id, menu, menuItem, isRight) {\n let rect = menuItem.getBoundingClientRect();\n tooltip.style.top = rect.top + 2 + \"px\";\n tooltip.style[isRight ? \"right\" : \"left\"] = isRight\n ? window.innerWidth - rect.right + rect.width + 10 + \"px\"\n : rect.left + rect.width + \"px\";\n }\n }\n\n async function onchange(e, id) {\n let iD = id; //Save the id, not sure if this is really necessary?\n let el = e.target;\n let files = Array.from(el.files);\n let processed = new Array();\n\n for (let file of files) {\n if (file.type.includes(\"svg\")) {\n //The file is already a svg, we should not change it...\n processed.push(file);\n continue;\n }\n\n let blob = await new Promise((resolve) => {\n //Get the Blob data url for the image so that we can add it to the svg\n let reader = new FileReader();\n reader.addEventListener(\"load\", () => resolve(reader.result));\n reader.readAsDataURL(file);\n });\n\n let i = new Image(); //New image to get the image's size\n i.src = blob;\n await new Promise((resolve) => {\n i.onload = resolve;\n });\n\n let dim = { width: i.width, height: i.height };\n const originalDim = JSON.parse(JSON.stringify(dim));\n\n if (mode === \"fit\") {\n //Make sure the image fits completely in the stage\n dim = getResizedWidthHeight(dim.width, dim.height);\n } else if (mode === \"fill\") {\n //Fill the stage with the image\n dim.height = (dim.height / dim.width) * 480;\n dim.width = 480;\n if (dim.height < 360) {\n dim.width = (dim.width / dim.height) * 360;\n dim.height = 360;\n }\n if (dim.width < 480) {\n dim.height = (dim.height / dim.width) * 480;\n dim.width = 480;\n }\n } //Otherwise just leave the image the same size\n\n function getResizedWidthHeight(oldWidth, oldHeight) {\n const STAGE_WIDTH = 479;\n const STAGE_HEIGHT = 360;\n const STAGE_RATIO = STAGE_WIDTH / STAGE_HEIGHT;\n\n // If both dimensions are smaller than or equal to corresponding stage dimension,\n // double both dimensions\n if (oldWidth <= STAGE_WIDTH && oldHeight <= STAGE_HEIGHT) {\n return { width: oldWidth, height: oldHeight };\n }\n\n // If neither dimension is larger than 2x corresponding stage dimension,\n // this is an in-between image, return it as is\n if (oldWidth <= STAGE_WIDTH && oldHeight <= STAGE_HEIGHT) {\n return { width: oldWidth, height: oldHeight };\n }\n\n const imageRatio = oldWidth / oldHeight;\n // Otherwise, figure out how to resize\n if (imageRatio >= STAGE_RATIO) {\n // Wide Image\n return {\n width: STAGE_WIDTH,\n height: Math.floor(STAGE_WIDTH / imageRatio),\n };\n }\n // In this case we have either:\n // - A wide image, but not with as big a ratio between width and height,\n // making it so that fitting the width to double stage size would leave\n // the height too big to fit in double the stage height\n // - A square image that's still larger than the double at least\n // one of the stage dimensions, so pick the smaller of the two dimensions (to fit)\n // - A tall image\n // In any of these cases, resize the image to fit the height to double the stage height\n return {\n width: Math.floor(STAGE_HEIGHT * imageRatio),\n height: STAGE_HEIGHT,\n };\n }\n\n processed.push(\n new File( //Create the svg file\n [\n `<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewbox=\"0,0,${\n dim.width\n },${dim.height}\" width=\"${dim.width}\" height=\"${dim.height}\">\n <g>\n <g\n data-paper-data='{\"isPaintingLayer\":true}'\n fill=\"none\"\n fill-rule=\"nonzero\"\n stroke=\"none\"\n stroke-width=\"0.5\"\n stroke-linecap=\"butt\"\n stroke-linejoin=\"miter\"\n stroke-miterlimit=\"10\"\n stroke-dasharray=\"\"\n stroke-dashoffset=\"0\"\n style=\"mix-blend-mode: normal;\"\n >\n <image\n width=\"${originalDim.width}\"\n height=\"${originalDim.height}\"\n\t\t\t\ttransform=\"scale(${dim.width / originalDim.width},${dim.height / originalDim.height})\"\n xlink:href=\"${blob}\"\n />\n </g>\n </g>\n </svg>`,\n ],\n `${file.name.replace(/(.*)\\..*/, \"$1\")}.svg`,\n {\n type: \"image/svg+xml\",\n }\n )\n );\n }\n\n (el = document.getElementById(iD).nextElementSibling.querySelector(\"input\")).files = new FileList(processed); //Convert processed image array to a FileList, which is not normally constructible.\n\n el.dispatchEvent(new e.constructor(e.type, e)); //Start a new, duplicate, event, but allow scratch to receive it this time.\n }\n\n function FileList(arr = []) {\n //File list constructor. Does not need the `new` keyword, but it is easier to read\n let filelist = new DataTransfer(); //This \"creates\" a FileList that we can add files to\n for (let file of arr) {\n filelist.items.add(file);\n }\n return filelist.files; //Completed FileList\n }\n}\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACRA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAGA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AA8BA;AACA;AAGA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-block-count.js ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-block-count"],{
2
+
3
+ /***/ "./src/addons/addons/block-count/_runtime_entry.js":
4
+ /*!*********************************************************!*\
5
+ !*** ./src/addons/addons/block-count/_runtime_entry.js ***!
6
+ \*********************************************************/
7
+ /*! exports provided: resources */
8
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9
+
10
+ "use strict";
11
+ __webpack_require__.r(__webpack_exports__);
12
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
13
+ /* harmony import */ var _blockcount_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./blockcount.js */ "./src/addons/addons/block-count/blockcount.js");
14
+ /* generated by pull.js */
15
+
16
+ const resources = {
17
+ "blockcount.js": _blockcount_js__WEBPACK_IMPORTED_MODULE_0__["default"]
18
+ };
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/block-count/blockcount.js":
23
+ /*!*****************************************************!*\
24
+ !*** ./src/addons/addons/block-count/blockcount.js ***!
25
+ \*****************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
32
+ let {
33
+ addon,
34
+ console,
35
+ msg
36
+ } = _ref;
37
+ const vm = addon.tab.traps.vm;
38
+ const getBlockCount = () => {
39
+ let blockCount = 0;
40
+ let scriptCount = 0;
41
+ let sprites = new Set(vm.runtime.targets.map(i => i.sprite.blocks._blocks));
42
+ sprites.forEach((sprite, i) => {
43
+ scriptCount += Object.values(sprite).filter(o => !o.parent).length; // Filter blocks that don't have a parent (meaning it's the top of a stack)
44
+ blockCount += Object.values(sprite).filter(o => !o.shadow).length; // shadow blocks should be filtered out
45
+ });
46
+ return {
47
+ blockCount,
48
+ scriptCount,
49
+ spriteCount: sprites.size - 1 // Backdrop counts as a target so we can subtract it
50
+ };
51
+ };
52
+ const addLiveBlockCount = async () => {
53
+ if (vm.editingTarget) {
54
+ let handler = null;
55
+ while (true) {
56
+ const topBar = await addon.tab.waitForElement("[class^='menu-bar_main-menu']", {
57
+ markAsSeen: true,
58
+ reduxEvents: ["scratch-gui/mode/SET_PLAYER", "fontsLoaded/SET_FONTS_LOADED", "scratch-gui/locales/SELECT_LOCALE"],
59
+ reduxCondition: state => !state.scratchGui.mode.isPlayerOnly
60
+ });
61
+ let display = topBar.appendChild(document.createElement("span"));
62
+ addon.tab.displayNoneWhileDisabled(display);
63
+ display.style.order = 1;
64
+ display.style.padding = "9px";
65
+ display.innerText = msg("blocks", {
66
+ num: getBlockCount().blockCount
67
+ });
68
+ let debounce; // debouncing values because of the way 'PROJECT_CHANGED' works
69
+ if (handler) {
70
+ vm.off("PROJECT_CHANGED", handler);
71
+ vm.runtime.off("PROJECT_LOADED", handler);
72
+ }
73
+ handler = async () => {
74
+ clearTimeout(debounce);
75
+ debounce = setTimeout(async () => {
76
+ display.innerText = msg("blocks", {
77
+ num: getBlockCount().blockCount
78
+ });
79
+ }, 1000);
80
+ };
81
+ vm.on("PROJECT_CHANGED", handler);
82
+ vm.runtime.on("PROJECT_LOADED", handler);
83
+ }
84
+ } else {
85
+ let timeout = setTimeout(function () {
86
+ addLiveBlockCount();
87
+ clearTimeout(timeout);
88
+ }, 1000);
89
+ }
90
+ };
91
+ addLiveBlockCount();
92
+ });
93
+
94
+ /***/ })
95
+
96
+ }]);
97
+ //# sourceMappingURL=addon-entry-block-count.js.map
js/addon-entry-block-count.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-block-count.js","sources":["webpack://GUI/./src/addons/addons/block-count/_runtime_entry.js","webpack://GUI/./src/addons/addons/block-count/blockcount.js"],"sourcesContent":["/* generated by pull.js */\nimport _js from \"./blockcount.js\";\nexport const resources = {\n \"blockcount.js\": _js,\n};\n","export default async function ({ addon, console, msg }) {\n const vm = addon.tab.traps.vm;\n\n const getBlockCount = () => {\n let blockCount = 0;\n let scriptCount = 0;\n let sprites = new Set(vm.runtime.targets.map((i) => i.sprite.blocks._blocks));\n sprites.forEach((sprite, i) => {\n scriptCount += Object.values(sprite).filter((o) => !o.parent).length; // Filter blocks that don't have a parent (meaning it's the top of a stack)\n blockCount += Object.values(sprite).filter((o) => !o.shadow).length; // shadow blocks should be filtered out\n });\n return {\n blockCount,\n scriptCount,\n spriteCount: sprites.size - 1, // Backdrop counts as a target so we can subtract it\n };\n };\n\n const addLiveBlockCount = async () => {\n if (vm.editingTarget) {\n let handler = null;\n while (true) {\n const topBar = await addon.tab.waitForElement(\"[class^='menu-bar_main-menu']\", {\n markAsSeen: true,\n reduxEvents: [\n \"scratch-gui/mode/SET_PLAYER\",\n \"fontsLoaded/SET_FONTS_LOADED\",\n \"scratch-gui/locales/SELECT_LOCALE\",\n ],\n reduxCondition: (state) => !state.scratchGui.mode.isPlayerOnly,\n });\n let display = topBar.appendChild(document.createElement(\"span\"));\n addon.tab.displayNoneWhileDisabled(display);\n display.style.order = 1;\n display.style.padding = \"9px\";\n display.innerText = msg(\"blocks\", { num: getBlockCount().blockCount });\n let debounce; // debouncing values because of the way 'PROJECT_CHANGED' works\n if (handler) {\n vm.off(\"PROJECT_CHANGED\", handler);\n vm.runtime.off(\"PROJECT_LOADED\", handler);\n }\n handler = async () => {\n clearTimeout(debounce);\n debounce = setTimeout(async () => {\n display.innerText = msg(\"blocks\", { num: getBlockCount().blockCount });\n }, 1000);\n };\n vm.on(\"PROJECT_CHANGED\", handler);\n vm.runtime.on(\"PROJECT_LOADED\", handler);\n }\n } else {\n let timeout = setTimeout(function () {\n addLiveBlockCount();\n clearTimeout(timeout);\n }, 1000);\n }\n };\n\n addLiveBlockCount();\n}\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;;;A","sourceRoot":""}
js/addon-entry-block-palette-icons.js ADDED
@@ -0,0 +1,314 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-block-palette-icons"],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/block-palette-icons/userstyle.css":
4
+ /*!***************************************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/block-palette-icons/userstyle.css ***!
6
+ \***************************************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ var escape = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/url/escape.js */ "./node_modules/css-loader/lib/url/escape.js");
11
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
12
+ // imports
13
+
14
+
15
+ // module
16
+ exports.push([module.i, ".scratchCategoryItemBubble {\n position: relative;\n}\n\n.scratchCategoryItemBubble::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n background-position: center;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.scratchCategoryId-motion .scratchCategoryItemBubble::after {\n background-image: url(" + escape(__webpack_require__(/*! ./icons/motion_icon.svg */ "./src/addons/addons/block-palette-icons/icons/motion_icon.svg")) + ");\n}\n\n.scratchCategoryId-looks .scratchCategoryItemBubble::after {\n background-image: url(" + escape(__webpack_require__(/*! ./icons/looks_icon.svg */ "./src/addons/addons/block-palette-icons/icons/looks_icon.svg")) + ");\n}\n\n.scratchCategoryId-sound .scratchCategoryItemBubble::after {\n background-image: url(" + escape(__webpack_require__(/*! ./icons/sound_icon.svg */ "./src/addons/addons/block-palette-icons/icons/sound_icon.svg")) + ");\n}\n\n.scratchCategoryId-events .scratchCategoryItemBubble::after {\n background-image: url(" + escape(__webpack_require__(/*! ./icons/events_icon.svg */ "./src/addons/addons/block-palette-icons/icons/events_icon.svg")) + ");\n}\n\n.scratchCategoryId-control .scratchCategoryItemBubble::after {\n background-image: url(" + escape(__webpack_require__(/*! ./icons/control_icon.svg */ "./src/addons/addons/block-palette-icons/icons/control_icon.svg")) + ");\n}\n\n.scratchCategoryId-sensing .scratchCategoryItemBubble::after {\n background-image: url(" + escape(__webpack_require__(/*! ./icons/sensing_icon.svg */ "./src/addons/addons/block-palette-icons/icons/sensing_icon.svg")) + ");\n}\n\n.scratchCategoryId-operators .scratchCategoryItemBubble::after {\n background-image: url(" + escape(__webpack_require__(/*! ./icons/operators_icon.svg */ "./src/addons/addons/block-palette-icons/icons/operators_icon.svg")) + ");\n}\n\n.scratchCategoryId-variables .scratchCategoryItemBubble::after {\n background-image: url(" + escape(__webpack_require__(/*! ./icons/variables_icon.svg */ "./src/addons/addons/block-palette-icons/icons/variables_icon.svg")) + ");\n}\n\n.scratchCategoryId-lists .scratchCategoryItemBubble::after {\n background-image: url(" + escape(__webpack_require__(/*! ./icons/list_icon.svg */ "./src/addons/addons/block-palette-icons/icons/list_icon.svg")) + ");\n}\n\n.scratchCategoryId-myBlocks .scratchCategoryItemBubble::after {\n background-image: url(" + escape(__webpack_require__(/*! ./icons/block_icon.svg */ "./src/addons/addons/block-palette-icons/icons/block_icon.svg")) + ");\n}\n", ""]);
17
+
18
+ // exports
19
+
20
+
21
+ /***/ }),
22
+
23
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/block_icon.svg":
24
+ /*!**********************************************************************************************************!*\
25
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/block_icon.svg ***!
26
+ \**********************************************************************************************************/
27
+ /*! exports provided: default */
28
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
29
+
30
+ "use strict";
31
+ __webpack_require__.r(__webpack_exports__);
32
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJtMzEuNDIgOS4wOS0xMy02YTEgMSAwIDAgMC0uODQgMGwtMTMgNkExIDEgMCAwIDAgNCAxMHYxN2ExIDEgMCAwIDAgLjU4LjkxbDEzIDZhMSAxIDAgMCAwIC44NCAwbDEzLTZBMSAxIDAgMCAwIDMyIDI3VjEwYTEgMSAwIDAgMC0uNTgtLjkxek0xOCA1LjEgMjguNjEgMTAgMTggMTQuOSA3LjM5IDEwek02IDExLjU2bDExIDUuMDh2MTQuOEw2IDI2LjM2em0xMyAxOS44OHYtMTQuOGwxMS01LjA4djE0Ljh6IiBjbGFzcz0iY2xyLWktb3V0bGluZSBjbHItaS1vdXRsaW5lLXBhdGgtMSIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGw9InJnYmEoMCwgMCwgMCwgMCkiIGQ9Ik0wIDBoMzZ2MzZIMHoiLz48L3N2Zz4=");
33
+
34
+ /***/ }),
35
+
36
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/control_icon.svg":
37
+ /*!************************************************************************************************************!*\
38
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/control_icon.svg ***!
39
+ \************************************************************************************************************/
40
+ /*! exports provided: default */
41
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
42
+
43
+ "use strict";
44
+ __webpack_require__.r(__webpack_exports__);
45
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJNMTMgM0g3YTcgNyAwIDEgMCAwIDE0aDZhNyA3IDAgMSAwIDAtMTR6bTAgMTJhNSA1IDAgMSAxIC4wMDEtMTAuMDAxQTUgNSAwIDAgMSAxMyAxNXoiIGZpbGw9IiNmZmYiLz48cGF0aCBmaWxsPSJyZ2JhKDAsIDAsIDAsIDApIiBkPSJNMCAwaDIwdjIwSDB6Ii8+PC9zdmc+");
46
+
47
+ /***/ }),
48
+
49
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/events_icon.svg":
50
+ /*!***********************************************************************************************************!*\
51
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/events_icon.svg ***!
52
+ \***********************************************************************************************************/
53
+ /*! exports provided: default */
54
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
55
+
56
+ "use strict";
57
+ __webpack_require__.r(__webpack_exports__);
58
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGJhc2VQcm9maWxlPSJ0aW55IiBoZWlnaHQ9IjEzNyIgdmVyc2lvbj0iMS4yIiB3aWR0aD0iMTIxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTEwNi4zNTEgMTkuNjIyYTcuMTgzIDcuMTgzIDAgMCAwLTcuODMgMS41NThjLTkuMDggOS4wNzMtMjMuODU1IDkuMDgtMzIuOTQyIDAtMTQuNjktMTQuNjc1LTM4LjU3NS0xNC42NzUtNTMuMjU4IDBhNy4xNjQgNy4xNjQgMCAwIDAtMi4xMDUgNS4wOHY5My4zODNjMCAzLjk2NSAzLjIxMSA3LjE4MyA3LjE4NCA3LjE4M3M3LjE4My0zLjIxOCA3LjE4My03LjE4M1Y4Ni45MzdjOS4xMy03LjE2MiAyMi40Mi02LjU0NCAzMC44MzggMS44NjggMTQuNjkgMTQuNjc1IDM4LjU4MiAxNC42NzUgNTMuMjU4IDBhNy4xNzcgNy4xNzcgMCAwIDAgMi4xMDUtNS4wNzlWMjYuMjZhNy4xODggNy4xODggMCAwIDAtNC40MzMtNi42Mzd6IiBmaWxsPSIjZmZmIiBjbGFzcz0iY3VycmVudExheWVyIi8+PC9zdmc+");
59
+
60
+ /***/ }),
61
+
62
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/list_icon.svg":
63
+ /*!*********************************************************************************************************!*\
64
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/list_icon.svg ***!
65
+ \*********************************************************************************************************/
66
+ /*! exports provided: default */
67
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
68
+
69
+ "use strict";
70
+ __webpack_require__.r(__webpack_exports__);
71
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiBzdHlsZT0iLW1zLXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZykiPjxwYXRoIGQ9Im04MC4xODIgNjcuNDU3LTM1LjQtLjAwMXYuMDAxbC0uMDA5LS4wMDFhMi4yNyAyLjI3IDAgMCAwLTIuMjY5IDIuMjY5YzAgLjA0Mi4wMS4wOC4wMTIuMTIxVjgwLjE4aC4wMTFhMi4yNjggMi4yNjggMCAwIDAgMi4yNTQgMi4yNjh2LjAwMWgzNS40di0uMDAyYTIuMjY4IDIuMjY4IDAgMCAwIDIuMjU0LTIuMjY4VjY5LjgyNWMuMDAyLS4wMzQuMDEtLjA2Ny4wMS0uMTAxYTIuMjY3IDIuMjY3IDAgMCAwLTIuMjYzLTIuMjY3em0tNDkuOTA0LS4wMDNIMTkuODIyYTIuMjcgMi4yNyAwIDAgMC0yLjI2OSAyLjI2OXYxMC40NTRhMi4yNjkgMi4yNjkgMCAwIDAgMi4yNjggMi4yNjloMTAuNDU1YTIuMjcgMi4yNyAwIDAgMCAyLjI2OS0yLjI2OVY2OS43MjNhMi4yNjcgMi4yNjcgMCAwIDAtMi4yNjctMi4yNjl6bTQ5LjkwNC0yNC45ODctMzUuNC0uMDAxdi4wMDFsLS4wMDktLjAwMWEyLjI3IDIuMjcgMCAwIDAtMi4yNjkgMi4yNjljMCAuMDQyLjAxLjA4LjAxMi4xMjFWNTUuMTloLjAxMWEyLjI2OCAyLjI2OCAwIDAgMCAyLjI1NCAyLjI2OHYuMDAxaDM1LjR2LS4wMDJhMi4yNjggMi4yNjggMCAwIDAgMi4yNTQtMi4yNjhWNDQuODM1Yy4wMDItLjAzNC4wMS0uMDY3LjAxLS4xMDFhMi4yNjcgMi4yNjcgMCAwIDAtMi4yNjMtMi4yNjd6bS00OS45MDQtLjAwM0gxOS44MjJhMi4yNyAyLjI3IDAgMCAwLTIuMjY5IDIuMjY5djEwLjQ1NGEyLjI2OSAyLjI2OSAwIDAgMCAyLjI2OCAyLjI2OWgxMC40NTVhMi4yNyAyLjI3IDAgMCAwIDIuMjY5LTIuMjY5VjQ0LjczM2EyLjI2NyAyLjI2NyAwIDAgMC0yLjI2Ny0yLjI2OXptMTIuMjM4LTEyLjE4OGguMDExYTIuMjY4IDIuMjY4IDAgMCAwIDIuMjU0IDIuMjY4di4wMDFoMzUuNHYtLjAwMmEyLjI2OCAyLjI2OCAwIDAgMCAyLjI1NC0yLjI2OFYxOS45MjFjLjAwMi0uMDM0LjAxLS4wNjcuMDEtLjEwMWEyLjI2OSAyLjI2OSAwIDAgMC0yLjI2NC0yLjI2OHYtLjAwMWgtMzUuNHYuMDAxbC0uMDA5LS4wMDFhMi4yNyAyLjI3IDAgMCAwLTIuMjY5IDIuMjY5YzAgLjA0Mi4wMS4wOC4wMTIuMTIxdjEwLjMzNXpNMzAuMjc4IDE3LjU1MUgxOS44MjJhMi4yNyAyLjI3IDAgMCAwLTIuMjY5IDIuMjY5djEwLjQ1NGEyLjI2OSAyLjI2OSAwIDAgMCAyLjI2OCAyLjI2OWgxMC40NTVhMi4yNyAyLjI3IDAgMCAwIDIuMjY5LTIuMjY5VjE5LjgyYTIuMjY2IDIuMjY2IDAgMCAwLTIuMjY3LTIuMjY5eiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGw9InJnYmEoMCwgMCwgMCwgMCkiIGQ9Ik0wIDBoMTAwdjEwMEgweiIvPjwvc3ZnPg==");
72
+
73
+ /***/ }),
74
+
75
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/looks_icon.svg":
76
+ /*!**********************************************************************************************************!*\
77
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/looks_icon.svg ***!
78
+ \**********************************************************************************************************/
79
+ /*! exports provided: default */
80
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
81
+
82
+ "use strict";
83
+ __webpack_require__.r(__webpack_exports__);
84
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiIHN0eWxlPSItbXMtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKSI+PHBhdGggZD0iTTM5NiA1MTJhMTEyIDExMiAwIDEgMCAyMjQgMCAxMTIgMTEyIDAgMSAwLTIyNCAwem01NDYuMi0yNS44Qzg0Ny40IDI4Ni41IDcwNC4xIDE4NiA1MTIgMTg2Yy0xOTIuMiAwLTMzNS40IDEwMC41LTQzMC4yIDMwMC4zYTYwLjMgNjAuMyAwIDAgMCAwIDUxLjVDMTc2LjYgNzM3LjUgMzE5LjkgODM4IDUxMiA4MzhjMTkyLjIgMCAzMzUuNC0xMDAuNSA0MzAuMi0zMDAuMyA3LjctMTYuMiA3LjctMzUgMC01MS41ek01MDggNjg4Yy05Ny4yIDAtMTc2LTc4LjgtMTc2LTE3NnM3OC44LTE3NiAxNzYtMTc2IDE3NiA3OC44IDE3NiAxNzYtNzguOCAxNzYtMTc2IDE3NnoiIGZpbGw9IiNmZmYiLz48cGF0aCBmaWxsPSJyZ2JhKDAsIDAsIDAsIDApIiBkPSJNMCAwaDEwMjR2MTAyNEgweiIvPjwvc3ZnPg==");
85
+
86
+ /***/ }),
87
+
88
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/motion_icon.svg":
89
+ /*!***********************************************************************************************************!*\
90
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/motion_icon.svg ***!
91
+ \***********************************************************************************************************/
92
+ /*! exports provided: default */
93
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
94
+
95
+ "use strict";
96
+ __webpack_require__.r(__webpack_exports__);
97
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJtMi44OCA3Ljg4IDEuNTQgMS41NEM0LjE1IDEwLjIzIDQgMTEuMSA0IDEyYzAgNC40MSAzLjU5IDggOCA4czgtMy41OSA4LTgtMy41OS04LTgtOGMtLjkgMC0xLjc3LjE1LTIuNTguNDJMNy44OSAyLjg5QzkuMTUgMi4zMiAxMC41NCAyIDEyIDJjNS41MiAwIDEwIDQuNDggMTAgMTBzLTQuNDggMTAtMTAgMTBTMiAxNy41MiAyIDEyYzAtMS40Ny4zMi0yLjg2Ljg4LTQuMTJ6TTcgNS41QzcgNi4zMyA2LjMzIDcgNS41IDdTNCA2LjMzIDQgNS41IDQuNjcgNCA1LjUgNCA3IDQuNjcgNyA1LjV6IiBmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0icmdiYSgwLCAwLCAwLCAwKSIgZD0iTTAgMGgyNHYyNEgweiIvPjwvc3ZnPg==");
98
+
99
+ /***/ }),
100
+
101
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/operators_icon.svg":
102
+ /*!**************************************************************************************************************!*\
103
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/operators_icon.svg ***!
104
+ \**************************************************************************************************************/
105
+ /*! exports provided: default */
106
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
107
+
108
+ "use strict";
109
+ __webpack_require__.r(__webpack_exports__);
110
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJNMTUuNiA1LjI5Yy0xLjEtLjEtMi4wNy43MS0yLjE3IDEuODJMMTMuMTggMTBIMTZ2MmgtM2wtLjQ0IDUuMDdhMy45ODYgMy45ODYgMCAwIDEtNC4zMyAzLjYzIDQuMDA3IDQuMDA3IDAgMCAxLTMuMDYtMS44N2wxLjUtMS41Yy4yNC43NC45IDEuMzEgMS43MyAxLjM4IDEuMS4xIDIuMDctLjcxIDIuMTctMS44MkwxMSAxMkg4di0yaDMuMTdsLjI3LTMuMDdjLjE5LTIuMiAyLjEzLTMuODMgNC4zMy0zLjYzIDEuMzEuMTEgMi40MS44NCAzLjA2IDEuODdsLTEuNSAxLjVjLS4yNC0uNzQtLjktMS4zMS0xLjczLTEuMzh6IiBmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0icmdiYSgwLCAwLCAwLCAwKSIgZD0iTTAgMGgyNHYyNEgweiIvPjwvc3ZnPg==");
111
+
112
+ /***/ }),
113
+
114
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/sensing_icon.svg":
115
+ /*!************************************************************************************************************!*\
116
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/sensing_icon.svg ***!
117
+ \************************************************************************************************************/
118
+ /*! exports provided: default */
119
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
120
+
121
+ "use strict";
122
+ __webpack_require__.r(__webpack_exports__);
123
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJNOSAxMS4yNFY3LjVhMi41IDIuNSAwIDAgMSA1IDB2My43NGMxLjIxLS44MSAyLTIuMTggMi0zLjc0QzE2IDUuMDEgMTMuOTkgMyAxMS41IDNTNyA1LjAxIDcgNy41YzAgMS41Ni43OSAyLjkzIDIgMy43NHptOS44NCA0LjYzLTQuNTQtMi4yNmMtLjE3LS4wNy0uMzUtLjExLS41NC0uMTFIMTN2LTZjMC0uODMtLjY3LTEuNS0xLjUtMS41UzEwIDYuNjcgMTAgNy41djEwLjc0Yy0zLjYtLjc2LTMuNTQtLjc1LTMuNjctLjc1LS4zMSAwLS41OS4xMy0uNzkuMzNsLS43OS44IDQuOTQgNC45NGMuMjcuMjcuNjUuNDQgMS4wNi40NGg2Ljc5Yy43NSAwIDEuMzMtLjU1IDEuNDQtMS4yOGwuNzUtNS4yN2MuMDEtLjA3LjAyLS4xNC4wMi0uMiAwLS42Mi0uMzgtMS4xNi0uOTEtMS4zOHoiIGZpbGw9IiNmZmYiLz48cGF0aCBmaWxsPSJyZ2JhKDAsIDAsIDAsIDApIiBkPSJNMCAwaDI0djI0SDB6Ii8+PC9zdmc+");
124
+
125
+ /***/ }),
126
+
127
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/sound_icon.svg":
128
+ /*!**********************************************************************************************************!*\
129
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/sound_icon.svg ***!
130
+ \**********************************************************************************************************/
131
+ /*! exports provided: default */
132
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
133
+
134
+ "use strict";
135
+ __webpack_require__.r(__webpack_exports__);
136
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJNMTQuNzA0IDMuNDQyYy4xOTEuMjI2LjI5Ni41MTIuMjk2LjgwOHYxNS41MDJhMS4yNSAxLjI1IDAgMCAxLTIuMDU4Ljk1NEw3Ljk3NSAxNi41SDQuMjVBMi4yNSAyLjI1IDAgMCAxIDIgMTQuMjV2LTQuNUEyLjI1IDIuMjUgMCAwIDEgNC4yNSA3LjVoMy43MjVsNC45NjgtNC4yMDRhMS4yNSAxLjI1IDAgMCAxIDEuNzYxLjE0N3ptMi40IDUuMTk4YS43NS43NSAwIDAgMSAxLjAzLjI1Yy41NzQuOTQuODYyIDEuOTkyLjg2MiAzLjE0IDAgMS4xNDktLjI4OCAyLjIwMS0uODYyIDMuMTQxYS43NS43NSAwIDEgMS0xLjI4LS43ODFjLjQyOC0uNzAyLjY0Mi0xLjQ4My42NDItMi4zNiAwLS44NzYtLjIxNC0xLjY1Ny0uNjQyLTIuMzU5YS43NS43NSAwIDAgMSAuMjUtMS4wM3oiIGZpbGw9IiNmZmYiLz48cGF0aCBmaWxsPSJyZ2JhKDAsIDAsIDAsIDApIiBkPSJNMCAwaDI0djI0SDB6Ii8+PC9zdmc+");
137
+
138
+ /***/ }),
139
+
140
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/variables_icon.svg":
141
+ /*!**************************************************************************************************************!*\
142
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/variables_icon.svg ***!
143
+ \**************************************************************************************************************/
144
+ /*! exports provided: default */
145
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
146
+
147
+ "use strict";
148
+ __webpack_require__.r(__webpack_exports__);
149
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTQuNjQ5IDMuMDg0QTEgMSAwIDAgMSA1LjE2MyA0LjQgMTMuOTUgMTMuOTUgMCAwIDAgNCAxMGMwIDEuOTkzLjQxNiAzLjg4NiAxLjE2NCA1LjZhMSAxIDAgMCAxLTEuODMyLjhBMTUuOTUgMTUuOTUgMCAwIDEgMiAxMGMwLTIuMjc0LjQ3NS00LjQ0IDEuMzMyLTYuNGExIDEgMCAwIDEgMS4zMTctLjUxNnpNMTIuOTYgN2EzIDMgMCAwIDAtMi4zNDIgMS4xMjZsLS4zMjguNDEtLjExMS0uMjc5QTIgMiAwIDAgMCA4LjMyMyA3SDhhMSAxIDAgMCAwIDAgMmguMzIzbC41MzIgMS4zMy0xLjAzNSAxLjI5NWExIDEgMCAwIDEtLjc4MS4zNzVIN2ExIDEgMCAxIDAgMCAyaC4wMzlhMyAzIDAgMCAwIDIuMzQyLTEuMTI2bC4zMjgtLjQxLjExMS4yNzlBMiAyIDAgMCAwIDExLjY3NyAxNEgxMmExIDEgMCAxIDAgMC0yaC0uMzIzbC0uNTMyLTEuMzMgMS4wMzUtMS4yOTVBMSAxIDAgMCAxIDEyLjk2MSA5SDEzYTEgMSAwIDEgMCAwLTJoLS4wMzl6bTEuODc0LTIuNmExIDEgMCAwIDEgMS44MzMtLjhBMTUuOTUgMTUuOTUgMCAwIDEgMTggMTBjMCAyLjI3NC0uNDc1IDQuNDQtMS4zMzIgNi40YTEgMSAwIDEgMS0xLjgzMi0uOEExMy45NDkgMTMuOTQ5IDAgMCAwIDE2IDEwYzAtMS45OTMtLjQxNi0zLjg4Ni0xLjE2NS01LjZ6IiBmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0icmdiYSgwLCAwLCAwLCAwKSIgZD0iTTAgMGgyMHYyMEgweiIvPjwvc3ZnPg==");
150
+
151
+ /***/ }),
152
+
153
+ /***/ "./src/addons/addons/block-palette-icons/_runtime_entry.js":
154
+ /*!*****************************************************************!*\
155
+ !*** ./src/addons/addons/block-palette-icons/_runtime_entry.js ***!
156
+ \*****************************************************************/
157
+ /*! exports provided: resources */
158
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
159
+
160
+ "use strict";
161
+ __webpack_require__.r(__webpack_exports__);
162
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
163
+ /* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! css-loader!./userstyle.css */ "./node_modules/css-loader/index.js!./src/addons/addons/block-palette-icons/userstyle.css");
164
+ /* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_0__);
165
+ /* harmony import */ var _url_loader_icons_block_icon_svg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! url-loader!./icons/block_icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/block_icon.svg");
166
+ /* harmony import */ var _url_loader_icons_control_icon_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! url-loader!./icons/control_icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/control_icon.svg");
167
+ /* harmony import */ var _url_loader_icons_events_icon_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! url-loader!./icons/events_icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/events_icon.svg");
168
+ /* harmony import */ var _url_loader_icons_list_icon_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! url-loader!./icons/list_icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/list_icon.svg");
169
+ /* harmony import */ var _url_loader_icons_looks_icon_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! url-loader!./icons/looks_icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/looks_icon.svg");
170
+ /* harmony import */ var _url_loader_icons_motion_icon_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! url-loader!./icons/motion_icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/motion_icon.svg");
171
+ /* harmony import */ var _url_loader_icons_operators_icon_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! url-loader!./icons/operators_icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/operators_icon.svg");
172
+ /* harmony import */ var _url_loader_icons_sensing_icon_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! url-loader!./icons/sensing_icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/sensing_icon.svg");
173
+ /* harmony import */ var _url_loader_icons_sound_icon_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! url-loader!./icons/sound_icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/sound_icon.svg");
174
+ /* harmony import */ var _url_loader_icons_variables_icon_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! url-loader!./icons/variables_icon.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/block-palette-icons/icons/variables_icon.svg");
175
+ /* generated by pull.js */
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+ const resources = {
188
+ "userstyle.css": _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_0___default.a,
189
+ "icons/block_icon.svg": _url_loader_icons_block_icon_svg__WEBPACK_IMPORTED_MODULE_1__["default"],
190
+ "icons/control_icon.svg": _url_loader_icons_control_icon_svg__WEBPACK_IMPORTED_MODULE_2__["default"],
191
+ "icons/events_icon.svg": _url_loader_icons_events_icon_svg__WEBPACK_IMPORTED_MODULE_3__["default"],
192
+ "icons/list_icon.svg": _url_loader_icons_list_icon_svg__WEBPACK_IMPORTED_MODULE_4__["default"],
193
+ "icons/looks_icon.svg": _url_loader_icons_looks_icon_svg__WEBPACK_IMPORTED_MODULE_5__["default"],
194
+ "icons/motion_icon.svg": _url_loader_icons_motion_icon_svg__WEBPACK_IMPORTED_MODULE_6__["default"],
195
+ "icons/operators_icon.svg": _url_loader_icons_operators_icon_svg__WEBPACK_IMPORTED_MODULE_7__["default"],
196
+ "icons/sensing_icon.svg": _url_loader_icons_sensing_icon_svg__WEBPACK_IMPORTED_MODULE_8__["default"],
197
+ "icons/sound_icon.svg": _url_loader_icons_sound_icon_svg__WEBPACK_IMPORTED_MODULE_9__["default"],
198
+ "icons/variables_icon.svg": _url_loader_icons_variables_icon_svg__WEBPACK_IMPORTED_MODULE_10__["default"]
199
+ };
200
+
201
+ /***/ }),
202
+
203
+ /***/ "./src/addons/addons/block-palette-icons/icons/block_icon.svg":
204
+ /*!********************************************************************!*\
205
+ !*** ./src/addons/addons/block-palette-icons/icons/block_icon.svg ***!
206
+ \********************************************************************/
207
+ /*! no static exports found */
208
+ /***/ (function(module, exports, __webpack_require__) {
209
+
210
+ module.exports = __webpack_require__.p + "static/assets/318e019bdee5ed02903aa5f22a9903f2.svg";
211
+
212
+ /***/ }),
213
+
214
+ /***/ "./src/addons/addons/block-palette-icons/icons/control_icon.svg":
215
+ /*!**********************************************************************!*\
216
+ !*** ./src/addons/addons/block-palette-icons/icons/control_icon.svg ***!
217
+ \**********************************************************************/
218
+ /*! no static exports found */
219
+ /***/ (function(module, exports, __webpack_require__) {
220
+
221
+ module.exports = __webpack_require__.p + "static/assets/e1249124e702a974df36355af6aa2385.svg";
222
+
223
+ /***/ }),
224
+
225
+ /***/ "./src/addons/addons/block-palette-icons/icons/events_icon.svg":
226
+ /*!*********************************************************************!*\
227
+ !*** ./src/addons/addons/block-palette-icons/icons/events_icon.svg ***!
228
+ \*********************************************************************/
229
+ /*! no static exports found */
230
+ /***/ (function(module, exports, __webpack_require__) {
231
+
232
+ module.exports = __webpack_require__.p + "static/assets/9d7acb2e5784a9a1d52e564af3d8469b.svg";
233
+
234
+ /***/ }),
235
+
236
+ /***/ "./src/addons/addons/block-palette-icons/icons/list_icon.svg":
237
+ /*!*******************************************************************!*\
238
+ !*** ./src/addons/addons/block-palette-icons/icons/list_icon.svg ***!
239
+ \*******************************************************************/
240
+ /*! no static exports found */
241
+ /***/ (function(module, exports, __webpack_require__) {
242
+
243
+ module.exports = __webpack_require__.p + "static/assets/bd6d382729ecbd23c5181cf2b327072f.svg";
244
+
245
+ /***/ }),
246
+
247
+ /***/ "./src/addons/addons/block-palette-icons/icons/looks_icon.svg":
248
+ /*!********************************************************************!*\
249
+ !*** ./src/addons/addons/block-palette-icons/icons/looks_icon.svg ***!
250
+ \********************************************************************/
251
+ /*! no static exports found */
252
+ /***/ (function(module, exports, __webpack_require__) {
253
+
254
+ module.exports = __webpack_require__.p + "static/assets/e008ee0cb1202de1137823150da1644a.svg";
255
+
256
+ /***/ }),
257
+
258
+ /***/ "./src/addons/addons/block-palette-icons/icons/motion_icon.svg":
259
+ /*!*********************************************************************!*\
260
+ !*** ./src/addons/addons/block-palette-icons/icons/motion_icon.svg ***!
261
+ \*********************************************************************/
262
+ /*! no static exports found */
263
+ /***/ (function(module, exports, __webpack_require__) {
264
+
265
+ module.exports = __webpack_require__.p + "static/assets/c088896fb05dc466b45ecaa1d5c4d007.svg";
266
+
267
+ /***/ }),
268
+
269
+ /***/ "./src/addons/addons/block-palette-icons/icons/operators_icon.svg":
270
+ /*!************************************************************************!*\
271
+ !*** ./src/addons/addons/block-palette-icons/icons/operators_icon.svg ***!
272
+ \************************************************************************/
273
+ /*! no static exports found */
274
+ /***/ (function(module, exports, __webpack_require__) {
275
+
276
+ module.exports = __webpack_require__.p + "static/assets/ab2c140af0ffba6b515eebc2156742e2.svg";
277
+
278
+ /***/ }),
279
+
280
+ /***/ "./src/addons/addons/block-palette-icons/icons/sensing_icon.svg":
281
+ /*!**********************************************************************!*\
282
+ !*** ./src/addons/addons/block-palette-icons/icons/sensing_icon.svg ***!
283
+ \**********************************************************************/
284
+ /*! no static exports found */
285
+ /***/ (function(module, exports, __webpack_require__) {
286
+
287
+ module.exports = __webpack_require__.p + "static/assets/7601fa61034e5d7d542538e1e4338a4e.svg";
288
+
289
+ /***/ }),
290
+
291
+ /***/ "./src/addons/addons/block-palette-icons/icons/sound_icon.svg":
292
+ /*!********************************************************************!*\
293
+ !*** ./src/addons/addons/block-palette-icons/icons/sound_icon.svg ***!
294
+ \********************************************************************/
295
+ /*! no static exports found */
296
+ /***/ (function(module, exports, __webpack_require__) {
297
+
298
+ module.exports = __webpack_require__.p + "static/assets/7b98085c05bdcd97dd0c6d4b34317793.svg";
299
+
300
+ /***/ }),
301
+
302
+ /***/ "./src/addons/addons/block-palette-icons/icons/variables_icon.svg":
303
+ /*!************************************************************************!*\
304
+ !*** ./src/addons/addons/block-palette-icons/icons/variables_icon.svg ***!
305
+ \************************************************************************/
306
+ /*! no static exports found */
307
+ /***/ (function(module, exports, __webpack_require__) {
308
+
309
+ module.exports = __webpack_require__.p + "static/assets/4bfaa15915bc5fb88b40b3e1a537c3ea.svg";
310
+
311
+ /***/ })
312
+
313
+ }]);
314
+ //# sourceMappingURL=addon-entry-block-palette-icons.js.map
js/addon-entry-block-palette-icons.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-block-palette-icons.js","sources":["webpack://GUI/./src/addons/addons/block-palette-icons/userstyle.css","webpack://GUI/./src/addons/addons/block-palette-icons/icons/block_icon.svg","webpack://GUI/./src/addons/addons/block-palette-icons/icons/control_icon.svg","webpack://GUI/./src/addons/addons/block-palette-icons/icons/events_icon.svg","webpack://GUI/./src/addons/addons/block-palette-icons/icons/list_icon.svg","webpack://GUI/./src/addons/addons/block-palette-icons/icons/looks_icon.svg","webpack://GUI/./src/addons/addons/block-palette-icons/icons/motion_icon.svg","webpack://GUI/./src/addons/addons/block-palette-icons/icons/operators_icon.svg","webpack://GUI/./src/addons/addons/block-palette-icons/icons/sensing_icon.svg","webpack://GUI/./src/addons/addons/block-palette-icons/icons/sound_icon.svg","webpack://GUI/./src/addons/addons/block-palette-icons/icons/variables_icon.svg","webpack://GUI/./src/addons/addons/block-palette-icons/_runtime_entry.js","webpack://GUI/./src/addons/addons/block-palette-icons/icons/block_icon.svg?a795","webpack://GUI/./src/addons/addons/block-palette-icons/icons/control_icon.svg?5b69","webpack://GUI/./src/addons/addons/block-palette-icons/icons/events_icon.svg?4564","webpack://GUI/./src/addons/addons/block-palette-icons/icons/list_icon.svg?8b76","webpack://GUI/./src/addons/addons/block-palette-icons/icons/looks_icon.svg?4204","webpack://GUI/./src/addons/addons/block-palette-icons/icons/motion_icon.svg?1779","webpack://GUI/./src/addons/addons/block-palette-icons/icons/operators_icon.svg?a5b2","webpack://GUI/./src/addons/addons/block-palette-icons/icons/sensing_icon.svg?d3cc","webpack://GUI/./src/addons/addons/block-palette-icons/icons/sound_icon.svg?11e2","webpack://GUI/./src/addons/addons/block-palette-icons/icons/variables_icon.svg?3491"],"sourcesContent":["var escape = require(\"../../../../node_modules/css-loader/lib/url/escape.js\");\nexports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".scratchCategoryItemBubble {\\n position: relative;\\n}\\n\\n.scratchCategoryItemBubble::after {\\n content: \\\"\\\";\\n position: absolute;\\n top: 0;\\n left: 0;\\n bottom: 0;\\n right: 0;\\n background-position: center;\\n background-repeat: no-repeat;\\n background-size: cover;\\n}\\n\\n.scratchCategoryId-motion .scratchCategoryItemBubble::after {\\n background-image: url(\" + escape(require(\"./icons/motion_icon.svg\")) + \");\\n}\\n\\n.scratchCategoryId-looks .scratchCategoryItemBubble::after {\\n background-image: url(\" + escape(require(\"./icons/looks_icon.svg\")) + \");\\n}\\n\\n.scratchCategoryId-sound .scratchCategoryItemBubble::after {\\n background-image: url(\" + escape(require(\"./icons/sound_icon.svg\")) + \");\\n}\\n\\n.scratchCategoryId-events .scratchCategoryItemBubble::after {\\n background-image: url(\" + escape(require(\"./icons/events_icon.svg\")) + \");\\n}\\n\\n.scratchCategoryId-control .scratchCategoryItemBubble::after {\\n background-image: url(\" + escape(require(\"./icons/control_icon.svg\")) + \");\\n}\\n\\n.scratchCategoryId-sensing .scratchCategoryItemBubble::after {\\n background-image: url(\" + escape(require(\"./icons/sensing_icon.svg\")) + \");\\n}\\n\\n.scratchCategoryId-operators .scratchCategoryItemBubble::after {\\n background-image: url(\" + escape(require(\"./icons/operators_icon.svg\")) + \");\\n}\\n\\n.scratchCategoryId-variables .scratchCategoryItemBubble::after {\\n background-image: url(\" + escape(require(\"./icons/variables_icon.svg\")) + \");\\n}\\n\\n.scratchCategoryId-lists .scratchCategoryItemBubble::after {\\n background-image: url(\" + escape(require(\"./icons/list_icon.svg\")) + \");\\n}\\n\\n.scratchCategoryId-myBlocks .scratchCategoryItemBubble::after {\\n background-image: url(\" + escape(require(\"./icons/block_icon.svg\")) + \");\\n}\\n\", \"\"]);\n\n// exports\n","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJtMzEuNDIgOS4wOS0xMy02YTEgMSAwIDAgMC0uODQgMGwtMTMgNkExIDEgMCAwIDAgNCAxMHYxN2ExIDEgMCAwIDAgLjU4LjkxbDEzIDZhMSAxIDAgMCAwIC44NCAwbDEzLTZBMSAxIDAgMCAwIDMyIDI3VjEwYTEgMSAwIDAgMC0uNTgtLjkxek0xOCA1LjEgMjguNjEgMTAgMTggMTQuOSA3LjM5IDEwek02IDExLjU2bDExIDUuMDh2MTQuOEw2IDI2LjM2em0xMyAxOS44OHYtMTQuOGwxMS01LjA4djE0Ljh6IiBjbGFzcz0iY2xyLWktb3V0bGluZSBjbHItaS1vdXRsaW5lLXBhdGgtMSIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGw9InJnYmEoMCwgMCwgMCwgMCkiIGQ9Ik0wIDBoMzZ2MzZIMHoiLz48L3N2Zz4=\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJNMTMgM0g3YTcgNyAwIDEgMCAwIDE0aDZhNyA3IDAgMSAwIDAtMTR6bTAgMTJhNSA1IDAgMSAxIC4wMDEtMTAuMDAxQTUgNSAwIDAgMSAxMyAxNXoiIGZpbGw9IiNmZmYiLz48cGF0aCBmaWxsPSJyZ2JhKDAsIDAsIDAsIDApIiBkPSJNMCAwaDIwdjIwSDB6Ii8+PC9zdmc+\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGJhc2VQcm9maWxlPSJ0aW55IiBoZWlnaHQ9IjEzNyIgdmVyc2lvbj0iMS4yIiB3aWR0aD0iMTIxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTEwNi4zNTEgMTkuNjIyYTcuMTgzIDcuMTgzIDAgMCAwLTcuODMgMS41NThjLTkuMDggOS4wNzMtMjMuODU1IDkuMDgtMzIuOTQyIDAtMTQuNjktMTQuNjc1LTM4LjU3NS0xNC42NzUtNTMuMjU4IDBhNy4xNjQgNy4xNjQgMCAwIDAtMi4xMDUgNS4wOHY5My4zODNjMCAzLjk2NSAzLjIxMSA3LjE4MyA3LjE4NCA3LjE4M3M3LjE4My0zLjIxOCA3LjE4My03LjE4M1Y4Ni45MzdjOS4xMy03LjE2MiAyMi40Mi02LjU0NCAzMC44MzggMS44NjggMTQuNjkgMTQuNjc1IDM4LjU4MiAxNC42NzUgNTMuMjU4IDBhNy4xNzcgNy4xNzcgMCAwIDAgMi4xMDUtNS4wNzlWMjYuMjZhNy4xODggNy4xODggMCAwIDAtNC40MzMtNi42Mzd6IiBmaWxsPSIjZmZmIiBjbGFzcz0iY3VycmVudExheWVyIi8+PC9zdmc+\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiBzdHlsZT0iLW1zLXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZykiPjxwYXRoIGQ9Im04MC4xODIgNjcuNDU3LTM1LjQtLjAwMXYuMDAxbC0uMDA5LS4wMDFhMi4yNyAyLjI3IDAgMCAwLTIuMjY5IDIuMjY5YzAgLjA0Mi4wMS4wOC4wMTIuMTIxVjgwLjE4aC4wMTFhMi4yNjggMi4yNjggMCAwIDAgMi4yNTQgMi4yNjh2LjAwMWgzNS40di0uMDAyYTIuMjY4IDIuMjY4IDAgMCAwIDIuMjU0LTIuMjY4VjY5LjgyNWMuMDAyLS4wMzQuMDEtLjA2Ny4wMS0uMTAxYTIuMjY3IDIuMjY3IDAgMCAwLTIuMjYzLTIuMjY3em0tNDkuOTA0LS4wMDNIMTkuODIyYTIuMjcgMi4yNyAwIDAgMC0yLjI2OSAyLjI2OXYxMC40NTRhMi4yNjkgMi4yNjkgMCAwIDAgMi4yNjggMi4yNjloMTAuNDU1YTIuMjcgMi4yNyAwIDAgMCAyLjI2OS0yLjI2OVY2OS43MjNhMi4yNjcgMi4yNjcgMCAwIDAtMi4yNjctMi4yNjl6bTQ5LjkwNC0yNC45ODctMzUuNC0uMDAxdi4wMDFsLS4wMDktLjAwMWEyLjI3IDIuMjcgMCAwIDAtMi4yNjkgMi4yNjljMCAuMDQyLjAxLjA4LjAxMi4xMjFWNTUuMTloLjAxMWEyLjI2OCAyLjI2OCAwIDAgMCAyLjI1NCAyLjI2OHYuMDAxaDM1LjR2LS4wMDJhMi4yNjggMi4yNjggMCAwIDAgMi4yNTQtMi4yNjhWNDQuODM1Yy4wMDItLjAzNC4wMS0uMDY3LjAxLS4xMDFhMi4yNjcgMi4yNjcgMCAwIDAtMi4yNjMtMi4yNjd6bS00OS45MDQtLjAwM0gxOS44MjJhMi4yNyAyLjI3IDAgMCAwLTIuMjY5IDIuMjY5djEwLjQ1NGEyLjI2OSAyLjI2OSAwIDAgMCAyLjI2OCAyLjI2OWgxMC40NTVhMi4yNyAyLjI3IDAgMCAwIDIuMjY5LTIuMjY5VjQ0LjczM2EyLjI2NyAyLjI2NyAwIDAgMC0yLjI2Ny0yLjI2OXptMTIuMjM4LTEyLjE4OGguMDExYTIuMjY4IDIuMjY4IDAgMCAwIDIuMjU0IDIuMjY4di4wMDFoMzUuNHYtLjAwMmEyLjI2OCAyLjI2OCAwIDAgMCAyLjI1NC0yLjI2OFYxOS45MjFjLjAwMi0uMDM0LjAxLS4wNjcuMDEtLjEwMWEyLjI2OSAyLjI2OSAwIDAgMC0yLjI2NC0yLjI2OHYtLjAwMWgtMzUuNHYuMDAxbC0uMDA5LS4wMDFhMi4yNyAyLjI3IDAgMCAwLTIuMjY5IDIuMjY5YzAgLjA0Mi4wMS4wOC4wMTIuMTIxdjEwLjMzNXpNMzAuMjc4IDE3LjU1MUgxOS44MjJhMi4yNyAyLjI3IDAgMCAwLTIuMjY5IDIuMjY5djEwLjQ1NGEyLjI2OSAyLjI2OSAwIDAgMCAyLjI2OCAyLjI2OWgxMC40NTVhMi4yNyAyLjI3IDAgMCAwIDIuMjY5LTIuMjY5VjE5LjgyYTIuMjY2IDIuMjY2IDAgMCAwLTIuMjY3LTIuMjY5eiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGw9InJnYmEoMCwgMCwgMCwgMCkiIGQ9Ik0wIDBoMTAwdjEwMEgweiIvPjwvc3ZnPg==\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiIHN0eWxlPSItbXMtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKSI+PHBhdGggZD0iTTM5NiA1MTJhMTEyIDExMiAwIDEgMCAyMjQgMCAxMTIgMTEyIDAgMSAwLTIyNCAwem01NDYuMi0yNS44Qzg0Ny40IDI4Ni41IDcwNC4xIDE4NiA1MTIgMTg2Yy0xOTIuMiAwLTMzNS40IDEwMC41LTQzMC4yIDMwMC4zYTYwLjMgNjAuMyAwIDAgMCAwIDUxLjVDMTc2LjYgNzM3LjUgMzE5LjkgODM4IDUxMiA4MzhjMTkyLjIgMCAzMzUuNC0xMDAuNSA0MzAuMi0zMDAuMyA3LjctMTYuMiA3LjctMzUgMC01MS41ek01MDggNjg4Yy05Ny4yIDAtMTc2LTc4LjgtMTc2LTE3NnM3OC44LTE3NiAxNzYtMTc2IDE3NiA3OC44IDE3NiAxNzYtNzguOCAxNzYtMTc2IDE3NnoiIGZpbGw9IiNmZmYiLz48cGF0aCBmaWxsPSJyZ2JhKDAsIDAsIDAsIDApIiBkPSJNMCAwaDEwMjR2MTAyNEgweiIvPjwvc3ZnPg==\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJtMi44OCA3Ljg4IDEuNTQgMS41NEM0LjE1IDEwLjIzIDQgMTEuMSA0IDEyYzAgNC40MSAzLjU5IDggOCA4czgtMy41OSA4LTgtMy41OS04LTgtOGMtLjkgMC0xLjc3LjE1LTIuNTguNDJMNy44OSAyLjg5QzkuMTUgMi4zMiAxMC41NCAyIDEyIDJjNS41MiAwIDEwIDQuNDggMTAgMTBzLTQuNDggMTAtMTAgMTBTMiAxNy41MiAyIDEyYzAtMS40Ny4zMi0yLjg2Ljg4LTQuMTJ6TTcgNS41QzcgNi4zMyA2LjMzIDcgNS41IDdTNCA2LjMzIDQgNS41IDQuNjcgNCA1LjUgNCA3IDQuNjcgNyA1LjV6IiBmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0icmdiYSgwLCAwLCAwLCAwKSIgZD0iTTAgMGgyNHYyNEgweiIvPjwvc3ZnPg==\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJNMTUuNiA1LjI5Yy0xLjEtLjEtMi4wNy43MS0yLjE3IDEuODJMMTMuMTggMTBIMTZ2MmgtM2wtLjQ0IDUuMDdhMy45ODYgMy45ODYgMCAwIDEtNC4zMyAzLjYzIDQuMDA3IDQuMDA3IDAgMCAxLTMuMDYtMS44N2wxLjUtMS41Yy4yNC43NC45IDEuMzEgMS43MyAxLjM4IDEuMS4xIDIuMDctLjcxIDIuMTctMS44MkwxMSAxMkg4di0yaDMuMTdsLjI3LTMuMDdjLjE5LTIuMiAyLjEzLTMuODMgNC4zMy0zLjYzIDEuMzEuMTEgMi40MS44NCAzLjA2IDEuODdsLTEuNSAxLjVjLS4yNC0uNzQtLjktMS4zMS0xLjczLTEuMzh6IiBmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0icmdiYSgwLCAwLCAwLCAwKSIgZD0iTTAgMGgyNHYyNEgweiIvPjwvc3ZnPg==\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJNOSAxMS4yNFY3LjVhMi41IDIuNSAwIDAgMSA1IDB2My43NGMxLjIxLS44MSAyLTIuMTggMi0zLjc0QzE2IDUuMDEgMTMuOTkgMyAxMS41IDNTNyA1LjAxIDcgNy41YzAgMS41Ni43OSAyLjkzIDIgMy43NHptOS44NCA0LjYzLTQuNTQtMi4yNmMtLjE3LS4wNy0uMzUtLjExLS41NC0uMTFIMTN2LTZjMC0uODMtLjY3LTEuNS0xLjUtMS41UzEwIDYuNjcgMTAgNy41djEwLjc0Yy0zLjYtLjc2LTMuNTQtLjc1LTMuNjctLjc1LS4zMSAwLS41OS4xMy0uNzkuMzNsLS43OS44IDQuOTQgNC45NGMuMjcuMjcuNjUuNDQgMS4wNi40NGg2Ljc5Yy43NSAwIDEuMzMtLjU1IDEuNDQtMS4yOGwuNzUtNS4yN2MuMDEtLjA3LjAyLS4xNC4wMi0uMiAwLS42Mi0uMzgtMS4xNi0uOTEtMS4zOHoiIGZpbGw9IiNmZmYiLz48cGF0aCBmaWxsPSJyZ2JhKDAsIDAsIDAsIDApIiBkPSJNMCAwaDI0djI0SDB6Ii8+PC9zdmc+\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBkPSJNMTQuNzA0IDMuNDQyYy4xOTEuMjI2LjI5Ni41MTIuMjk2LjgwOHYxNS41MDJhMS4yNSAxLjI1IDAgMCAxLTIuMDU4Ljk1NEw3Ljk3NSAxNi41SDQuMjVBMi4yNSAyLjI1IDAgMCAxIDIgMTQuMjV2LTQuNUEyLjI1IDIuMjUgMCAwIDEgNC4yNSA3LjVoMy43MjVsNC45NjgtNC4yMDRhMS4yNSAxLjI1IDAgMCAxIDEuNzYxLjE0N3ptMi40IDUuMTk4YS43NS43NSAwIDAgMSAxLjAzLjI1Yy41NzQuOTQuODYyIDEuOTkyLjg2MiAzLjE0IDAgMS4xNDktLjI4OCAyLjIwMS0uODYyIDMuMTQxYS43NS43NSAwIDEgMS0xLjI4LS43ODFjLjQyOC0uNzAyLjY0Mi0xLjQ4My42NDItMi4zNiAwLS44NzYtLjIxNC0xLjY1Ny0uNjQyLTIuMzU5YS43NS43NSAwIDAgMSAuMjUtMS4wM3oiIGZpbGw9IiNmZmYiLz48cGF0aCBmaWxsPSJyZ2JhKDAsIDAsIDAsIDApIiBkPSJNMCAwaDI0djI0SDB6Ii8+PC9zdmc+\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTQuNjQ5IDMuMDg0QTEgMSAwIDAgMSA1LjE2MyA0LjQgMTMuOTUgMTMuOTUgMCAwIDAgNCAxMGMwIDEuOTkzLjQxNiAzLjg4NiAxLjE2NCA1LjZhMSAxIDAgMCAxLTEuODMyLjhBMTUuOTUgMTUuOTUgMCAwIDEgMiAxMGMwLTIuMjc0LjQ3NS00LjQ0IDEuMzMyLTYuNGExIDEgMCAwIDEgMS4zMTctLjUxNnpNMTIuOTYgN2EzIDMgMCAwIDAtMi4zNDIgMS4xMjZsLS4zMjguNDEtLjExMS0uMjc5QTIgMiAwIDAgMCA4LjMyMyA3SDhhMSAxIDAgMCAwIDAgMmguMzIzbC41MzIgMS4zMy0xLjAzNSAxLjI5NWExIDEgMCAwIDEtLjc4MS4zNzVIN2ExIDEgMCAxIDAgMCAyaC4wMzlhMyAzIDAgMCAwIDIuMzQyLTEuMTI2bC4zMjgtLjQxLjExMS4yNzlBMiAyIDAgMCAwIDExLjY3NyAxNEgxMmExIDEgMCAxIDAgMC0yaC0uMzIzbC0uNTMyLTEuMzMgMS4wMzUtMS4yOTVBMSAxIDAgMCAxIDEyLjk2MSA5SDEzYTEgMSAwIDEgMCAwLTJoLS4wMzl6bTEuODc0LTIuNmExIDEgMCAwIDEgMS44MzMtLjhBMTUuOTUgMTUuOTUgMCAwIDEgMTggMTBjMCAyLjI3NC0uNDc1IDQuNDQtMS4zMzIgNi40YTEgMSAwIDEgMS0xLjgzMi0uOEExMy45NDkgMTMuOTQ5IDAgMCAwIDE2IDEwYzAtMS45OTMtLjQxNi0zLjg4Ni0xLjE2NS01LjZ6IiBmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0icmdiYSgwLCAwLCAwLCAwKSIgZD0iTTAgMGgyMHYyMEgweiIvPjwvc3ZnPg==\"","/* generated by pull.js */\nimport _css from \"!css-loader!./userstyle.css\";\nimport _asset from \"!url-loader!./icons/block_icon.svg\";\nimport _asset2 from \"!url-loader!./icons/control_icon.svg\";\nimport _asset3 from \"!url-loader!./icons/events_icon.svg\";\nimport _asset4 from \"!url-loader!./icons/list_icon.svg\";\nimport _asset5 from \"!url-loader!./icons/looks_icon.svg\";\nimport _asset6 from \"!url-loader!./icons/motion_icon.svg\";\nimport _asset7 from \"!url-loader!./icons/operators_icon.svg\";\nimport _asset8 from \"!url-loader!./icons/sensing_icon.svg\";\nimport _asset9 from \"!url-loader!./icons/sound_icon.svg\";\nimport _asset10 from \"!url-loader!./icons/variables_icon.svg\";\nexport const resources = {\n \"userstyle.css\": _css,\n \"icons/block_icon.svg\": _asset,\n \"icons/control_icon.svg\": _asset2,\n \"icons/events_icon.svg\": _asset3,\n \"icons/list_icon.svg\": _asset4,\n \"icons/looks_icon.svg\": _asset5,\n \"icons/motion_icon.svg\": _asset6,\n \"icons/operators_icon.svg\": _asset7,\n \"icons/sensing_icon.svg\": _asset8,\n \"icons/sound_icon.svg\": _asset9,\n \"icons/variables_icon.svg\": _asset10,\n};\n","module.exports = __webpack_public_path__ + \"static/assets/318e019bdee5ed02903aa5f22a9903f2.svg\";","module.exports = __webpack_public_path__ + \"static/assets/e1249124e702a974df36355af6aa2385.svg\";","module.exports = __webpack_public_path__ + \"static/assets/9d7acb2e5784a9a1d52e564af3d8469b.svg\";","module.exports = __webpack_public_path__ + \"static/assets/bd6d382729ecbd23c5181cf2b327072f.svg\";","module.exports = __webpack_public_path__ + \"static/assets/e008ee0cb1202de1137823150da1644a.svg\";","module.exports = __webpack_public_path__ + \"static/assets/c088896fb05dc466b45ecaa1d5c4d007.svg\";","module.exports = __webpack_public_path__ + \"static/assets/ab2c140af0ffba6b515eebc2156742e2.svg\";","module.exports = __webpack_public_path__ + \"static/assets/7601fa61034e5d7d542538e1e4338a4e.svg\";","module.exports = __webpack_public_path__ + \"static/assets/7b98085c05bdcd97dd0c6d4b34317793.svg\";","module.exports = __webpack_public_path__ + \"static/assets/4bfaa15915bc5fb88b40b3e1a537c3ea.svg\";"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACRA;AAAA;;;;;;;;;;;;ACAA;AAAA;;;;;;;;;;;;ACAA;AAAA;;;;;;;;;;;;ACAA;AAAA;;;;;;;;;;;;ACAA;AAAA;;;;;;;;;;;;ACAA;AAAA;;;;;;;;;;;;ACAA;AAAA;;;;;;;;;;;;ACAA;AAAA;;;;;;;;;;;;ACAA;AAAA;;;;;;;;;;;;ACAA;AAAA;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxBA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;A","sourceRoot":""}
js/addon-entry-blocks2image.js ADDED
@@ -0,0 +1,238 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-blocks2image"],{
2
+
3
+ /***/ "./src/addons/addons/blocks2image/_runtime_entry.js":
4
+ /*!**********************************************************!*\
5
+ !*** ./src/addons/addons/blocks2image/_runtime_entry.js ***!
6
+ \**********************************************************/
7
+ /*! exports provided: resources */
8
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9
+
10
+ "use strict";
11
+ __webpack_require__.r(__webpack_exports__);
12
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
13
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/blocks2image/userscript.js");
14
+ /* generated by pull.js */
15
+
16
+ const resources = {
17
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"]
18
+ };
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/blocks2image/userscript.js":
23
+ /*!******************************************************!*\
24
+ !*** ./src/addons/addons/blocks2image/userscript.js ***!
25
+ \******************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
32
+ let {
33
+ addon,
34
+ console,
35
+ msg
36
+ } = _ref;
37
+ function makeStyle() {
38
+ let style = document.createElement("style");
39
+ style.textContent = "\n .blocklyText {\n fill: #fff;\n font-family: \"Helvetica Neue\", Helvetica, sans-serif;\n font-size: 12pt;\n font-weight: 500;\n }\n .blocklyNonEditableText>text, .blocklyEditableText>text {\n fill: #575E75;\n }\n .blocklyDropdownText {\n fill: #fff !important;\n }\n ";
40
+ for (let userstyle of document.querySelectorAll(".scratch-addons-style[data-addons*='editor-theme3']")) {
41
+ if (userstyle.disabled) continue;
42
+ style.textContent += userstyle.textContent;
43
+ }
44
+ return style;
45
+ }
46
+ function setCSSVars(element) {
47
+ for (let property of document.documentElement.style) {
48
+ if (property.startsWith("--editorTheme3-")) element.style.setProperty(property, document.documentElement.style.getPropertyValue(property));
49
+ }
50
+ }
51
+ let exSVG = document.createElementNS("http://www.w3.org/2000/svg", "svg");
52
+ exSVG.setAttribute("xmlns:html", "http://www.w3.org/1999/xhtml");
53
+ exSVG.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
54
+ exSVG.setAttribute("version", "1.1");
55
+
56
+ // blocks-media as base64 for svg inline image
57
+ let blocksMedia = new Map();
58
+ blocksMedia.set("repeat.svg", "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InJlcGVhdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNDRjhCMTc7fQoJLnN0MXtmaWxsOiNGRkZGRkY7fQo8L3N0eWxlPgo8dGl0bGU+cmVwZWF0PC90aXRsZT4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTIzLjMsMTFjLTAuMywwLjYtMC45LDEtMS41LDFoLTEuNmMtMC4xLDEuMy0wLjUsMi41LTEuMSwzLjZjLTAuOSwxLjctMi4zLDMuMi00LjEsNC4xCgljLTEuNywwLjktMy42LDEuMi01LjUsMC45Yy0xLjgtMC4zLTMuNS0xLjEtNC45LTIuM2MtMC43LTAuNy0wLjctMS45LDAtMi42YzAuNi0wLjYsMS42LTAuNywyLjMtMC4ySDdjMC45LDAuNiwxLjksMC45LDIuOSwwLjkKCXMxLjktMC4zLDIuNy0wLjljMS4xLTAuOCwxLjgtMi4xLDEuOC0zLjVoLTEuNWMtMC45LDAtMS43LTAuNy0xLjctMS43YzAtMC40LDAuMi0wLjksMC41LTEuMmw0LjQtNC40YzAuNy0wLjYsMS43LTAuNiwyLjQsMEwyMyw5LjIKCUMyMy41LDkuNywyMy42LDEwLjQsMjMuMywxMXoiLz4KPHBhdGggY2xhc3M9InN0MSIgZD0iTTIxLjgsMTFoLTIuNmMwLDEuNS0wLjMsMi45LTEsNC4yYy0wLjgsMS42LTIuMSwyLjgtMy43LDMuNmMtMS41LDAuOC0zLjMsMS4xLTQuOSwwLjhjLTEuNi0wLjItMy4yLTEtNC40LTIuMQoJYy0wLjQtMC4zLTAuNC0wLjktMC4xLTEuMmMwLjMtMC40LDAuOS0wLjQsMS4yLTAuMWwwLDBjMSwwLjcsMi4yLDEuMSwzLjQsMS4xczIuMy0wLjMsMy4zLTFjMC45LTAuNiwxLjYtMS41LDItMi42CgljMC4zLTAuOSwwLjQtMS44LDAuMi0yLjhoLTIuNGMtMC40LDAtMC43LTAuMy0wLjctMC43YzAtMC4yLDAuMS0wLjMsMC4yLTAuNGw0LjQtNC40YzAuMy0wLjMsMC43LTAuMywwLjksMEwyMiw5LjgKCWMwLjMsMC4zLDAuNCwwLjYsMC4zLDAuOVMyMiwxMSwyMS44LDExeiIvPgo8L3N2Zz4K");
59
+ blocksMedia.set("green-flag.svg", "data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwLDAsNjkuNDM1MTQsODEuODUzNjEiIGhlaWdodD0iODEuODUzNjEiIHdpZHRoPSI2OS40MzUxNCIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImNvbG9yLTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMTkxLjg0MTM3IiB4Mj0iMjQwLjA3NDA0IiB5MT0iMTQxLjE1MDkyIiB4MT0iMjQwLjA3NDA0Ij48c3RvcCBzdG9wLWNvbG9yPSIjMDBhNWZmIiBvZmZzZXQ9IjAiPjwvc3RvcD48c3RvcCBzdG9wLWNvbG9yPSIjMDA2NWZmIiBvZmZzZXQ9IjEiPjwvc3RvcD48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA0Ljc4MjQzLC0xMzkuNDk1NDcpIj48ZyBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBzdHJva2U9IiMwMDMxNmIiIGZpbGwtcnVsZT0ibm9uemVybyIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9Ij48cGF0aCBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLXdpZHRoPSIzIiBmaWxsPSJ1cmwoI2NvbG9yLTEpIiBkPSJNMjA3LjQzMDUyLDE4Ny4yNjY0MnYtNDIuNDU1NTRjMCwwIDcuNDUwMDgsLTMuNjU5OTYgMTUuODExNzEsLTMuNjU5OTZjOC45ODk3MywwIDI1LjQ3NjM1LDguMjM0OTEgMzMuODMzNjYsOC4yMzQ5MWM4LjI5MjM0LDAgMTUuNjQxNjksLTQuNTc0OTUgMTUuNjQxNjksLTQuNTc0OTV2NDIuNDU1NTRjMCwwIC03LjM3NzI1LDQuNTc0OTUgLTE1LjY0MTY5LDQuNTc0OTVjLTcuNTEwNzcsMCAtMjQuNTc4NzMsLTguMjM0OTEgLTMyLjk4MzU3LC04LjIzNDkxYy04LjczMDY1LDAgLTE2LjY2MTgsMy42NTk5NiAtMTYuNjYxOCwzLjY1OTk2eiI+PC9wYXRoPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBmaWxsPSJub25lIiBkPSJNMjA3LjI4MjQ0LDIxOC44NDkwOHYtNzYuODUzNjEiPjwvcGF0aD48L2c+PC9nPjwvc3ZnPjwhLS1yb3RhdGlvbkNlbnRlcjozNS4yMTc1NjUwMDAwMDAwMTo0MC41MDQ1Mjk5OTk5OTk5OS0tPg==");
60
+ blocksMedia.set("blue-flag.svg", "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ImdyZWVuZmxhZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiM0NTk5M0Q7fQoJLnN0MXtmaWxsOiM0Q0JGNTY7fQo8L3N0eWxlPgo8dGl0bGU+Z3JlZW5mbGFnPC90aXRsZT4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTIwLjgsMy43Yy0wLjQtMC4yLTAuOS0wLjEtMS4yLDAuMmMtMiwxLjYtNC44LDEuNi02LjgsMGMtMi4zLTEuOS01LjYtMi4zLTguMy0xVjIuNWMwLTAuNi0wLjUtMS0xLTEKCXMtMSwwLjQtMSwxdjE4LjhjMCwwLjUsMC41LDEsMSwxaDAuMWMwLjUsMCwxLTAuNSwxLTF2LTYuNGMxLTAuNywyLjEtMS4yLDMuNC0xLjNjMS4yLDAsMi40LDAuNCwzLjQsMS4yYzIuOSwyLjMsNywyLjMsOS44LDAKCWMwLjMtMC4yLDAuNC0wLjUsMC40LTAuOVY0LjdDMjEuNiw0LjIsMjEuMywzLjgsMjAuOCwzLjd6IE0yMC41LDEzLjlDMjAuNSwxMy45LDIwLjUsMTMuOSwyMC41LDEzLjlDMTgsMTYsMTQuNCwxNiwxMS45LDE0CgljLTEuMS0wLjktMi41LTEuNC00LTEuNGMtMS4yLDAuMS0yLjMsMC41LTMuNCwxLjFWNEM3LDIuNiwxMCwyLjksMTIuMiw0LjZjMi40LDEuOSw1LjcsMS45LDguMSwwYzAuMSwwLDAuMSwwLDAuMiwwCgljMCwwLDAuMSwwLjEsMC4xLDAuMUwyMC41LDEzLjl6Ii8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0yMC42LDQuOGwtMC4xLDkuMWMwLDAsMCwwLjEsMCwwLjFjLTIuNSwyLTYuMSwyLTguNiwwYy0xLjEtMC45LTIuNS0xLjQtNC0xLjRjLTEuMiwwLjEtMi4zLDAuNS0zLjQsMS4xVjQKCUM3LDIuNiwxMCwyLjksMTIuMiw0LjZjMi40LDEuOSw1LjcsMS45LDguMSwwYzAuMSwwLDAuMSwwLDAuMiwwQzIwLjUsNC43LDIwLjYsNC43LDIwLjYsNC44eiIvPgo8L3N2Zz4K");
61
+ blocksMedia.set("control_stop.svg", "data:image/svg+xml;base64,PHN2ZyBpZD0iSWNvbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDAgNDAiPjx0aXRsZT5jb250cm9sX3N0b3A8L3RpdGxlPjxwb2x5Z29uIHBvaW50cz0iMjUuNjEgNi41IDMzLjU2IDE0LjQ0IDMzLjU2IDI1LjY4IDI1LjYxIDMzLjYyIDE0LjM4IDMzLjYyIDYuNDMgMjUuNjggNi40MyAxNC40NCAxNC4zOCA2LjUgMjUuNjEgNi41IiBmaWxsPSIjZWM1ODU4IiBzdHJva2U9IiNiNjQ2NDYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==");
62
+ blocksMedia.set("rotate-left.svg", "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIGlkPSJyb3RhdGUtY2xvY2t3aXNlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHN0eWxlPi5jbHMtMXtmaWxsOiMzZDc5Y2M7fS5jbHMtMntmaWxsOiNmZmY7fTwvc3R5bGU+PHRpdGxlPnJvdGF0ZS1jbG9ja3dpc2U8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIwLjM0LDE4LjIxYTEwLjI0LDEwLjI0LDAsMCwxLTguMSw0LjIyLDIuMjYsMi4yNiwwLDAsMS0uMTYtNC41MmgwYTUuNTgsNS41OCwwLDAsMCw0LjI1LTIuNTMsNS4wNiw1LjA2LDAsMCwwLC41NC00LjYyQTQuMjUsNC4yNSwwLDAsMCwxNS41NSw5YTQuMzEsNC4zMSwwLDAsMC0yLS44QTQuODIsNC44MiwwLDAsMCwxMC40LDlsMS4xMiwxLjQxQTEuNTksMS41OSwwLDAsMSwxMC4zNiwxM0gyLjY3YTEuNTYsMS41NiwwLDAsMS0xLjI2LS42M0ExLjU0LDEuNTQsMCwwLDEsMS4xMywxMUwyLjg1LDMuNTdBMS41OSwxLjU5LDAsMCwxLDQuMzgsMi40LDEuNTcsMS41NywwLDAsMSw1LjYyLDNMNi43LDQuMzVhMTAuNjYsMTAuNjYsMCwwLDEsNy43Mi0xLjY4QTkuODgsOS44OCwwLDAsMSwxOSw0LjgxLDkuNjEsOS42MSwwLDAsMSwyMS44Myw5LDEwLjA4LDEwLjA4LDAsMCwxLDIwLjM0LDE4LjIxWiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTE5LjU2LDE3LjY1YTkuMjksOS4yOSwwLDAsMS03LjM1LDMuODMsMS4zMSwxLjMxLDAsMCwxLS4wOC0yLjYyLDYuNTMsNi41MywwLDAsMCw1LTIuOTIsNi4wNSw2LjA1LDAsMCwwLC42Ny01LjUxLDUuMzIsNS4zMiwwLDAsMC0xLjY0LTIuMTYsNS4yMSw1LjIxLDAsMCwwLTIuNDgtMUE1Ljg2LDUuODYsMCwwLDAsOSw4Ljg0TDEwLjc0LDExYS41OS41OSwwLDAsMS0uNDMsMUgyLjdhLjYuNiwwLDAsMS0uNi0uNzVMMy44MSwzLjgzYS41OS41OSwwLDAsMSwxLS4yMWwxLjY3LDIuMWE5LjcxLDkuNzEsMCwwLDEsNy43NS0yLjA3LDguODQsOC44NCwwLDAsMSw0LjEyLDEuOTIsOC42OCw4LjY4LDAsMCwxLDIuNTQsMy43MkE5LjE0LDkuMTQsMCwwLDEsMTkuNTYsMTcuNjVaIi8+PC9zdmc+");
63
+ blocksMedia.set("rotate-right.svg", "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIGlkPSJyb3RhdGUtY291bnRlci1jbG9ja3dpc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6IzNkNzljYzt9LmNscy0ye2ZpbGw6I2ZmZjt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPnJvdGF0ZS1jb3VudGVyLWNsb2Nrd2lzZTwvdGl0bGU+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjgsMTIuMmExLjYsMS42LDAsMCwxLTEuMjcuNjNIMTMuNzJhMS41OSwxLjU5LDAsMCwxLTEuMTYtMi41OGwxLjEyLTEuNDFhNC44Miw0LjgyLDAsMCwwLTMuMTQtLjc3LDQuMzEsNC4zMSwwLDAsMC0yLC44LDQuMjUsNC4yNSwwLDAsMC0xLjM0LDEuNzMsNS4wNiw1LjA2LDAsMCwwLC41NCw0LjYyQTUuNTgsNS41OCwwLDAsMCwxMiwxNy43NGgwYTIuMjYsMi4yNiwwLDAsMS0uMTYsNC41MkExMC4yNSwxMC4yNSwwLDAsMSwzLjc0LDE4LDEwLjE0LDEwLjE0LDAsMCwxLDIuMjUsOC43OCw5LjcsOS43LDAsMCwxLDUuMDgsNC42NCw5LjkyLDkuOTIsMCwwLDEsOS42NiwyLjVhMTAuNjYsMTAuNjYsMCwwLDEsNy43MiwxLjY4bDEuMDgtMS4zNWExLjU3LDEuNTcsMCwwLDEsMS4yNC0uNiwxLjYsMS42LDAsMCwxLDEuNTQsMS4yMWwxLjcsNy4zN0ExLjU3LDEuNTcsMCwwLDEsMjIuNjgsMTIuMloiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS4zOCwxMS44M0gxMy43N2EuNTkuNTksMCwwLDEtLjQzLTFsMS43NS0yLjE5YTUuOSw1LjksMCwwLDAtNC43LTEuNTgsNS4wNyw1LjA3LDAsMCwwLTQuMTEsMy4xN0E2LDYsMCwwLDAsNywxNS43N2E2LjUxLDYuNTEsMCwwLDAsNSwyLjkyLDEuMzEsMS4zMSwwLDAsMS0uMDgsMi42Miw5LjMsOS4zLDAsMCwxLTcuMzUtMy44MkE5LjE2LDkuMTYsMCwwLDEsMy4xNyw5LjEyLDguNTEsOC41MSwwLDAsMSw1LjcxLDUuNCw4Ljc2LDguNzYsMCwwLDEsOS44MiwzLjQ4YTkuNzEsOS43MSwwLDAsMSw3Ljc1LDIuMDdsMS42Ny0yLjFhLjU5LjU5LDAsMCwxLDEsLjIxTDIyLDExLjA4QS41OS41OSwwLDAsMSwyMS4zOCwxMS44M1oiLz48L3N2Zz4=");
64
+ blocksMedia.set("dropdown-arrow.svg", "data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMi43MSIgaGVpZ2h0PSI4Ljc5IiB2aWV3Qm94PSIwIDAgMTIuNzEgOC43OSI+PHRpdGxlPmRyb3Bkb3duLWFycm93PC90aXRsZT48ZyBvcGFjaXR5PSIwLjEiPjxwYXRoIGQ9Ik0xMi43MSwyLjQ0QTIuNDEsMi40MSwwLDAsMSwxMiw0LjE2TDguMDgsOC4wOGEyLjQ1LDIuNDUsMCwwLDEtMy40NSwwTDAuNzIsNC4xNkEyLjQyLDIuNDIsMCwwLDEsMCwyLjQ0LDIuNDgsMi40OCwwLDAsMSwuNzEuNzFDMSwwLjQ3LDEuNDMsMCw2LjM2LDBTMTEuNzUsMC40NiwxMiwuNzFBMi40NCwyLjQ0LDAsMCwxLDEyLjcxLDIuNDRaIiBmaWxsPSIjMjMxZjIwIi8+PC9nPjxwYXRoIGQ9Ik02LjM2LDcuNzlhMS40MywxLjQzLDAsMCwxLTEtLjQyTDEuNDIsMy40NWExLjQ0LDEuNDQsMCwwLDEsMC0yYzAuNTYtLjU2LDkuMzEtMC41Niw5Ljg3LDBhMS40NCwxLjQ0LDAsMCwxLDAsMkw3LjM3LDcuMzdBMS40MywxLjQzLDAsMCwxLDYuMzYsNy43OVoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=");
65
+ addon.tab.createBlockContextMenu(items => {
66
+ var _svgchild$childNodes, _svgchild$childNodes2;
67
+ if (addon.self.disabled) return items;
68
+ let svgchild = document.querySelector("svg.blocklySvg g.blocklyBlockCanvas");
69
+ const pasteItemIndex = items.findIndex(obj => obj._isDevtoolsFirstItem);
70
+ const insertBeforeIndex = pasteItemIndex !== -1 ?
71
+ // If "paste" button exists, add own items before it
72
+ pasteItemIndex :
73
+ // If there's no such button, insert at end
74
+ items.length;
75
+ items.splice(insertBeforeIndex, 0, {
76
+ enabled: !!(svgchild !== null && svgchild !== void 0 && (_svgchild$childNodes = svgchild.childNodes) !== null && _svgchild$childNodes !== void 0 && _svgchild$childNodes.length),
77
+ text: msg("export_all_to_SVG"),
78
+ callback: () => {
79
+ exportBlock(false);
80
+ },
81
+ separator: true
82
+ }, {
83
+ enabled: !!(svgchild !== null && svgchild !== void 0 && (_svgchild$childNodes2 = svgchild.childNodes) !== null && _svgchild$childNodes2 !== void 0 && _svgchild$childNodes2.length),
84
+ text: msg("export_all_to_PNG"),
85
+ callback: () => {
86
+ exportBlock(true);
87
+ },
88
+ separator: false
89
+ });
90
+ return items;
91
+ }, {
92
+ workspace: true
93
+ });
94
+ addon.tab.createBlockContextMenu((items, block) => {
95
+ if (addon.self.disabled) return items;
96
+ const makeSpaceItemIndex = items.findIndex(obj => obj._isDevtoolsFirstItem);
97
+ const insertBeforeIndex = makeSpaceItemIndex !== -1 ?
98
+ // If "make space" button exists, add own items before it
99
+ makeSpaceItemIndex :
100
+ // If there's no such button, insert at end
101
+ items.length;
102
+ items.splice(insertBeforeIndex, 0, {
103
+ enabled: true,
104
+ text: msg("export_selected_to_SVG"),
105
+ callback: () => {
106
+ exportBlock(false, block);
107
+ },
108
+ separator: true
109
+ }, {
110
+ enabled: true,
111
+ text: msg("export_selected_to_PNG"),
112
+ callback: () => {
113
+ exportBlock(true, block);
114
+ },
115
+ separator: false
116
+ });
117
+ return items;
118
+ }, {
119
+ blocks: true
120
+ });
121
+ function exportBlock(isExportPNG, block) {
122
+ let svg;
123
+ if (block) {
124
+ svg = selectedBlocks(isExportPNG, block);
125
+ } else {
126
+ svg = allBlocks(isExportPNG);
127
+ }
128
+ // resolve nbsp whitespace
129
+ svg.querySelectorAll("text").forEach(text => {
130
+ text.innerHTML = text.innerHTML.replace(/&nbsp;/g, " ");
131
+ });
132
+ // resolve image path
133
+ let scratchURL = window.location.origin;
134
+ svg.querySelectorAll("image").forEach(item => {
135
+ let builtinSvgData = blocksMedia.get(item.getAttribute("xlink:href").substring(item.getAttribute("xlink:href").lastIndexOf("/") + 1));
136
+ if (builtinSvgData) {
137
+ // replace svg file path (official) to inline svg
138
+ item.setAttribute("xlink:href", builtinSvgData);
139
+ } else if (item.getAttribute("xlink:href").indexOf("/static/") === 0) {
140
+ // replace link path for third party website
141
+ item.setAttribute("xlink:href", scratchURL + item.getAttribute("xlink:href").slice(0));
142
+ } else if (item.getAttribute("xlink:href").indexOf("./static/") === 0) {
143
+ item.setAttribute("xlink:href", scratchURL + item.getAttribute("xlink:href").slice(1));
144
+ } else if (item.getAttribute("xlink:href").indexOf("static/") === 0) {
145
+ item.setAttribute("xlink:href", scratchURL + "/" + item.getAttribute("xlink:href"));
146
+ }
147
+ });
148
+ if (!isExportPNG) {
149
+ exportData(new XMLSerializer().serializeToString(svg));
150
+ } else {
151
+ exportPNG(svg);
152
+ }
153
+ }
154
+ function selectedBlocks(isExportPNG, block) {
155
+ let svg = exSVG.cloneNode();
156
+ let svgchild = block.svgGroup_;
157
+ svgchild = svgchild.cloneNode(true);
158
+ let dataShapes = svgchild.getAttribute("data-shapes");
159
+ svgchild.setAttribute("transform", "translate(0,".concat(dataShapes === "hat" ? "18" : "0", ") ").concat(isExportPNG ? "scale(2)" : ""));
160
+ setCSSVars(svg);
161
+ svg.append(makeStyle());
162
+ svg.append(svgchild);
163
+ return svg;
164
+ }
165
+ function allBlocks(isExportPNG) {
166
+ let svg = exSVG.cloneNode();
167
+ let svgchild = document.querySelector("svg.blocklySvg g.blocklyBlockCanvas");
168
+ svgchild = svgchild.cloneNode(true);
169
+ let xArr = [];
170
+ let yArr = [];
171
+ svgchild.childNodes.forEach(g => {
172
+ let x = g.getAttribute("transform").match(/translate\((.*?),(.*?)\)/)[1] || 0;
173
+ let y = g.getAttribute("transform").match(/translate\((.*?),(.*?)\)/)[2] || 0;
174
+ xArr.push(x * (isExportPNG ? 2 : 1));
175
+ yArr.push(y * (isExportPNG ? 2 : 1));
176
+ g.style.display = ""; // because of TW scratch-blocks changes
177
+ });
178
+ svgchild.setAttribute("transform", "translate(".concat(-Math.min(...xArr), ",").concat(-Math.min(...yArr) + 18 * (isExportPNG ? 2 : 1), ") ").concat(isExportPNG ? "scale(2)" : ""));
179
+ setCSSVars(svg);
180
+ svg.append(makeStyle());
181
+ svg.append(svgchild);
182
+ return svg;
183
+ }
184
+ function exportData(text) {
185
+ const saveLink = document.createElement("a");
186
+ document.body.appendChild(saveLink);
187
+ const data = new Blob([text], {
188
+ type: "text"
189
+ });
190
+ const url = window.URL.createObjectURL(data);
191
+ saveLink.href = url;
192
+
193
+ // File name: project-DATE-TIME
194
+ const date = new Date();
195
+ const timestamp = "".concat(date.toLocaleDateString(), "-").concat(date.toLocaleTimeString());
196
+ saveLink.download = "block_".concat(timestamp, ".svg");
197
+ saveLink.click();
198
+ window.URL.revokeObjectURL(url);
199
+ document.body.removeChild(saveLink);
200
+ }
201
+ function exportPNG(svg) {
202
+ const serializer = new XMLSerializer();
203
+ const iframe = document.createElement("iframe");
204
+ // iframe.style.display = "none"
205
+ document.body.append(iframe);
206
+ iframe.contentDocument.write(serializer.serializeToString(svg));
207
+ let {
208
+ width,
209
+ height
210
+ } = iframe.contentDocument.body.querySelector("svg g").getBoundingClientRect();
211
+ height = height + 20 * 2; // hat block height restore
212
+ svg.setAttribute("width", width + "px");
213
+ svg.setAttribute("height", height + "px");
214
+ let canvas = document.createElement("canvas");
215
+ let ctx = canvas.getContext("2d");
216
+ let img = document.createElement("img");
217
+ img.setAttribute("src", "data:image/svg+xml;base64," + btoa(unescape(encodeURIComponent(serializer.serializeToString(svg)))));
218
+ img.onload = function () {
219
+ canvas.height = img.height;
220
+ canvas.width = img.width;
221
+ ctx.drawImage(img, 0, 0, img.width, img.height);
222
+ // Now is done
223
+ let dataURL = canvas.toDataURL("image/png");
224
+ let link = document.createElement("a");
225
+ const date = new Date();
226
+ const timestamp = "".concat(date.toLocaleDateString(), "-").concat(date.toLocaleTimeString());
227
+ link.download = "block_".concat(timestamp, ".png");
228
+ link.href = dataURL;
229
+ link.click();
230
+ iframe.remove();
231
+ };
232
+ }
233
+ });
234
+
235
+ /***/ })
236
+
237
+ }]);
238
+ //# sourceMappingURL=addon-entry-blocks2image.js.map
js/addon-entry-blocks2image.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-blocks2image.js","sources":["webpack://GUI/./src/addons/addons/blocks2image/_runtime_entry.js","webpack://GUI/./src/addons/addons/blocks2image/userscript.js"],"sourcesContent":["/* generated by pull.js */\nimport _js from \"./userscript.js\";\nexport const resources = {\n \"userscript.js\": _js,\n};\n","export default async function ({ addon, console, msg }) {\n function makeStyle() {\n let style = document.createElement(\"style\");\n style.textContent = `\n .blocklyText {\n fill: #fff;\n font-family: \"Helvetica Neue\", Helvetica, sans-serif;\n font-size: 12pt;\n font-weight: 500;\n }\n .blocklyNonEditableText>text, .blocklyEditableText>text {\n fill: #575E75;\n }\n .blocklyDropdownText {\n fill: #fff !important;\n }\n `;\n for (let userstyle of document.querySelectorAll(\".scratch-addons-style[data-addons*='editor-theme3']\")) {\n if (userstyle.disabled) continue;\n style.textContent += userstyle.textContent;\n }\n return style;\n }\n\n function setCSSVars(element) {\n for (let property of document.documentElement.style) {\n if (property.startsWith(\"--editorTheme3-\"))\n element.style.setProperty(property, document.documentElement.style.getPropertyValue(property));\n }\n }\n\n let exSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n exSVG.setAttribute(\"xmlns:html\", \"http://www.w3.org/1999/xhtml\");\n exSVG.setAttribute(\"xmlns:xlink\", \"http://www.w3.org/1999/xlink\");\n exSVG.setAttribute(\"version\", \"1.1\");\n\n // blocks-media as base64 for svg inline image\n let blocksMedia = new Map();\n blocksMedia.set(\n \"repeat.svg\",\n \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InJlcGVhdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNDRjhCMTc7fQoJLnN0MXtmaWxsOiNGRkZGRkY7fQo8L3N0eWxlPgo8dGl0bGU+cmVwZWF0PC90aXRsZT4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTIzLjMsMTFjLTAuMywwLjYtMC45LDEtMS41LDFoLTEuNmMtMC4xLDEuMy0wLjUsMi41LTEuMSwzLjZjLTAuOSwxLjctMi4zLDMuMi00LjEsNC4xCgljLTEuNywwLjktMy42LDEuMi01LjUsMC45Yy0xLjgtMC4zLTMuNS0xLjEtNC45LTIuM2MtMC43LTAuNy0wLjctMS45LDAtMi42YzAuNi0wLjYsMS42LTAuNywyLjMtMC4ySDdjMC45LDAuNiwxLjksMC45LDIuOSwwLjkKCXMxLjktMC4zLDIuNy0wLjljMS4xLTAuOCwxLjgtMi4xLDEuOC0zLjVoLTEuNWMtMC45LDAtMS43LTAuNy0xLjctMS43YzAtMC40LDAuMi0wLjksMC41LTEuMmw0LjQtNC40YzAuNy0wLjYsMS43LTAuNiwyLjQsMEwyMyw5LjIKCUMyMy41LDkuNywyMy42LDEwLjQsMjMuMywxMXoiLz4KPHBhdGggY2xhc3M9InN0MSIgZD0iTTIxLjgsMTFoLTIuNmMwLDEuNS0wLjMsMi45LTEsNC4yYy0wLjgsMS42LTIuMSwyLjgtMy43LDMuNmMtMS41LDAuOC0zLjMsMS4xLTQuOSwwLjhjLTEuNi0wLjItMy4yLTEtNC40LTIuMQoJYy0wLjQtMC4zLTAuNC0wLjktMC4xLTEuMmMwLjMtMC40LDAuOS0wLjQsMS4yLTAuMWwwLDBjMSwwLjcsMi4yLDEuMSwzLjQsMS4xczIuMy0wLjMsMy4zLTFjMC45LTAuNiwxLjYtMS41LDItMi42CgljMC4zLTAuOSwwLjQtMS44LDAuMi0yLjhoLTIuNGMtMC40LDAtMC43LTAuMy0wLjctMC43YzAtMC4yLDAuMS0wLjMsMC4yLTAuNGw0LjQtNC40YzAuMy0wLjMsMC43LTAuMywwLjksMEwyMiw5LjgKCWMwLjMsMC4zLDAuNCwwLjYsMC4zLDAuOVMyMiwxMSwyMS44LDExeiIvPgo8L3N2Zz4K\"\n );\n blocksMedia.set(\n \"green-flag.svg\",\n \"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwLDAsNjkuNDM1MTQsODEuODUzNjEiIGhlaWdodD0iODEuODUzNjEiIHdpZHRoPSI2OS40MzUxNCIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImNvbG9yLTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMTkxLjg0MTM3IiB4Mj0iMjQwLjA3NDA0IiB5MT0iMTQxLjE1MDkyIiB4MT0iMjQwLjA3NDA0Ij48c3RvcCBzdG9wLWNvbG9yPSIjMDBhNWZmIiBvZmZzZXQ9IjAiPjwvc3RvcD48c3RvcCBzdG9wLWNvbG9yPSIjMDA2NWZmIiBvZmZzZXQ9IjEiPjwvc3RvcD48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA0Ljc4MjQzLC0xMzkuNDk1NDcpIj48ZyBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBzdHJva2U9IiMwMDMxNmIiIGZpbGwtcnVsZT0ibm9uemVybyIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9Ij48cGF0aCBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLXdpZHRoPSIzIiBmaWxsPSJ1cmwoI2NvbG9yLTEpIiBkPSJNMjA3LjQzMDUyLDE4Ny4yNjY0MnYtNDIuNDU1NTRjMCwwIDcuNDUwMDgsLTMuNjU5OTYgMTUuODExNzEsLTMuNjU5OTZjOC45ODk3MywwIDI1LjQ3NjM1LDguMjM0OTEgMzMuODMzNjYsOC4yMzQ5MWM4LjI5MjM0LDAgMTUuNjQxNjksLTQuNTc0OTUgMTUuNjQxNjksLTQuNTc0OTV2NDIuNDU1NTRjMCwwIC03LjM3NzI1LDQuNTc0OTUgLTE1LjY0MTY5LDQuNTc0OTVjLTcuNTEwNzcsMCAtMjQuNTc4NzMsLTguMjM0OTEgLTMyLjk4MzU3LC04LjIzNDkxYy04LjczMDY1LDAgLTE2LjY2MTgsMy42NTk5NiAtMTYuNjYxOCwzLjY1OTk2eiI+PC9wYXRoPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBmaWxsPSJub25lIiBkPSJNMjA3LjI4MjQ0LDIxOC44NDkwOHYtNzYuODUzNjEiPjwvcGF0aD48L2c+PC9nPjwvc3ZnPjwhLS1yb3RhdGlvbkNlbnRlcjozNS4yMTc1NjUwMDAwMDAwMTo0MC41MDQ1Mjk5OTk5OTk5OS0tPg==\"\n );\n blocksMedia.set(\n \"blue-flag.svg\",\n \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ImdyZWVuZmxhZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiM0NTk5M0Q7fQoJLnN0MXtmaWxsOiM0Q0JGNTY7fQo8L3N0eWxlPgo8dGl0bGU+Z3JlZW5mbGFnPC90aXRsZT4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTIwLjgsMy43Yy0wLjQtMC4yLTAuOS0wLjEtMS4yLDAuMmMtMiwxLjYtNC44LDEuNi02LjgsMGMtMi4zLTEuOS01LjYtMi4zLTguMy0xVjIuNWMwLTAuNi0wLjUtMS0xLTEKCXMtMSwwLjQtMSwxdjE4LjhjMCwwLjUsMC41LDEsMSwxaDAuMWMwLjUsMCwxLTAuNSwxLTF2LTYuNGMxLTAuNywyLjEtMS4yLDMuNC0xLjNjMS4yLDAsMi40LDAuNCwzLjQsMS4yYzIuOSwyLjMsNywyLjMsOS44LDAKCWMwLjMtMC4yLDAuNC0wLjUsMC40LTAuOVY0LjdDMjEuNiw0LjIsMjEuMywzLjgsMjAuOCwzLjd6IE0yMC41LDEzLjlDMjAuNSwxMy45LDIwLjUsMTMuOSwyMC41LDEzLjlDMTgsMTYsMTQuNCwxNiwxMS45LDE0CgljLTEuMS0wLjktMi41LTEuNC00LTEuNGMtMS4yLDAuMS0yLjMsMC41LTMuNCwxLjFWNEM3LDIuNiwxMCwyLjksMTIuMiw0LjZjMi40LDEuOSw1LjcsMS45LDguMSwwYzAuMSwwLDAuMSwwLDAuMiwwCgljMCwwLDAuMSwwLjEsMC4xLDAuMUwyMC41LDEzLjl6Ii8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0yMC42LDQuOGwtMC4xLDkuMWMwLDAsMCwwLjEsMCwwLjFjLTIuNSwyLTYuMSwyLTguNiwwYy0xLjEtMC45LTIuNS0xLjQtNC0xLjRjLTEuMiwwLjEtMi4zLDAuNS0zLjQsMS4xVjQKCUM3LDIuNiwxMCwyLjksMTIuMiw0LjZjMi40LDEuOSw1LjcsMS45LDguMSwwYzAuMSwwLDAuMSwwLDAuMiwwQzIwLjUsNC43LDIwLjYsNC43LDIwLjYsNC44eiIvPgo8L3N2Zz4K\"\n );\n blocksMedia.set(\n \"control_stop.svg\",\n \"data:image/svg+xml;base64,PHN2ZyBpZD0iSWNvbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDAgNDAiPjx0aXRsZT5jb250cm9sX3N0b3A8L3RpdGxlPjxwb2x5Z29uIHBvaW50cz0iMjUuNjEgNi41IDMzLjU2IDE0LjQ0IDMzLjU2IDI1LjY4IDI1LjYxIDMzLjYyIDE0LjM4IDMzLjYyIDYuNDMgMjUuNjggNi40MyAxNC40NCAxNC4zOCA2LjUgMjUuNjEgNi41IiBmaWxsPSIjZWM1ODU4IiBzdHJva2U9IiNiNjQ2NDYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==\"\n );\n blocksMedia.set(\n \"rotate-left.svg\",\n \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIGlkPSJyb3RhdGUtY2xvY2t3aXNlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHN0eWxlPi5jbHMtMXtmaWxsOiMzZDc5Y2M7fS5jbHMtMntmaWxsOiNmZmY7fTwvc3R5bGU+PHRpdGxlPnJvdGF0ZS1jbG9ja3dpc2U8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIwLjM0LDE4LjIxYTEwLjI0LDEwLjI0LDAsMCwxLTguMSw0LjIyLDIuMjYsMi4yNiwwLDAsMS0uMTYtNC41MmgwYTUuNTgsNS41OCwwLDAsMCw0LjI1LTIuNTMsNS4wNiw1LjA2LDAsMCwwLC41NC00LjYyQTQuMjUsNC4yNSwwLDAsMCwxNS41NSw5YTQuMzEsNC4zMSwwLDAsMC0yLS44QTQuODIsNC44MiwwLDAsMCwxMC40LDlsMS4xMiwxLjQxQTEuNTksMS41OSwwLDAsMSwxMC4zNiwxM0gyLjY3YTEuNTYsMS41NiwwLDAsMS0xLjI2LS42M0ExLjU0LDEuNTQsMCwwLDEsMS4xMywxMUwyLjg1LDMuNTdBMS41OSwxLjU5LDAsMCwxLDQuMzgsMi40LDEuNTcsMS41NywwLDAsMSw1LjYyLDNMNi43LDQuMzVhMTAuNjYsMTAuNjYsMCwwLDEsNy43Mi0xLjY4QTkuODgsOS44OCwwLDAsMSwxOSw0LjgxLDkuNjEsOS42MSwwLDAsMSwyMS44Myw5LDEwLjA4LDEwLjA4LDAsMCwxLDIwLjM0LDE4LjIxWiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTE5LjU2LDE3LjY1YTkuMjksOS4yOSwwLDAsMS03LjM1LDMuODMsMS4zMSwxLjMxLDAsMCwxLS4wOC0yLjYyLDYuNTMsNi41MywwLDAsMCw1LTIuOTIsNi4wNSw2LjA1LDAsMCwwLC42Ny01LjUxLDUuMzIsNS4zMiwwLDAsMC0xLjY0LTIuMTYsNS4yMSw1LjIxLDAsMCwwLTIuNDgtMUE1Ljg2LDUuODYsMCwwLDAsOSw4Ljg0TDEwLjc0LDExYS41OS41OSwwLDAsMS0uNDMsMUgyLjdhLjYuNiwwLDAsMS0uNi0uNzVMMy44MSwzLjgzYS41OS41OSwwLDAsMSwxLS4yMWwxLjY3LDIuMWE5LjcxLDkuNzEsMCwwLDEsNy43NS0yLjA3LDguODQsOC44NCwwLDAsMSw0LjEyLDEuOTIsOC42OCw4LjY4LDAsMCwxLDIuNTQsMy43MkE5LjE0LDkuMTQsMCwwLDEsMTkuNTYsMTcuNjVaIi8+PC9zdmc+\"\n );\n blocksMedia.set(\n \"rotate-right.svg\",\n \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIGlkPSJyb3RhdGUtY291bnRlci1jbG9ja3dpc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6IzNkNzljYzt9LmNscy0ye2ZpbGw6I2ZmZjt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPnJvdGF0ZS1jb3VudGVyLWNsb2Nrd2lzZTwvdGl0bGU+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjgsMTIuMmExLjYsMS42LDAsMCwxLTEuMjcuNjNIMTMuNzJhMS41OSwxLjU5LDAsMCwxLTEuMTYtMi41OGwxLjEyLTEuNDFhNC44Miw0LjgyLDAsMCwwLTMuMTQtLjc3LDQuMzEsNC4zMSwwLDAsMC0yLC44LDQuMjUsNC4yNSwwLDAsMC0xLjM0LDEuNzMsNS4wNiw1LjA2LDAsMCwwLC41NCw0LjYyQTUuNTgsNS41OCwwLDAsMCwxMiwxNy43NGgwYTIuMjYsMi4yNiwwLDAsMS0uMTYsNC41MkExMC4yNSwxMC4yNSwwLDAsMSwzLjc0LDE4LDEwLjE0LDEwLjE0LDAsMCwxLDIuMjUsOC43OCw5LjcsOS43LDAsMCwxLDUuMDgsNC42NCw5LjkyLDkuOTIsMCwwLDEsOS42NiwyLjVhMTAuNjYsMTAuNjYsMCwwLDEsNy43MiwxLjY4bDEuMDgtMS4zNWExLjU3LDEuNTcsMCwwLDEsMS4yNC0uNiwxLjYsMS42LDAsMCwxLDEuNTQsMS4yMWwxLjcsNy4zN0ExLjU3LDEuNTcsMCwwLDEsMjIuNjgsMTIuMloiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS4zOCwxMS44M0gxMy43N2EuNTkuNTksMCwwLDEtLjQzLTFsMS43NS0yLjE5YTUuOSw1LjksMCwwLDAtNC43LTEuNTgsNS4wNyw1LjA3LDAsMCwwLTQuMTEsMy4xN0E2LDYsMCwwLDAsNywxNS43N2E2LjUxLDYuNTEsMCwwLDAsNSwyLjkyLDEuMzEsMS4zMSwwLDAsMS0uMDgsMi42Miw5LjMsOS4zLDAsMCwxLTcuMzUtMy44MkE5LjE2LDkuMTYsMCwwLDEsMy4xNyw5LjEyLDguNTEsOC41MSwwLDAsMSw1LjcxLDUuNCw4Ljc2LDguNzYsMCwwLDEsOS44MiwzLjQ4YTkuNzEsOS43MSwwLDAsMSw3Ljc1LDIuMDdsMS42Ny0yLjFhLjU5LjU5LDAsMCwxLDEsLjIxTDIyLDExLjA4QS41OS41OSwwLDAsMSwyMS4zOCwxMS44M1oiLz48L3N2Zz4=\"\n );\n blocksMedia.set(\n \"dropdown-arrow.svg\",\n \"data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMi43MSIgaGVpZ2h0PSI4Ljc5IiB2aWV3Qm94PSIwIDAgMTIuNzEgOC43OSI+PHRpdGxlPmRyb3Bkb3duLWFycm93PC90aXRsZT48ZyBvcGFjaXR5PSIwLjEiPjxwYXRoIGQ9Ik0xMi43MSwyLjQ0QTIuNDEsMi40MSwwLDAsMSwxMiw0LjE2TDguMDgsOC4wOGEyLjQ1LDIuNDUsMCwwLDEtMy40NSwwTDAuNzIsNC4xNkEyLjQyLDIuNDIsMCwwLDEsMCwyLjQ0LDIuNDgsMi40OCwwLDAsMSwuNzEuNzFDMSwwLjQ3LDEuNDMsMCw2LjM2LDBTMTEuNzUsMC40NiwxMiwuNzFBMi40NCwyLjQ0LDAsMCwxLDEyLjcxLDIuNDRaIiBmaWxsPSIjMjMxZjIwIi8+PC9nPjxwYXRoIGQ9Ik02LjM2LDcuNzlhMS40MywxLjQzLDAsMCwxLTEtLjQyTDEuNDIsMy40NWExLjQ0LDEuNDQsMCwwLDEsMC0yYzAuNTYtLjU2LDkuMzEtMC41Niw5Ljg3LDBhMS40NCwxLjQ0LDAsMCwxLDAsMkw3LjM3LDcuMzdBMS40MywxLjQzLDAsMCwxLDYuMzYsNy43OVoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=\"\n );\n\n addon.tab.createBlockContextMenu(\n (items) => {\n if (addon.self.disabled) return items;\n let svgchild = document.querySelector(\"svg.blocklySvg g.blocklyBlockCanvas\");\n\n const pasteItemIndex = items.findIndex((obj) => obj._isDevtoolsFirstItem);\n const insertBeforeIndex =\n pasteItemIndex !== -1\n ? // If \"paste\" button exists, add own items before it\n pasteItemIndex\n : // If there's no such button, insert at end\n items.length;\n\n items.splice(\n insertBeforeIndex,\n 0,\n {\n enabled: !!svgchild?.childNodes?.length,\n text: msg(\"export_all_to_SVG\"),\n callback: () => {\n exportBlock(false);\n },\n separator: true,\n },\n {\n enabled: !!svgchild?.childNodes?.length,\n text: msg(\"export_all_to_PNG\"),\n callback: () => {\n exportBlock(true);\n },\n separator: false,\n }\n );\n\n return items;\n },\n { workspace: true }\n );\n addon.tab.createBlockContextMenu(\n (items, block) => {\n if (addon.self.disabled) return items;\n const makeSpaceItemIndex = items.findIndex((obj) => obj._isDevtoolsFirstItem);\n const insertBeforeIndex =\n makeSpaceItemIndex !== -1\n ? // If \"make space\" button exists, add own items before it\n makeSpaceItemIndex\n : // If there's no such button, insert at end\n items.length;\n\n items.splice(\n insertBeforeIndex,\n 0,\n {\n enabled: true,\n text: msg(\"export_selected_to_SVG\"),\n callback: () => {\n exportBlock(false, block);\n },\n separator: true,\n },\n {\n enabled: true,\n text: msg(\"export_selected_to_PNG\"),\n callback: () => {\n exportBlock(true, block);\n },\n separator: false,\n }\n );\n\n return items;\n },\n { blocks: true }\n );\n\n function exportBlock(isExportPNG, block) {\n let svg;\n if (block) {\n svg = selectedBlocks(isExportPNG, block);\n } else {\n svg = allBlocks(isExportPNG);\n }\n // resolve nbsp whitespace\n svg.querySelectorAll(\"text\").forEach((text) => {\n text.innerHTML = text.innerHTML.replace(/&nbsp;/g, \" \");\n });\n // resolve image path\n let scratchURL = window.location.origin;\n\n svg.querySelectorAll(\"image\").forEach((item) => {\n let builtinSvgData = blocksMedia.get(\n item.getAttribute(\"xlink:href\").substring(item.getAttribute(\"xlink:href\").lastIndexOf(\"/\") + 1)\n );\n if (builtinSvgData) {\n // replace svg file path (official) to inline svg\n item.setAttribute(\"xlink:href\", builtinSvgData);\n } else if (item.getAttribute(\"xlink:href\").indexOf(\"/static/\") === 0) {\n // replace link path for third party website\n item.setAttribute(\"xlink:href\", scratchURL + item.getAttribute(\"xlink:href\").slice(0));\n } else if (item.getAttribute(\"xlink:href\").indexOf(\"./static/\") === 0) {\n item.setAttribute(\"xlink:href\", scratchURL + item.getAttribute(\"xlink:href\").slice(1));\n } else if (item.getAttribute(\"xlink:href\").indexOf(\"static/\") === 0) {\n item.setAttribute(\"xlink:href\", scratchURL + \"/\" + item.getAttribute(\"xlink:href\"));\n }\n });\n if (!isExportPNG) {\n exportData(new XMLSerializer().serializeToString(svg));\n } else {\n exportPNG(svg);\n }\n }\n\n function selectedBlocks(isExportPNG, block) {\n let svg = exSVG.cloneNode();\n\n let svgchild = block.svgGroup_;\n svgchild = svgchild.cloneNode(true);\n let dataShapes = svgchild.getAttribute(\"data-shapes\");\n svgchild.setAttribute(\n \"transform\",\n `translate(0,${dataShapes === \"hat\" ? \"18\" : \"0\"}) ${isExportPNG ? \"scale(2)\" : \"\"}`\n );\n setCSSVars(svg);\n svg.append(makeStyle());\n svg.append(svgchild);\n return svg;\n }\n\n function allBlocks(isExportPNG) {\n let svg = exSVG.cloneNode();\n\n let svgchild = document.querySelector(\"svg.blocklySvg g.blocklyBlockCanvas\");\n svgchild = svgchild.cloneNode(true);\n\n let xArr = [];\n let yArr = [];\n\n svgchild.childNodes.forEach((g) => {\n let x = g.getAttribute(\"transform\").match(/translate\\((.*?),(.*?)\\)/)[1] || 0;\n let y = g.getAttribute(\"transform\").match(/translate\\((.*?),(.*?)\\)/)[2] || 0;\n xArr.push(x * (isExportPNG ? 2 : 1));\n yArr.push(y * (isExportPNG ? 2 : 1));\n g.style.display = \"\"; // because of TW scratch-blocks changes\n });\n\n svgchild.setAttribute(\n \"transform\",\n `translate(${-Math.min(...xArr)},${-Math.min(...yArr) + 18 * (isExportPNG ? 2 : 1)}) ${\n isExportPNG ? \"scale(2)\" : \"\"\n }`\n );\n setCSSVars(svg);\n svg.append(makeStyle());\n svg.append(svgchild);\n return svg;\n }\n\n function exportData(text) {\n const saveLink = document.createElement(\"a\");\n document.body.appendChild(saveLink);\n\n const data = new Blob([text], { type: \"text\" });\n const url = window.URL.createObjectURL(data);\n saveLink.href = url;\n\n // File name: project-DATE-TIME\n const date = new Date();\n const timestamp = `${date.toLocaleDateString()}-${date.toLocaleTimeString()}`;\n saveLink.download = `block_${timestamp}.svg`;\n saveLink.click();\n window.URL.revokeObjectURL(url);\n document.body.removeChild(saveLink);\n }\n\n function exportPNG(svg) {\n const serializer = new XMLSerializer();\n\n const iframe = document.createElement(\"iframe\");\n // iframe.style.display = \"none\"\n document.body.append(iframe);\n iframe.contentDocument.write(serializer.serializeToString(svg));\n let { width, height } = iframe.contentDocument.body.querySelector(\"svg g\").getBoundingClientRect();\n height = height + 20 * 2; // hat block height restore\n svg.setAttribute(\"width\", width + \"px\");\n svg.setAttribute(\"height\", height + \"px\");\n\n let canvas = document.createElement(\"canvas\");\n let ctx = canvas.getContext(\"2d\");\n\n let img = document.createElement(\"img\");\n\n img.setAttribute(\n \"src\",\n \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(serializer.serializeToString(svg))))\n );\n img.onload = function () {\n canvas.height = img.height;\n canvas.width = img.width;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n // Now is done\n let dataURL = canvas.toDataURL(\"image/png\");\n let link = document.createElement(\"a\");\n const date = new Date();\n const timestamp = `${date.toLocaleDateString()}-${date.toLocaleTimeString()}`;\n\n link.download = `block_${timestamp}.png`;\n link.href = dataURL;\n link.click();\n iframe.remove();\n };\n }\n}\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAcA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AAIA;AAIA;AAIA;AAIA;AAIA;AAKA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAAA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAMA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-cat-blocks.js ADDED
@@ -0,0 +1,327 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-cat-blocks"],{
2
+
3
+ /***/ "./src/addons/addons/cat-blocks/_runtime_entry.js":
4
+ /*!********************************************************!*\
5
+ !*** ./src/addons/addons/cat-blocks/_runtime_entry.js ***!
6
+ \********************************************************/
7
+ /*! exports provided: resources */
8
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9
+
10
+ "use strict";
11
+ __webpack_require__.r(__webpack_exports__);
12
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
13
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/cat-blocks/userscript.js");
14
+ /* generated by pull.js */
15
+
16
+ const resources = {
17
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"]
18
+ };
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/cat-blocks/userscript.js":
23
+ /*!****************************************************!*\
24
+ !*** ./src/addons/addons/cat-blocks/userscript.js ***!
25
+ \****************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /**
32
+ * Based on https://github.com/LLK/scratch-blocks/compare/hotfix/totally-normal-2021 (Apache 2.0)
33
+ * It has been modified to work properly in our environment and fix some bugs.
34
+ */
35
+
36
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
37
+ let {
38
+ addon,
39
+ console
40
+ } = _ref;
41
+ const Blockly = await addon.tab.traps.getBlockly();
42
+ const shouldWatchMouseCursor = addon.settings.get("watch");
43
+ Blockly.BlockSvg.START_HAT_HEIGHT = 31;
44
+ Blockly.BlockSvg.START_HAT_PATH = "c2.6,-2.3 5.5,-4.3 8.5,-6.2" + "c-1,-12.5 5.3,-23.3 8.4,-24.8c3.7,-1.8 16.5,13.1 18.4,15.4" + "c8.4,-1.3 17,-1.3 25.4,0c1.9,-2.3 14.7,-17.2 18.4,-15.4" + "c3.1,1.5 9.4,12.3 8.4,24.8c3,1.8 5.9,3.9 8.5,6.1";
45
+ Blockly.BlockSvg.TOP_LEFT_CORNER_DEFINE_HAT = "c0,-7.1 3.7,-13.3 9.3,-16.9c1.7,-7.5 5.4,-13.2 7.6,-14.2" + "c2.6,-1.3 10,6 14.6,11.1h33c4.6,-5.1 11.9,-12.4 14.6,-11.1" + "c1.9,0.9 4.9,5.2 6.8,11.1c2.6,0,5.2,0,7.8,0";
46
+ Blockly.BlockSvg.prototype.renderCatFace_ = function () {
47
+ this.catPath_.svgFace.setAttribute("fill", "#000000");
48
+ var closedEye = Blockly.utils.createSvgElement("path", {}, this.svgFace_);
49
+ closedEye.setAttribute("d", "M25.2-1.1c0.1,0,0.2,0,0.2,0l8.3-2.1l-7-4.8" + "c-0.5-0.3-1.1-0.2-1.4,0.3s-0.2,1.1,0.3,1.4L29-4.1l-4,1" + "c-0.5,0.1-0.9,0.7-0.7,1.2C24.3-1.4,24.7-1.1,25.2-1.1z");
50
+ closedEye.setAttribute("fill-opacity", "0");
51
+ this.catPath_.svgFace.closedEye = closedEye;
52
+ var closedEye2 = Blockly.utils.createSvgElement("path", {}, this.svgFace_);
53
+ closedEye2.setAttribute("d", "M62.4-1.1c-0.1,0-0.2,0-0.2,0l-8.3-2.1l7-4.8" + "c0.5-0.3,1.1-0.2,1.4,0.3s0.2,1.1-0.3,1.4l-3.4,2.3l4,1" + "c0.5,0.1,0.9,0.7,0.7,1.2C63.2-1.4,62.8-1.1,62.4-1.1z");
54
+ closedEye2.setAttribute("fill-opacity", "0");
55
+ this.catPath_.svgFace.closedEye2 = closedEye2;
56
+ var eye = Blockly.utils.createSvgElement("circle", {}, this.svgFace_);
57
+ eye.setAttribute("cx", "59.2");
58
+ eye.setAttribute("cy", "-3.3");
59
+ eye.setAttribute("r", "3.4");
60
+ eye.setAttribute("fill-opacity", "0.6");
61
+ this.catPath_.svgFace.eye = eye;
62
+ var eye2 = Blockly.utils.createSvgElement("circle", {}, this.svgFace_);
63
+ eye2.setAttribute("cx", "29.1");
64
+ eye2.setAttribute("cy", "-3.3");
65
+ eye2.setAttribute("r", "3.4");
66
+ eye2.setAttribute("fill-opacity", "0.6");
67
+ this.catPath_.svgFace.eye2 = eye2;
68
+ var mouth = Blockly.utils.createSvgElement("path", {}, this.svgFace_);
69
+ mouth.setAttribute("d", "M45.6,0.1c-0.9,0-1.7-0.3-2.3-0.9" + "c-0.6,0.6-1.3,0.9-2.2,0.9c-0.9,0-1.8-0.3-2.3-0.9c-1-1.1-1.1-2.6-1.1-2.8" + "c0-0.5,0.5-1,1-1l0,0c0.6,0,1,0.5,1,1c0,0.4,0.1,1.7,1.4,1.7" + "c0.5,0,0.7-0.2,0.8-0.3c0.3-0.3,0.4-1,0.4-1.3c0-0.1,0-0.1,0-0.2" + "c0-0.5,0.5-1,1-1l0,0c0.5,0,1,0.4,1,1c0,0,0,0.1,0,0.2" + "c0,0.3,0.1,0.9,0.4,1.2C44.8-2.2,45-2,45.5-2s0.7-0.2,0.8-0.3" + "c0.3-0.4,0.4-1.1,0.3-1.3c0-0.5,0.4-1,0.9-1.1c0.5,0,1,0.4,1.1,0.9" + "c0,0.2,0.1,1.8-0.8,2.8C47.5-0.4,46.8,0.1,45.6,0.1z");
70
+ mouth.setAttribute("fill-opacity", "0.6");
71
+ this.catPath_.ear.setAttribute("d", "M73.1-15.6c1.7-4.2,4.5-9.1,5.8-8.5" + "c1.6,0.8,5.4,7.9,5,15.4c0,0.6-0.7,0.7-1.1,0.5c-3-1.6-6.4-2.8-8.6-3.6" + "C72.8-12.3,72.4-13.7,73.1-15.6z");
72
+ this.catPath_.ear.setAttribute("fill", "#FFD5E6");
73
+ this.catPath_.ear2.setAttribute("d", "M22.4-15.6c-1.7-4.2-4.5-9.1-5.8-8.5" + "c-1.6,0.8-5.4,7.9-5,15.4c0,0.6,0.7,0.7,1.1,0.5c3-1.6,6.4-2.8,8.6-3.6" + "C22.8-12.3,23.2-13.7,22.4-15.6z");
74
+ this.catPath_.ear2.setAttribute("fill", "#FFD5E6");
75
+ };
76
+ Blockly.BlockSvg.prototype.initCatStuff = function () {
77
+ if (this.hasInitCatStuff) return;
78
+ this.hasInitCatStuff = true;
79
+
80
+ // Ear part of the SVG path for hat blocks
81
+ var LEFT_EAR_UP = "c-1,-12.5 5.3,-23.3 8.4,-24.8c3.7,-1.8 16.5,13.1 18.4,15.4";
82
+ var LEFT_EAR_DOWN = "c-5.8,-4.8 -8,-18 -4.9,-19.5c3.7,-1.8 24.5,11.1 31.7,10.1";
83
+ var RIGHT_EAR_UP = "c1.9,-2.3 14.7,-17.2 18.4,-15.4c3.1,1.5 9.4,12.3 8.4,24.8";
84
+ var RIGHT_EAR_DOWN = "c7.2,1 28,-11.9 31.7,-10.1c3.1,1.5 0.9,14.7 -4.9,19.5";
85
+ // Ears look slightly different for define hat blocks
86
+ var DEFINE_HAT_LEFT_EAR_UP = "c0,-7.1 3.7,-13.3 9.3,-16.9c1.7,-7.5 5.4,-13.2 7.6,-14.2c2.6,-1.3 10,6 14.6,11.1";
87
+ var DEFINE_HAT_RIGHT_EAR_UP = "h33c4.6,-5.1 11.9,-12.4 14.6,-11.1c1.9,0.9 4.9,5.2 6.8,11.1c2.6,0,5.2,0,7.8,0";
88
+ var DEFINE_HAT_LEFT_EAR_DOWN = "c0,-4.6 1.6,-8.9 4.3,-12.3c-2.4,-5.6 -2.9,-12.4 -0.7,-13.4c2.1,-1 9.6,2.6 17,5.8" + "c2.6,0 6.2,0 10.9,0";
89
+ var DEFINE_HAT_RIGHT_EAR_DOWN = "c0,0 25.6,0 44,0c7.4,-3.2 14.8,-6.8 16.9,-5.8c1.2,0.6 1.6,2.9 1.3,5.8";
90
+ var that = this;
91
+ this.catPath_.ear = Blockly.utils.createSvgElement("path", {}, this.catPath_);
92
+ this.catPath_.ear2 = Blockly.utils.createSvgElement("path", {}, this.catPath_);
93
+ if (this.RTL) {
94
+ // Mirror the ears.
95
+ this.catPath_.ear.setAttribute("transform", "scale(-1 1)");
96
+ this.catPath_.ear2.setAttribute("transform", "scale(-1 1)");
97
+ }
98
+ this.catPath_.addEventListener("mouseenter", function (event) {
99
+ clearTimeout(that.blinkFn);
100
+ // blink
101
+ if (event.target.svgFace.eye) {
102
+ event.target.svgFace.eye.setAttribute("fill-opacity", "0");
103
+ event.target.svgFace.eye2.setAttribute("fill-opacity", "0");
104
+ event.target.svgFace.closedEye.setAttribute("fill-opacity", "0.6");
105
+ event.target.svgFace.closedEye2.setAttribute("fill-opacity", "0.6");
106
+ }
107
+
108
+ // reset after a short delay
109
+ that.blinkFn = setTimeout(function () {
110
+ if (event.target.svgFace.eye) {
111
+ event.target.svgFace.eye.setAttribute("fill-opacity", "0.6");
112
+ event.target.svgFace.eye2.setAttribute("fill-opacity", "0.6");
113
+ event.target.svgFace.closedEye.setAttribute("fill-opacity", "0");
114
+ event.target.svgFace.closedEye2.setAttribute("fill-opacity", "0");
115
+ }
116
+ }, 100);
117
+ });
118
+ this.catPath_.ear.addEventListener("mouseenter", function () {
119
+ clearTimeout(that.earFn);
120
+ clearTimeout(that.ear2Fn);
121
+ // ear flick
122
+ that.catPath_.ear.setAttribute("fill-opacity", "0");
123
+ that.catPath_.ear2.setAttribute("fill-opacity", "");
124
+ var bodyPath = that.catPath_.svgBody.getAttribute("d");
125
+ bodyPath = bodyPath.replace(RIGHT_EAR_UP, RIGHT_EAR_DOWN);
126
+ bodyPath = bodyPath.replace(DEFINE_HAT_RIGHT_EAR_UP, DEFINE_HAT_RIGHT_EAR_DOWN);
127
+ bodyPath = bodyPath.replace(LEFT_EAR_DOWN, LEFT_EAR_UP);
128
+ bodyPath = bodyPath.replace(DEFINE_HAT_LEFT_EAR_DOWN, DEFINE_HAT_LEFT_EAR_UP);
129
+ that.catPath_.svgBody.setAttribute("d", bodyPath);
130
+
131
+ // reset after a short delay
132
+ that.earFn = setTimeout(function () {
133
+ that.catPath_.ear.setAttribute("fill-opacity", "");
134
+ var bodyPath = that.catPath_.svgBody.getAttribute("d");
135
+ bodyPath = bodyPath.replace(RIGHT_EAR_DOWN, RIGHT_EAR_UP);
136
+ bodyPath = bodyPath.replace(DEFINE_HAT_RIGHT_EAR_DOWN, DEFINE_HAT_RIGHT_EAR_UP);
137
+ that.catPath_.svgBody.setAttribute("d", bodyPath);
138
+ }, 50);
139
+ });
140
+ this.catPath_.ear2.addEventListener("mouseenter", function () {
141
+ clearTimeout(that.earFn);
142
+ clearTimeout(that.ear2Fn);
143
+ // ear flick
144
+ that.catPath_.ear2.setAttribute("fill-opacity", "0");
145
+ that.catPath_.ear.setAttribute("fill-opacity", "");
146
+ var bodyPath = that.catPath_.svgBody.getAttribute("d");
147
+ bodyPath = bodyPath.replace(LEFT_EAR_UP, LEFT_EAR_DOWN);
148
+ bodyPath = bodyPath.replace(DEFINE_HAT_LEFT_EAR_UP, DEFINE_HAT_LEFT_EAR_DOWN);
149
+ bodyPath = bodyPath.replace(RIGHT_EAR_DOWN, RIGHT_EAR_UP);
150
+ bodyPath = bodyPath.replace(DEFINE_HAT_RIGHT_EAR_DOWN, DEFINE_HAT_RIGHT_EAR_UP);
151
+ that.catPath_.svgBody.setAttribute("d", bodyPath);
152
+
153
+ // reset after a short delay
154
+ that.ear2Fn = setTimeout(function () {
155
+ that.catPath_.ear2.setAttribute("fill-opacity", "");
156
+ var bodyPath = that.catPath_.svgBody.getAttribute("d");
157
+ bodyPath = bodyPath.replace(LEFT_EAR_DOWN, LEFT_EAR_UP);
158
+ bodyPath = bodyPath.replace(DEFINE_HAT_LEFT_EAR_DOWN, DEFINE_HAT_LEFT_EAR_UP);
159
+ that.catPath_.svgBody.setAttribute("d", bodyPath);
160
+ }, 50);
161
+ });
162
+ if (this.RTL) {
163
+ // Set to the correct initial position
164
+ this.svgFace_.style.transform = "translate(-87px, 0px)";
165
+ }
166
+ if (this.shouldWatchMouse()) {
167
+ this.windowListener = function (event) {
168
+ var time = Date.now();
169
+ if (time < that.lastCallTime + that.CALL_FREQUENCY_MS) return;
170
+ that.lastCallTime = time;
171
+ if (!that.shouldWatchMouse()) return;
172
+
173
+ // mouse watching
174
+ if (that.workspace) {
175
+ // not disposed
176
+ var xy = that.getCatFacePosition();
177
+ var mouseLocation = {
178
+ x: event.x / that.workspace.scale,
179
+ y: event.y / that.workspace.scale
180
+ };
181
+ var dx = mouseLocation.x - xy.x;
182
+ var dy = mouseLocation.y - xy.y;
183
+ var theta = Math.atan2(dx, dy);
184
+
185
+ // Map the vector from the cat face to the mouse location to a much shorter
186
+ // vector in the same direction, which will be the translation vector for
187
+ // the cat face
188
+ var delta = Math.sqrt(dx * dx + dy * dy);
189
+ var scaleFactor = delta / (delta + 1);
190
+
191
+ // Equation for radius of ellipse at theta for axes with length a and b
192
+ var a = 2;
193
+ var b = 5;
194
+ var r = a * b / Math.sqrt(Math.pow(b * Math.cos(theta), 2) + Math.pow(a * Math.sin(theta), 2));
195
+
196
+ // Convert polar coordinate back to x, y coordinate
197
+ dx = r * scaleFactor * Math.sin(theta);
198
+ dy = r * scaleFactor * Math.cos(theta);
199
+ if (that.RTL) dx -= 87; // Translate face over
200
+ that.svgFace_.style.transform = "translate(" + dx + "px, " + dy + "px)";
201
+ }
202
+ };
203
+ document.addEventListener("mousemove", this.windowListener);
204
+ }
205
+ };
206
+ let workspacePositionRect = null;
207
+ Blockly.BlockSvg.prototype.getCatFacePosition = function () {
208
+ // getBoundingClientRect is not performant
209
+ //var offset = that.workspace.getParentSvg().getBoundingClientRect();
210
+ if (!workspacePositionRect) {
211
+ workspacePositionRect = this.workspace.getParentSvg().getBoundingClientRect();
212
+ }
213
+ var offset = {
214
+ x: workspacePositionRect.x,
215
+ y: workspacePositionRect.y
216
+ };
217
+ if (!this.isInFlyout && this.workspace.getFlyout()) {
218
+ offset.x += this.workspace.getFlyout().getWidth();
219
+ }
220
+ offset.x += this.workspace.scrollX;
221
+ offset.y += this.workspace.scrollY;
222
+ var xy = this.getRelativeToSurfaceXY(this.svgGroup_);
223
+ if (this.RTL) {
224
+ xy.x = this.workspace.getWidth() - xy.x - this.width;
225
+ }
226
+ // convert to workspace units
227
+ xy.x += offset.x / this.workspace.scale;
228
+ xy.y += offset.y / this.workspace.scale;
229
+ // distance to center of face
230
+ xy.x -= 43.5;
231
+ xy.y -= 4;
232
+ // flyout category offset
233
+ xy.x += 60;
234
+ if (this.RTL) {
235
+ // We've been calculating from the right edge. Convert x to from left edge.
236
+ xy.x = screen.width - xy.x;
237
+ }
238
+ return xy;
239
+ };
240
+ Blockly.BlockSvg.prototype.shouldWatchMouse = function () {
241
+ if (!shouldWatchMouseCursor) return false;
242
+ // if (window.vmLoadHigh || !window.CAT_CHASE_MOUSE) return false;
243
+ var xy = this.getCatFacePosition();
244
+ const MARGIN = 50;
245
+ var blockXOnScreen = xy.x > -MARGIN && xy.x - MARGIN < screen.width / this.workspace.scale;
246
+ var blockYOnScreen = xy.y > -MARGIN && xy.y - MARGIN < screen.height / this.workspace.scale;
247
+ return this.startHat_ && !this.isGlowingStack_ && blockXOnScreen && blockYOnScreen;
248
+ };
249
+ const originalRenderDraw = Blockly.BlockSvg.prototype.renderDraw_;
250
+ Blockly.BlockSvg.prototype.renderDraw_ = function () {
251
+ if (!this.svgFace_) {
252
+ this.sa_catBlockConstructor();
253
+ }
254
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
255
+ args[_key] = arguments[_key];
256
+ }
257
+ const r = originalRenderDraw.call(this, ...args);
258
+ if (this.output_ !== undefined || this.isInMutator) return r;
259
+ if (!this.outputConnection && !this.previousConnection) {
260
+ this.initCatStuff();
261
+ }
262
+ if (this.startHat_ && !this.svgFace_.firstChild) {
263
+ this.renderCatFace_();
264
+ }
265
+ return r;
266
+ };
267
+ const originalDispose = Blockly.BlockSvg.prototype.dispose;
268
+ Blockly.BlockSvg.prototype.dispose = function () {
269
+ clearTimeout(this.blinkFn);
270
+ clearTimeout(this.earFn);
271
+ clearTimeout(this.ear2Fn);
272
+ if (this.windowListener) {
273
+ document.removeEventListener("mousemove", this.windowListener);
274
+ }
275
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
276
+ args[_key2] = arguments[_key2];
277
+ }
278
+ return originalDispose.call(this, ...args);
279
+ };
280
+ const originalSetGlowStack = Blockly.BlockSvg.prototype.setGlowStack;
281
+ Blockly.BlockSvg.prototype.setGlowStack = function (isGlowingStack) {
282
+ if (this.windowListener) {
283
+ if (isGlowingStack) {
284
+ // For performance, don't follow the mouse when the stack is glowing
285
+ document.removeEventListener("mousemove", this.windowListener);
286
+ if (this.workspace && this.svgFace_.style) {
287
+ // reset face direction
288
+ if (this.RTL) {
289
+ this.svgFace_.style.transform = "translate(-87px, 0px)";
290
+ } else {
291
+ this.svgFace_.style.transform = "";
292
+ }
293
+ }
294
+ } else {
295
+ document.addEventListener("mousemove", this.windowListener);
296
+ }
297
+ }
298
+ return originalSetGlowStack.call(this, isGlowingStack);
299
+ };
300
+ Blockly.BlockSvg.prototype.sa_catBlockConstructor = function () {
301
+ this.catPath_ = Blockly.utils.createSvgElement("g", {}, this.svgGroup_);
302
+ this.svgFace_ = Blockly.utils.createSvgElement("g", {}, this.catPath_);
303
+ this.catPath_.svgFace = this.svgFace_;
304
+ this.catPath_.svgBody = this.svgPath_;
305
+ this.lastCallTime = 0;
306
+ this.CALL_FREQUENCY_MS = 60;
307
+ };
308
+ const workspace = Blockly.getMainWorkspace();
309
+ if (workspace) {
310
+ const vm = addon.tab.traps.vm;
311
+ if (vm.editingTarget) {
312
+ vm.emitWorkspaceUpdate();
313
+ }
314
+ const flyout = workspace.getFlyout();
315
+ if (flyout) {
316
+ const flyoutWorkspace = flyout.getWorkspace();
317
+ Blockly.Xml.clearWorkspaceAndLoadFromXml(Blockly.Xml.workspaceToDom(flyoutWorkspace), flyoutWorkspace);
318
+ workspace.getToolbox().refreshSelection();
319
+ workspace.toolboxRefreshEnabled_ = true;
320
+ }
321
+ }
322
+ });
323
+
324
+ /***/ })
325
+
326
+ }]);
327
+ //# sourceMappingURL=addon-entry-cat-blocks.js.map
js/addon-entry-cat-blocks.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-cat-blocks.js","sources":["webpack://GUI/./src/addons/addons/cat-blocks/_runtime_entry.js","webpack://GUI/./src/addons/addons/cat-blocks/userscript.js"],"sourcesContent":["/* generated by pull.js */\nimport _js from \"./userscript.js\";\nexport const resources = {\n \"userscript.js\": _js,\n};\n","/**\n * Based on https://github.com/LLK/scratch-blocks/compare/hotfix/totally-normal-2021 (Apache 2.0)\n * It has been modified to work properly in our environment and fix some bugs.\n */\n\nexport default async function ({ addon, console }) {\n const Blockly = await addon.tab.traps.getBlockly();\n\n const shouldWatchMouseCursor = addon.settings.get(\"watch\");\n\n Blockly.BlockSvg.START_HAT_HEIGHT = 31;\n\n Blockly.BlockSvg.START_HAT_PATH =\n \"c2.6,-2.3 5.5,-4.3 8.5,-6.2\" +\n \"c-1,-12.5 5.3,-23.3 8.4,-24.8c3.7,-1.8 16.5,13.1 18.4,15.4\" +\n \"c8.4,-1.3 17,-1.3 25.4,0c1.9,-2.3 14.7,-17.2 18.4,-15.4\" +\n \"c3.1,1.5 9.4,12.3 8.4,24.8c3,1.8 5.9,3.9 8.5,6.1\";\n\n Blockly.BlockSvg.TOP_LEFT_CORNER_DEFINE_HAT =\n \"c0,-7.1 3.7,-13.3 9.3,-16.9c1.7,-7.5 5.4,-13.2 7.6,-14.2\" +\n \"c2.6,-1.3 10,6 14.6,11.1h33c4.6,-5.1 11.9,-12.4 14.6,-11.1\" +\n \"c1.9,0.9 4.9,5.2 6.8,11.1c2.6,0,5.2,0,7.8,0\";\n\n Blockly.BlockSvg.prototype.renderCatFace_ = function () {\n this.catPath_.svgFace.setAttribute(\"fill\", \"#000000\");\n\n var closedEye = Blockly.utils.createSvgElement(\"path\", {}, this.svgFace_);\n closedEye.setAttribute(\n \"d\",\n \"M25.2-1.1c0.1,0,0.2,0,0.2,0l8.3-2.1l-7-4.8\" +\n \"c-0.5-0.3-1.1-0.2-1.4,0.3s-0.2,1.1,0.3,1.4L29-4.1l-4,1\" +\n \"c-0.5,0.1-0.9,0.7-0.7,1.2C24.3-1.4,24.7-1.1,25.2-1.1z\"\n );\n closedEye.setAttribute(\"fill-opacity\", \"0\");\n this.catPath_.svgFace.closedEye = closedEye;\n\n var closedEye2 = Blockly.utils.createSvgElement(\"path\", {}, this.svgFace_);\n closedEye2.setAttribute(\n \"d\",\n \"M62.4-1.1c-0.1,0-0.2,0-0.2,0l-8.3-2.1l7-4.8\" +\n \"c0.5-0.3,1.1-0.2,1.4,0.3s0.2,1.1-0.3,1.4l-3.4,2.3l4,1\" +\n \"c0.5,0.1,0.9,0.7,0.7,1.2C63.2-1.4,62.8-1.1,62.4-1.1z\"\n );\n closedEye2.setAttribute(\"fill-opacity\", \"0\");\n this.catPath_.svgFace.closedEye2 = closedEye2;\n\n var eye = Blockly.utils.createSvgElement(\"circle\", {}, this.svgFace_);\n eye.setAttribute(\"cx\", \"59.2\");\n eye.setAttribute(\"cy\", \"-3.3\");\n eye.setAttribute(\"r\", \"3.4\");\n eye.setAttribute(\"fill-opacity\", \"0.6\");\n this.catPath_.svgFace.eye = eye;\n\n var eye2 = Blockly.utils.createSvgElement(\"circle\", {}, this.svgFace_);\n eye2.setAttribute(\"cx\", \"29.1\");\n eye2.setAttribute(\"cy\", \"-3.3\");\n eye2.setAttribute(\"r\", \"3.4\");\n eye2.setAttribute(\"fill-opacity\", \"0.6\");\n this.catPath_.svgFace.eye2 = eye2;\n\n var mouth = Blockly.utils.createSvgElement(\"path\", {}, this.svgFace_);\n mouth.setAttribute(\n \"d\",\n \"M45.6,0.1c-0.9,0-1.7-0.3-2.3-0.9\" +\n \"c-0.6,0.6-1.3,0.9-2.2,0.9c-0.9,0-1.8-0.3-2.3-0.9c-1-1.1-1.1-2.6-1.1-2.8\" +\n \"c0-0.5,0.5-1,1-1l0,0c0.6,0,1,0.5,1,1c0,0.4,0.1,1.7,1.4,1.7\" +\n \"c0.5,0,0.7-0.2,0.8-0.3c0.3-0.3,0.4-1,0.4-1.3c0-0.1,0-0.1,0-0.2\" +\n \"c0-0.5,0.5-1,1-1l0,0c0.5,0,1,0.4,1,1c0,0,0,0.1,0,0.2\" +\n \"c0,0.3,0.1,0.9,0.4,1.2C44.8-2.2,45-2,45.5-2s0.7-0.2,0.8-0.3\" +\n \"c0.3-0.4,0.4-1.1,0.3-1.3c0-0.5,0.4-1,0.9-1.1c0.5,0,1,0.4,1.1,0.9\" +\n \"c0,0.2,0.1,1.8-0.8,2.8C47.5-0.4,46.8,0.1,45.6,0.1z\"\n );\n mouth.setAttribute(\"fill-opacity\", \"0.6\");\n\n this.catPath_.ear.setAttribute(\n \"d\",\n \"M73.1-15.6c1.7-4.2,4.5-9.1,5.8-8.5\" +\n \"c1.6,0.8,5.4,7.9,5,15.4c0,0.6-0.7,0.7-1.1,0.5c-3-1.6-6.4-2.8-8.6-3.6\" +\n \"C72.8-12.3,72.4-13.7,73.1-15.6z\"\n );\n this.catPath_.ear.setAttribute(\"fill\", \"#FFD5E6\");\n\n this.catPath_.ear2.setAttribute(\n \"d\",\n \"M22.4-15.6c-1.7-4.2-4.5-9.1-5.8-8.5\" +\n \"c-1.6,0.8-5.4,7.9-5,15.4c0,0.6,0.7,0.7,1.1,0.5c3-1.6,6.4-2.8,8.6-3.6\" +\n \"C22.8-12.3,23.2-13.7,22.4-15.6z\"\n );\n this.catPath_.ear2.setAttribute(\"fill\", \"#FFD5E6\");\n };\n\n Blockly.BlockSvg.prototype.initCatStuff = function () {\n if (this.hasInitCatStuff) return;\n this.hasInitCatStuff = true;\n\n // Ear part of the SVG path for hat blocks\n var LEFT_EAR_UP = \"c-1,-12.5 5.3,-23.3 8.4,-24.8c3.7,-1.8 16.5,13.1 18.4,15.4\";\n var LEFT_EAR_DOWN = \"c-5.8,-4.8 -8,-18 -4.9,-19.5c3.7,-1.8 24.5,11.1 31.7,10.1\";\n var RIGHT_EAR_UP = \"c1.9,-2.3 14.7,-17.2 18.4,-15.4c3.1,1.5 9.4,12.3 8.4,24.8\";\n var RIGHT_EAR_DOWN = \"c7.2,1 28,-11.9 31.7,-10.1c3.1,1.5 0.9,14.7 -4.9,19.5\";\n // Ears look slightly different for define hat blocks\n var DEFINE_HAT_LEFT_EAR_UP = \"c0,-7.1 3.7,-13.3 9.3,-16.9c1.7,-7.5 5.4,-13.2 7.6,-14.2c2.6,-1.3 10,6 14.6,11.1\";\n var DEFINE_HAT_RIGHT_EAR_UP = \"h33c4.6,-5.1 11.9,-12.4 14.6,-11.1c1.9,0.9 4.9,5.2 6.8,11.1c2.6,0,5.2,0,7.8,0\";\n var DEFINE_HAT_LEFT_EAR_DOWN =\n \"c0,-4.6 1.6,-8.9 4.3,-12.3c-2.4,-5.6 -2.9,-12.4 -0.7,-13.4c2.1,-1 9.6,2.6 17,5.8\" + \"c2.6,0 6.2,0 10.9,0\";\n var DEFINE_HAT_RIGHT_EAR_DOWN = \"c0,0 25.6,0 44,0c7.4,-3.2 14.8,-6.8 16.9,-5.8c1.2,0.6 1.6,2.9 1.3,5.8\";\n\n var that = this;\n this.catPath_.ear = Blockly.utils.createSvgElement(\"path\", {}, this.catPath_);\n this.catPath_.ear2 = Blockly.utils.createSvgElement(\"path\", {}, this.catPath_);\n if (this.RTL) {\n // Mirror the ears.\n this.catPath_.ear.setAttribute(\"transform\", \"scale(-1 1)\");\n this.catPath_.ear2.setAttribute(\"transform\", \"scale(-1 1)\");\n }\n this.catPath_.addEventListener(\"mouseenter\", function (event) {\n clearTimeout(that.blinkFn);\n // blink\n if (event.target.svgFace.eye) {\n event.target.svgFace.eye.setAttribute(\"fill-opacity\", \"0\");\n event.target.svgFace.eye2.setAttribute(\"fill-opacity\", \"0\");\n event.target.svgFace.closedEye.setAttribute(\"fill-opacity\", \"0.6\");\n event.target.svgFace.closedEye2.setAttribute(\"fill-opacity\", \"0.6\");\n }\n\n // reset after a short delay\n that.blinkFn = setTimeout(function () {\n if (event.target.svgFace.eye) {\n event.target.svgFace.eye.setAttribute(\"fill-opacity\", \"0.6\");\n event.target.svgFace.eye2.setAttribute(\"fill-opacity\", \"0.6\");\n event.target.svgFace.closedEye.setAttribute(\"fill-opacity\", \"0\");\n event.target.svgFace.closedEye2.setAttribute(\"fill-opacity\", \"0\");\n }\n }, 100);\n });\n\n this.catPath_.ear.addEventListener(\"mouseenter\", function () {\n clearTimeout(that.earFn);\n clearTimeout(that.ear2Fn);\n // ear flick\n that.catPath_.ear.setAttribute(\"fill-opacity\", \"0\");\n that.catPath_.ear2.setAttribute(\"fill-opacity\", \"\");\n var bodyPath = that.catPath_.svgBody.getAttribute(\"d\");\n bodyPath = bodyPath.replace(RIGHT_EAR_UP, RIGHT_EAR_DOWN);\n bodyPath = bodyPath.replace(DEFINE_HAT_RIGHT_EAR_UP, DEFINE_HAT_RIGHT_EAR_DOWN);\n bodyPath = bodyPath.replace(LEFT_EAR_DOWN, LEFT_EAR_UP);\n bodyPath = bodyPath.replace(DEFINE_HAT_LEFT_EAR_DOWN, DEFINE_HAT_LEFT_EAR_UP);\n that.catPath_.svgBody.setAttribute(\"d\", bodyPath);\n\n // reset after a short delay\n that.earFn = setTimeout(function () {\n that.catPath_.ear.setAttribute(\"fill-opacity\", \"\");\n var bodyPath = that.catPath_.svgBody.getAttribute(\"d\");\n bodyPath = bodyPath.replace(RIGHT_EAR_DOWN, RIGHT_EAR_UP);\n bodyPath = bodyPath.replace(DEFINE_HAT_RIGHT_EAR_DOWN, DEFINE_HAT_RIGHT_EAR_UP);\n that.catPath_.svgBody.setAttribute(\"d\", bodyPath);\n }, 50);\n });\n this.catPath_.ear2.addEventListener(\"mouseenter\", function () {\n clearTimeout(that.earFn);\n clearTimeout(that.ear2Fn);\n // ear flick\n that.catPath_.ear2.setAttribute(\"fill-opacity\", \"0\");\n that.catPath_.ear.setAttribute(\"fill-opacity\", \"\");\n var bodyPath = that.catPath_.svgBody.getAttribute(\"d\");\n bodyPath = bodyPath.replace(LEFT_EAR_UP, LEFT_EAR_DOWN);\n bodyPath = bodyPath.replace(DEFINE_HAT_LEFT_EAR_UP, DEFINE_HAT_LEFT_EAR_DOWN);\n bodyPath = bodyPath.replace(RIGHT_EAR_DOWN, RIGHT_EAR_UP);\n bodyPath = bodyPath.replace(DEFINE_HAT_RIGHT_EAR_DOWN, DEFINE_HAT_RIGHT_EAR_UP);\n that.catPath_.svgBody.setAttribute(\"d\", bodyPath);\n\n // reset after a short delay\n that.ear2Fn = setTimeout(function () {\n that.catPath_.ear2.setAttribute(\"fill-opacity\", \"\");\n var bodyPath = that.catPath_.svgBody.getAttribute(\"d\");\n bodyPath = bodyPath.replace(LEFT_EAR_DOWN, LEFT_EAR_UP);\n bodyPath = bodyPath.replace(DEFINE_HAT_LEFT_EAR_DOWN, DEFINE_HAT_LEFT_EAR_UP);\n that.catPath_.svgBody.setAttribute(\"d\", bodyPath);\n }, 50);\n });\n if (this.RTL) {\n // Set to the correct initial position\n this.svgFace_.style.transform = \"translate(-87px, 0px)\";\n }\n if (this.shouldWatchMouse()) {\n this.windowListener = function (event) {\n var time = Date.now();\n if (time < that.lastCallTime + that.CALL_FREQUENCY_MS) return;\n that.lastCallTime = time;\n if (!that.shouldWatchMouse()) return;\n\n // mouse watching\n if (that.workspace) {\n // not disposed\n var xy = that.getCatFacePosition();\n var mouseLocation = {\n x: event.x / that.workspace.scale,\n y: event.y / that.workspace.scale,\n };\n\n var dx = mouseLocation.x - xy.x;\n var dy = mouseLocation.y - xy.y;\n var theta = Math.atan2(dx, dy);\n\n // Map the vector from the cat face to the mouse location to a much shorter\n // vector in the same direction, which will be the translation vector for\n // the cat face\n var delta = Math.sqrt(dx * dx + dy * dy);\n var scaleFactor = delta / (delta + 1);\n\n // Equation for radius of ellipse at theta for axes with length a and b\n var a = 2;\n var b = 5;\n var r = (a * b) / Math.sqrt(Math.pow(b * Math.cos(theta), 2) + Math.pow(a * Math.sin(theta), 2));\n\n // Convert polar coordinate back to x, y coordinate\n dx = r * scaleFactor * Math.sin(theta);\n dy = r * scaleFactor * Math.cos(theta);\n\n if (that.RTL) dx -= 87; // Translate face over\n that.svgFace_.style.transform = \"translate(\" + dx + \"px, \" + dy + \"px)\";\n }\n };\n document.addEventListener(\"mousemove\", this.windowListener);\n }\n };\n\n let workspacePositionRect = null;\n Blockly.BlockSvg.prototype.getCatFacePosition = function () {\n // getBoundingClientRect is not performant\n //var offset = that.workspace.getParentSvg().getBoundingClientRect();\n if (!workspacePositionRect) {\n workspacePositionRect = this.workspace.getParentSvg().getBoundingClientRect();\n }\n var offset = { x: workspacePositionRect.x, y: workspacePositionRect.y };\n\n if (!this.isInFlyout && this.workspace.getFlyout()) {\n offset.x += this.workspace.getFlyout().getWidth();\n }\n\n offset.x += this.workspace.scrollX;\n offset.y += this.workspace.scrollY;\n\n var xy = this.getRelativeToSurfaceXY(this.svgGroup_);\n if (this.RTL) {\n xy.x = this.workspace.getWidth() - xy.x - this.width;\n }\n // convert to workspace units\n xy.x += offset.x / this.workspace.scale;\n xy.y += offset.y / this.workspace.scale;\n // distance to center of face\n xy.x -= 43.5;\n xy.y -= 4;\n // flyout category offset\n xy.x += 60;\n if (this.RTL) {\n // We've been calculating from the right edge. Convert x to from left edge.\n xy.x = screen.width - xy.x;\n }\n return xy;\n };\n\n Blockly.BlockSvg.prototype.shouldWatchMouse = function () {\n if (!shouldWatchMouseCursor) return false;\n // if (window.vmLoadHigh || !window.CAT_CHASE_MOUSE) return false;\n var xy = this.getCatFacePosition();\n const MARGIN = 50;\n var blockXOnScreen = xy.x > -MARGIN && xy.x - MARGIN < screen.width / this.workspace.scale;\n var blockYOnScreen = xy.y > -MARGIN && xy.y - MARGIN < screen.height / this.workspace.scale;\n return this.startHat_ && !this.isGlowingStack_ && blockXOnScreen && blockYOnScreen;\n };\n\n const originalRenderDraw = Blockly.BlockSvg.prototype.renderDraw_;\n Blockly.BlockSvg.prototype.renderDraw_ = function (...args) {\n if (!this.svgFace_) {\n this.sa_catBlockConstructor();\n }\n const r = originalRenderDraw.call(this, ...args);\n if (this.output_ !== undefined || this.isInMutator) return r;\n if (!this.outputConnection && !this.previousConnection) {\n this.initCatStuff();\n }\n if (this.startHat_ && !this.svgFace_.firstChild) {\n this.renderCatFace_();\n }\n return r;\n };\n\n const originalDispose = Blockly.BlockSvg.prototype.dispose;\n Blockly.BlockSvg.prototype.dispose = function (...args) {\n clearTimeout(this.blinkFn);\n clearTimeout(this.earFn);\n clearTimeout(this.ear2Fn);\n if (this.windowListener) {\n document.removeEventListener(\"mousemove\", this.windowListener);\n }\n return originalDispose.call(this, ...args);\n };\n\n const originalSetGlowStack = Blockly.BlockSvg.prototype.setGlowStack;\n Blockly.BlockSvg.prototype.setGlowStack = function (isGlowingStack) {\n if (this.windowListener) {\n if (isGlowingStack) {\n // For performance, don't follow the mouse when the stack is glowing\n document.removeEventListener(\"mousemove\", this.windowListener);\n if (this.workspace && this.svgFace_.style) {\n // reset face direction\n if (this.RTL) {\n this.svgFace_.style.transform = \"translate(-87px, 0px)\";\n } else {\n this.svgFace_.style.transform = \"\";\n }\n }\n } else {\n document.addEventListener(\"mousemove\", this.windowListener);\n }\n }\n return originalSetGlowStack.call(this, isGlowingStack);\n };\n\n Blockly.BlockSvg.prototype.sa_catBlockConstructor = function () {\n this.catPath_ = Blockly.utils.createSvgElement(\"g\", {}, this.svgGroup_);\n\n this.svgFace_ = Blockly.utils.createSvgElement(\"g\", {}, this.catPath_);\n this.catPath_.svgFace = this.svgFace_;\n this.catPath_.svgBody = this.svgPath_;\n this.lastCallTime = 0;\n this.CALL_FREQUENCY_MS = 60;\n };\n\n const workspace = Blockly.getMainWorkspace();\n if (workspace) {\n const vm = addon.tab.traps.vm;\n if (vm.editingTarget) {\n vm.emitWorkspaceUpdate();\n }\n const flyout = workspace.getFlyout();\n if (flyout) {\n const flyoutWorkspace = flyout.getWorkspace();\n Blockly.Xml.clearWorkspaceAndLoadFromXml(Blockly.Xml.workspaceToDom(flyoutWorkspace), flyoutWorkspace);\n workspace.getToolbox().refreshSelection();\n workspace.toolboxRefreshEnabled_ = true;\n }\n }\n}"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACJA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AAEA;AAMA;AAKA;AACA;AAEA;AACA;AAMA;AACA;AAEA;AACA;AAMA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAWA;AAEA;AAMA;AAEA;AAMA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAHA;AAAA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AANA;AAAA;AAOA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-clones.js ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-clones"],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/clones/style.css":
4
+ /*!**********************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/clones/style.css ***!
6
+ \**********************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ var escape = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/url/escape.js */ "./node_modules/css-loader/lib/url/escape.js");
11
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
12
+ // imports
13
+
14
+
15
+ // module
16
+ exports.push([module.i, ".clone-container-container {\n display: none;\n align-items: center;\n padding: 0.25rem;\n user-select: none;\n color: #a065ff;\n}\n\n.clone-container {\n font-size: 0.625rem;\n font-weight: bold;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n white-space: nowrap;\n}\n\n.clone-icon {\n margin: 0.25rem;\n display: inline-block;\n background-image: url(" + escape(__webpack_require__(/*! ./cat.svg */ "./src/addons/addons/clones/cat.svg")) + ");\n height: 16px;\n width: 16px;\n}\n\n.clone-container-container[data-count=\"none\"] {\n display: none;\n}\n\n.clone-container-container[data-count=\"full\"] {\n color: #ff6680;\n}\n\n.clone-container-container[data-count=\"full\"] .clone-icon {\n background-image: url(" + escape(__webpack_require__(/*! ./300cats.svg */ "./src/addons/addons/clones/300cats.svg")) + ");\n}\n\n.clone-count::after {\n content: attr(data-str);\n}\n\n.sa-clones-small .clone-container-container {\n display: none !important;\n}\n", ""]);
17
+
18
+ // exports
19
+
20
+
21
+ /***/ }),
22
+
23
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/clones/300cats.svg":
24
+ /*!************************************************************************************!*\
25
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/clones/300cats.svg ***!
26
+ \************************************************************************************/
27
+ /*! exports provided: default */
28
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
29
+
30
+ "use strict";
31
+ __webpack_require__.r(__webpack_exports__);
32
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTS0xLTFoODAydjYwMkgtMXoiLz48ZyBmaWxsPSIjZmZkMWQ4Ij48Y2lyY2xlIGN5PSI4LjQ4NCIgY3g9IjcuNDE0IiByPSI0LjczMyIvPjxwYXRoIGQ9Im0zLjg0MyA2LjEuMjk2LTQuODMgMi4yMzYgNC4yNjVtMS40MTEtLjEwOEw5LjQuODY2bC45NzUgNC43MTYiIGZpbGwtb3BhY2l0eT0ibnVsbCIvPjwvZz48ZyBmaWxsPSIjZmY5MWEzIj48Y2lyY2xlIGN5PSI5LjEwNCIgY3g9IjcuOTg3IiByPSI0LjczMyIvPjxwYXRoIGQ9Im00LjQxNSA2LjcyLjI5Ni00LjgzIDIuMjM3IDQuMjY1bTEuNDEtLjEwOCAxLjYxNi00LjU2Ljk3NCA0LjcxNSIgZmlsbC1vcGFjaXR5PSJudWxsIi8+PC9nPjxnIGZpbGw9IiNmZjY2ODAiPjxjaXJjbGUgY3k9IjkuNDg2IiBjeD0iOC45NDEiIHI9IjQuNzMzIi8+PHBhdGggZD0ibTUuMzcgNy4xMDIuMjk1LTQuODMgMi4yMzcgNC4yNjVtMS40MS0uMTA3IDEuNjE2LTQuNTYyLjk3NCA0LjcxNiIgZmlsbC1vcGFjaXR5PSJudWxsIi8+PC9nPjwvc3ZnPg==");
33
+
34
+ /***/ }),
35
+
36
+ /***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/clones/cat.svg":
37
+ /*!********************************************************************************!*\
38
+ !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/clones/cat.svg ***!
39
+ \********************************************************************************/
40
+ /*! exports provided: default */
41
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
42
+
43
+ "use strict";
44
+ __webpack_require__.r(__webpack_exports__);
45
+ /* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTS0xLTFoODAydjYwMkgtMXoiLz48ZyBmaWxsPSIjZGNjOWZmIj48Y2lyY2xlIGN5PSI4LjQ4NCIgY3g9IjcuNDE0IiByPSI0LjczMyIvPjxwYXRoIGQ9Im0zLjg0MyA2LjEuMjk2LTQuODMgMi4yMzYgNC4yNjVtMS40MTEtLjEwOEw5LjQuODY2bC45NzUgNC43MTYiIGZpbGwtb3BhY2l0eT0ibnVsbCIvPjwvZz48ZyBmaWxsPSIjYmM5NmZmIj48Y2lyY2xlIGN5PSI5LjEwNCIgY3g9IjcuOTg3IiByPSI0LjczMyIvPjxwYXRoIGQ9Im00LjQxNSA2LjcyLjI5Ni00LjgzIDIuMjM3IDQuMjY1bTEuNDEtLjEwOCAxLjYxNi00LjU2Ljk3NCA0LjcxNSIgZmlsbC1vcGFjaXR5PSJudWxsIi8+PC9nPjxnIGZpbGw9IiNhMDY1ZmYiPjxjaXJjbGUgY3k9IjkuNDg2IiBjeD0iOC45NDEiIHI9IjQuNzMzIi8+PHBhdGggZD0ibTUuMzcgNy4xMDIuMjk1LTQuODMgMi4yMzcgNC4yNjVtMS40MS0uMTA3IDEuNjE2LTQuNTYyLjk3NCA0LjcxNiIgZmlsbC1vcGFjaXR5PSJudWxsIi8+PC9nPjwvc3ZnPg==");
46
+
47
+ /***/ }),
48
+
49
+ /***/ "./src/addons/addons/clones/300cats.svg":
50
+ /*!**********************************************!*\
51
+ !*** ./src/addons/addons/clones/300cats.svg ***!
52
+ \**********************************************/
53
+ /*! no static exports found */
54
+ /***/ (function(module, exports, __webpack_require__) {
55
+
56
+ module.exports = __webpack_require__.p + "static/assets/60fb267c5ab0c6f4ed9ab4a891ca7dd5.svg";
57
+
58
+ /***/ }),
59
+
60
+ /***/ "./src/addons/addons/clones/_runtime_entry.js":
61
+ /*!****************************************************!*\
62
+ !*** ./src/addons/addons/clones/_runtime_entry.js ***!
63
+ \****************************************************/
64
+ /*! exports provided: resources */
65
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
66
+
67
+ "use strict";
68
+ __webpack_require__.r(__webpack_exports__);
69
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
70
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/clones/userscript.js");
71
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./style.css */ "./node_modules/css-loader/index.js!./src/addons/addons/clones/style.css");
72
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__);
73
+ /* harmony import */ var _url_loader_300cats_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! url-loader!./300cats.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/clones/300cats.svg");
74
+ /* harmony import */ var _url_loader_cat_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! url-loader!./cat.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/clones/cat.svg");
75
+ /* generated by pull.js */
76
+
77
+
78
+
79
+
80
+ const resources = {
81
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"],
82
+ "style.css": _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default.a,
83
+ "300cats.svg": _url_loader_300cats_svg__WEBPACK_IMPORTED_MODULE_2__["default"],
84
+ "cat.svg": _url_loader_cat_svg__WEBPACK_IMPORTED_MODULE_3__["default"]
85
+ };
86
+
87
+ /***/ }),
88
+
89
+ /***/ "./src/addons/addons/clones/cat.svg":
90
+ /*!******************************************!*\
91
+ !*** ./src/addons/addons/clones/cat.svg ***!
92
+ \******************************************/
93
+ /*! no static exports found */
94
+ /***/ (function(module, exports, __webpack_require__) {
95
+
96
+ module.exports = __webpack_require__.p + "static/assets/8a30520407ffdf5b0e7e06e490db9c1d.svg";
97
+
98
+ /***/ }),
99
+
100
+ /***/ "./src/addons/addons/clones/userscript.js":
101
+ /*!************************************************!*\
102
+ !*** ./src/addons/addons/clones/userscript.js ***!
103
+ \************************************************/
104
+ /*! exports provided: default */
105
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
106
+
107
+ "use strict";
108
+ __webpack_require__.r(__webpack_exports__);
109
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
110
+ let {
111
+ addon,
112
+ console,
113
+ msg
114
+ } = _ref;
115
+ const vm = addon.tab.traps.vm;
116
+ let showIconOnly = addon.settings.get("showicononly");
117
+ if (addon.tab.redux.state && addon.tab.redux.state.scratchGui.stageSize.stageSize === "small") {
118
+ document.body.classList.add("sa-clones-small");
119
+ }
120
+ document.addEventListener("click", e => {
121
+ if (e.target.closest("[class*='stage-header_stage-button-first']")) {
122
+ document.body.classList.add("sa-clones-small");
123
+ } else if (e.target.closest("[class*='stage-header_stage-button-last']")) {
124
+ document.body.classList.remove("sa-clones-small");
125
+ }
126
+ }, {
127
+ capture: true
128
+ });
129
+ let countContainerContainer = document.createElement("div");
130
+ addon.tab.displayNoneWhileDisabled(countContainerContainer);
131
+ let countContainer = document.createElement("div");
132
+ let count = document.createElement("span");
133
+ let icon = document.createElement("span");
134
+ countContainerContainer.className = "clone-container-container";
135
+ countContainer.className = "clone-container";
136
+ count.className = "clone-count";
137
+ icon.className = "clone-icon";
138
+ countContainerContainer.appendChild(icon);
139
+ countContainerContainer.appendChild(countContainer);
140
+ countContainer.appendChild(count);
141
+ let lastChecked = 0;
142
+ const cache = Array(301).fill().map((_, i) => msg("clones", {
143
+ cloneCount: i
144
+ }));
145
+ function doCloneChecks(force) {
146
+ const v = vm.runtime._cloneCounter;
147
+ // performance
148
+ if (v === lastChecked && !force) return;
149
+ lastChecked = v;
150
+ if (v === 0) {
151
+ countContainerContainer.dataset.count = "none";
152
+ } else if (v >= vm.runtime.runtimeOptions.maxClones) {
153
+ countContainerContainer.dataset.count = "full";
154
+ } else {
155
+ countContainerContainer.dataset.count = "";
156
+ }
157
+ if (showIconOnly) {
158
+ count.dataset.str = v;
159
+ } else {
160
+ count.dataset.str = cache[v] || msg("clones", {
161
+ cloneCount: v
162
+ });
163
+ }
164
+ if (v === 0) countContainerContainer.style.display = "none";else countContainerContainer.style.display = "flex";
165
+ }
166
+ addon.settings.addEventListener("change", () => {
167
+ showIconOnly = addon.settings.get("showicononly");
168
+ doCloneChecks(true);
169
+ });
170
+ const oldStep = vm.runtime._step;
171
+ vm.runtime._step = function () {
172
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
173
+ args[_key] = arguments[_key];
174
+ }
175
+ const ret = oldStep.call(this, ...args);
176
+ doCloneChecks();
177
+ return ret;
178
+ };
179
+
180
+ /*
181
+ if (addon.self.enabledLate) {
182
+ // Clone count might be inaccurate if the user deleted sprites
183
+ // before enabling the addon
184
+ let count = 0;
185
+ for (let target of vm.runtime.targets) {
186
+ if (!target.isOriginal) ++count;
187
+ }
188
+ vm.runtime._cloneCounter = count;
189
+ }
190
+ */
191
+
192
+ while (true) {
193
+ await addon.tab.waitForElement('[class*="controls_controls-container"]', {
194
+ markAsSeen: true,
195
+ reduxEvents: ["scratch-gui/mode/SET_PLAYER", "fontsLoaded/SET_FONTS_LOADED", "scratch-gui/locales/SELECT_LOCALE"]
196
+ });
197
+ if (addon.tab.editorMode === "editor" || addon.tab.redux.state.scratchGui.mode.isEmbedded) {
198
+ addon.tab.appendToSharedSpace({
199
+ space: "afterStopButton",
200
+ element: countContainerContainer,
201
+ order: 2
202
+ });
203
+ }
204
+ }
205
+ });
206
+
207
+ /***/ })
208
+
209
+ }]);
210
+ //# sourceMappingURL=addon-entry-clones.js.map
js/addon-entry-clones.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-clones.js","sources":["webpack://GUI/./src/addons/addons/clones/style.css","webpack://GUI/./src/addons/addons/clones/300cats.svg","webpack://GUI/./src/addons/addons/clones/cat.svg","webpack://GUI/./src/addons/addons/clones/300cats.svg?533e","webpack://GUI/./src/addons/addons/clones/_runtime_entry.js","webpack://GUI/./src/addons/addons/clones/cat.svg?ffb3","webpack://GUI/./src/addons/addons/clones/userscript.js"],"sourcesContent":["var escape = require(\"../../../../node_modules/css-loader/lib/url/escape.js\");\nexports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".clone-container-container {\\n display: none;\\n align-items: center;\\n padding: 0.25rem;\\n user-select: none;\\n color: #a065ff;\\n}\\n\\n.clone-container {\\n font-size: 0.625rem;\\n font-weight: bold;\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n white-space: nowrap;\\n}\\n\\n.clone-icon {\\n margin: 0.25rem;\\n display: inline-block;\\n background-image: url(\" + escape(require(\"./cat.svg\")) + \");\\n height: 16px;\\n width: 16px;\\n}\\n\\n.clone-container-container[data-count=\\\"none\\\"] {\\n display: none;\\n}\\n\\n.clone-container-container[data-count=\\\"full\\\"] {\\n color: #ff6680;\\n}\\n\\n.clone-container-container[data-count=\\\"full\\\"] .clone-icon {\\n background-image: url(\" + escape(require(\"./300cats.svg\")) + \");\\n}\\n\\n.clone-count::after {\\n content: attr(data-str);\\n}\\n\\n.sa-clones-small .clone-container-container {\\n display: none !important;\\n}\\n\", \"\"]);\n\n// exports\n","export default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTS0xLTFoODAydjYwMkgtMXoiLz48ZyBmaWxsPSIjZmZkMWQ4Ij48Y2lyY2xlIGN5PSI4LjQ4NCIgY3g9IjcuNDE0IiByPSI0LjczMyIvPjxwYXRoIGQ9Im0zLjg0MyA2LjEuMjk2LTQuODMgMi4yMzYgNC4yNjVtMS40MTEtLjEwOEw5LjQuODY2bC45NzUgNC43MTYiIGZpbGwtb3BhY2l0eT0ibnVsbCIvPjwvZz48ZyBmaWxsPSIjZmY5MWEzIj48Y2lyY2xlIGN5PSI5LjEwNCIgY3g9IjcuOTg3IiByPSI0LjczMyIvPjxwYXRoIGQ9Im00LjQxNSA2LjcyLjI5Ni00LjgzIDIuMjM3IDQuMjY1bTEuNDEtLjEwOCAxLjYxNi00LjU2Ljk3NCA0LjcxNSIgZmlsbC1vcGFjaXR5PSJudWxsIi8+PC9nPjxnIGZpbGw9IiNmZjY2ODAiPjxjaXJjbGUgY3k9IjkuNDg2IiBjeD0iOC45NDEiIHI9IjQuNzMzIi8+PHBhdGggZD0ibTUuMzcgNy4xMDIuMjk1LTQuODMgMi4yMzcgNC4yNjVtMS40MS0uMTA3IDEuNjE2LTQuNTYyLjk3NCA0LjcxNiIgZmlsbC1vcGFjaXR5PSJudWxsIi8+PC9nPjwvc3ZnPg==\"","export default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTS0xLTFoODAydjYwMkgtMXoiLz48ZyBmaWxsPSIjZGNjOWZmIj48Y2lyY2xlIGN5PSI4LjQ4NCIgY3g9IjcuNDE0IiByPSI0LjczMyIvPjxwYXRoIGQ9Im0zLjg0MyA2LjEuMjk2LTQuODMgMi4yMzYgNC4yNjVtMS40MTEtLjEwOEw5LjQuODY2bC45NzUgNC43MTYiIGZpbGwtb3BhY2l0eT0ibnVsbCIvPjwvZz48ZyBmaWxsPSIjYmM5NmZmIj48Y2lyY2xlIGN5PSI5LjEwNCIgY3g9IjcuOTg3IiByPSI0LjczMyIvPjxwYXRoIGQ9Im00LjQxNSA2LjcyLjI5Ni00LjgzIDIuMjM3IDQuMjY1bTEuNDEtLjEwOCAxLjYxNi00LjU2Ljk3NCA0LjcxNSIgZmlsbC1vcGFjaXR5PSJudWxsIi8+PC9nPjxnIGZpbGw9IiNhMDY1ZmYiPjxjaXJjbGUgY3k9IjkuNDg2IiBjeD0iOC45NDEiIHI9IjQuNzMzIi8+PHBhdGggZD0ibTUuMzcgNy4xMDIuMjk1LTQuODMgMi4yMzcgNC4yNjVtMS40MS0uMTA3IDEuNjE2LTQuNTYyLjk3NCA0LjcxNiIgZmlsbC1vcGFjaXR5PSJudWxsIi8+PC9nPjwvc3ZnPg==\"","module.exports = __webpack_public_path__ + \"static/assets/60fb267c5ab0c6f4ed9ab4a891ca7dd5.svg\";","/* generated by pull.js */\nimport _js from \"./userscript.js\";\nimport _css from \"!css-loader!./style.css\";\nimport _asset from \"!url-loader!./300cats.svg\";\nimport _asset2 from \"!url-loader!./cat.svg\";\nexport const resources = {\n \"userscript.js\": _js,\n \"style.css\": _css,\n \"300cats.svg\": _asset,\n \"cat.svg\": _asset2,\n};\n","module.exports = __webpack_public_path__ + \"static/assets/8a30520407ffdf5b0e7e06e490db9c1d.svg\";","export default async function ({ addon, console, msg }) {\n const vm = addon.tab.traps.vm;\n\n let showIconOnly = addon.settings.get(\"showicononly\");\n\n if (addon.tab.redux.state && addon.tab.redux.state.scratchGui.stageSize.stageSize === \"small\") {\n document.body.classList.add(\"sa-clones-small\");\n }\n document.addEventListener(\n \"click\",\n (e) => {\n if (e.target.closest(\"[class*='stage-header_stage-button-first']\")) {\n document.body.classList.add(\"sa-clones-small\");\n } else if (e.target.closest(\"[class*='stage-header_stage-button-last']\")) {\n document.body.classList.remove(\"sa-clones-small\");\n }\n },\n { capture: true }\n );\n\n let countContainerContainer = document.createElement(\"div\");\n addon.tab.displayNoneWhileDisabled(countContainerContainer);\n\n let countContainer = document.createElement(\"div\");\n let count = document.createElement(\"span\");\n let icon = document.createElement(\"span\");\n\n countContainerContainer.className = \"clone-container-container\";\n countContainer.className = \"clone-container\";\n count.className = \"clone-count\";\n icon.className = \"clone-icon\";\n\n countContainerContainer.appendChild(icon);\n countContainerContainer.appendChild(countContainer);\n countContainer.appendChild(count);\n\n let lastChecked = 0;\n\n const cache = Array(301)\n .fill()\n .map((_, i) => msg(\"clones\", { cloneCount: i }));\n\n function doCloneChecks(force) {\n const v = vm.runtime._cloneCounter;\n // performance\n if (v === lastChecked && !force) return;\n lastChecked = v;\n if (v === 0) {\n countContainerContainer.dataset.count = \"none\";\n } else if (v >= vm.runtime.runtimeOptions.maxClones) {\n countContainerContainer.dataset.count = \"full\";\n } else {\n countContainerContainer.dataset.count = \"\";\n }\n if (showIconOnly) {\n count.dataset.str = v;\n } else {\n count.dataset.str = cache[v] || msg(\"clones\", { cloneCount: v });\n }\n\n if (v === 0) countContainerContainer.style.display = \"none\";\n else countContainerContainer.style.display = \"flex\";\n }\n\n addon.settings.addEventListener(\"change\", () => {\n showIconOnly = addon.settings.get(\"showicononly\");\n doCloneChecks(true);\n });\n\n const oldStep = vm.runtime._step;\n vm.runtime._step = function (...args) {\n const ret = oldStep.call(this, ...args);\n doCloneChecks();\n return ret;\n };\n\n /*\n if (addon.self.enabledLate) {\n // Clone count might be inaccurate if the user deleted sprites\n // before enabling the addon\n let count = 0;\n for (let target of vm.runtime.targets) {\n if (!target.isOriginal) ++count;\n }\n vm.runtime._cloneCounter = count;\n }\n */\n\n while (true) {\n await addon.tab.waitForElement('[class*=\"controls_controls-container\"]', {\n markAsSeen: true,\n reduxEvents: [\"scratch-gui/mode/SET_PLAYER\", \"fontsLoaded/SET_FONTS_LOADED\", \"scratch-gui/locales/SELECT_LOCALE\"],\n });\n\n if (addon.tab.editorMode === \"editor\" || addon.tab.redux.state.scratchGui.mode.isEmbedded) {\n addon.tab.appendToSharedSpace({ space: \"afterStopButton\", element: countContainerContainer, order: 2 });\n }\n }\n}"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACRA;AAAA;;;;;;;;;;;;ACAA;AAAA;;;;;;;;;;;ACAA;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACVA;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-columns.js ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-columns"],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/columns/style.css":
4
+ /*!***********************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/columns/style.css ***!
6
+ \***********************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
11
+ // imports
12
+
13
+
14
+ // module
15
+ exports.push([module.i, "[class*=\"blocks_blocks_\"] .blocklyToolboxDiv {\n width: 310px;\n height: auto !important;\n}\n\n.scratchCategoryMenu {\n width: 100%;\n columns: 2;\n column-gap: 0.5rem;\n padding: 0.25rem;\n}\n\n.scratchCategorySecondMenu {\n columns: 1;\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n padding-bottom: 2.25rem;\n}\n\n.scratchCategorySecondMenu:empty {\n padding-top: 0;\n padding-bottom: 2rem;\n}\n\n.scratchCategoryMenuItem {\n display: inline-flex; /* inline so that it isn't split between both columns */\n width: 100%;\n padding: 0.25rem;\n border-radius: 0.875rem;\n}\n\n.scratchCategoryItemBubble,\n.scratchCategoryItemIcon {\n margin: 0;\n margin-inline-end: 0.5rem;\n}\n\n.scratchCategoryMenuItemLabel {\n flex: 1;\n display: flex;\n align-items: center;\n}\n\n[class*=\"gui_extension-button-container_\"] {\n top: var(--sa-add-extension-button-y);\n bottom: auto;\n margin-inline-start: 0.5rem;\n width: calc(308px - 1rem);\n height: calc(1.75rem - 2px);\n background-color: transparent;\n border-color: var(--ui-black-transparent, rgba(0, 0, 0, 0.15));\n}\n\n/* [dir] is for specificity to override editor-stage-left */\n[dir] [class*=\"gui_extension-button-container_\"] {\n border-radius: 0.25rem;\n}\n\n[class*=\"gui_extension-button-container_\"]:hover {\n background-color: var(--ui-tertiary, white);\n}\n\n[class*=\"gui_extension-button-container_\"]::before {\n display: none;\n}\n\n[class*=\"gui_extension-button_\"] {\n display: flex;\n align-items: center;\n padding-inline: 0;\n}\n\n[class*=\"gui_extension-button-icon_\"] {\n filter: var(--editorDarkMode-categoryMenu-invertedFilter, brightness(0.4));\n}\n\n[class*=\"gui_extension-button-container_\"]:hover [class*=\"gui_extension-button-icon_\"] {\n filter: var(--editorDarkMode-accent-invertedFilter, brightness(0.4));\n}\n[theme=\"dark\"] [class*=\"gui_extension-button-icon_\"] {\n filter: none !important;\n}\n\n.sa-add-extension-label {\n color: var(--text-primary, #575e75);\n font-size: 0.65rem;\n}\n\n[class*=\"gui_extension-button-container_\"]:hover .sa-add-extension-label {\n color: var(--text-primary, #575e75);\n font-size: 0.65rem;\n}\n\n/* hide-flyout compatibility */\n\n[class*=\"gui_tabs_\"] {\n --sa-flyout-width: 310px;\n --sa-category-width: 0;\n}\n\n.sa-flyout-placeHolder {\n top: calc(var(--sa-flyout-y));\n}\n", ""]);
16
+
17
+ // exports
18
+
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/columns/_runtime_entry.js":
23
+ /*!*****************************************************!*\
24
+ !*** ./src/addons/addons/columns/_runtime_entry.js ***!
25
+ \*****************************************************/
26
+ /*! exports provided: resources */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
32
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/columns/userscript.js");
33
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./style.css */ "./node_modules/css-loader/index.js!./src/addons/addons/columns/style.css");
34
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__);
35
+ /* generated by pull.js */
36
+
37
+
38
+ const resources = {
39
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"],
40
+ "style.css": _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default.a
41
+ };
42
+
43
+ /***/ }),
44
+
45
+ /***/ "./src/addons/addons/columns/userscript.js":
46
+ /*!*************************************************!*\
47
+ !*** ./src/addons/addons/columns/userscript.js ***!
48
+ \*************************************************/
49
+ /*! exports provided: default */
50
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
51
+
52
+ "use strict";
53
+ __webpack_require__.r(__webpack_exports__);
54
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
55
+ let {
56
+ addon,
57
+ msg,
58
+ console
59
+ } = _ref;
60
+ const Blockly = await addon.tab.traps.getBlockly();
61
+
62
+ // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L235
63
+ const _ToolboxPosition = Blockly.Toolbox.prototype.position;
64
+ Blockly.Toolbox.prototype.position = function () {
65
+ _ToolboxPosition.call(this);
66
+
67
+ // Update flyout position when category menu height changes.
68
+ if (this.HtmlDiv && !this.HtmlDiv._observer) {
69
+ this.HtmlDiv._observer = new ResizeObserver(() => {
70
+ this.flyout_.position();
71
+ });
72
+ this.HtmlDiv._observer.observe(this.HtmlDiv);
73
+ }
74
+ };
75
+
76
+ // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/flyout_vertical.js#L314
77
+ const _VerticalFlyoutPosition = Blockly.VerticalFlyout.prototype.position;
78
+ Blockly.VerticalFlyout.prototype.position = function () {
79
+ _VerticalFlyoutPosition.call(this);
80
+ if (addon.self.disabled || !this.isVisible()) {
81
+ return;
82
+ }
83
+ var targetWorkspaceMetrics = this.targetWorkspace_.getMetrics();
84
+ if (!targetWorkspaceMetrics) {
85
+ // Hidden components will return null.
86
+ return;
87
+ }
88
+
89
+ // In RTL, subtract the total width of left and right workspace borders and the category menu border
90
+ // from the workspace width.
91
+ var x = this.toolboxPosition_ === Blockly.TOOLBOX_AT_RIGHT ? targetWorkspaceMetrics.viewWidth - 3 : 0;
92
+ var y = this.parentToolbox_.HtmlDiv.offsetHeight;
93
+
94
+ // Addon sets the width of the flyout to the width of the toolbox.
95
+ this.width_ = this.parentToolbox_.getWidth();
96
+ this.height_ = Math.max(0, targetWorkspaceMetrics.viewHeight - y);
97
+ this.setBackgroundPath_(this.width_, this.height_);
98
+ this.svgGroup_.setAttribute("width", this.width_);
99
+ this.svgGroup_.setAttribute("height", this.height_);
100
+ var transform = "translate(" + x + "px," + y + "px)";
101
+ Blockly.utils.setCssTransform(this.svgGroup_, transform);
102
+
103
+ // Update the scrollbar (if one exists).
104
+ if (this.scrollbar_) {
105
+ // Set the scrollbars origin to be the top left of the flyout.
106
+ this.scrollbar_.setOrigin(x + (this.toolboxPosition_ === Blockly.TOOLBOX_AT_RIGHT ? 0 : this.width_ - this.getWidth()), y);
107
+ this.scrollbar_.resize();
108
+ }
109
+
110
+ // Set CSS variables for the userstyle.
111
+ const container = this.svgGroup_.closest("[class*='gui_tab-panel_']");
112
+ container.style.setProperty("--sa-add-extension-button-y", "".concat(y - 33, "px"));
113
+ container.parentElement.style.setProperty("--sa-flyout-y", "".concat(y, "px"));
114
+ };
115
+
116
+ // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/flyout_base.js#L370
117
+ const _VerticalFlyoutGetWidth = Blockly.VerticalFlyout.prototype.getWidth;
118
+ Blockly.VerticalFlyout.prototype.getWidth = function () {
119
+ // In RTL, this will be called by Blockly to position blocks inside the flyout.
120
+ let width = _VerticalFlyoutGetWidth.call(this);
121
+ if (!addon.self.disabled) width += 60;
122
+ return width;
123
+ };
124
+
125
+ // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L595
126
+ const _CategoryMenuCreateDom = Blockly.Toolbox.CategoryMenu.prototype.createDom;
127
+ Blockly.Toolbox.CategoryMenu.prototype.createDom = function () {
128
+ _CategoryMenuCreateDom.call(this);
129
+ if (addon.self.disabled) return;
130
+ this.secondTable = document.createElement("div");
131
+ this.secondTable.className = "scratchCategorySecondMenu " + (this.parent_.horizontalLayout_ ? "scratchCategoryMenuHorizontal" : "scratchCategoryMenu");
132
+ this.parentHtml_.appendChild(this.secondTable);
133
+ };
134
+
135
+ // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L606
136
+ const _CategoryMenuPopulate = Blockly.Toolbox.CategoryMenu.prototype.populate;
137
+ Blockly.Toolbox.CategoryMenu.prototype.populate = function (domTree) {
138
+ if (!domTree) return;
139
+ const Categories = ["motion", "looks", "sound", "events", "control", "sensing", "operators", "variables", "lists", "myBlocks"];
140
+ const extensionsNodes = [];
141
+ const extensionTree = domTree.cloneNode(true);
142
+ if (!addon.self.disabled) {
143
+ extensionTree.childNodes.forEach(child => {
144
+ if (child.tagName === "category" && !Categories.includes(child.id)) {
145
+ extensionsNodes.push(child.cloneNode(true));
146
+ child.remove();
147
+ }
148
+ });
149
+ }
150
+ _CategoryMenuPopulate.call(this, extensionTree);
151
+ for (const child of extensionsNodes) {
152
+ const row = document.createElement("div");
153
+ row.className = "scratchCategoryMenuRow";
154
+ this.secondTable.appendChild(row);
155
+ if (child) {
156
+ this.categories_.push(new Blockly.Toolbox.Category(this, row, child));
157
+ }
158
+ }
159
+ if (!addon.self.disabled) {
160
+ this.height_ = this.table.offsetHeight + this.secondTable.offsetHeight;
161
+ }
162
+ };
163
+
164
+ // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L639
165
+ const _CategoryMenuDispose = Blockly.Toolbox.CategoryMenu.prototype.dispose;
166
+ Blockly.Toolbox.CategoryMenu.prototype.dispose = function () {
167
+ _CategoryMenuDispose.call(this);
168
+ if (this.secondTable) {
169
+ this.secondTable.remove();
170
+ this.secondTable = null;
171
+ }
172
+ };
173
+ function updateToolbox() {
174
+ const workspace = Blockly.getMainWorkspace();
175
+ const toolbox = workspace.getToolbox();
176
+ if (!toolbox) return;
177
+ const categoryMenu = toolbox.categoryMenu_;
178
+ if (!categoryMenu) return;
179
+
180
+ // Scratch may have already updated the toolbox for us, so no need to update it again.
181
+ if (categoryMenu.secondTable && !addon.self.disabled) return;
182
+ // Must dispose and createDom the category menu so we can run our polluted commands.
183
+ categoryMenu.dispose();
184
+ categoryMenu.createDom();
185
+ // Repopulate the category menu since we've just disposed it.
186
+ toolbox.populate_(workspace.options.languageTree);
187
+ // Reposition the toolbox, since it's likely our addon moved it.
188
+ toolbox.position();
189
+ }
190
+ updateToolbox();
191
+ addon.self.addEventListener("disabled", updateToolbox);
192
+ addon.self.addEventListener("reenabled", updateToolbox);
193
+ while (true) {
194
+ const addExtensionButton = await addon.tab.waitForElement("[class*='gui_extension-button_']", {
195
+ markAsSeen: true,
196
+ reduxEvents: ["scratch-gui/mode/SET_PLAYER", "fontsLoaded/SET_FONTS_LOADED", "scratch-gui/locales/SELECT_LOCALE"],
197
+ condition: () => !addon.tab.redux.state.scratchGui.mode.isPlayerOnly
198
+ });
199
+ const addExtensionLabel = Object.assign(document.createElement("span"), {
200
+ className: "sa-add-extension-label",
201
+ innerText: addon.tab.scratchMessage("gui.gui.addExtension")
202
+ });
203
+ addon.tab.displayNoneWhileDisabled(addExtensionLabel);
204
+ addExtensionButton.appendChild(addExtensionLabel);
205
+ addExtensionButton.removeAttribute("title");
206
+ }
207
+ });
208
+
209
+ /***/ })
210
+
211
+ }]);
212
+ //# sourceMappingURL=addon-entry-columns.js.map
js/addon-entry-columns.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-columns.js","sources":["webpack://GUI/./src/addons/addons/columns/style.css","webpack://GUI/./src/addons/addons/columns/_runtime_entry.js","webpack://GUI/./src/addons/addons/columns/userscript.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"[class*=\\\"blocks_blocks_\\\"] .blocklyToolboxDiv {\\n width: 310px;\\n height: auto !important;\\n}\\n\\n.scratchCategoryMenu {\\n width: 100%;\\n columns: 2;\\n column-gap: 0.5rem;\\n padding: 0.25rem;\\n}\\n\\n.scratchCategorySecondMenu {\\n columns: 1;\\n display: grid;\\n grid-template-columns: repeat(2, 1fr);\\n padding-bottom: 2.25rem;\\n}\\n\\n.scratchCategorySecondMenu:empty {\\n padding-top: 0;\\n padding-bottom: 2rem;\\n}\\n\\n.scratchCategoryMenuItem {\\n display: inline-flex; /* inline so that it isn't split between both columns */\\n width: 100%;\\n padding: 0.25rem;\\n border-radius: 0.875rem;\\n}\\n\\n.scratchCategoryItemBubble,\\n.scratchCategoryItemIcon {\\n margin: 0;\\n margin-inline-end: 0.5rem;\\n}\\n\\n.scratchCategoryMenuItemLabel {\\n flex: 1;\\n display: flex;\\n align-items: center;\\n}\\n\\n[class*=\\\"gui_extension-button-container_\\\"] {\\n top: var(--sa-add-extension-button-y);\\n bottom: auto;\\n margin-inline-start: 0.5rem;\\n width: calc(308px - 1rem);\\n height: calc(1.75rem - 2px);\\n background-color: transparent;\\n border-color: var(--ui-black-transparent, rgba(0, 0, 0, 0.15));\\n}\\n\\n/* [dir] is for specificity to override editor-stage-left */\\n[dir] [class*=\\\"gui_extension-button-container_\\\"] {\\n border-radius: 0.25rem;\\n}\\n\\n[class*=\\\"gui_extension-button-container_\\\"]:hover {\\n background-color: var(--ui-tertiary, white);\\n}\\n\\n[class*=\\\"gui_extension-button-container_\\\"]::before {\\n display: none;\\n}\\n\\n[class*=\\\"gui_extension-button_\\\"] {\\n display: flex;\\n align-items: center;\\n padding-inline: 0;\\n}\\n\\n[class*=\\\"gui_extension-button-icon_\\\"] {\\n filter: var(--editorDarkMode-categoryMenu-invertedFilter, brightness(0.4));\\n}\\n\\n[class*=\\\"gui_extension-button-container_\\\"]:hover [class*=\\\"gui_extension-button-icon_\\\"] {\\n filter: var(--editorDarkMode-accent-invertedFilter, brightness(0.4));\\n}\\n[theme=\\\"dark\\\"] [class*=\\\"gui_extension-button-icon_\\\"] {\\n filter: none !important;\\n}\\n\\n.sa-add-extension-label {\\n color: var(--text-primary, #575e75);\\n font-size: 0.65rem;\\n}\\n\\n[class*=\\\"gui_extension-button-container_\\\"]:hover .sa-add-extension-label {\\n color: var(--text-primary, #575e75);\\n font-size: 0.65rem;\\n}\\n\\n/* hide-flyout compatibility */\\n\\n[class*=\\\"gui_tabs_\\\"] {\\n --sa-flyout-width: 310px;\\n --sa-category-width: 0;\\n}\\n\\n.sa-flyout-placeHolder {\\n top: calc(var(--sa-flyout-y));\\n}\\n\", \"\"]);\n\n// exports\n","/* generated by pull.js */\nimport _js from \"./userscript.js\";\nimport _css from \"!css-loader!./style.css\";\nexport const resources = {\n \"userscript.js\": _js,\n \"style.css\": _css,\n};\n","export default async function ({ addon, msg, console }) {\n const Blockly = await addon.tab.traps.getBlockly();\n\n // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L235\n const _ToolboxPosition = Blockly.Toolbox.prototype.position;\n Blockly.Toolbox.prototype.position = function () {\n _ToolboxPosition.call(this);\n\n // Update flyout position when category menu height changes.\n if (this.HtmlDiv && !this.HtmlDiv._observer) {\n this.HtmlDiv._observer = new ResizeObserver(() => {\n this.flyout_.position();\n });\n this.HtmlDiv._observer.observe(this.HtmlDiv);\n }\n };\n\n // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/flyout_vertical.js#L314\n const _VerticalFlyoutPosition = Blockly.VerticalFlyout.prototype.position;\n Blockly.VerticalFlyout.prototype.position = function () {\n _VerticalFlyoutPosition.call(this);\n if (addon.self.disabled || !this.isVisible()) {\n return;\n }\n var targetWorkspaceMetrics = this.targetWorkspace_.getMetrics();\n if (!targetWorkspaceMetrics) {\n // Hidden components will return null.\n return;\n }\n\n // In RTL, subtract the total width of left and right workspace borders and the category menu border\n // from the workspace width.\n var x = this.toolboxPosition_ === Blockly.TOOLBOX_AT_RIGHT ? targetWorkspaceMetrics.viewWidth - 3 : 0;\n var y = this.parentToolbox_.HtmlDiv.offsetHeight;\n\n // Addon sets the width of the flyout to the width of the toolbox.\n this.width_ = this.parentToolbox_.getWidth();\n this.height_ = Math.max(0, targetWorkspaceMetrics.viewHeight - y);\n\n this.setBackgroundPath_(this.width_, this.height_);\n\n this.svgGroup_.setAttribute(\"width\", this.width_);\n this.svgGroup_.setAttribute(\"height\", this.height_);\n var transform = \"translate(\" + x + \"px,\" + y + \"px)\";\n Blockly.utils.setCssTransform(this.svgGroup_, transform);\n\n // Update the scrollbar (if one exists).\n if (this.scrollbar_) {\n // Set the scrollbars origin to be the top left of the flyout.\n this.scrollbar_.setOrigin(\n x + (this.toolboxPosition_ === Blockly.TOOLBOX_AT_RIGHT ? 0 : this.width_ - this.getWidth()),\n y\n );\n this.scrollbar_.resize();\n }\n\n // Set CSS variables for the userstyle.\n const container = this.svgGroup_.closest(\"[class*='gui_tab-panel_']\");\n container.style.setProperty(\"--sa-add-extension-button-y\", `${y - 33}px`);\n container.parentElement.style.setProperty(\"--sa-flyout-y\", `${y}px`);\n };\n\n // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/flyout_base.js#L370\n const _VerticalFlyoutGetWidth = Blockly.VerticalFlyout.prototype.getWidth;\n Blockly.VerticalFlyout.prototype.getWidth = function () {\n // In RTL, this will be called by Blockly to position blocks inside the flyout.\n let width = _VerticalFlyoutGetWidth.call(this);\n if (!addon.self.disabled) width += 60;\n return width;\n };\n\n // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L595\n const _CategoryMenuCreateDom = Blockly.Toolbox.CategoryMenu.prototype.createDom;\n Blockly.Toolbox.CategoryMenu.prototype.createDom = function () {\n _CategoryMenuCreateDom.call(this);\n if (addon.self.disabled) return;\n this.secondTable = document.createElement(\"div\");\n this.secondTable.className =\n \"scratchCategorySecondMenu \" +\n (this.parent_.horizontalLayout_ ? \"scratchCategoryMenuHorizontal\" : \"scratchCategoryMenu\");\n this.parentHtml_.appendChild(this.secondTable);\n };\n\n // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L606\n const _CategoryMenuPopulate = Blockly.Toolbox.CategoryMenu.prototype.populate;\n Blockly.Toolbox.CategoryMenu.prototype.populate = function (domTree) {\n if (!domTree) return;\n\n const Categories = [\n \"motion\",\n \"looks\",\n \"sound\",\n \"events\",\n \"control\",\n \"sensing\",\n \"operators\",\n \"variables\",\n \"lists\",\n \"myBlocks\",\n ];\n const extensionsNodes = [];\n const extensionTree = domTree.cloneNode(true);\n if (!addon.self.disabled) {\n extensionTree.childNodes.forEach((child) => {\n if (child.tagName === \"category\" && !Categories.includes(child.id)) {\n extensionsNodes.push(child.cloneNode(true));\n child.remove();\n }\n });\n }\n _CategoryMenuPopulate.call(this, extensionTree);\n for (const child of extensionsNodes) {\n const row = document.createElement(\"div\");\n row.className = \"scratchCategoryMenuRow\";\n this.secondTable.appendChild(row);\n if (child) {\n this.categories_.push(new Blockly.Toolbox.Category(this, row, child));\n }\n }\n if (!addon.self.disabled) {\n this.height_ = this.table.offsetHeight + this.secondTable.offsetHeight;\n }\n };\n\n // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L639\n const _CategoryMenuDispose = Blockly.Toolbox.CategoryMenu.prototype.dispose;\n Blockly.Toolbox.CategoryMenu.prototype.dispose = function () {\n _CategoryMenuDispose.call(this);\n if (this.secondTable) {\n this.secondTable.remove();\n this.secondTable = null;\n }\n };\n\n function updateToolbox() {\n const workspace = Blockly.getMainWorkspace();\n const toolbox = workspace.getToolbox();\n if (!toolbox) return;\n const categoryMenu = toolbox.categoryMenu_;\n if (!categoryMenu) return;\n\n // Scratch may have already updated the toolbox for us, so no need to update it again.\n if (categoryMenu.secondTable && !addon.self.disabled) return;\n // Must dispose and createDom the category menu so we can run our polluted commands.\n categoryMenu.dispose();\n categoryMenu.createDom();\n // Repopulate the category menu since we've just disposed it.\n toolbox.populate_(workspace.options.languageTree);\n // Reposition the toolbox, since it's likely our addon moved it.\n toolbox.position();\n }\n\n updateToolbox();\n addon.self.addEventListener(\"disabled\", updateToolbox);\n addon.self.addEventListener(\"reenabled\", updateToolbox);\n\n while (true) {\n const addExtensionButton = await addon.tab.waitForElement(\"[class*='gui_extension-button_']\", {\n markAsSeen: true,\n reduxEvents: [\"scratch-gui/mode/SET_PLAYER\", \"fontsLoaded/SET_FONTS_LOADED\", \"scratch-gui/locales/SELECT_LOCALE\"],\n condition: () => !addon.tab.redux.state.scratchGui.mode.isPlayerOnly,\n });\n const addExtensionLabel = Object.assign(document.createElement(\"span\"), {\n className: \"sa-add-extension-label\",\n innerText: addon.tab.scratchMessage(\"gui.gui.addExtension\"),\n });\n addon.tab.displayNoneWhileDisabled(addExtensionLabel);\n addExtensionButton.appendChild(addExtensionLabel);\n addExtensionButton.removeAttribute(\"title\");\n }\n}\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-custom-block-shape.js ADDED
@@ -0,0 +1,209 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-custom-block-shape"],{
2
+
3
+ /***/ "./src/addons/addons/custom-block-shape/_runtime_entry.js":
4
+ /*!****************************************************************!*\
5
+ !*** ./src/addons/addons/custom-block-shape/_runtime_entry.js ***!
6
+ \****************************************************************/
7
+ /*! exports provided: resources */
8
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9
+
10
+ "use strict";
11
+ __webpack_require__.r(__webpack_exports__);
12
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
13
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/custom-block-shape/userscript.js");
14
+ /* generated by pull.js */
15
+
16
+ const resources = {
17
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"]
18
+ };
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/custom-block-shape/userscript.js":
23
+ /*!************************************************************!*\
24
+ !*** ./src/addons/addons/custom-block-shape/userscript.js ***!
25
+ \************************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
32
+ let {
33
+ addon,
34
+ console
35
+ } = _ref;
36
+ var BlocklyInstance = await addon.tab.traps.getBlockly();
37
+ (function (Blockly) {
38
+ const BlockSvg = BlocklyInstance.BlockSvg;
39
+ var vm = addon.tab.traps.vm;
40
+ const {
41
+ GRID_UNIT
42
+ } = BlockSvg;
43
+ function path2SegmentList(path) {
44
+ const cmds = structuredClone(BlockSvg.CUSTOM_NOTCH_UTIL.supportedCommands);
45
+ cmds.z = 0;
46
+ const segment = /([astvzqmhlc])([^astvzqmhlc]*)/ig;
47
+ const data = [];
48
+ path.replace(segment, (_, command, args) => {
49
+ let type = command.toLowerCase();
50
+ const numbers = args.match(/-?[0-9]*\.?[0-9]+(?:e[-+]?\d+)?/ig);
51
+ args = numbers ? numbers.map(Number) : [];
52
+ if (type == "m" && args.length > 2) {
53
+ data.push([command].concat(args.splice(0, 2)));
54
+ type = "l";
55
+ command = command == "m" ? "l" : "L";
56
+ }
57
+ while (true) {
58
+ if (args.length == cmds[type]) {
59
+ args.unshift(command);
60
+ return data.push(args);
61
+ }
62
+ if (args.length < cmds[type]) throw new Error("malformed path data");
63
+ data.push([command].concat(args.splice(0, cmds[type])));
64
+ }
65
+ });
66
+ return data;
67
+ }
68
+ function scalePathXY(path, scaleX, scaleY) {
69
+ const segments = path2SegmentList(path);
70
+ return segments.map(segment => {
71
+ const name = segment[0].toLowerCase();
72
+ if (name === "v") {
73
+ segment[1] *= scaleY;
74
+ return segment;
75
+ }
76
+ if (name === "a") {
77
+ segment[1] *= scaleX;
78
+ segment[2] *= scaleY;
79
+ segment[6] *= scaleX;
80
+ segment[7] *= scaleY;
81
+ return segment;
82
+ }
83
+ return segment.map((val, i) => {
84
+ if (!i) return val;
85
+ return val *= i % 2 ? scaleX : scaleY;
86
+ });
87
+ }).flat().join(" ");
88
+ }
89
+ function updateAllBlocks() {
90
+ const workspace = Blockly.getMainWorkspace();
91
+ if (workspace) {
92
+ if (vm.editingTarget) {
93
+ vm.emitWorkspaceUpdate();
94
+ }
95
+ const flyout = workspace.getFlyout();
96
+ if (flyout) {
97
+ const flyoutWorkspace = flyout.getWorkspace();
98
+ Blockly.Xml.clearWorkspaceAndLoadFromXml(Blockly.Xml.workspaceToDom(flyoutWorkspace), flyoutWorkspace);
99
+ workspace.getToolbox().refreshSelection();
100
+ workspace.toolboxRefreshEnabled_ = true;
101
+ }
102
+ }
103
+ }
104
+ function applyChanges() {
105
+ let paddingSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : addon.settings.get("paddingSize");
106
+ let cornerSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : addon.settings.get("cornerSize");
107
+ let notchSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : addon.settings.get("notchSize");
108
+ let multiplier = paddingSize / 100;
109
+ cornerSize = cornerSize / 100;
110
+ notchSize = notchSize / 100;
111
+ BlockSvg.SEP_SPACE_Y = 2 * GRID_UNIT * multiplier;
112
+ BlockSvg.MIN_BLOCK_X = 16 * GRID_UNIT * multiplier;
113
+ BlockSvg.MIN_BLOCK_X_OUTPUT = 12 * GRID_UNIT * multiplier;
114
+ BlockSvg.MIN_BLOCK_X_SHADOW_OUTPUT = 10 * GRID_UNIT * multiplier;
115
+ BlockSvg.MIN_BLOCK_Y = 12 * GRID_UNIT * multiplier;
116
+ BlockSvg.EXTRA_STATEMENT_ROW_Y = 8 * GRID_UNIT * multiplier;
117
+ BlockSvg.MIN_BLOCK_X_WITH_STATEMENT = 40 * GRID_UNIT * multiplier;
118
+ BlockSvg.MIN_BLOCK_Y_SINGLE_FIELD_OUTPUT = 8 * GRID_UNIT * multiplier;
119
+ BlockSvg.MIN_BLOCK_Y_REPORTER = 10 * GRID_UNIT * multiplier;
120
+ BlockSvg.MIN_STATEMENT_INPUT_HEIGHT = 6 * GRID_UNIT * multiplier;
121
+ BlockSvg.NOTCH_WIDTH = 8 * GRID_UNIT * multiplier;
122
+ BlockSvg.NOTCH_HEIGHT = 2 * GRID_UNIT * multiplier * notchSize;
123
+ BlockSvg.NOTCH_START_PADDING = 3 * GRID_UNIT; //* multiplier
124
+ BlockSvg.ICON_SEPARATOR_HEIGHT = 10 * GRID_UNIT * multiplier;
125
+ BlockSvg.NOTCH_PATH_LEFT = "c 2 0 3 ".concat(1 * notchSize, " 4 ").concat(2 * notchSize, " ") + "l ".concat(4 * multiplier * notchSize, " ").concat(4 * multiplier * notchSize, " ") + "c 1 ".concat(1 * notchSize, " 2 ").concat(2 * notchSize, " 4 ").concat(2 * notchSize, " ") + "h ".concat(24 * (multiplier - 0.5), " ") + "c 2 0 3 ".concat(-1 * notchSize, " 4 ").concat(-2 * notchSize, " ") + "l ".concat(4 * multiplier * notchSize, " ").concat(-4 * multiplier * notchSize, " ") + "c 1 ".concat(-1 * notchSize, " 2 ").concat(-2 * notchSize, " 4 ").concat(-2 * notchSize, " ");
126
+ BlockSvg.NOTCH_PATH_RIGHT = "h ".concat(-4 * (cornerSize - 1) - 5 * (1 - notchSize), " ") + "c -2 0 -3 ".concat(1 * notchSize, " -4 ").concat(2 * notchSize, " ") + "l ".concat(-4 * multiplier * notchSize, " ").concat(4 * multiplier * notchSize, " ") + "c -1 ".concat(1 * notchSize, " -2 ").concat(2 * notchSize, " -4 ").concat(2 * notchSize, " ") + "h ".concat(-24 * (multiplier - 0.5), " ") + "c -2 0 -3 ".concat(-1 * notchSize, " -4 ").concat(-2 * notchSize, " ") + "l ".concat(-4 * multiplier * notchSize, " ").concat(-4 * multiplier * notchSize, " ") + "c -1 ".concat(-1 * notchSize, " -2 ").concat(-2 * notchSize, " -4 ").concat(-2 * notchSize, " ");
127
+
128
+ /* Custom Notch API Support */
129
+ const adjustedNotchSize = (multiplier > 1 ? multiplier - 0.05 : multiplier < 1 ? multiplier + 0.05 : multiplier) + (cornerSize - 1) / 10;
130
+ BlockSvg.CUSTOM_NOTCHES.forEach(notch => {
131
+ if (!notch.ogLeft) {
132
+ notch.ogLeft = notch.left;
133
+ notch.ogRight = notch.right;
134
+ }
135
+ notch.left = scalePathXY(notch.ogLeft, adjustedNotchSize, notchSize);
136
+ notch.right = scalePathXY(notch.ogRight, adjustedNotchSize, notchSize);
137
+ });
138
+
139
+ /* Custom Shape API Support */
140
+ BlockSvg.CUSTOM_SHAPES.forEach(shape => {
141
+ if (!shape.ogEmptySize) {
142
+ shape.ogEmptySize = shape.emptyInputWidth;
143
+ shape.ogEmptyPath = shape.emptyInputPath;
144
+ }
145
+ shape.emptyInputWidth = shape.ogEmptySize * multiplier;
146
+ shape.emptyInputPath = scalePathXY(shape.ogEmptyPath, multiplier, multiplier);
147
+ if (shape.emptyInputPath[0] !== "M" && shape.emptyInputPath[0] !== "m") {
148
+ shape.emptyInputPath = "M" + shape.emptyInputPath;
149
+ }
150
+ });
151
+ BlockSvg.INPUT_SHAPE_HEXAGONAL_WIDTH = 12 * GRID_UNIT * multiplier;
152
+ BlockSvg.INPUT_SHAPE_HEXAGONAL = "M " + 4 * GRID_UNIT * multiplier + ",0 " + " h " + 4 * GRID_UNIT + " l " + 4 * GRID_UNIT * multiplier + "," + 4 * GRID_UNIT * multiplier + " l " + -4 * GRID_UNIT * multiplier + "," + 4 * GRID_UNIT * multiplier + " h " + -4 * GRID_UNIT + " l " + -4 * GRID_UNIT * multiplier + "," + -4 * GRID_UNIT * multiplier + " l " + 4 * GRID_UNIT * multiplier + "," + -4 * GRID_UNIT * multiplier + " z";
153
+ BlockSvg.INPUT_SHAPE_ROUND_WIDTH = 12 * GRID_UNIT * multiplier;
154
+ BlockSvg.INPUT_SHAPE_ROUND = "M " + 4 * GRID_UNIT * multiplier + ",0" + " h " + 4 * GRID_UNIT * multiplier + " a " + 4 * GRID_UNIT * multiplier + " " + 4 * GRID_UNIT * multiplier + " 0 0 1 0 " + 8 * GRID_UNIT * multiplier + " h " + -4 * GRID_UNIT * multiplier + " a " + 4 * GRID_UNIT * multiplier + " " + 4 * GRID_UNIT * multiplier + " 0 0 1 0 -" + 8 * GRID_UNIT * multiplier + " z";
155
+ BlockSvg.INPUT_SHAPE_SQUARE_WIDTH = 12 * GRID_UNIT * multiplier;
156
+ BlockSvg.INPUT_SHAPE_SQUARE = 'm 0,4A 4,4 0 0,1 4,0' + ' h ' + (12 * GRID_UNIT * multiplier - 2 * 4) + 'a 4,4 0 0,1 4,4' + ' v ' + (8 * GRID_UNIT * multiplier - 2 * 4) + ' a 4,4 0 0,1 -4,4' + ' h ' + (-12 * GRID_UNIT * multiplier + 2 * 4) + 'a 4,4 0 0,1 -4,-4 z';
157
+ BlockSvg.INPUT_SHAPE_LEAF_WIDTH = 12 * GRID_UNIT * multiplier;
158
+ BlockSvg.INPUT_SHAPE_LEAF = "M ".concat(6 * GRID_UNIT * multiplier, " 0\n l ").concat(2 * GRID_UNIT * multiplier, " 0\n a ").concat(4 * GRID_UNIT * multiplier, " ").concat(4 * GRID_UNIT * multiplier, " 0 0 1 ").concat(4 * GRID_UNIT * multiplier, " ").concat(4 * GRID_UNIT * multiplier, "\n l 0 ").concat(2.4 * GRID_UNIT * multiplier, "\n a ").concat(1.6 * GRID_UNIT * multiplier, " ").concat(1.6 * GRID_UNIT * multiplier, " 0 0 1 -").concat(1.6 * GRID_UNIT * multiplier, " ").concat(1.6 * GRID_UNIT * multiplier, "\n h -").concat(4 * GRID_UNIT * multiplier, "\n l -").concat(2.4 * GRID_UNIT * multiplier, " 0\n a ").concat(4 * GRID_UNIT * multiplier, " ").concat(4 * GRID_UNIT * multiplier, " 0 0 1 -").concat(4 * GRID_UNIT * multiplier, " -").concat(4 * GRID_UNIT * multiplier, "\n l 0 -").concat(2.4 * GRID_UNIT * multiplier, "\n a ").concat(1.6 * GRID_UNIT * multiplier, " ").concat(1.6 * GRID_UNIT * multiplier, " 0 0 1 ").concat(1.6 * GRID_UNIT * multiplier, " -").concat(1.6 * GRID_UNIT * multiplier, "\n z");
159
+ BlockSvg.INPUT_SHAPE_PLUS_WIDTH = 12 * GRID_UNIT * multiplier;
160
+ BlockSvg.INPUT_SHAPE_PLUS = "M ".concat(9 * GRID_UNIT * multiplier, " 0\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 1 ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, "\n l 0 2\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 0 ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, "\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 1 ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, "\n l 0 4\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 1 -").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, "\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 0 -").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, "\n l 0 2\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 1 -").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, "\n h -").concat(6 * GRID_UNIT * multiplier, "\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 1 -").concat(GRID_UNIT * multiplier, " -").concat(GRID_UNIT * multiplier, "\n l 0 -2\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 0 -").concat(GRID_UNIT * multiplier, " -").concat(GRID_UNIT * multiplier, "\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 1 -").concat(GRID_UNIT * multiplier, " -").concat(GRID_UNIT * multiplier, "\n l 0 -4\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 1 ").concat(GRID_UNIT * multiplier, " -").concat(GRID_UNIT * multiplier, "\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 0 ").concat(GRID_UNIT * multiplier, " -").concat(GRID_UNIT * multiplier, "\n l 0 -2\n a ").concat(GRID_UNIT * multiplier, " ").concat(GRID_UNIT * multiplier, " 0 0 1 ").concat(GRID_UNIT * multiplier, " -").concat(GRID_UNIT * multiplier, " \n z");
161
+ BlockSvg.INPUT_SHAPE_HEIGHT = 8 * GRID_UNIT * multiplier;
162
+ BlockSvg.FIELD_HEIGHT = 8 * GRID_UNIT * multiplier; // NOTE: Determines string input heights
163
+ BlockSvg.FIELD_WIDTH = 6 * GRID_UNIT * Math.min(multiplier, 1) + 10 * GRID_UNIT * Math.max(multiplier - 1, 0);
164
+ BlockSvg.FIELD_DEFAULT_CORNER_RADIUS = 4 * GRID_UNIT * multiplier;
165
+ BlockSvg.EDITABLE_FIELD_PADDING = 1.5 * GRID_UNIT * multiplier;
166
+ BlockSvg.BOX_FIELD_PADDING = 2 * GRID_UNIT * multiplier;
167
+ BlockSvg.DROPDOWN_ARROW_PADDING = 2 * GRID_UNIT * multiplier;
168
+ BlockSvg.FIELD_WIDTH_MIN_EDIT = 8 * GRID_UNIT * multiplier;
169
+ BlockSvg.INPUT_AND_FIELD_MIN_X = 12 * GRID_UNIT * multiplier;
170
+ BlockSvg.INLINE_PADDING_Y = 1 * GRID_UNIT * multiplier; // For when reporters are inside reporters
171
+ BlockSvg.SHAPE_IN_SHAPE_PADDING[1][0] = 5 * GRID_UNIT * multiplier;
172
+ BlockSvg.SHAPE_IN_SHAPE_PADDING[1][2] = 5 * GRID_UNIT * multiplier;
173
+ BlockSvg.SHAPE_IN_SHAPE_PADDING[1][3] = 5 * GRID_UNIT * multiplier;
174
+ var originalDropdownObject = BlocklyInstance.FieldDropdown.prototype.positionArrow;
175
+ BlocklyInstance.FieldDropdown.prototype.positionArrow = function (x) {
176
+ this.arrowY_ = 11 * multiplier;
177
+ return originalDropdownObject.call(this, x);
178
+ };
179
+
180
+ // Corner setting
181
+ BlockSvg.CORNER_RADIUS = 1 * GRID_UNIT * cornerSize * 100 / 100;
182
+ BlockSvg.TOP_LEFT_CORNER_START = "m 0," + BlockSvg.CORNER_RADIUS;
183
+ BlockSvg.TOP_LEFT_CORNER = "A " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,1 " + BlockSvg.CORNER_RADIUS + ",0";
184
+ BlockSvg.TOP_RIGHT_CORNER = "a " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,1 " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS;
185
+ BlockSvg.BOTTOM_RIGHT_CORNER = " a " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,1 -" + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS;
186
+ BlockSvg.BOTTOM_LEFT_CORNER = "a " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,1 -" + BlockSvg.CORNER_RADIUS + ",-" + BlockSvg.CORNER_RADIUS;
187
+ BlockSvg.INNER_TOP_LEFT_CORNER = " a " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,0 -" + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS;
188
+ BlockSvg.INNER_BOTTOM_LEFT_CORNER = "a " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,0 " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS;
189
+ BlockSvg.TOP_RIGHT_CORNER_DEFINE_HAT = "a " + BlockSvg.DEFINE_HAT_CORNER_RADIUS + "," + BlockSvg.DEFINE_HAT_CORNER_RADIUS + " 0 0,1 " + BlockSvg.DEFINE_HAT_CORNER_RADIUS + "," + BlockSvg.DEFINE_HAT_CORNER_RADIUS + " v " + (1 * GRID_UNIT - BlockSvg.CORNER_RADIUS);
190
+ BlockSvg.STATEMENT_INPUT_INNER_SPACE = 2.8 * GRID_UNIT - 0.9 * GRID_UNIT * cornerSize;
191
+ }
192
+ function applyAndUpdate() {
193
+ applyChanges(...arguments);
194
+ updateAllBlocks();
195
+ }
196
+ addon.settings.addEventListener("change", () => applyAndUpdate());
197
+ addon.self.addEventListener("disabled", () => {
198
+ // Scratch 3.0 blocks
199
+ applyAndUpdate(100, 100, 100);
200
+ });
201
+ addon.self.addEventListener("reenabled", () => applyAndUpdate());
202
+ applyAndUpdate();
203
+ })(window.Blockly);
204
+ });
205
+
206
+ /***/ })
207
+
208
+ }]);
209
+ //# sourceMappingURL=addon-entry-custom-block-shape.js.map
js/addon-entry-custom-block-shape.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-custom-block-shape.js","sources":["webpack://GUI/./src/addons/addons/custom-block-shape/_runtime_entry.js","webpack://GUI/./src/addons/addons/custom-block-shape/userscript.js"],"sourcesContent":["/* generated by pull.js */\nimport _js from \"./userscript.js\";\nexport const resources = {\n \"userscript.js\": _js,\n};\n","export default async function ({ addon, console }) {\n var BlocklyInstance = await addon.tab.traps.getBlockly();\n\n (function (Blockly) {\n const BlockSvg = BlocklyInstance.BlockSvg;\n var vm = addon.tab.traps.vm;\n\n const { GRID_UNIT } = BlockSvg;\n\n function path2SegmentList(path) {\n const cmds = structuredClone(BlockSvg.CUSTOM_NOTCH_UTIL.supportedCommands);\n cmds.z = 0;\n const segment = /([astvzqmhlc])([^astvzqmhlc]*)/ig;\n \tconst data = [];\n \tpath.replace(segment, (_, command, args) => {\n \t\tlet type = command.toLowerCase();\n \t\tconst numbers = args.match(/-?[0-9]*\\.?[0-9]+(?:e[-+]?\\d+)?/ig);\n \t\targs = numbers ? numbers.map(Number) : [];\n\t\t if (type == \"m\" && args.length > 2) {\n\t\t \tdata.push([command].concat(args.splice(0, 2)));\n\t\t \ttype = \"l\";\n\t\t \tcommand = command == \"m\" ? \"l\" : \"L\";\n\t\t }\n\n while (true) {\n if (args.length == cmds[type]) {\n args.unshift(command);\n return data.push(args);\n }\n if (args.length < cmds[type]) throw new Error(\"malformed path data\");\n data.push([command].concat(args.splice(0, cmds[type])));\n }\n });\n return data;\n }\n\n function scalePathXY (path, scaleX, scaleY) {\n const segments = path2SegmentList(path);\n return segments.map((segment) => {\n const name = segment[0].toLowerCase();\n if (name === \"v\") {\n segment[1] *= scaleY;\n return segment;\n }\n if (name === \"a\") {\n segment[1] *= scaleX;\n segment[2] *= scaleY;\n segment[6] *= scaleX;\n segment[7] *= scaleY;\n return segment;\n }\n\n return segment.map((val, i) => {\n if (!i) return val;\n return val *= i % 2 ? scaleX : scaleY;\n });\n }).flat().join(\" \");\n }\n\n function updateAllBlocks() {\n const workspace = Blockly.getMainWorkspace();\n if (workspace) {\n if (vm.editingTarget) {\n vm.emitWorkspaceUpdate();\n }\n const flyout = workspace.getFlyout();\n if (flyout) {\n const flyoutWorkspace = flyout.getWorkspace();\n Blockly.Xml.clearWorkspaceAndLoadFromXml(Blockly.Xml.workspaceToDom(flyoutWorkspace), flyoutWorkspace);\n workspace.getToolbox().refreshSelection();\n workspace.toolboxRefreshEnabled_ = true;\n }\n }\n }\n\n function applyChanges(\n paddingSize = addon.settings.get(\"paddingSize\"),\n cornerSize = addon.settings.get(\"cornerSize\"),\n notchSize = addon.settings.get(\"notchSize\")\n ) {\n let multiplier = paddingSize / 100;\n cornerSize = cornerSize / 100;\n notchSize = notchSize / 100;\n BlockSvg.SEP_SPACE_Y = 2 * GRID_UNIT * multiplier;\n BlockSvg.MIN_BLOCK_X = 16 * GRID_UNIT * multiplier;\n BlockSvg.MIN_BLOCK_X_OUTPUT = 12 * GRID_UNIT * multiplier;\n BlockSvg.MIN_BLOCK_X_SHADOW_OUTPUT = 10 * GRID_UNIT * multiplier;\n BlockSvg.MIN_BLOCK_Y = 12 * GRID_UNIT * multiplier;\n BlockSvg.EXTRA_STATEMENT_ROW_Y = 8 * GRID_UNIT * multiplier;\n BlockSvg.MIN_BLOCK_X_WITH_STATEMENT = 40 * GRID_UNIT * multiplier;\n BlockSvg.MIN_BLOCK_Y_SINGLE_FIELD_OUTPUT = 8 * GRID_UNIT * multiplier;\n BlockSvg.MIN_BLOCK_Y_REPORTER = 10 * GRID_UNIT * multiplier;\n BlockSvg.MIN_STATEMENT_INPUT_HEIGHT = 6 * GRID_UNIT * multiplier;\n BlockSvg.NOTCH_WIDTH = 8 * GRID_UNIT * multiplier;\n BlockSvg.NOTCH_HEIGHT = 2 * GRID_UNIT * multiplier * notchSize;\n BlockSvg.NOTCH_START_PADDING = 3 * GRID_UNIT; //* multiplier\n BlockSvg.ICON_SEPARATOR_HEIGHT = 10 * GRID_UNIT * multiplier;\n\n BlockSvg.NOTCH_PATH_LEFT =\n `c 2 0 3 ${1 * notchSize} 4 ${2 * notchSize} ` +\n `l ${4 * multiplier * notchSize} ${4 * multiplier * notchSize} ` +\n `c 1 ${1 * notchSize} 2 ${2 * notchSize} 4 ${2 * notchSize} ` +\n `h ${24 * (multiplier - 0.5)} ` +\n `c 2 0 3 ${-1 * notchSize} 4 ${-2 * notchSize} ` +\n `l ${4 * multiplier * notchSize} ${-4 * multiplier * notchSize} ` +\n `c 1 ${-1 * notchSize} 2 ${-2 * notchSize} 4 ${-2 * notchSize} `\n BlockSvg.NOTCH_PATH_RIGHT =\n `h ${(-4 * (cornerSize - 1) - 5 * (1 - notchSize))} ` +\n `c -2 0 -3 ${1 * notchSize} -4 ${2 * notchSize} ` +\n `l ${-4 * multiplier * notchSize} ${4 * multiplier * notchSize} ` +\n `c -1 ${1 * notchSize} -2 ${2 * notchSize} -4 ${2 * notchSize} ` +\n `h ${-24 * (multiplier - 0.5)} ` +\n `c -2 0 -3 ${-1 * notchSize} -4 ${-2 * notchSize} ` +\n `l ${-4 * multiplier * notchSize} ${-4 * multiplier * notchSize} ` +\n `c -1 ${-1 * notchSize} -2 ${-2 * notchSize} -4 ${-2 * notchSize} `\n\n /* Custom Notch API Support */\n const adjustedNotchSize = (multiplier > 1 ? multiplier - 0.05 :\n multiplier < 1 ? multiplier + 0.05 : multiplier) + ((cornerSize - 1) / 10);\n BlockSvg.CUSTOM_NOTCHES.forEach((notch) => {\n if (!notch.ogLeft) {\n notch.ogLeft = notch.left;\n notch.ogRight = notch.right;\n }\n notch.left = scalePathXY(notch.ogLeft, adjustedNotchSize, notchSize);\n notch.right = scalePathXY(notch.ogRight, adjustedNotchSize, notchSize);\n });\n\n /* Custom Shape API Support */\n BlockSvg.CUSTOM_SHAPES.forEach((shape) => {\n if (!shape.ogEmptySize) {\n shape.ogEmptySize = shape.emptyInputWidth;\n shape.ogEmptyPath = shape.emptyInputPath;\n }\n shape.emptyInputWidth = shape.ogEmptySize * multiplier;\n shape.emptyInputPath = scalePathXY(shape.ogEmptyPath, multiplier, multiplier);\n if (shape.emptyInputPath[0] !== \"M\" && shape.emptyInputPath[0] !== \"m\") {\n shape.emptyInputPath = \"M\" + shape.emptyInputPath;\n }\n });\n\n BlockSvg.INPUT_SHAPE_HEXAGONAL_WIDTH = 12 * GRID_UNIT * multiplier;\n BlockSvg.INPUT_SHAPE_HEXAGONAL =\n \"M \" +\n 4 * GRID_UNIT * multiplier +\n \",0 \" +\n \" h \" +\n 4 * GRID_UNIT +\n \" l \" +\n 4 * GRID_UNIT * multiplier +\n \",\" +\n 4 * GRID_UNIT * multiplier +\n \" l \" +\n -4 * GRID_UNIT * multiplier +\n \",\" +\n 4 * GRID_UNIT * multiplier +\n \" h \" +\n -4 * GRID_UNIT +\n \" l \" +\n -4 * GRID_UNIT * multiplier +\n \",\" +\n -4 * GRID_UNIT * multiplier +\n \" l \" +\n 4 * GRID_UNIT * multiplier +\n \",\" +\n -4 * GRID_UNIT * multiplier +\n \" z\";\n BlockSvg.INPUT_SHAPE_ROUND_WIDTH = 12 * GRID_UNIT * multiplier;\n BlockSvg.INPUT_SHAPE_ROUND =\n \"M \" +\n 4 * GRID_UNIT * multiplier +\n \",0\" +\n \" h \" +\n 4 * GRID_UNIT * multiplier +\n \" a \" +\n 4 * GRID_UNIT * multiplier +\n \" \" +\n 4 * GRID_UNIT * multiplier +\n \" 0 0 1 0 \" +\n 8 * GRID_UNIT * multiplier +\n \" h \" +\n -4 * GRID_UNIT * multiplier +\n \" a \" +\n 4 * GRID_UNIT * multiplier +\n \" \" +\n 4 * GRID_UNIT * multiplier +\n \" 0 0 1 0 -\" +\n 8 * GRID_UNIT * multiplier +\n \" z\";\n\n BlockSvg.INPUT_SHAPE_SQUARE_WIDTH = 12 * GRID_UNIT * multiplier;\n BlockSvg.INPUT_SHAPE_SQUARE =\n 'm 0,4A 4,4 0 0,1 4,0'+\n ' h ' + (12 * GRID_UNIT * multiplier - 2 * 4) +\n 'a 4,4 0 0,1 4,4' +\n ' v ' + (8 * GRID_UNIT * multiplier - 2 * 4) +\n ' a 4,4 0 0,1 -4,4' +\n ' h ' + (-12 * GRID_UNIT * multiplier + 2 * 4) +\n 'a 4,4 0 0,1 -4,-4 z';\n\n BlockSvg.INPUT_SHAPE_LEAF_WIDTH = 12 * GRID_UNIT * multiplier;\n BlockSvg.INPUT_SHAPE_LEAF = \n `M ${6 * GRID_UNIT * multiplier} 0\n l ${2 * GRID_UNIT * multiplier} 0\n a ${4 * GRID_UNIT * multiplier} ${4 * GRID_UNIT * multiplier} 0 0 1 ${4 * GRID_UNIT * multiplier} ${4 * GRID_UNIT * multiplier}\n l 0 ${2.4 * GRID_UNIT * multiplier}\n a ${1.6 * GRID_UNIT * multiplier} ${1.6 * GRID_UNIT * multiplier} 0 0 1 -${1.6 * GRID_UNIT * multiplier} ${1.6 * GRID_UNIT * multiplier}\n h -${4 * GRID_UNIT * multiplier}\n l -${2.4 * GRID_UNIT * multiplier} 0\n a ${4 * GRID_UNIT * multiplier} ${4 * GRID_UNIT * multiplier} 0 0 1 -${4 * GRID_UNIT * multiplier} -${4 * GRID_UNIT * multiplier}\n l 0 -${2.4 * GRID_UNIT * multiplier}\n a ${1.6 * GRID_UNIT * multiplier} ${1.6 * GRID_UNIT * multiplier} 0 0 1 ${1.6 * GRID_UNIT * multiplier} -${1.6 * GRID_UNIT * multiplier}\n z`;\n\n BlockSvg.INPUT_SHAPE_PLUS_WIDTH = 12 * GRID_UNIT * multiplier;\n BlockSvg.INPUT_SHAPE_PLUS = \n `M ${9 * GRID_UNIT * multiplier} 0\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 1 ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier}\n l 0 2\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 0 ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier}\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 1 ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier}\n l 0 4\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 1 -${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier}\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 0 -${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier}\n l 0 2\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 1 -${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier}\n h -${6 * GRID_UNIT * multiplier}\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 1 -${GRID_UNIT * multiplier} -${GRID_UNIT * multiplier}\n l 0 -2\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 0 -${GRID_UNIT * multiplier} -${GRID_UNIT * multiplier}\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 1 -${GRID_UNIT * multiplier} -${GRID_UNIT * multiplier}\n l 0 -4\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 1 ${GRID_UNIT * multiplier} -${GRID_UNIT * multiplier}\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 0 ${GRID_UNIT * multiplier} -${GRID_UNIT * multiplier}\n l 0 -2\n a ${GRID_UNIT * multiplier} ${GRID_UNIT * multiplier} 0 0 1 ${GRID_UNIT * multiplier} -${GRID_UNIT * multiplier} \n z`;\n\n BlockSvg.INPUT_SHAPE_HEIGHT = 8 * GRID_UNIT * multiplier;\n BlockSvg.FIELD_HEIGHT = 8 * GRID_UNIT * multiplier; // NOTE: Determines string input heights\n BlockSvg.FIELD_WIDTH = 6 * GRID_UNIT * Math.min(multiplier, 1) + 10 * GRID_UNIT * Math.max(multiplier - 1, 0);\n BlockSvg.FIELD_DEFAULT_CORNER_RADIUS = 4 * GRID_UNIT * multiplier;\n BlockSvg.EDITABLE_FIELD_PADDING = 1.5 * GRID_UNIT * multiplier;\n BlockSvg.BOX_FIELD_PADDING = 2 * GRID_UNIT * multiplier;\n BlockSvg.DROPDOWN_ARROW_PADDING = 2 * GRID_UNIT * multiplier;\n BlockSvg.FIELD_WIDTH_MIN_EDIT = 8 * GRID_UNIT * multiplier;\n BlockSvg.INPUT_AND_FIELD_MIN_X = 12 * GRID_UNIT * multiplier;\n BlockSvg.INLINE_PADDING_Y = 1 * GRID_UNIT * multiplier; // For when reporters are inside reporters\n BlockSvg.SHAPE_IN_SHAPE_PADDING[1][0] = 5 * GRID_UNIT * multiplier;\n BlockSvg.SHAPE_IN_SHAPE_PADDING[1][2] = 5 * GRID_UNIT * multiplier;\n BlockSvg.SHAPE_IN_SHAPE_PADDING[1][3] = 5 * GRID_UNIT * multiplier;\n\n var originalDropdownObject = BlocklyInstance.FieldDropdown.prototype.positionArrow;\n BlocklyInstance.FieldDropdown.prototype.positionArrow = function (x) {\n this.arrowY_ = 11 * multiplier;\n return originalDropdownObject.call(this, x);\n };\n\n // Corner setting\n BlockSvg.CORNER_RADIUS = (1 * GRID_UNIT * cornerSize * 100) / 100;\n\n BlockSvg.TOP_LEFT_CORNER_START = \"m 0,\" + BlockSvg.CORNER_RADIUS;\n\n BlockSvg.TOP_LEFT_CORNER =\n \"A \" + BlockSvg.CORNER_RADIUS + \",\" + BlockSvg.CORNER_RADIUS + \" 0 0,1 \" + BlockSvg.CORNER_RADIUS + \",0\";\n\n BlockSvg.TOP_RIGHT_CORNER =\n \"a \" +\n BlockSvg.CORNER_RADIUS +\n \",\" +\n BlockSvg.CORNER_RADIUS +\n \" 0 0,1 \" +\n BlockSvg.CORNER_RADIUS +\n \",\" +\n BlockSvg.CORNER_RADIUS;\n\n BlockSvg.BOTTOM_RIGHT_CORNER =\n \" a \" +\n BlockSvg.CORNER_RADIUS +\n \",\" +\n BlockSvg.CORNER_RADIUS +\n \" 0 0,1 -\" +\n BlockSvg.CORNER_RADIUS +\n \",\" +\n BlockSvg.CORNER_RADIUS;\n\n BlockSvg.BOTTOM_LEFT_CORNER =\n \"a \" +\n BlockSvg.CORNER_RADIUS +\n \",\" +\n BlockSvg.CORNER_RADIUS +\n \" 0 0,1 -\" +\n BlockSvg.CORNER_RADIUS +\n \",-\" +\n BlockSvg.CORNER_RADIUS;\n\n BlockSvg.INNER_TOP_LEFT_CORNER =\n \" a \" +\n BlockSvg.CORNER_RADIUS +\n \",\" +\n BlockSvg.CORNER_RADIUS +\n \" 0 0,0 -\" +\n BlockSvg.CORNER_RADIUS +\n \",\" +\n BlockSvg.CORNER_RADIUS;\n\n BlockSvg.INNER_BOTTOM_LEFT_CORNER =\n \"a \" +\n BlockSvg.CORNER_RADIUS +\n \",\" +\n BlockSvg.CORNER_RADIUS +\n \" 0 0,0 \" +\n BlockSvg.CORNER_RADIUS +\n \",\" +\n BlockSvg.CORNER_RADIUS;\n\n BlockSvg.TOP_RIGHT_CORNER_DEFINE_HAT =\n \"a \" +\n BlockSvg.DEFINE_HAT_CORNER_RADIUS +\n \",\" +\n BlockSvg.DEFINE_HAT_CORNER_RADIUS +\n \" 0 0,1 \" +\n BlockSvg.DEFINE_HAT_CORNER_RADIUS +\n \",\" +\n BlockSvg.DEFINE_HAT_CORNER_RADIUS +\n \" v \" +\n (1 * GRID_UNIT - BlockSvg.CORNER_RADIUS);\n\n BlockSvg.STATEMENT_INPUT_INNER_SPACE = 2.8 * GRID_UNIT - 0.9 * GRID_UNIT * cornerSize;\n }\n\n function applyAndUpdate(...args) {\n applyChanges(...args);\n updateAllBlocks();\n }\n\n addon.settings.addEventListener(\"change\", () => applyAndUpdate());\n\n addon.self.addEventListener(\"disabled\", () => {\n // Scratch 3.0 blocks\n applyAndUpdate(100, 100, 100);\n });\n\n addon.self.addEventListener(\"reenabled\", () => applyAndUpdate());\n\n applyAndUpdate();\n })(window.Blockly);\n}"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAIA;AAHA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAQA;AACA;AASA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAyBA;AACA;AAsBA;AACA;AASA;AACA;AAaA;AACA;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAGA;AAUA;AAUA;AAUA;AAUA;AAUA;AAYA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-custom-block-text.js ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-custom-block-text"],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/custom-block-text/text-bold.css":
4
+ /*!*************************************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/custom-block-text/text-bold.css ***!
6
+ \*************************************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
11
+ // imports
12
+
13
+
14
+ // module
15
+ exports.push([module.i, ".blocklyText,\n.blocklyHtmlInput {\n font-weight: bold;\n}\n", ""]);
16
+
17
+ // exports
18
+
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/custom-block-text/text-shadow.css":
23
+ /*!***************************************************************************************!*\
24
+ !*** ./node_modules/css-loader!./src/addons/addons/custom-block-text/text-shadow.css ***!
25
+ \***************************************************************************************/
26
+ /*! no static exports found */
27
+ /***/ (function(module, exports, __webpack_require__) {
28
+
29
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
30
+ // imports
31
+
32
+
33
+ // module
34
+ exports.push([module.i, "/** Makes block text a little easier to read. **/\n.blocklyDraggable > .blocklyText,\n.blocklyDraggable > g > text {\n text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4);\n}\n", ""]);
35
+
36
+ // exports
37
+
38
+
39
+ /***/ }),
40
+
41
+ /***/ "./src/addons/addons/custom-block-text/_runtime_entry.js":
42
+ /*!***************************************************************!*\
43
+ !*** ./src/addons/addons/custom-block-text/_runtime_entry.js ***!
44
+ \***************************************************************/
45
+ /*! exports provided: resources */
46
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
47
+
48
+ "use strict";
49
+ __webpack_require__.r(__webpack_exports__);
50
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
51
+ /* harmony import */ var _css_loader_text_bold_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! css-loader!./text-bold.css */ "./node_modules/css-loader/index.js!./src/addons/addons/custom-block-text/text-bold.css");
52
+ /* harmony import */ var _css_loader_text_bold_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_text_bold_css__WEBPACK_IMPORTED_MODULE_0__);
53
+ /* harmony import */ var _css_loader_text_shadow_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./text-shadow.css */ "./node_modules/css-loader/index.js!./src/addons/addons/custom-block-text/text-shadow.css");
54
+ /* harmony import */ var _css_loader_text_shadow_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_text_shadow_css__WEBPACK_IMPORTED_MODULE_1__);
55
+ /* generated by pull.js */
56
+
57
+
58
+ const resources = {
59
+ "text-bold.css": _css_loader_text_bold_css__WEBPACK_IMPORTED_MODULE_0___default.a,
60
+ "text-shadow.css": _css_loader_text_shadow_css__WEBPACK_IMPORTED_MODULE_1___default.a
61
+ };
62
+
63
+ /***/ })
64
+
65
+ }]);
66
+ //# sourceMappingURL=addon-entry-custom-block-text.js.map
js/addon-entry-custom-block-text.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-custom-block-text.js","sources":["webpack://GUI/./src/addons/addons/custom-block-text/text-bold.css","webpack://GUI/./src/addons/addons/custom-block-text/text-shadow.css","webpack://GUI/./src/addons/addons/custom-block-text/_runtime_entry.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".blocklyText,\\n.blocklyHtmlInput {\\n font-weight: bold;\\n}\\n\", \"\"]);\n\n// exports\n","exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"/** Makes block text a little easier to read. **/\\n.blocklyDraggable > .blocklyText,\\n.blocklyDraggable > g > text {\\n text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4);\\n}\\n\", \"\"]);\n\n// exports\n","/* generated by pull.js */\nimport _css from \"!css-loader!./text-bold.css\";\nimport _css2 from \"!css-loader!./text-shadow.css\";\nexport const resources = {\n \"text-bold.css\": _css,\n \"text-shadow.css\": _css2,\n};\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-custom-zoom.js ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-custom-zoom"],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/custom-zoom/style.css":
4
+ /*!***************************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/custom-zoom/style.css ***!
6
+ \***************************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
11
+ // imports
12
+
13
+
14
+ // module
15
+ exports.push([module.i, ".sa-custom-zoom-area {\n position: absolute;\n bottom: 0;\n right: 0;\n width: 60px;\n height: 148px;\n pointer-events: none;\n}\n.blocklyZoom > * {\n transition: transform var(--sa-custom-zoom-speed, 0) ease-in-out;\n}\n.sa-custom-zoom-hidden > * {\n transform: translateX(80px);\n}\n", ""]);
16
+
17
+ // exports
18
+
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/custom-zoom/_runtime_entry.js":
23
+ /*!*********************************************************!*\
24
+ !*** ./src/addons/addons/custom-zoom/_runtime_entry.js ***!
25
+ \*********************************************************/
26
+ /*! exports provided: resources */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
32
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/custom-zoom/userscript.js");
33
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./style.css */ "./node_modules/css-loader/index.js!./src/addons/addons/custom-zoom/style.css");
34
+ /* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__);
35
+ /* generated by pull.js */
36
+
37
+
38
+ const resources = {
39
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"],
40
+ "style.css": _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default.a
41
+ };
42
+
43
+ /***/ }),
44
+
45
+ /***/ "./src/addons/addons/custom-zoom/userscript.js":
46
+ /*!*****************************************************!*\
47
+ !*** ./src/addons/addons/custom-zoom/userscript.js ***!
48
+ \*****************************************************/
49
+ /*! exports provided: default */
50
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
51
+
52
+ "use strict";
53
+ __webpack_require__.r(__webpack_exports__);
54
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
55
+ let {
56
+ addon,
57
+ console
58
+ } = _ref;
59
+ await addon.tab.traps.getBlockly();
60
+ let controlsRect;
61
+ let previousIsHovered = false;
62
+ const speeds = {
63
+ none: "0s",
64
+ short: "0.2s",
65
+ default: "0.3s",
66
+ long: "0.5s"
67
+ };
68
+ const customZoomAreaElement = document.createElement("div");
69
+ customZoomAreaElement.className = "sa-custom-zoom-area";
70
+ function update() {
71
+ document.removeEventListener("mousemove", onMouseMove);
72
+ if (addon.tab.editorMode !== "editor") return;
73
+ Blockly.getMainWorkspace().options.zoomOptions.maxScale = addon.settings.get("maxZoom") / 100;
74
+ Blockly.getMainWorkspace().options.zoomOptions.minScale = addon.settings.get("minZoom") / 100;
75
+ Blockly.getMainWorkspace().options.zoomOptions.startScale = addon.settings.get("startZoom") / 100;
76
+ Blockly.getMainWorkspace().options.zoomOptions.scaleSpeed = 1 + 0.2 * (addon.settings.get("zoomSpeed") / 100);
77
+ const svgGroup = getZoomControls();
78
+ const autohide = addon.settings.get("autohide");
79
+ if (svgGroup) svgGroup.classList.toggle("sa-custom-zoom-hidden", autohide);
80
+ if (autohide) {
81
+ const injectionDiv = document.querySelector(".injectionDiv");
82
+ injectionDiv.appendChild(customZoomAreaElement);
83
+ updateRect();
84
+ document.addEventListener("mousemove", onMouseMove);
85
+ }
86
+ }
87
+ function getZoomControls() {
88
+ const zoomControls = Blockly.getMainWorkspace().zoomControls_;
89
+ if (zoomControls) return zoomControls.svgGroup_;
90
+ return null;
91
+ }
92
+ function onMouseMove(e) {
93
+ const isHovered = e.x > controlsRect.left && e.x < controlsRect.right && e.y > controlsRect.top && e.y < controlsRect.bottom;
94
+ if (isHovered !== previousIsHovered) {
95
+ previousIsHovered = isHovered;
96
+ const svgGroup = getZoomControls();
97
+ if (svgGroup) {
98
+ svgGroup.style.setProperty("--sa-custom-zoom-speed", speeds[addon.settings.get("speed")]);
99
+ svgGroup.classList.toggle("sa-custom-zoom-hidden", !isHovered);
100
+ }
101
+ }
102
+ }
103
+ function updateRect() {
104
+ controlsRect = customZoomAreaElement.getBoundingClientRect();
105
+ }
106
+ function onResize() {
107
+ if (addon.tab.editorMode === "editor" && addon.settings.get("autohide")) {
108
+ updateRect();
109
+ }
110
+ }
111
+ await addon.tab.waitForElement(".blocklyZoom");
112
+ update();
113
+ addon.tab.addEventListener("urlChange", update);
114
+ addon.settings.addEventListener("change", update);
115
+ window.addEventListener("resize", onResize);
116
+ });
117
+
118
+ /***/ })
119
+
120
+ }]);
121
+ //# sourceMappingURL=addon-entry-custom-zoom.js.map
js/addon-entry-custom-zoom.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-custom-zoom.js","sources":["webpack://GUI/./src/addons/addons/custom-zoom/style.css","webpack://GUI/./src/addons/addons/custom-zoom/_runtime_entry.js","webpack://GUI/./src/addons/addons/custom-zoom/userscript.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".sa-custom-zoom-area {\\n position: absolute;\\n bottom: 0;\\n right: 0;\\n width: 60px;\\n height: 148px;\\n pointer-events: none;\\n}\\n.blocklyZoom > * {\\n transition: transform var(--sa-custom-zoom-speed, 0) ease-in-out;\\n}\\n.sa-custom-zoom-hidden > * {\\n transform: translateX(80px);\\n}\\n\", \"\"]);\n\n// exports\n","/* generated by pull.js */\nimport _js from \"./userscript.js\";\nimport _css from \"!css-loader!./style.css\";\nexport const resources = {\n \"userscript.js\": _js,\n \"style.css\": _css,\n};\n","export default async function ({ addon, console }) {\n await addon.tab.traps.getBlockly();\n\n let controlsRect;\n let previousIsHovered = false;\n const speeds = {\n none: \"0s\",\n short: \"0.2s\",\n default: \"0.3s\",\n long: \"0.5s\",\n };\n\n const customZoomAreaElement = document.createElement(\"div\");\n customZoomAreaElement.className = \"sa-custom-zoom-area\";\n\n function update() {\n document.removeEventListener(\"mousemove\", onMouseMove);\n\n if (addon.tab.editorMode !== \"editor\") return;\n\n Blockly.getMainWorkspace().options.zoomOptions.maxScale = addon.settings.get(\"maxZoom\") / 100;\n Blockly.getMainWorkspace().options.zoomOptions.minScale = addon.settings.get(\"minZoom\") / 100;\n Blockly.getMainWorkspace().options.zoomOptions.startScale = addon.settings.get(\"startZoom\") / 100;\n Blockly.getMainWorkspace().options.zoomOptions.scaleSpeed = 1 + 0.2 * (addon.settings.get(\"zoomSpeed\") / 100);\n\n const svgGroup = getZoomControls();\n const autohide = addon.settings.get(\"autohide\");\n if (svgGroup) svgGroup.classList.toggle(\"sa-custom-zoom-hidden\", autohide);\n if (autohide) {\n const injectionDiv = document.querySelector(\".injectionDiv\");\n injectionDiv.appendChild(customZoomAreaElement);\n updateRect();\n document.addEventListener(\"mousemove\", onMouseMove);\n }\n }\n\n function getZoomControls() {\n const zoomControls = Blockly.getMainWorkspace().zoomControls_;\n if (zoomControls) return zoomControls.svgGroup_;\n return null;\n }\n\n function onMouseMove(e) {\n const isHovered =\n e.x > controlsRect.left && e.x < controlsRect.right && e.y > controlsRect.top && e.y < controlsRect.bottom;\n if (isHovered !== previousIsHovered) {\n previousIsHovered = isHovered;\n const svgGroup = getZoomControls();\n if (svgGroup) {\n svgGroup.style.setProperty(\"--sa-custom-zoom-speed\", speeds[addon.settings.get(\"speed\")]);\n svgGroup.classList.toggle(\"sa-custom-zoom-hidden\", !isHovered);\n }\n }\n }\n\n function updateRect() {\n controlsRect = customZoomAreaElement.getBoundingClientRect();\n }\n\n function onResize() {\n if (addon.tab.editorMode === \"editor\" && addon.settings.get(\"autohide\")) {\n updateRect();\n }\n }\n\n await addon.tab.waitForElement(\".blocklyZoom\");\n update();\n addon.tab.addEventListener(\"urlChange\", update);\n addon.settings.addEventListener(\"change\", update);\n window.addEventListener(\"resize\", onResize);\n}\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-debugger.js ADDED
The diff for this file is too large to render. See raw diff
 
js/addon-entry-debugger.js.map ADDED
The diff for this file is too large to render. See raw diff
 
js/addon-entry-default-costume-editor-color.js ADDED
@@ -0,0 +1,300 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-default-costume-editor-color"],{
2
+
3
+ /***/ "./src/addons/addons/default-costume-editor-color/_runtime_entry.js":
4
+ /*!**************************************************************************!*\
5
+ !*** ./src/addons/addons/default-costume-editor-color/_runtime_entry.js ***!
6
+ \**************************************************************************/
7
+ /*! exports provided: resources */
8
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9
+
10
+ "use strict";
11
+ __webpack_require__.r(__webpack_exports__);
12
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
13
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/default-costume-editor-color/userscript.js");
14
+ /* generated by pull.js */
15
+
16
+ const resources = {
17
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"]
18
+ };
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/default-costume-editor-color/userscript.js":
23
+ /*!**********************************************************************!*\
24
+ !*** ./src/addons/addons/default-costume-editor-color/userscript.js ***!
25
+ \**********************************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
32
+ let {
33
+ addon,
34
+ console,
35
+ msg
36
+ } = _ref;
37
+ // We don"t *need* to wait for the costume editor to be opened, but redux updates take a non-zero
38
+ // amount of CPU time so let's delay that for as long as possible.
39
+ await addon.tab.traps.getPaper();
40
+ const hexComponent = str => Math.round(+str).toString(16).toUpperCase().padStart(2, "0");
41
+ const parseColor = color => {
42
+ if (color === null) {
43
+ return null;
44
+ }
45
+ if (typeof color === "string") {
46
+ // TW natively supports hex color codes with or without transparency
47
+ if (color.startsWith("#")) {
48
+ return color.substring(0, 9).toUpperCase();
49
+ }
50
+ // Sometimes paper gives us rgb() colors which have to be converted to hex
51
+ const rgbMatch = color.match(/^rgb\((\d+)\s*,(\d+)\s*,(\d+)\)$/);
52
+ if (rgbMatch) {
53
+ const [_, r, g, b] = rgbMatch;
54
+ return "#".concat(hexComponent(r)).concat(hexComponent(g)).concat(hexComponent(b));
55
+ }
56
+ // It can also give us rgba() colors
57
+ const rgbaMatch = color.match(/^rgba\((\d+)\s*,(\d+)\s*,(\d+),([\d.]+)\)$/);
58
+ if (rgbaMatch) {
59
+ const [_, r, g, b, a] = rgbaMatch;
60
+ return "#".concat(hexComponent(r)).concat(hexComponent(g)).concat(hexComponent(b)).concat(hexComponent(a * 255));
61
+ }
62
+ }
63
+ console.log("Could not normalize color", color);
64
+ return null;
65
+ };
66
+ const parseColorStyleColor = color => {
67
+ if (color === MIXED) return MIXED;
68
+ return parseColor(color);
69
+ };
70
+
71
+ // Special value Scratch uses as color when objects with different colors are selected
72
+ // https://github.com/LLK/scratch-paint/blob/6733e20b56f52d139f9885952a57c7da012a542f/src/helper/style-path.js#L10
73
+ const MIXED = "scratch-paint/style-path/mixed";
74
+ const SCRATCH_DEFAULT_FILL = parseColor("#9966FF");
75
+ const SCRATCH_DEFAULT_STROKE = parseColor("#000000");
76
+ const TOOL_INFO = Object.assign(Object.create(null), {
77
+ // Tool names and gradient info defined in https://github.com/LLK/scratch-paint/blob/develop/src/lib/modes.js
78
+ // Search for activateTool() in matching file in https://github.com/LLK/scratch-paint/tree/develop/src/containers
79
+ BRUSH: {
80
+ resetsFill: true
81
+ },
82
+ ERASER: {},
83
+ LINE: {
84
+ resetsStroke: true,
85
+ requiresNonZeroStrokeWidth: true,
86
+ supportsGradient: true
87
+ },
88
+ FILL: {
89
+ resetsFill: true,
90
+ supportsGradient: true
91
+ },
92
+ SELECT: {
93
+ supportsGradient: true
94
+ },
95
+ RESHAPE: {
96
+ supportsGradient: true
97
+ },
98
+ OVAL: {
99
+ resetsFill: true,
100
+ resetsStroke: true,
101
+ supportsGradient: true
102
+ },
103
+ RECT: {
104
+ resetsFill: true,
105
+ resetsStroke: true,
106
+ supportsGradient: true
107
+ },
108
+ TEXT: {
109
+ resetsFill: true,
110
+ resetsStroke: true
111
+ },
112
+ BIT_BRUSH: {
113
+ resetsFill: true
114
+ },
115
+ BIT_LINE: {
116
+ resetsFill: true,
117
+ requiresNonZeroStrokeWidth: true
118
+ },
119
+ BIT_OVAL: {
120
+ resetsFill: true,
121
+ resetsStroke: true,
122
+ supportsGradient: true
123
+ },
124
+ BIT_RECT: {
125
+ resetsFill: true,
126
+ resetsStroke: true,
127
+ supportsGradient: true
128
+ },
129
+ BIT_TEXT: {
130
+ resetsFill: true,
131
+ resetsStroke: true
132
+ },
133
+ BIT_FILL: {
134
+ resetsFill: true,
135
+ supportsGradient: true
136
+ },
137
+ BIT_ERASER: {},
138
+ BIT_SELECT: {
139
+ supportsGradient: true
140
+ }
141
+ });
142
+ const getToolInfo = () => TOOL_INFO[addon.tab.redux.state.scratchPaint.mode];
143
+ class ColorStyleReducerWrapper {
144
+ constructor(reduxPropertyName, primaryAction, secondaryAction, gradientTypeAction) {
145
+ this.reduxPropertyName = reduxPropertyName;
146
+ this.primaryAction = primaryAction;
147
+ this.secondaryAction = secondaryAction;
148
+ this.gradientTypeAction = gradientTypeAction;
149
+ }
150
+ get() {
151
+ let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : addon.tab.redux.state;
152
+ return state.scratchPaint.color[this.reduxPropertyName];
153
+ }
154
+ set(newColor) {
155
+ const state = this.get();
156
+ const newPrimary = parseColorStyleColor(newColor.primary);
157
+ if (state.primary !== newPrimary) {
158
+ addon.tab.redux.dispatch({
159
+ type: this.primaryAction,
160
+ color: newPrimary
161
+ });
162
+ }
163
+ const toolInfo = getToolInfo();
164
+ const toolSupportsGradient = toolInfo && toolInfo.supportsGradient;
165
+ if (toolSupportsGradient) {
166
+ const newSecondary = parseColorStyleColor(newColor.secondary);
167
+ if (state.secondary !== newSecondary) {
168
+ addon.tab.redux.dispatch({
169
+ type: this.secondaryAction,
170
+ color: newSecondary
171
+ });
172
+ }
173
+ if (state.gradientType !== newColor.gradientType) {
174
+ addon.tab.redux.dispatch({
175
+ type: this.gradientTypeAction,
176
+ gradientType: newColor.gradientType
177
+ });
178
+ }
179
+ }
180
+ }
181
+ }
182
+ const fillStyle = new ColorStyleReducerWrapper("fillColor", "scratch-paint/fill-style/CHANGE_FILL_COLOR", "scratch-paint/fill-style/CHANGE_FILL_COLOR_2", "scratch-paint/fill-style/CHANGE_FILL_GRADIENT_TYPE");
183
+ const strokeStyle = new ColorStyleReducerWrapper("strokeColor", "scratch-paint/stroke-style/CHANGE_STROKE_COLOR", "scratch-paint/stroke-style/CHANGE_STROKE_COLOR_2", "scratch-paint/stroke-style/CHANGE_STROKE_GRADIENT_TYPE");
184
+ const simpleHexColor = hex => ({
185
+ primary: hex,
186
+ secondary: null,
187
+ gradientType: "SOLID"
188
+ });
189
+ let defaultFillColor;
190
+ let defaultStrokeColor;
191
+ let defaultStrokeWidth;
192
+ const setDefaultColorsToSettings = () => {
193
+ defaultFillColor = simpleHexColor(parseColor(addon.settings.get("fill")));
194
+ defaultStrokeColor = simpleHexColor(parseColor(addon.settings.get("stroke")));
195
+ defaultStrokeWidth = addon.settings.get("strokeSize");
196
+ };
197
+ setDefaultColorsToSettings();
198
+ const applyFillColor = () => {
199
+ fillStyle.set(defaultFillColor);
200
+ };
201
+ const applyStrokeColor = () => {
202
+ strokeStyle.set(defaultStrokeColor);
203
+ };
204
+ const applyStrokeWidth = mustBeNonZero => {
205
+ let width = defaultStrokeWidth;
206
+ if (width === 0 && mustBeNonZero) {
207
+ width = 1;
208
+ }
209
+ if (addon.tab.redux.state.scratchPaint.color.strokeWidth !== width) {
210
+ addon.tab.redux.dispatch({
211
+ type: "scratch-paint/stroke-width/CHANGE_STROKE_WIDTH",
212
+ strokeWidth: width
213
+ });
214
+ }
215
+ };
216
+ if (!addon.self.disabled) {
217
+ applyFillColor();
218
+ applyStrokeColor();
219
+ applyStrokeWidth(false);
220
+ }
221
+ addon.settings.addEventListener("change", () => {
222
+ if (!addon.settings.get("persistence")) {
223
+ setDefaultColorsToSettings();
224
+ }
225
+ });
226
+ const isValidColorToPersist = color => color.primary !== null && color.primary !== MIXED;
227
+ let activatingTool = false;
228
+ addon.tab.redux.initialize();
229
+ addon.tab.redux.addEventListener("statechanged", _ref2 => {
230
+ let {
231
+ detail
232
+ } = _ref2;
233
+ if (addon.self.disabled) {
234
+ return;
235
+ }
236
+ const action = detail.action;
237
+ if (!activatingTool && addon.settings.get("persistence")) {
238
+ // We always want to check for changes instead of filtering to just certain actions because quite a few
239
+ // actions can change these.
240
+ const newFill = fillStyle.get();
241
+ if (fillStyle.get(detail.prev) !== newFill && isValidColorToPersist(newFill)) {
242
+ defaultFillColor = newFill;
243
+ }
244
+ const newStroke = strokeStyle.get();
245
+ if (strokeStyle.get(detail.prev) !== newStroke && isValidColorToPersist(newStroke)) {
246
+ defaultStrokeColor = newStroke;
247
+ }
248
+ const newStrokeWidth = detail.next.scratchPaint.color.strokeWidth;
249
+ if (typeof newStrokeWidth === "number") {
250
+ defaultStrokeWidth = newStrokeWidth;
251
+ }
252
+ }
253
+ if (action.type === "scratch-paint/modes/CHANGE_MODE") {
254
+ activatingTool = true;
255
+ queueMicrotask(() => {
256
+ activatingTool = false;
257
+ if (addon.settings.get("persistence")) {
258
+ // In persistence, we always want to re-apply the previous stroke and fill.
259
+ const toolInfo = getToolInfo();
260
+ if (!toolInfo) {
261
+ console.warn("unknown tool", addon.tab.redux.state.scratchPaint.mode);
262
+ return;
263
+ }
264
+ if (toolInfo.resetsFill) {
265
+ applyFillColor();
266
+ }
267
+ if (toolInfo.resetsStroke) {
268
+ applyStrokeWidth(!!toolInfo.requiresNonZeroStrokeWidth);
269
+ applyStrokeColor();
270
+ }
271
+ } else {
272
+ // In non-persistence, we'll only apply the default colors when Scratch resets them to maintain the same behavior.
273
+ // We have to do this weird redux trick because we can't modify these constants:
274
+ // https://github.com/LLK/scratch-paint/blob/6733e20b56f52d139f9885952a57c7da012a542f/src/reducers/fill-style.js#L7
275
+ // https://github.com/LLK/scratch-paint/blob/6733e20b56f52d139f9885952a57c7da012a542f/src/reducers/stroke-style.js#L7
276
+ const oldFillColor = fillStyle.get(detail.prev);
277
+ if (oldFillColor.primary === null || oldFillColor.primary === MIXED) {
278
+ const newFillColor = fillStyle.get();
279
+ if (newFillColor.primary === SCRATCH_DEFAULT_FILL) {
280
+ applyFillColor();
281
+ }
282
+ }
283
+ const oldStrokeColor = strokeStyle.get(detail.prev);
284
+ if (oldStrokeColor.primary === null || oldStrokeColor.primary === MIXED) {
285
+ const newStrokeColor = strokeStyle.get();
286
+ if (newStrokeColor.primary === SCRATCH_DEFAULT_STROKE) {
287
+ applyStrokeWidth(true);
288
+ applyStrokeColor();
289
+ }
290
+ }
291
+ }
292
+ });
293
+ }
294
+ });
295
+ });
296
+
297
+ /***/ })
298
+
299
+ }]);
300
+ //# sourceMappingURL=addon-entry-default-costume-editor-color.js.map
js/addon-entry-default-costume-editor-color.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-default-costume-editor-color.js","sources":["webpack://GUI/./src/addons/addons/default-costume-editor-color/_runtime_entry.js","webpack://GUI/./src/addons/addons/default-costume-editor-color/userscript.js"],"sourcesContent":["/* generated by pull.js */\nimport _js from \"./userscript.js\";\nexport const resources = {\n \"userscript.js\": _js,\n};\n","export default async function ({ addon, console, msg }) {\n // We don\"t *need* to wait for the costume editor to be opened, but redux updates take a non-zero\n // amount of CPU time so let's delay that for as long as possible.\n await addon.tab.traps.getPaper();\n\n const hexComponent = (str) => Math.round(+str).toString(16).toUpperCase().padStart(2, \"0\");\n\n const parseColor = (color) => {\n if (color === null) {\n return null;\n }\n if (typeof color === \"string\") {\n // TW natively supports hex color codes with or without transparency\n if (color.startsWith(\"#\")) {\n return color.substring(0, 9).toUpperCase();\n }\n // Sometimes paper gives us rgb() colors which have to be converted to hex\n const rgbMatch = color.match(/^rgb\\((\\d+)\\s*,(\\d+)\\s*,(\\d+)\\)$/);\n if (rgbMatch) {\n const [_, r, g, b] = rgbMatch;\n return `#${hexComponent(r)}${hexComponent(g)}${hexComponent(b)}`;\n }\n // It can also give us rgba() colors\n const rgbaMatch = color.match(/^rgba\\((\\d+)\\s*,(\\d+)\\s*,(\\d+),([\\d.]+)\\)$/);\n if (rgbaMatch) {\n const [_, r, g, b, a] = rgbaMatch;\n return `#${hexComponent(r)}${hexComponent(g)}${hexComponent(b)}${hexComponent(a * 255)}`;\n }\n }\n console.log(\"Could not normalize color\", color);\n return null;\n };\n\n const parseColorStyleColor = (color) => {\n if (color === MIXED) return MIXED;\n return parseColor(color);\n };\n\n // Special value Scratch uses as color when objects with different colors are selected\n // https://github.com/LLK/scratch-paint/blob/6733e20b56f52d139f9885952a57c7da012a542f/src/helper/style-path.js#L10\n const MIXED = \"scratch-paint/style-path/mixed\";\n\n const SCRATCH_DEFAULT_FILL = parseColor(\"#9966FF\");\n const SCRATCH_DEFAULT_STROKE = parseColor(\"#000000\");\n\n const TOOL_INFO = Object.assign(Object.create(null), {\n // Tool names and gradient info defined in https://github.com/LLK/scratch-paint/blob/develop/src/lib/modes.js\n // Search for activateTool() in matching file in https://github.com/LLK/scratch-paint/tree/develop/src/containers\n BRUSH: {\n resetsFill: true,\n },\n ERASER: {},\n LINE: {\n resetsStroke: true,\n requiresNonZeroStrokeWidth: true,\n supportsGradient: true,\n },\n FILL: {\n resetsFill: true,\n supportsGradient: true,\n },\n SELECT: {\n supportsGradient: true,\n },\n RESHAPE: {\n supportsGradient: true,\n },\n OVAL: {\n resetsFill: true,\n resetsStroke: true,\n supportsGradient: true,\n },\n RECT: {\n resetsFill: true,\n resetsStroke: true,\n supportsGradient: true,\n },\n TEXT: {\n resetsFill: true,\n resetsStroke: true,\n },\n BIT_BRUSH: {\n resetsFill: true,\n },\n BIT_LINE: {\n resetsFill: true,\n requiresNonZeroStrokeWidth: true,\n },\n BIT_OVAL: {\n resetsFill: true,\n resetsStroke: true,\n supportsGradient: true,\n },\n BIT_RECT: {\n resetsFill: true,\n resetsStroke: true,\n supportsGradient: true,\n },\n BIT_TEXT: {\n resetsFill: true,\n resetsStroke: true,\n },\n BIT_FILL: {\n resetsFill: true,\n supportsGradient: true,\n },\n BIT_ERASER: {},\n BIT_SELECT: {\n supportsGradient: true,\n },\n });\n\n const getToolInfo = () => TOOL_INFO[addon.tab.redux.state.scratchPaint.mode];\n\n class ColorStyleReducerWrapper {\n constructor(reduxPropertyName, primaryAction, secondaryAction, gradientTypeAction) {\n this.reduxPropertyName = reduxPropertyName;\n this.primaryAction = primaryAction;\n this.secondaryAction = secondaryAction;\n this.gradientTypeAction = gradientTypeAction;\n }\n\n get(state = addon.tab.redux.state) {\n return state.scratchPaint.color[this.reduxPropertyName];\n }\n\n set(newColor) {\n const state = this.get();\n const newPrimary = parseColorStyleColor(newColor.primary);\n if (state.primary !== newPrimary) {\n addon.tab.redux.dispatch({\n type: this.primaryAction,\n color: newPrimary,\n });\n }\n const toolInfo = getToolInfo();\n const toolSupportsGradient = toolInfo && toolInfo.supportsGradient;\n if (toolSupportsGradient) {\n const newSecondary = parseColorStyleColor(newColor.secondary);\n if (state.secondary !== newSecondary) {\n addon.tab.redux.dispatch({\n type: this.secondaryAction,\n color: newSecondary,\n });\n }\n if (state.gradientType !== newColor.gradientType) {\n addon.tab.redux.dispatch({\n type: this.gradientTypeAction,\n gradientType: newColor.gradientType,\n });\n }\n }\n }\n }\n\n const fillStyle = new ColorStyleReducerWrapper(\n \"fillColor\",\n \"scratch-paint/fill-style/CHANGE_FILL_COLOR\",\n \"scratch-paint/fill-style/CHANGE_FILL_COLOR_2\",\n \"scratch-paint/fill-style/CHANGE_FILL_GRADIENT_TYPE\"\n );\n const strokeStyle = new ColorStyleReducerWrapper(\n \"strokeColor\",\n \"scratch-paint/stroke-style/CHANGE_STROKE_COLOR\",\n \"scratch-paint/stroke-style/CHANGE_STROKE_COLOR_2\",\n \"scratch-paint/stroke-style/CHANGE_STROKE_GRADIENT_TYPE\"\n );\n\n const simpleHexColor = (hex) => ({\n primary: hex,\n secondary: null,\n gradientType: \"SOLID\",\n });\n\n let defaultFillColor;\n let defaultStrokeColor;\n let defaultStrokeWidth;\n const setDefaultColorsToSettings = () => {\n defaultFillColor = simpleHexColor(parseColor(addon.settings.get(\"fill\")));\n defaultStrokeColor = simpleHexColor(parseColor(addon.settings.get(\"stroke\")));\n defaultStrokeWidth = addon.settings.get(\"strokeSize\");\n };\n setDefaultColorsToSettings();\n\n const applyFillColor = () => {\n fillStyle.set(defaultFillColor);\n };\n const applyStrokeColor = () => {\n strokeStyle.set(defaultStrokeColor);\n };\n const applyStrokeWidth = (mustBeNonZero) => {\n let width = defaultStrokeWidth;\n if (width === 0 && mustBeNonZero) {\n width = 1;\n }\n if (addon.tab.redux.state.scratchPaint.color.strokeWidth !== width) {\n addon.tab.redux.dispatch({\n type: \"scratch-paint/stroke-width/CHANGE_STROKE_WIDTH\",\n strokeWidth: width,\n });\n }\n };\n\n if (!addon.self.disabled) {\n applyFillColor();\n applyStrokeColor();\n applyStrokeWidth(false);\n }\n\n addon.settings.addEventListener(\"change\", () => {\n if (!addon.settings.get(\"persistence\")) {\n setDefaultColorsToSettings();\n }\n });\n\n const isValidColorToPersist = (color) => color.primary !== null && color.primary !== MIXED;\n\n let activatingTool = false;\n addon.tab.redux.initialize();\n addon.tab.redux.addEventListener(\"statechanged\", ({ detail }) => {\n if (addon.self.disabled) {\n return;\n }\n const action = detail.action;\n\n if (!activatingTool && addon.settings.get(\"persistence\")) {\n // We always want to check for changes instead of filtering to just certain actions because quite a few\n // actions can change these.\n const newFill = fillStyle.get();\n if (fillStyle.get(detail.prev) !== newFill && isValidColorToPersist(newFill)) {\n defaultFillColor = newFill;\n }\n const newStroke = strokeStyle.get();\n if (strokeStyle.get(detail.prev) !== newStroke && isValidColorToPersist(newStroke)) {\n defaultStrokeColor = newStroke;\n }\n\n const newStrokeWidth = detail.next.scratchPaint.color.strokeWidth;\n if (typeof newStrokeWidth === \"number\") {\n defaultStrokeWidth = newStrokeWidth;\n }\n }\n\n if (action.type === \"scratch-paint/modes/CHANGE_MODE\") {\n activatingTool = true;\n queueMicrotask(() => {\n activatingTool = false;\n if (addon.settings.get(\"persistence\")) {\n // In persistence, we always want to re-apply the previous stroke and fill.\n const toolInfo = getToolInfo();\n if (!toolInfo) {\n console.warn(\"unknown tool\", addon.tab.redux.state.scratchPaint.mode);\n return;\n }\n if (toolInfo.resetsFill) {\n applyFillColor();\n }\n if (toolInfo.resetsStroke) {\n applyStrokeWidth(!!toolInfo.requiresNonZeroStrokeWidth);\n applyStrokeColor();\n }\n } else {\n // In non-persistence, we'll only apply the default colors when Scratch resets them to maintain the same behavior.\n // We have to do this weird redux trick because we can't modify these constants:\n // https://github.com/LLK/scratch-paint/blob/6733e20b56f52d139f9885952a57c7da012a542f/src/reducers/fill-style.js#L7\n // https://github.com/LLK/scratch-paint/blob/6733e20b56f52d139f9885952a57c7da012a542f/src/reducers/stroke-style.js#L7\n const oldFillColor = fillStyle.get(detail.prev);\n if (oldFillColor.primary === null || oldFillColor.primary === MIXED) {\n const newFillColor = fillStyle.get();\n if (newFillColor.primary === SCRATCH_DEFAULT_FILL) {\n applyFillColor();\n }\n }\n const oldStrokeColor = strokeStyle.get(detail.prev);\n if (oldStrokeColor.primary === null || oldStrokeColor.primary === MIXED) {\n const newStrokeColor = strokeStyle.get();\n if (newStrokeColor.primary === SCRATCH_DEFAULT_STROKE) {\n applyStrokeWidth(true);\n applyStrokeColor();\n }\n }\n }\n });\n }\n });\n}\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAMA;AAOA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-disable-paste-offset.js ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-disable-paste-offset"],{
2
+
3
+ /***/ "./src/addons/addons/disable-paste-offset/_runtime_entry.js":
4
+ /*!******************************************************************!*\
5
+ !*** ./src/addons/addons/disable-paste-offset/_runtime_entry.js ***!
6
+ \******************************************************************/
7
+ /*! exports provided: resources */
8
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9
+
10
+ "use strict";
11
+ __webpack_require__.r(__webpack_exports__);
12
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
13
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/disable-paste-offset/userscript.js");
14
+ /* generated by pull.js */
15
+
16
+ const resources = {
17
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"]
18
+ };
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/disable-paste-offset/userscript.js":
23
+ /*!**************************************************************!*\
24
+ !*** ./src/addons/addons/disable-paste-offset/userscript.js ***!
25
+ \**************************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
32
+ let {
33
+ addon,
34
+ console
35
+ } = _ref;
36
+ addon.tab.redux.initialize();
37
+ addon.tab.redux.addEventListener("statechanged", _ref2 => {
38
+ let {
39
+ detail
40
+ } = _ref2;
41
+ if (addon.self.disabled) return;
42
+ if (detail.action.type === "scratch-paint/clipboard/SET" || detail.action.type === "scratch-paint/clipboard/INCREMENT_PASTE_OFFSET") {
43
+ addon.tab.redux.dispatch({
44
+ type: "scratch-paint/clipboard/CLEAR_PASTE_OFFSET"
45
+ });
46
+ }
47
+ });
48
+ addon.self.addEventListener("disabled", () => {
49
+ addon.tab.redux.dispatch({
50
+ type: "scratch-paint/clipboard/CLEAR_PASTE_OFFSET"
51
+ });
52
+ addon.tab.redux.dispatch({
53
+ type: "scratch-paint/clipboard/INCREMENT_PASTE_OFFSET"
54
+ });
55
+ });
56
+ addon.self.addEventListener("reenabled", () => {
57
+ addon.tab.redux.dispatch({
58
+ type: "scratch-paint/clipboard/CLEAR_PASTE_OFFSET"
59
+ });
60
+ });
61
+ if (addon.self.enabledLate) {
62
+ addon.tab.redux.dispatch({
63
+ type: "scratch-paint/clipboard/CLEAR_PASTE_OFFSET"
64
+ });
65
+ }
66
+ });
67
+
68
+ /***/ })
69
+
70
+ }]);
71
+ //# sourceMappingURL=addon-entry-disable-paste-offset.js.map
js/addon-entry-disable-paste-offset.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-disable-paste-offset.js","sources":["webpack://GUI/./src/addons/addons/disable-paste-offset/_runtime_entry.js","webpack://GUI/./src/addons/addons/disable-paste-offset/userscript.js"],"sourcesContent":["/* generated by pull.js */\nimport _js from \"./userscript.js\";\nexport const resources = {\n \"userscript.js\": _js,\n};\n","export default async function ({ addon, console }) {\n addon.tab.redux.initialize();\n addon.tab.redux.addEventListener(\"statechanged\", ({ detail }) => {\n if (addon.self.disabled) return;\n if (\n detail.action.type === \"scratch-paint/clipboard/SET\" ||\n detail.action.type === \"scratch-paint/clipboard/INCREMENT_PASTE_OFFSET\"\n ) {\n addon.tab.redux.dispatch({ type: \"scratch-paint/clipboard/CLEAR_PASTE_OFFSET\" });\n }\n });\n addon.self.addEventListener(\"disabled\", () => {\n addon.tab.redux.dispatch({ type: \"scratch-paint/clipboard/CLEAR_PASTE_OFFSET\" });\n addon.tab.redux.dispatch({ type: \"scratch-paint/clipboard/INCREMENT_PASTE_OFFSET\" });\n });\n addon.self.addEventListener(\"reenabled\", () => {\n addon.tab.redux.dispatch({ type: \"scratch-paint/clipboard/CLEAR_PASTE_OFFSET\" });\n });\n if (addon.self.enabledLate) {\n addon.tab.redux.dispatch({ type: \"scratch-paint/clipboard/CLEAR_PASTE_OFFSET\" });\n }\n}\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAIA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-disable-stage-drag-select.js ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-disable-stage-drag-select"],{
2
+
3
+ /***/ "./src/addons/addons/disable-stage-drag-select/_runtime_entry.js":
4
+ /*!***********************************************************************!*\
5
+ !*** ./src/addons/addons/disable-stage-drag-select/_runtime_entry.js ***!
6
+ \***********************************************************************/
7
+ /*! exports provided: resources */
8
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9
+
10
+ "use strict";
11
+ __webpack_require__.r(__webpack_exports__);
12
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
13
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/disable-stage-drag-select/userscript.js");
14
+ /* generated by pull.js */
15
+
16
+ const resources = {
17
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"]
18
+ };
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/disable-stage-drag-select/userscript.js":
23
+ /*!*******************************************************************!*\
24
+ !*** ./src/addons/addons/disable-stage-drag-select/userscript.js ***!
25
+ \*******************************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony default export */ __webpack_exports__["default"] = (async _ref => {
32
+ let {
33
+ addon,
34
+ console
35
+ } = _ref;
36
+ const vm = addon.tab.traps.vm;
37
+ let shiftKeyPressed = false;
38
+ document.addEventListener("mousedown", function (e) {
39
+ shiftKeyPressed = e.shiftKey;
40
+ }, {
41
+ capture: true
42
+ });
43
+
44
+ // Do not focus sprite after dragging it
45
+ const oldStopDrag = vm.stopDrag;
46
+ vm.stopDrag = function () {
47
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
48
+ args[_key] = arguments[_key];
49
+ }
50
+ if (shiftKeyPressed || addon.self.disabled) return oldStopDrag.call(this, ...args);
51
+ const setEditingTarget = this.setEditingTarget;
52
+ this.setEditingTarget = () => {};
53
+ const r = oldStopDrag.call(this, ...args);
54
+ this.setEditingTarget = setEditingTarget;
55
+ return r;
56
+ };
57
+
58
+ // Don't let the editor drag sprites that aren't marked as draggable
59
+ const oldGetTargetIdForDrawableId = vm.getTargetIdForDrawableId;
60
+ vm.getTargetIdForDrawableId = function () {
61
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
62
+ args[_key2] = arguments[_key2];
63
+ }
64
+ const targetId = oldGetTargetIdForDrawableId.call(this, ...args);
65
+ if (shiftKeyPressed || addon.self.disabled) return targetId;
66
+ if (targetId !== null) {
67
+ const target = this.runtime.getTargetById(targetId);
68
+ if (target && !target.draggable) {
69
+ return null;
70
+ }
71
+ }
72
+ return targetId;
73
+ };
74
+ });
75
+
76
+ /***/ })
77
+
78
+ }]);
79
+ //# sourceMappingURL=addon-entry-disable-stage-drag-select.js.map
js/addon-entry-disable-stage-drag-select.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-disable-stage-drag-select.js","sources":["webpack://GUI/./src/addons/addons/disable-stage-drag-select/_runtime_entry.js","webpack://GUI/./src/addons/addons/disable-stage-drag-select/userscript.js"],"sourcesContent":["/* generated by pull.js */\nimport _js from \"./userscript.js\";\nexport const resources = {\n \"userscript.js\": _js,\n};\n","export default async ({ addon, console }) => {\n const vm = addon.tab.traps.vm;\n\n let shiftKeyPressed = false;\n document.addEventListener(\n \"mousedown\",\n function (e) {\n shiftKeyPressed = e.shiftKey;\n },\n {\n capture: true,\n }\n );\n\n // Do not focus sprite after dragging it\n const oldStopDrag = vm.stopDrag;\n vm.stopDrag = function (...args) {\n if (shiftKeyPressed || addon.self.disabled) return oldStopDrag.call(this, ...args);\n const setEditingTarget = this.setEditingTarget;\n this.setEditingTarget = () => {};\n const r = oldStopDrag.call(this, ...args);\n this.setEditingTarget = setEditingTarget;\n return r;\n };\n\n // Don't let the editor drag sprites that aren't marked as draggable\n const oldGetTargetIdForDrawableId = vm.getTargetIdForDrawableId;\n vm.getTargetIdForDrawableId = function (...args) {\n const targetId = oldGetTargetIdForDrawableId.call(this, ...args);\n if (shiftKeyPressed || addon.self.disabled) return targetId;\n if (targetId !== null) {\n const target = this.runtime.getTargetById(targetId);\n if (target && !target.draggable) {\n return null;\n }\n }\n return targetId;\n };\n};\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-editor-buttons-reverse-order.js ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-editor-buttons-reverse-order"],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/editor-buttons-reverse-order/userstyle.css":
4
+ /*!************************************************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/editor-buttons-reverse-order/userstyle.css ***!
6
+ \************************************************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
11
+ // imports
12
+
13
+
14
+ // module
15
+ exports.push([module.i, "[class*=\"stage-header_stage-menu-wrapper\"],\n[class*=\"stage-header_stage-size-row\"] {\n flex-direction: row-reverse;\n}\n\n[dir=\"ltr\"] [class*=\"stage-header_stage-size-toggle-group\"],\n[dir=\"ltr\"] .sa-debugger-container,\n[dir=\"ltr\"] .sa-gamepad-container {\n margin-right: 0;\n margin-left: 0.2rem;\n}\n\n[dir=\"rtl\"] [class*=\"stage-header_stage-size-toggle-group\"],\n[dir=\"rtl\"] .sa-debugger-container,\n[dir=\"rtl\"] .sa-gamepad-container {\n margin-left: 0;\n margin-right: 0.2rem;\n}\n\n[class*=\"green-flag_green-flag_\"],\n[class*=\"stop-all_stop-all_\"],\n.pause-btn {\n order: 1;\n}\n", ""]);
16
+
17
+ // exports
18
+
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/editor-buttons-reverse-order/_runtime_entry.js":
23
+ /*!**************************************************************************!*\
24
+ !*** ./src/addons/addons/editor-buttons-reverse-order/_runtime_entry.js ***!
25
+ \**************************************************************************/
26
+ /*! exports provided: resources */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
32
+ /* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! css-loader!./userstyle.css */ "./node_modules/css-loader/index.js!./src/addons/addons/editor-buttons-reverse-order/userstyle.css");
33
+ /* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_0__);
34
+ /* generated by pull.js */
35
+
36
+ const resources = {
37
+ "userstyle.css": _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_0___default.a
38
+ };
39
+
40
+ /***/ })
41
+
42
+ }]);
43
+ //# sourceMappingURL=addon-entry-editor-buttons-reverse-order.js.map
js/addon-entry-editor-buttons-reverse-order.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-editor-buttons-reverse-order.js","sources":["webpack://GUI/./src/addons/addons/editor-buttons-reverse-order/userstyle.css","webpack://GUI/./src/addons/addons/editor-buttons-reverse-order/_runtime_entry.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"[class*=\\\"stage-header_stage-menu-wrapper\\\"],\\n[class*=\\\"stage-header_stage-size-row\\\"] {\\n flex-direction: row-reverse;\\n}\\n\\n[dir=\\\"ltr\\\"] [class*=\\\"stage-header_stage-size-toggle-group\\\"],\\n[dir=\\\"ltr\\\"] .sa-debugger-container,\\n[dir=\\\"ltr\\\"] .sa-gamepad-container {\\n margin-right: 0;\\n margin-left: 0.2rem;\\n}\\n\\n[dir=\\\"rtl\\\"] [class*=\\\"stage-header_stage-size-toggle-group\\\"],\\n[dir=\\\"rtl\\\"] .sa-debugger-container,\\n[dir=\\\"rtl\\\"] .sa-gamepad-container {\\n margin-left: 0;\\n margin-right: 0.2rem;\\n}\\n\\n[class*=\\\"green-flag_green-flag_\\\"],\\n[class*=\\\"stop-all_stop-all_\\\"],\\n.pause-btn {\\n order: 1;\\n}\\n\", \"\"]);\n\n// exports\n","/* generated by pull.js */\nimport _css from \"!css-loader!./userstyle.css\";\nexport const resources = {\n \"userstyle.css\": _css,\n};\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-editor-colored-context-menus.js ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-editor-colored-context-menus"],{
2
+
3
+ /***/ "./node_modules/css-loader/index.js!./src/addons/addons/editor-colored-context-menus/userscript.css":
4
+ /*!*************************************************************************************************!*\
5
+ !*** ./node_modules/css-loader!./src/addons/addons/editor-colored-context-menus/userscript.css ***!
6
+ \*************************************************************************************************/
7
+ /*! no static exports found */
8
+ /***/ (function(module, exports, __webpack_require__) {
9
+
10
+ exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
11
+ // imports
12
+
13
+
14
+ // module
15
+ exports.push([module.i, ".sa-contextmenu-colored .blocklyContextMenu {\n background: var(--sa-contextmenu-bg) !important;\n border-color: var(--sa-contextmenu-border) !important;\n}\n.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem-highlight,\n.sa-contextmenu-colored .s3dev-mi:hover {\n background-color: #0001;\n border-color: transparent !important;\n}\n.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem[style*=\"border-top\"] {\n border-top-color: var(--sa-contextmenu-border) !important;\n}\n.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem .goog-menuitem-content {\n color: var(--sa-contextmenu-text, #fff);\n}", ""]);
16
+
17
+ // exports
18
+
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/editor-colored-context-menus/_runtime_entry.js":
23
+ /*!**************************************************************************!*\
24
+ !*** ./src/addons/addons/editor-colored-context-menus/_runtime_entry.js ***!
25
+ \**************************************************************************/
26
+ /*! exports provided: resources */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
32
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/editor-colored-context-menus/userscript.js");
33
+ /* harmony import */ var _css_loader_userscript_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./userscript.css */ "./node_modules/css-loader/index.js!./src/addons/addons/editor-colored-context-menus/userscript.css");
34
+ /* harmony import */ var _css_loader_userscript_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_userscript_css__WEBPACK_IMPORTED_MODULE_1__);
35
+ /* generated by pull.js */
36
+
37
+
38
+ const resources = {
39
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"],
40
+ "userscript.css": _css_loader_userscript_css__WEBPACK_IMPORTED_MODULE_1___default.a
41
+ };
42
+
43
+ /***/ }),
44
+
45
+ /***/ "./src/addons/addons/editor-colored-context-menus/userscript.js":
46
+ /*!**********************************************************************!*\
47
+ !*** ./src/addons/addons/editor-colored-context-menus/userscript.js ***!
48
+ \**********************************************************************/
49
+ /*! exports provided: default */
50
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
51
+
52
+ "use strict";
53
+ __webpack_require__.r(__webpack_exports__);
54
+ /* harmony import */ var _libraries_common_cs_text_color_esm_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../libraries/common/cs/text-color.esm.js */ "./src/addons/libraries/common/cs/text-color.esm.js");
55
+
56
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
57
+ let {
58
+ addon,
59
+ console
60
+ } = _ref;
61
+ const ScratchBlocks = await addon.tab.traps.getBlockly();
62
+ const fixupColor = color => {
63
+ // some extensions have SVG-gradient styled blocks
64
+ if (color.startsWith("url(#")) {
65
+ const gradientID = color.substring(5, color.length - 1);
66
+ const gradientCode = document.querySelector("svg [id=\"".concat(gradientID, "\"]"));
67
+ if (!gradientCode || gradientCode.tagName !== "linearGradient") return "#000000";
68
+ const parseCoord = v => parseFloat(v.replace("%", ""));
69
+ const x1 = parseCoord(gradientCode.getAttribute("x1") || "0");
70
+ const y1 = parseCoord(gradientCode.getAttribute("y1") || "0");
71
+ const x2 = parseCoord(gradientCode.getAttribute("x2") || "100");
72
+ const y2 = parseCoord(gradientCode.getAttribute("y2") || "0");
73
+ const dx = x2 - x1,
74
+ dy = y2 - y1;
75
+ const angleDeg = (Math.atan2(dy, dx) * 180 / Math.PI + 90 + 360) % 360;
76
+ const stops = Array.from(gradientCode.querySelectorAll("stop")).map(stop => {
77
+ const color = stop.getAttribute("stop-color") || "#000";
78
+ let offset = stop.getAttribute("offset");
79
+ if (!offset) offset = "0%";else if (!offset.endsWith("%")) offset = parseFloat(offset) * 100 + "%";
80
+ return "".concat(color, " ").concat(offset);
81
+ });
82
+ return "linear-gradient(".concat(angleDeg.toFixed(2), "deg, ").concat(stops.join(", "), ")");
83
+ } else {
84
+ return Object(_libraries_common_cs_text_color_esm_js__WEBPACK_IMPORTED_MODULE_0__["removeAlpha"])(color);
85
+ }
86
+ };
87
+ const applyContextMenuColor = block => {
88
+ var _block$textColour;
89
+ const widgetDiv = ScratchBlocks.WidgetDiv.DIV;
90
+ if (!widgetDiv) {
91
+ return;
92
+ }
93
+ const background = block.svgPath_;
94
+ if (!background) {
95
+ return;
96
+ }
97
+ const fill = fixupColor(background.getAttribute("fill"));
98
+ const border = background.getAttribute("stroke") || "#0003";
99
+ widgetDiv.classList.add("sa-contextmenu-colored");
100
+ widgetDiv.style.setProperty("--sa-contextmenu-bg", fill);
101
+ widgetDiv.style.setProperty("--sa-contextmenu-border", border);
102
+ widgetDiv.style.setProperty("--sa-contextmenu-text", (_block$textColour = block.textColour) !== null && _block$textColour !== void 0 ? _block$textColour : "#fff");
103
+ };
104
+ const originalHandleRightClick = ScratchBlocks.Gesture.prototype.handleRightClick;
105
+ ScratchBlocks.Gesture.prototype.handleRightClick = function () {
106
+ const block = this.targetBlock_;
107
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
108
+ args[_key] = arguments[_key];
109
+ }
110
+ const ret = originalHandleRightClick.call(this, ...args);
111
+ if (block) {
112
+ applyContextMenuColor(block);
113
+ }
114
+ return ret;
115
+ };
116
+ const originalHide = ScratchBlocks.WidgetDiv.hide;
117
+ ScratchBlocks.WidgetDiv.hide = function () {
118
+ if (ScratchBlocks.WidgetDiv.DIV) {
119
+ ScratchBlocks.WidgetDiv.DIV.classList.remove("sa-contextmenu-colored");
120
+ }
121
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
122
+ args[_key2] = arguments[_key2];
123
+ }
124
+ return originalHide.call(this, ...args);
125
+ };
126
+ });
127
+
128
+ /***/ })
129
+
130
+ }]);
131
+ //# sourceMappingURL=addon-entry-editor-colored-context-menus.js.map
js/addon-entry-editor-colored-context-menus.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-editor-colored-context-menus.js","sources":["webpack://GUI/./src/addons/addons/editor-colored-context-menus/userscript.css","webpack://GUI/./src/addons/addons/editor-colored-context-menus/_runtime_entry.js","webpack://GUI/./src/addons/addons/editor-colored-context-menus/userscript.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".sa-contextmenu-colored .blocklyContextMenu {\\n background: var(--sa-contextmenu-bg) !important;\\n border-color: var(--sa-contextmenu-border) !important;\\n}\\n.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem-highlight,\\n.sa-contextmenu-colored .s3dev-mi:hover {\\n background-color: #0001;\\n border-color: transparent !important;\\n}\\n.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem[style*=\\\"border-top\\\"] {\\n border-top-color: var(--sa-contextmenu-border) !important;\\n}\\n.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem .goog-menuitem-content {\\n color: var(--sa-contextmenu-text, #fff);\\n}\", \"\"]);\n\n// exports\n","/* generated by pull.js */\nimport _js from \"./userscript.js\";\nimport _css from \"!css-loader!./userscript.css\";\nexport const resources = {\n \"userscript.js\": _js,\n \"userscript.css\": _css,\n};\n","import { removeAlpha } from \"../../libraries/common/cs/text-color.esm.js\";\n\nexport default async function ({ addon, console }) {\n const ScratchBlocks = await addon.tab.traps.getBlockly();\n\n const fixupColor = (color) => {\n // some extensions have SVG-gradient styled blocks\n if (color.startsWith(`url(#`)) {\n const gradientID = color.substring(5, color.length - 1);\n const gradientCode = document.querySelector(`svg [id=\"${gradientID}\"]`);\n if (!gradientCode || gradientCode.tagName !== \"linearGradient\") return \"#000000\";\n\n const parseCoord = v => parseFloat(v.replace(\"%\", \"\"));\n const x1 = parseCoord(gradientCode.getAttribute(\"x1\") || \"0\");\n const y1 = parseCoord(gradientCode.getAttribute(\"y1\") || \"0\");\n const x2 = parseCoord(gradientCode.getAttribute(\"x2\") || \"100\");\n const y2 = parseCoord(gradientCode.getAttribute(\"y2\") || \"0\");\n\n const dx = x2 - x1, dy = y2 - y1;\n const angleDeg = ((Math.atan2(dy, dx) * 180) / Math.PI + 90 + 360) % 360;\n\n const stops = Array.from(gradientCode.querySelectorAll(\"stop\")).map(stop => {\n const color = stop.getAttribute(\"stop-color\") || \"#000\";\n let offset = stop.getAttribute(\"offset\");\n if (!offset) offset = \"0%\";\n else if (!offset.endsWith(\"%\")) offset = parseFloat(offset) * 100 + \"%\";\n return `${color} ${offset}`;\n });\n return `linear-gradient(${angleDeg.toFixed(2)}deg, ${stops.join(\", \")})`;\n } else {\n return removeAlpha(color);\n }\n };\n\n const applyContextMenuColor = (block) => {\n const widgetDiv = ScratchBlocks.WidgetDiv.DIV;\n if (!widgetDiv) {\n return;\n }\n const background = block.svgPath_;\n if (!background) {\n return;\n }\n const fill = fixupColor(background.getAttribute(\"fill\"));\n const border = background.getAttribute(\"stroke\") || \"#0003\";\n widgetDiv.classList.add(\"sa-contextmenu-colored\");\n widgetDiv.style.setProperty(\"--sa-contextmenu-bg\", fill);\n widgetDiv.style.setProperty(\"--sa-contextmenu-border\", border);\n widgetDiv.style.setProperty(\"--sa-contextmenu-text\", block.textColour ?? \"#fff\");\n };\n\n const originalHandleRightClick = ScratchBlocks.Gesture.prototype.handleRightClick;\n ScratchBlocks.Gesture.prototype.handleRightClick = function (...args) {\n const block = this.targetBlock_;\n const ret = originalHandleRightClick.call(this, ...args);\n if (block) {\n applyContextMenuColor(block);\n }\n return ret;\n };\n\n const originalHide = ScratchBlocks.WidgetDiv.hide;\n ScratchBlocks.WidgetDiv.hide = function (...args) {\n if (ScratchBlocks.WidgetDiv.DIV) {\n ScratchBlocks.WidgetDiv.DIV.classList.remove(\"sa-contextmenu-colored\");\n }\n return originalHide.call(this, ...args);\n };\n}"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AADA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAHA;AAAA;AAIA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-editor-extra-keys.js ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-editor-extra-keys"],{
2
+
3
+ /***/ "./src/addons/addons/editor-extra-keys/_runtime_entry.js":
4
+ /*!***************************************************************!*\
5
+ !*** ./src/addons/addons/editor-extra-keys/_runtime_entry.js ***!
6
+ \***************************************************************/
7
+ /*! exports provided: resources */
8
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9
+
10
+ "use strict";
11
+ __webpack_require__.r(__webpack_exports__);
12
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
13
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/editor-extra-keys/userscript.js");
14
+ /* generated by pull.js */
15
+
16
+ const resources = {
17
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"]
18
+ };
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/editor-extra-keys/userscript.js":
23
+ /*!***********************************************************!*\
24
+ !*** ./src/addons/addons/editor-extra-keys/userscript.js ***!
25
+ \***********************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
32
+ let {
33
+ addon,
34
+ msg
35
+ } = _ref;
36
+ const ScratchBlocks = await addon.tab.traps.getBlockly();
37
+ let defaultKeys = null;
38
+ function appendKeys(keys, enableShiftKeys) {
39
+ if (!defaultKeys) {
40
+ defaultKeys = [...keys];
41
+ }
42
+ if (!addon.self.disabled) {
43
+ keys.push(...[["-", "-"], [",", ","], [".", "."]]);
44
+ keys.splice(5, 0, [msg("enter-key"), "enter"]);
45
+ if (addon.settings.get("experimentalKeys")) {
46
+ keys.push(...[["`", "`"], ["=", "="], ["[", "["], ["]", "]"], ["\\", "\\"], [";", ";"], ["'", "'"], ["/", "/"]]);
47
+ }
48
+ if (enableShiftKeys && addon.settings.get("shiftKeys")) {
49
+ keys.push(...[["!", "!"], ["@", "@"], ["#", "#"], ["$", "$"], ["%", "%"], ["^", "^"], ["&", "&"], ["*", "*"], ["(", "("], [")", ")"], ["_", "_"], ["+", "+"], ["{", "{"], ["}", "}"], ["|", "|"], [":", ":"], ['"', '"'], ["?", "?"], ["<", "<"], [">", ">"], ["~", "~"]]);
50
+ }
51
+ if (addon.settings.get("twKeys")) {
52
+ keys.push(...[["backspace", "backspace"], ["delete", "delete"], ["shift", "shift"], ["caps lock", "caps lock"], ["scroll lock", "scroll lock"], ["control", "control"], ["escape", "escape"], ["insert", "insert"], ["home", "home"], ["end", "end"], ["page up", "page up"], ["page down", "page down"]]);
53
+ }
54
+ }
55
+ return keys;
56
+ }
57
+ for (const opcode of ["sensing_keyoptions", "event_whenkeypressed", "event_whenkeyhit"]) {
58
+ const block = ScratchBlocks.Blocks[opcode];
59
+ const originalInit = block.init;
60
+ block.init = function () {
61
+ const originalJsonInit = this.jsonInit;
62
+ this.jsonInit = function (obj) {
63
+ appendKeys(obj.args0[0].options, opcode === "event_whenkeypressed" || opcode === "event_whenkeyhit");
64
+ return originalJsonInit.call(this, obj);
65
+ };
66
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
67
+ args[_key] = arguments[_key];
68
+ }
69
+ return originalInit.call(this, ...args);
70
+ };
71
+ }
72
+ const updateExistingBlocks = () => {
73
+ const workspace = Blockly.getMainWorkspace();
74
+ const flyout = workspace && workspace.getFlyout();
75
+ if (workspace && flyout) {
76
+ const allBlocks = [...workspace.getAllBlocks(), ...flyout.getWorkspace().getAllBlocks()];
77
+ for (const block of allBlocks) {
78
+ if (block.type !== "event_whenkeypressed" && block.type !== "event_whenkeyhit" && block.type !== "sensing_keyoptions") {
79
+ continue;
80
+ }
81
+ const input = block.inputList[0];
82
+ if (!input) {
83
+ continue;
84
+ }
85
+ const field = input.fieldRow.find(i => i && Array.isArray(i.menuGenerator_));
86
+ if (!field) {
87
+ continue;
88
+ }
89
+ field.menuGenerator_ = appendKeys(defaultKeys ? [...defaultKeys] : field.menuGenerator_, block.type === "event_whenkeypressed" || block.type === "event_whenkeyhit");
90
+ }
91
+ }
92
+ };
93
+ updateExistingBlocks();
94
+ addon.settings.addEventListener("change", updateExistingBlocks);
95
+ addon.self.addEventListener("disabled", updateExistingBlocks);
96
+ addon.self.addEventListener("reenabled", updateExistingBlocks);
97
+ });
98
+
99
+ /***/ })
100
+
101
+ }]);
102
+ //# sourceMappingURL=addon-entry-editor-extra-keys.js.map
js/addon-entry-editor-extra-keys.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"js/addon-entry-editor-extra-keys.js","sources":["webpack://GUI/./src/addons/addons/editor-extra-keys/_runtime_entry.js","webpack://GUI/./src/addons/addons/editor-extra-keys/userscript.js"],"sourcesContent":["/* generated by pull.js */\nimport _js from \"./userscript.js\";\nexport const resources = {\n \"userscript.js\": _js,\n};\n","export default async function ({ addon, msg }) {\n const ScratchBlocks = await addon.tab.traps.getBlockly();\n\n let defaultKeys = null;\n function appendKeys(keys, enableShiftKeys) {\n if (!defaultKeys) {\n defaultKeys = [...keys];\n }\n if (!addon.self.disabled) {\n keys.push(\n ...[\n [\"-\", \"-\"],\n [\",\", \",\"],\n [\".\", \".\"],\n ]\n );\n keys.splice(5, 0, [msg(\"enter-key\"), \"enter\"]);\n if (addon.settings.get(\"experimentalKeys\")) {\n keys.push(\n ...[\n [\"`\", \"`\"],\n [\"=\", \"=\"],\n [\"[\", \"[\"],\n [\"]\", \"]\"],\n [\"\\\\\", \"\\\\\"],\n [\";\", \";\"],\n [\"'\", \"'\"],\n [\"/\", \"/\"],\n ]\n );\n }\n if (enableShiftKeys && addon.settings.get(\"shiftKeys\")) {\n keys.push(\n ...[\n [\"!\", \"!\"],\n [\"@\", \"@\"],\n [\"#\", \"#\"],\n [\"$\", \"$\"],\n [\"%\", \"%\"],\n [\"^\", \"^\"],\n [\"&\", \"&\"],\n [\"*\", \"*\"],\n [\"(\", \"(\"],\n [\")\", \")\"],\n [\"_\", \"_\"],\n [\"+\", \"+\"],\n [\"{\", \"{\"],\n [\"}\", \"}\"],\n [\"|\", \"|\"],\n [\":\", \":\"],\n ['\"', '\"'],\n [\"?\", \"?\"],\n [\"<\", \"<\"],\n [\">\", \">\"],\n [\"~\", \"~\"],\n ]\n );\n }\n if (addon.settings.get(\"twKeys\")) {\n keys.push(\n ...[\n [\"backspace\", \"backspace\"],\n [\"delete\", \"delete\"],\n [\"shift\", \"shift\"],\n [\"caps lock\", \"caps lock\"],\n [\"scroll lock\", \"scroll lock\"],\n [\"control\", \"control\"],\n [\"escape\", \"escape\"],\n [\"insert\", \"insert\"],\n [\"home\", \"home\"],\n [\"end\", \"end\"],\n [\"page up\", \"page up\"],\n [\"page down\", \"page down\"],\n ]\n );\n }\n }\n return keys;\n }\n\n for (const opcode of [\"sensing_keyoptions\", \"event_whenkeypressed\", \"event_whenkeyhit\"]) {\n const block = ScratchBlocks.Blocks[opcode];\n const originalInit = block.init;\n block.init = function (...args) {\n const originalJsonInit = this.jsonInit;\n this.jsonInit = function (obj) {\n appendKeys(obj.args0[0].options, opcode === \"event_whenkeypressed\" || opcode === \"event_whenkeyhit\");\n return originalJsonInit.call(this, obj);\n };\n return originalInit.call(this, ...args);\n };\n }\n\n const updateExistingBlocks = () => {\n const workspace = Blockly.getMainWorkspace();\n const flyout = workspace && workspace.getFlyout();\n if (workspace && flyout) {\n const allBlocks = [...workspace.getAllBlocks(), ...flyout.getWorkspace().getAllBlocks()];\n for (const block of allBlocks) {\n if (block.type !== \"event_whenkeypressed\" && block.type !== \"event_whenkeyhit\" && block.type !== \"sensing_keyoptions\") {\n continue;\n }\n const input = block.inputList[0];\n if (!input) {\n continue;\n }\n const field = input.fieldRow.find((i) => i && Array.isArray(i.menuGenerator_));\n if (!field) {\n continue;\n }\n field.menuGenerator_ = appendKeys(\n defaultKeys ? [...defaultKeys] : field.menuGenerator_,\n block.type === \"event_whenkeypressed\" || block.type === \"event_whenkeyhit\"\n );\n }\n }\n };\n\n updateExistingBlocks();\n addon.settings.addEventListener(\"change\", updateExistingBlocks);\n addon.self.addEventListener(\"disabled\", updateExistingBlocks);\n addon.self.addEventListener(\"reenabled\", updateExistingBlocks);\n}\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAOA;AACA;AACA;AAYA;AACA;AACA;AAyBA;AACA;AACA;AAgBA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AALA;AAAA;AAMA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}
js/addon-entry-editor-sounds.js ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-editor-sounds"],{
2
+
3
+ /***/ "./src/addons/addons/editor-sounds/_runtime_entry.js":
4
+ /*!***********************************************************!*\
5
+ !*** ./src/addons/addons/editor-sounds/_runtime_entry.js ***!
6
+ \***********************************************************/
7
+ /*! exports provided: resources */
8
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9
+
10
+ "use strict";
11
+ __webpack_require__.r(__webpack_exports__);
12
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; });
13
+ /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/editor-sounds/userscript.js");
14
+ /* generated by pull.js */
15
+
16
+ const resources = {
17
+ "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"]
18
+ };
19
+
20
+ /***/ }),
21
+
22
+ /***/ "./src/addons/addons/editor-sounds/userscript.js":
23
+ /*!*******************************************************!*\
24
+ !*** ./src/addons/addons/editor-sounds/userscript.js ***!
25
+ \*******************************************************/
26
+ /*! exports provided: default */
27
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
28
+
29
+ "use strict";
30
+ __webpack_require__.r(__webpack_exports__);
31
+ /* harmony default export */ __webpack_exports__["default"] = (async function (_ref) {
32
+ let {
33
+ addon,
34
+ console
35
+ } = _ref;
36
+ const ScratchBlocks = await addon.tab.traps.getBlockly();
37
+ const injectCurrent = () => {
38
+ const workspace = Blockly.getMainWorkspace();
39
+ const pathToMedia = workspace.options.pathToMedia;
40
+ ScratchBlocks.inject.loadSounds_(pathToMedia, workspace);
41
+ };
42
+
43
+ // Add sounds to the current workspace
44
+ injectCurrent();
45
+
46
+ // Add sounds to all future workspaces
47
+ const originalInit = ScratchBlocks.init_;
48
+ ScratchBlocks.init_ = function () {
49
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
50
+ args[_key] = arguments[_key];
51
+ }
52
+ const wksp = args[0];
53
+ wksp.options.hasSounds = true;
54
+ return originalInit.call(this, ...args);
55
+ };
56
+ addon.self.addEventListener("disabled", () => {
57
+ const workspace = Blockly.getMainWorkspace();
58
+ const audio = workspace.getAudioManager();
59
+ delete audio.SOUNDS_.click;
60
+ delete audio.SOUNDS_.delete;
61
+ });
62
+ addon.self.addEventListener("reenabled", injectCurrent);
63
+ });
64
+
65
+ /***/ })
66
+
67
+ }]);
68
+ //# sourceMappingURL=addon-entry-editor-sounds.js.map