soiz1 commited on
Commit
8086c81
·
verified ·
1 Parent(s): 771aa8f

Update build 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 +11 -0
  2. 41f50eb9f984c12c2544.worker.js +228 -0
  3. 41f50eb9f984c12c2544.worker.js.map +1 -0
  4. addons.html +22 -0
  5. bloomfilter.svg +6 -0
  6. contact.html +49 -0
  7. credits.html +22 -0
  8. editor.html +53 -0
  9. embed.html +50 -0
  10. embedtest.html +15 -0
  11. favicon.ico +3 -0
  12. favicon.png +0 -0
  13. featured_project.png +0 -0
  14. fullscreen.html +53 -0
  15. iframeposttest.html +37 -0
  16. iframereceivetest.html +22 -0
  17. images/192.png +0 -0
  18. images/512.png +0 -0
  19. images/apple-touch-icon.png +0 -0
  20. index.html +53 -0
  21. js/0.js +74 -0
  22. js/0.js.map +1 -0
  23. js/1.js +124 -0
  24. js/1.js.map +1 -0
  25. js/2.js +53 -0
  26. js/2.js.map +1 -0
  27. js/addon-default-entry.js +0 -0
  28. js/addon-default-entry.js.map +0 -0
  29. js/addon-entry-2d-color-picker.js +1635 -0
  30. js/addon-entry-2d-color-picker.js.map +1 -0
  31. js/addon-entry-better-img-uploads.js +271 -0
  32. js/addon-entry-better-img-uploads.js.map +1 -0
  33. js/addon-entry-block-count.js +97 -0
  34. js/addon-entry-block-count.js.map +1 -0
  35. js/addon-entry-block-palette-icons.js +314 -0
  36. js/addon-entry-block-palette-icons.js.map +1 -0
  37. js/addon-entry-blocks2image.js +238 -0
  38. js/addon-entry-blocks2image.js.map +1 -0
  39. js/addon-entry-cat-blocks.js +327 -0
  40. js/addon-entry-cat-blocks.js.map +1 -0
  41. js/addon-entry-clones.js +210 -0
  42. js/addon-entry-clones.js.map +1 -0
  43. js/addon-entry-columns.js +212 -0
  44. js/addon-entry-columns.js.map +1 -0
  45. js/addon-entry-custom-block-shape.js +135 -0
  46. js/addon-entry-custom-block-shape.js.map +1 -0
  47. js/addon-entry-custom-block-text.js +66 -0
  48. js/addon-entry-custom-block-text.js.map +1 -0
  49. js/addon-entry-custom-zoom.js +121 -0
  50. js/addon-entry-custom-zoom.js.map +1 -0
.gitattributes CHANGED
@@ -33,3 +33,14 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ favicon.ico filter=lfs diff=lfs merge=lfs -text
37
+ js/vendors~editor~embed~fullscreen~player~playground.js filter=lfs diff=lfs merge=lfs -text
38
+ js/vendors~editor~embed~fullscreen~player~playground.js.map filter=lfs diff=lfs merge=lfs -text
39
+ static/assets/48d66af328a669a1c84c5dc87a4e9a3b.ttf filter=lfs diff=lfs merge=lfs -text
40
+ static/assets/4c768843c9fa6593074231cd762b83f8.ttf filter=lfs diff=lfs merge=lfs -text
41
+ static/assets/57f5c040b2ec7c6f269042b4e1c32a03.png filter=lfs diff=lfs merge=lfs -text
42
+ static/assets/5f46c8dc3b8cc2296eb73f013dfce3db.ttf filter=lfs diff=lfs merge=lfs -text
43
+ static/assets/8996930d8e83f63cc3341172205df460.otf filter=lfs diff=lfs merge=lfs -text
44
+ static/assets/8d83d454d2c42614a203322393c23a5b.ttf filter=lfs diff=lfs merge=lfs -text
45
+ static/assets/9ec3449723269a806ec6eaba0f8f6cef.ttf filter=lfs diff=lfs merge=lfs -text
46
+ 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":""}
addons.html ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Addon Settings - PenguinMod</title>
7
+ <style>
8
+ body[splash-theme="dark"]:not(.tw-loaded) {
9
+ background: #111;
10
+ }
11
+ </style>
12
+ </head>
13
+ <body>
14
+ <script>
15
+ (function() {
16
+ try {var localTheme = localStorage.getItem('tw:theme');} catch (e) {}
17
+ if (localTheme ? localTheme === 'dark' : window.matchMedia('(prefers-color-scheme: dark)').matches) document.body.setAttribute('splash-theme', 'dark');
18
+ })();
19
+ </script>
20
+ <div id="app"></div>
21
+ <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/addon-settings~addons~editor~fullscreen~player~playground.js"></script><script src="js/addon-settings.js"></script></body>
22
+ </html>
bloomfilter.svg ADDED
contact.html ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>PenguinMod - Contact</title>
5
+ <meta charset="utf8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <style>
8
+ body {
9
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
10
+ margin: 0; padding: 0;
11
+ }
12
+ header {
13
+ background-color: hsla(194, 100%, 50%, 1);
14
+ color: white;
15
+ text-align: center;
16
+ padding: 20px 0;
17
+ }
18
+ main {
19
+ max-width: 900px;
20
+ margin: auto;
21
+ }
22
+ @media (prefers-color-scheme: dark) {
23
+ body { background: #111; color: #eee; }
24
+ a { color: #4af; }
25
+ }
26
+ </style>
27
+ </head>
28
+
29
+ <body>
30
+ <header>
31
+ <h1>Contact</h1>
32
+ </header>
33
+
34
+ <main>
35
+ <p>
36
+ Please only contact us personally for serious matters such as security, copyright, etc.
37
+ <br>
38
+ Spam, advertisments, or other mail may be blocked.
39
+ </p>
40
+
41
+ <br>
42
+
43
+ <p>Email us at <a href="mailto:[email protected]">[email protected]</a></p>
44
+ <p>Make an <a href="https://github.com/PenguinMod/PenguinMod-Home/issues">issue on our GitHub</a></p>
45
+ <p>Post or reply mentioning <a href="https://twitter.com/penguin_mod">our X account</a></p>
46
+ <p>Join <a href="https://discord.gg/NZ9MBMYTZh">our Discord Server</a></p>
47
+ </main>
48
+ </body>
49
+ </html>
credits.html ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>PenguinMod & TurboWarp Credits</title>
7
+ <style>
8
+ body[splash-theme="dark"]:not(.tw-loaded) {
9
+ background: #111;
10
+ }
11
+ </style>
12
+ </head>
13
+ <body>
14
+ <script>
15
+ (function() {
16
+ try {var localTheme = localStorage.getItem('tw:theme');} catch (e) {}
17
+ if (localTheme ? localTheme === 'dark' : window.matchMedia('(prefers-color-scheme: dark)').matches) document.body.setAttribute('splash-theme', 'dark');
18
+ })();
19
+ </script>
20
+ <div id="app"></div>
21
+ <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/credits.js"></script></body>
22
+ </html>
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>
embed.html ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>Embedded Project - PenguinMod</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
+ })();
47
+ </script>
48
+ <div id="app"></div>
49
+ <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/embed~player.js"></script><script src="js/embed.js"></script></body>
50
+ </html>
embedtest.html ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta name="robots" content="noindex">
5
+ <style>
6
+ body {
7
+ /* not quite white so we can test transparency */
8
+ background-color: #ffeecc;
9
+ }
10
+ </style>
11
+ </head>
12
+ <body>
13
+ <iframe src="embed.html?addons=pause,gamepad&settings-button&fullscreen-background=black#443603478" width="499" height="416" allowtransparency="true" frameborder="0" scrolling="no" allowfullscreen></iframe>
14
+ </body>
15
+ </html>
favicon.ico ADDED

Git LFS Details

  • SHA256: 7b6414945f53b55f68a2b3f62381e2ab92f2385a39a5329bfd7a8baa2e2ecba2
  • Pointer size: 131 Bytes
  • Size of remote file: 238 kB
favicon.png ADDED
featured_project.png ADDED
fullscreen.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 - A mod of TurboWarp</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/fullscreen.js"></script></body>
53
+ </html>
iframeposttest.html ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>aegewg</title>
7
+ </head>
8
+ <body>
9
+
10
+ <input type="text" id="url" placeholder="url">
11
+ <button id="post">post msg</button>
12
+
13
+ <script>
14
+
15
+ const post = document.getElementById('post');
16
+ const url = document.getElementById('url');
17
+
18
+ const gaga = document.createElement('iframe');
19
+ gaga.src = "./iframereceivetest.html";
20
+ gaga.width = 600;
21
+ gaga.height = 500;
22
+ document.body.appendChild(gaga);
23
+
24
+ url.onchange = () => {
25
+ gaga.src = url.value;
26
+ };
27
+
28
+ post.onclick = () => {
29
+ gaga.contentWindow.postMessage({
30
+ joe: 'oh my goodnees'
31
+ }, "*");
32
+ };
33
+
34
+ </script>
35
+
36
+ </body>
37
+ </html>
iframereceivetest.html ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Document</title>
7
+ </head>
8
+ <body>
9
+
10
+
11
+ <script>
12
+
13
+ window.onmessage = (e) => {
14
+ const element = document.createElement('p');
15
+ element.innerText = `${JSON.stringify(e.data)}`;
16
+ document.body.appendChild(element);
17
+ };
18
+
19
+ </script>
20
+
21
+ </body>
22
+ </html>
images/192.png ADDED
images/512.png ADDED
images/apple-touch-icon.png ADDED
index.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 - A mod of TurboWarp</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~editor~embed~fullscreen~player~playground.js"></script><script src="js/addon-settings~addons~editor~fullscreen~player~playground.js"></script><script src="js/embed~player.js"></script><script src="js/player.js"></script></body>
53
+ </html>
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,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAADAFBMVEUBAQEDAwMCAgICAgIDAwMCAgIEBAQNDQ0CAgIDAwMEBAQEBAQFBQUODg4kJCQFBQUMDAwEBAQQEBAWFhYFBQUJCQkEBAQtLS0LCwsTExMpKSkgICAFBQUsLCw2NjYfHx8ZGRkWFhY2NjYREREXFxcUFBQcHBwWFhYICAhAQEAcHBwhISEKCgoPDw+FhYVKSkpnZ2dqamooKChpaWk1NTUMDAwjIyMqKiorKysKCgpVVVVDQ0NAQEBhYWElJSU5OTlsbGxNTU1VVVWMjIw6OjofHx9MTEwoKCh7e3tMTEwPDw97e3tWVlaDg4MtLS01NTWGhoYyMjJeXl5xcXHFxcUzMzMkJCR1dXVXV1dAQEAVFRWqqqo3NzcrKythYWFLS0uLi4s7OztnZ2dTU1N/f39BQUEdHR2CgoJNTU2YmJh6enoUFBR4eHgeHh6EhISSkpIcHBx8fHyenp5/f39ra2uenp49PT0oKCg+Pj4rKyvFxcVAQEBfX19HR0eOjo5fX19WVlZ1dXW5ublQUFCgoKClpaXExMRQUFCpqanMzMyoqKhOTk4+Pj5sbGyVlZXAwMCJiYllZWVeXl4nJydAQECQkJCSkpIgICCzs7OysrLT09OQkJBcXFx2dna/v79eXl5TU1NiYmJHR0dSUlKEhIRzc3OXl5ecnJxCQkKOjo6goKCsrKy1tbV0dHQUFBRmZmYvLy9+fn7R0dGVlZXNzc1XV1efn5/19fXh4eHr6+tHR0d5eXne3t6goKBxcXHIyMjDw8O2trbNzc0yMjLY2NjOzs7u7u7v7+9hYWG/v7/Pz8+6urqTk5NsbGy8vLydnZ2pqamzs7O0tLTn5+fd3d28vLzMzMzz8/Pe3t4/Pz/g4ODa2tqysrKsrKzv7++urq5ERETk5OT29vasrKz4+Pja2tqQkJDJycm0tLTQ0NDs7Ozz8/Pv7+/t7e34+Pjg4ODb29v5+fmkpKSlpaXk5OT5+fmSkpL4+Pjn5+fr6+v6+vr6+vrW1tbd3d3k5OS+vr5HdEzEAAABAHRSTlP9+vXw5uva/N/UzsK69/mq8Mjk/LOMoPt20OXVlfD7+/Dh8u73xty7gfrs52nX9/r57MbZz1ut093m9Ony5fHmuNm456PJ8IPcpk35yamn2r22+vng6Jft5ZZA98W9yr3TsaZiYNQzzcz3uK3GuN9PnZqS7Mi2hnbdJSC/8OCX2NiomIV3Dvjn12nDlHeX1X91VLBoUTjFi2Q9t7Y2R9eVdoVE+4qI46XK+tWx5dKidVonymfqoueDO8iveYT54cW2taeVd1b4Vb2l+e+FZ03GpPnVqJTHlmfJaCzZxoTnkxb4peW0+aeIdNm3dtVGlbmmw1rr2tLw7+eV+uDq62T0g1J1ZAAAOipJREFUeNqElcFOWmEUhHlj13XfhauuTLRpH4JuhMSVAd25kaCpCZGmTQ1YQYJRayX9Zjj3nl8odWb+2/U3Z7CN36t6kJd6fngudf98X+ju/q7Ud7nQNzl1++32lQ7kUuODcaHz8fkrncilfp38KtX61ar1tfW11PbX7Vrvt9+vqrGR3vgk4Z2gl8kb+AlPSnqbJD7BgW8X9DZJfDvx7aBfbwAHv725gPL49obz35F1flLji59kAzj5eav8YyXw/zkA+BNf9BsWkPhJH/hvL8D8WUFJHy4GsMqf+H4lftAX+PkLyAWk1u5vozcHYP4NFby5gGDPAZBQ0if/pvmjPH4OoNAaPd5AX3RA3v4L8NVep988gUbyRwXZQEm/zk+Mvz4Am/yXn082sKGDxF9AnfgEbxhAiZ8NbJhAFpDoJX02sIqfWr+/bOUPgFhPcJOng6cNCxD5Gv3iBJfn/9//ATmBxN9EXxZgZwO2NHi+H4TRjX13Y5set/m0k37ES5n/DHbek/KEDuyygVJ5/4XfyaLowA1kBXH95NezsoE3F5DsSX8Mug056BU9n6Rv26C3MRl9HylUYFtwfyPGh50n/KDXZxxeWUAnGpDWF9AFv5sNkFB5/s37b64t4Pj3w/Hv44cHB8NP6gYw8fUV89+0b4K/bf4RwcKv+M+WPruVyZNMygX0Dg4ODw7HlZXOuCN+3sJe6aCL1UG41S3xeRSwb2+7gdUFNIV/ZVsN6LHxI9w/4JEHgEVveE2AgE5gJ7bgpcT3g53U9Cgn0DO+RrAk53MOftDD3wE86O0d2G2jKy03cIqXArwFO1IH2/uv8Zukoq8LgN34NuH6eqb3/mMBNwPTS3cYeCfwg/678Hm28F2B/STfZgPGh39lAOeyJxADqAX+CS8b8Ad8glzCvjvAXgCmgl283YTf+DbwYS8A7NpK3D4XAHuK+7ex4UPRQLmAYK9kfiv4oQ/Dfwh7/YG8Y/6FnPQ26ISP4cWPA974Jg8zACy5Ahv6K7it5Q5YAAYbCX/wMODfwfEgde8GiAW8BiDTQdDbFT46w/D7/KY3f3bQUwPksAe/MsbkHMO+1sFOdhD4yP/oByB+G/4W3k9+0HEz+W3BY0IB8BvdSfaEl0kq6HMCI90/JXrgC8G/Qo8JdgWWKhB/hwQ9CnrQlW6X1AtoYbBVgenloCfBL5PAb15Bn1r+DYgKAj+cEvxjSR+O+cNvJz5PJjW++adOj+C4f+CPFchhHwvfWig7izD8BHZSSeyqgMjARwfwo2ygCb1CBaQsIRaQeg3/OLhRaACjOYY9FfipifFDBf7Uz/AVP48CSp27gqDHCvDE+JxfRtmAz++3T2rF/XcJ2GUFpk/lAnIASjYAeuJDTwNzdxD45m9fjEZkgvWZTM7krGAKvc8/9QKAR4eVQx251E5nsaMJKDQQ+EkvJ/7pvpz338WqADcr+UewuoDUwA0MB47YHyEPk7kX0J6TNrEuZNhrfthHCY+mGHhi91LJnvgkF0ADwEeCn5QNKJb5U76/wwS4f8r8SqjxcJxKfF9fRm5gLnjYPQAl6EeYBvAkDH448Xm4N2X+08QPb1qArs8LdfVw0tsFv11pV7bA38WhzQsYyoMhFWCDV/B8DL/soC2jS+hVATI/mYQq/I9VA8AjOqCC5O+9QS+nKnzenvmFX/Infjbg/bOBEl/87/AVDzVqeoKH4h8+Dh/LDuYxAPCJfCl4vYoebK4f+OafTMEXveUB2FkB/H37p9zRw8Zf76BL8B74BMNPSnyS8LhSU84G3rkBkgswek0/LOmBxynTY8LteV7AxeQiz69w/Skv+Wv4XEBf/Bb8ekt4fT90dj7s6JWCXufH5JQG9nIAsf8tZ5fgpMe13pGrcFGAjXR9O/nB55v8l+05+LDLHoD5GUEI+snUFaR62cGR8PvGl2MBP7k9weZ3qKDs4JoR+Pb1AqhgVjcw2986FT4PeCcbIIEvflcQaYhbz/CQqwIp8UmB7wEIPTWRrWyA+08/8l4v4Airgr5MNIE++HInDDsWuT9+kGsAyb8HPJZmGPpZsYCtYC828An7+rLPT1RBw7/+egDF/V9kKniZz4ll/EtyeXHhEpKfhMAmfKZTUhRQ0JcLMH2owi9L4PSYCmTYkb6+/h70UYIWsLWP3YLAU5/cgEoA30ZXSzeCPPCJ6H+AbnrYScBf8uErfJIK/i+ityeqQPj6oCM5BpANIO+/D3k1gA9uwPBh4E1vkxhANCD02SnbP93yL0BmAEo5ANAxSXp9YgFDkvjAD01vv7y4AowE3wafT1YwwYlPsPhhx9YR96cBRAN9N2B23x/nAsD/+UH8kvmvZX/2hG8F/2xGKEDeooVqAeb3i/vDrwqIKsgOnIb5Q7ATgzuA20b3JyqQa32ZyP4kvvk9AvCPAl7uH/VTr+m9ANHnAq7De9fQp8zvCcycLSx8adcW/2fRY1dQ4X96l9IGWEDyK5o/ieu7gz/zlwofBX7SM4DowPxE+P5gnV4fNyD8Hkl+OwQ+Tl3jOD9RBzmAmYyMP8NuwDa98P2M/5eOMnZtKo6icP7ITK6GrkI2F4cQCrrUgIOKZghCh7qYZHNI0i2xhVCICG3oJNpVHFPqd07ue/e9F3vO+d10/c69r6Hn5IsrCHzUKuHNju9DUQFOeOGT6ODux3hfAZHfj4EPxQVAnvSN/YMu+jo+yfvf4yPgScr4KfavCkJu4CP0MvBu4IsN/MEF5O5/KmogOvAF7P7udtfXu+AvOoCdwD8msX/R13WOobeigu92VmA/fgC/9V56/QRXGlBCPgH0Dvhw4BPwSannjRJaeQCwV/GBFz653v2lggo9z/hBL70vHGL5bkBxB0l/eAG9/9GHLfCr9LiJX78A2Hn4w8eEb1xAFuDdY8n8vMBngC6nwL8z/535Je8fN/ZvV2V83rJsoPdLdvL+s4NCjQsI/JTpEx8b35+ASqjIHRxVC0h46OXcP9d/H/g8JHQ9Mr4DPvCb+ze6wwUkvLw0PfPX8lePBjD0xuclO0aMGn4fv53UPwDvXiMEvdGRLkD0CW8rR40LyAOo0O9n9QKgNz8xuzoIBf0MW+dz3f+8uv8lFrs76BEOIHyCAb/FJydbUrt/4HmmNz9v8keOBur4BJvfFdipIw4AE6sFtfDzAHY/4U724J8KnTC8f/lHssszG83fzwkVYA/Y6/RL4fcI7Dp/fOIOEn/7e/s7Jfi4gAkGnTDAn+BUwIca9L5+Es5PIHWf9CHhT/F+/cBjBH9Vs7GW7+A5JSD23+wAfsKjAix+x/S3PgHwsfkZpsdv1QH5UzSAXYP5NTpZAa52QHL9PON7qIAaPIb9Zw1e/L4AK+AjUqx/PAPd9LoC04dht0Ue6S1j/X4ntuGDnhf0W+BdAQ30iwsA3Ra+b2CvTqI3LmCEIbfhdvRqBaww7Kv7VW5/uhM/urue8gFkBXLsXiZavTJ3B+ezc07gnNjQI0/jE38B5kfwCz/2b3zH/AQj8UPvZAlaf+eZjPg5LGFEBdmBG4iHWyU+9Cvz3+9WBX+cP+snNXhifCJb8M/JnEhRwRJDTgoB71ixfVlD64/nGwh4nQBzIltmNzzQerbQO40TGBGsHI3EfxRXkAWAT1bmt3d6U9m6k+/88htoKzO7oLdcgf8PBj9juSSpHvH6Q7c2+FsOgFi+gT5P8Mj4/gLUQZSAOnkAaoDPoIMHRQMjhQIwCXwrvoOW8cnKMj+ZFvzXwU+Svo1L/orAnmElJPo6f0+WEp8DILduYJsyv/F5sJOJnIJdjvWrAtZP0ACDLniCRyPG0Sjws4FW8GMi/hX4ZFeun5T47THBgd+eDZmpwE+Bb1fVs0t8HjI9VkLw2ynzk6o64id+3j4xfnQw4CMQfOAzahW0Al3axRQ7iVHefxsT0Hngt+sHMLcfwV+QpE+ZvoctV5D0DIkZ+ASnOnKHl/iiD5OR7E+gqKDOTyhAJkGv7U9XSV+4nUbjMehtX4BibUS/AXuT/PPFfAG6jBa9aOAsv35G6JETqGhiJ392EBegEgZUAD+D7bsB5AqOiMRMtYzOiAuYykQyv8eeHPSxDLhtDc2Owd9sYCd+C0WbN71Hb9E7W651AVSwxrcN+iY8OaR/jY0e27cML3wG/MRjNBjpAkKgyzW1cvvGJ4lf0uuBz0NDVwB5ezhklh2QzRwnvmx+hjugAa+feP/rPH/J++/ibbdPqOCi3yd7vSYTAj4Dd3wAivF5A5kIXmOkChLf4+ACUv+ll03uEQcAeLDbG9AZQa8rELq9TJ9h0LG2T8yf8Dbw4G/7CuwMKsCvsUawGx+nAt+7D3o5lRfwxM5PoM6PiQW7TYA3PvvHMz2VwDM68Qt+YvpUwb8wv88fdhqQra7s5WNXYJs+FPRo8roz0eiQRgM4NSJyVU+OCPykdgHHoDOOp2HhT48DH3or4IdBjzdKQe+3YP08aS50G3rZ+4feSnrw9cTe9bzYXpT0TA7gAuw+FrxfhxuAn1TpD/Br9KDrAMKNAgyPtP1jP+gxSQ39gJf4ET/UPGR8D8j1CoFPzK+I3/cve3TzAmQNKrD6fn2iBoweD3Q5NXAJdcFP3pTbV57sDwBlAdDbx15+sX+hHye9z99qm57rH2KSWsgE3SxSZzjw18LPCzD+ugs8QeL3+nmghzmAPq/UpKRnXHbIpeAv/RJe7IM38DvGx2KPElRA4q9MHn6Ygt5oAHCP0Eap4/Nu5jeuoYbv7S/cwJoZ9J5dVWAHPvDIn0DcAPzG7xf4nm4g8JFKGMik1Bs6aPILHjv80SrYjY802sdTwGXpIejtlPEjlugBv8GIGfT2Xmti9SonIHQr/kj4sgLwZSvgGV9lN4CYsDs8w9sjbH4sej+XYPsCzI/NT7DoIScM9C0aqOHbKTbPgJ8kPs/4S9hlEuICuhhs/6DAJ8Bjw+sAkj51SQlgqwHbgj3wPWQkel9AiZ8lcAEpyNFD+/jB9DzlG4b92/AA/2pDMNzyDQ90W3l1uH651Cnbl0kqK0jFAaS0eV/AZbDzBoWf2pA7hkeMJ7IrSH5dgLdfUVsdYA/jA8+olnAl04HpeaDLIejN7+2nGvjrLu/2tEu6JGT4R/g/ib18Xy/9DRg/BP9TVzBQCdFAiR+uq6XrT2n1wg/60DfYgRf+Z3w1JOwfxf6vgCdiD5/dnFEB/I0DIKb3O+2ekga9TQWJT2DHYBO5Exa0huFxeQFPdf1PQQ98FPSM+ifQaIDQQnTA+iXBA440zF/Qe9zQQFUs3w74wwM4JTwdAfiF0Qs/6F+Ang18UgNee/gf3WSs2mQcRfE+kGtfohBw1kXo5pYha6AIEooWIdIloCkkFmIhmbpIn6BITcEh4FbIC/QB9HfOvenN/yuec+7/y/o798b6Gd4T9D9hd44/uwTL/MTuXkCxC51Jwa779+Fj7R78q/srw/N4qCDofye78P8Afwr8qdwcwAD/GrD73H+xA45FD/wwnllYu08nP2H7n0zvJ3VMBeYP/DiBaiD5jzoFJL4n0BXhh0wPPIMSHyV+eE+nqgDywpdA/z5QAwFPhO/HHroDSmBMj2bK7FNWIG6MOhdQ+ASDTwdUIH5NVXD0So7n+QWUbmUq8O6v3IBt/KuiT/4S5GyfN/H9DGwqSF9aWUEYcKNj0e/v3/jmJyXIw8rS+AFf9GHLyz/6fMQHVwVVQMEXvwV76R6z/tKfdOJnDJ8GPelZ/2CQ6MT4mi3rv2SyBdiZbADtKvgxA1uzV4PhMW9u3w8KeIJWjF7Y6QC5geYCbrl+nPAkxPKvCPqi3Hs4gcIX++gP4Qn2UmyfhMFn+YNLnhLgNAB25Al/NhQ6wXkBP3DnAJZgwy7nATT6bK/EvgKdYO3ewVUADazf38b6i/8LDdjNAexpBP294EHn1enHnyDxtf8B7JldBeRJ28sh3roEVBW4hBTodtvBkg6WLsFZHi9j/8V/vDoGnWi8fT/FnwXcptd7l1/sRW+ThDc+2yei76yfAZqxkfgvO/xDIg81pZncqmU3PkY/GfBFz9O9ALLiBjAdcAYoK/CoAMCJLwA1BYieaTp4CI/cAM8IeJ3/yK4KxH96eqcKkPGf82/h59nyVAfAE7vw0/Mfchff77GsFP4Ke/sWJQBf+OmDpF+DzAmsb/mhB/I107B7CILc8FgP6F14W/wEGT8b0GzDaLgVOm/3AAqfmRte4rMME8n06X2tCDY6PloBX0p+X4A27/mbDYC+hn9PD/jqAe0OABMk+nLq7qkEq2lAmQAfZvl0gAu/W4Hxwbbn82zA8v5DyT/FG9NvCj90ROSSL8DHvxb1X7+YQL+2DW/7Au6pIMH5ePnFnvAYcj6DwV1TAfgT2EUPNrGGYVIH0E8bPi328HKOqaCz/6ktbbIDTErFX/+DA9EisJlMsNfuHRqQRnK1IH53QBb4jgbkOyrAHXyN90+0f+GjHX9vOOzLdGB4OpjPWno/8C+ZRtPogBh/w4u6/M87UAGwS7yGL7/G3j5Bvn0yKp1io48Wuf6gB57YqYnwJ8LfqoHuBZgefg/kdQDQeyzTp0uQN97I/gtsVqSU8CX+AvoHBHoKcu/f8KIvjTQ+gT0tvP+FshC88T02EX5egLePSQn+HvykD36fMDN7rkQFpgecYHThTEk+O3qyOwC58El4Twc6/oK/DXxWHw2QJ91Djxt2r36BwBe5HwT6jh/scxqYkMsJ2vLZY8eQ++mH4WaCvx/kpeS/IMVPDE82NJD8qzBJmf/QJk8FvK8C0GsOH3788Fr4vCXzk2og7OXbie8KbOChly0dQDrVC/e4gZ75o4LqAM8a+ov5xVJ2DE+srAAjKoC/reAQqwNSBegEil+GHnH9pr8qeGz+ZF/wsnsPCfbiBx6T4s8T2DoB7wztPH4r2Ukr0/sAjD8tftgNL/BUXcEYcswJ1AUQF9DC+/zzAjBJPZKRPLrmAT87yAru0oUPPRWEwc4S2v2bX7sXPumBT4C35sQufILBdw+QXwR/ahNO+t0HfnSoOSQ0QOoC2gZCD2FictgfTB+PSgj4VKKXYFfEDv3ASX6Ce5O8fWJ8/gB9kqID4yf7RwJ4Wloq0C8ZtEz8pOcp+PShDXk5Cyh2v8Yn2PiYyNo+Xoyui72Wr6f4CT6/m/APcAkl+HuT+vsLHw2fVQC/J/BR8hPwNVO5VBdQGhMfwOZwzPIdFPykCrCtq2wgDt/40giDT4DuVpDwZ4a3B9BDLrfw4PsAvPsU4B18uM0uu4GkLwHP+vFz+g8Jj7kAfceJzwR8vHEBxV56wIA39I/XI3wNe3Swzw864wrOqwJifj2lHsHmrxL6Mil97H9UBR8dGpDRPPEzU1L6MN18mIr/A/b65ZVNCcJPHaUPuvgi9zwSFPim57leyH4soS/OeAg2vpLqnoDJX6oB9BL8gsfmT3jsCD7p4wBKuf53O3YsfNGrAi+eIQj6MdhM4vvBB699AUqp8K3E1/L5Fv035kwHcMburTPYNST5q4KXaf4AoE9wqko4Af0Egy521g/8UwMEtx28u4D/Hf6QHdAA+HjM0IHxV86hnKoODrrwgHf4r8MjDHv6W+IDL36MAD8zeMOPTO7wg9WTLrzB/YCPSYxLKPbaP9y+AJkP5FSgDjDJ/acSn6TqAsDXFD5plk9C8Hu8ez2wZ9TBOQmXJirh5bl3H+mFI9aJ0j+hAplg0OWkh5+Ev+J3F4QHcsn43j9B5h97Oh10K0AHtfsbgh9v8OubpBd84efu/RjdTx6A0Dv0Lw0f9Ak/yQast9UA1Jlit4xe8MgVgK8StH7wiflNz5P0qOjTe/IFrLv4BD/qvY4CqgWhXwOPaIDk+hO/rQB48Tf7B52kwT+RT4Tvie2fENzqK/xpwAMfdKSPK6CE0jj9vIUX/7mAGxt0BQv+BvjaP+iqAHjjm77wCUZv8PkbuHdOwZ/42j12ooNU///sDPAoGpASPvEbjSONxG78F7gKKHgFcsQHQd/omywtvH9c+Bpb9MZHSe8nBf1bBvwowfQEdgd6huDid0An5v/HRhnjNhUGQdjHyBFcoDRcICJItjs65A6liWJFaYycmhpBYSRSIhqkFC5NB02anMg138yuPbwHM7P7QvnN/uYb9hOQwNfY4wrwPW69+CL+L6ZnpYBfFcTy9Tk9+JpmJ9A3O+iF/3cF747snTfvsCsIfGVFVh1wVwwVlIJ+1fSy8p0RfcNH/6c/4SN18AJ7gT56AVBLeQBeXcENEb7pWaXmDz70LOmrp7mpYKiVDbi9Ap4O9AxCXwv8Kxt1A34B4FOBHXwvmbTuy6pA+Mj8GHomv4MJ3GVkeshDX/xBD33Yif3V9oK8TEKvwK2hA7jVABlI8GVS7OMK8FAmr7UxvqLDV3gDLwj0XUGZ5AUMdPMLbLnWjxvsFsYlXBY+I3Jv01+zZOsaCz82vvUBj+jh9xBd/wryqOi7g49H/o0CukzAd7D52w3v9McFmJ+xuPzNTy/gXcIPIvCg27ArxgcdW66g4K+NznYJdX1kerOXEcu6kgnsNvl2pQpK6QB0omV62L3RsQLYLfg7wCPvxm/zAqIbTEAnkPPl+JWTLqHHPv8l5Djw0NvXNIBBt12BTaRUIPwL6CupQGP4WoH/9pGP0Jm6vtdG8CykCmQidvPLfExvmZ5MhvyG7/zAgT94oIefYONHRf8OdsOfYnbmFvTI6Nj0rNz/U/Dt8Iu90Em9goYngrfv9QI29xHoXhHstVLAzRHf2/oZ/gM2Pbo0vx7/pd4+/ww/9LITfryCX9Rvxg1cgL4y/oXpo2+krOwh72DwSf8KNrJCAxrY8yNICe10oMGTXF9udtMfxH84mF5zKStAi5sGRvAEchbozb9q04A6uA39BeAr8V/xBozvGfPDThjDm9/shLVpmRxxeldAosBHwxcAuCYCPvQsxxV8ts1ufk3jt0nj9wf6W5u0jK/hBVxcCJ/BgyfA7OGmAlz8wTc9PwFeAN904BLw/zvA4xImufzxq+Nj6G9MjiE/XCK+pc9F731nm10TrTDg187KsS8wAZzgEXvj78HXp+n3sEt8WuBvKtF9mcz+hidnsJ85odea6PZ2jk8waUF/oABqaPb4rvjBZ4b4t4waYMytRSBn2sDDbpPUsHegP+kjNaQEtOlsxhUQ8D0YcK+zF4orwKlALyDsaQD8YmcMzxQ9gvwEL/E1/J3B0wDSAt3T5yeyri9dpYLWluH8hNevF7Av+JEM7xXNNvfMbAa5bZ3JfCAveibyTyASd/ANb0dC17pjOL4CedkdND0mvr/wO+Dn/CohFdhbDHi7RQUU0A5/d8As/6qAUAKLFvIIGBn+dgqAOnrsBoJPsBI1OFPBJmeF/nj/6GLlAM60Gj/0BBc/AX5IH/ylwInovWaxuInnbMbxYQ9+JQU0e/vweCCNj4bsvj3BYA/ub/y5zO3JGN/TLqWCrejbyl4eyfwMWnagJ/bMQ/DMA337dH3k5RaYFAB40R/cgFPXlw45fZkg48NNbNObfRf6CHCxEybwpmf83+C2709w0PMEFgI3PDK6oj8KH7ELHp0dbd03PEsmVYDhHx+BZzB61Ij8EQffC7caf87ALntBP8fXA/p4qC3xsq6YvQePH8ACU4HpGdnaEDRb4g0uuQWXwBtICSgNoIngiWx84gLQkf288YM+0JwK5oDb+gHsoEc77I+P/77o3/v8wW+L3ckPwNMCXWN62TF4G3ST6xv1+YM/rqBfgOmR1qHj03sZ//yO7/EH4Gl48FnwK9CXifG9BL8T/Xv4MfHnGf7qwMHWnpSJ6XGdf29wrB1BHUeDEkb4qWByvH5k+GJvevEDfS7kdeAxj1/knVsF7J2iLwN2+RZqsKsB8CvbZ5FHqQDytv9SA8v9ciHyBVPagH/qQHnCQ/ii947SwAT24g/+4zkLajdgfNaaBtxBlzB3A6g/xr/esYXPENb7qgAJv1bw5a08LGGPF0w3gD76QwXE+FHjk6bvz4Nj/gfTT4f0LM1kiA88FbDq9Gz4RcxiIF9raUC3pWu8m++A1258bHyZGF7WMnrTA88KPOx4zzT/nvH1Be8M6Z+WTwTNyqLHBPSH2VSf6Qz+KY7yAv7Bhx94xp+78/P1GvxCdwlzvoG3drVvVcFJ4O98f+P3PAufsFyBPdQCQ01YHnbxj/CfSHcwi6FnHPNj0L00je9MAg+2Az1flgdw+HV9rLVe6/al/LGTEdv3N7uNuoPGZ+hA2nqlg1dwv9q/WrgBJVp2cB7Bk0wM3xvmB+KlBqb86dtPTc4iUQo472Dk6wNf8fUNz8yJ3fTBr92C3fhM9EyM7/s3PRH7M6Mv/IsapBKiruD1cuk8xaQ6eGAzsJenM/jZU+6vDmQSTZqeafR8174/Absk9qAHv20Fv9lDz5Qj8AkWOrEX4t+7gsAb/7W+RA0IHGm1AH+q27fUgPhhF/+wghRwXvSs3N/sMqm5a/w4P/7AB//oqPmRduMzr+SGJ4tXZFEZCvzXvj/WLvzoQYODrxcwxQ9GJ+1UMAm+9klrDx5ogP57Pn/Lxrv5793vXQe9NDgZw9skAn8rfmvb+GzjM2GH3gP9a+aJ8BngN3009WCvlquggRRgR0Xet/cOPoGaYMGf6OfGN/wfuskYN40wCsJ7CbvKAVKCLNFR2HITBUWyLIELh4jOUhqkuMMS3CJXSMUBKNykybHyzeyIx7+bzMx7P+03b7l5VQM3Z7+uZZ71+vXP+k8SepsSbNiVmJw+Efk+HWBCBaAD71QD5bNyftLwO30BoWe1DaSC9vjQ64EdvcfwY8QiNGB+jcUDv+DXkPcmBu9NGqWBnp+R4bbF7vmdEhhreW5gIPCJVlUQ5wsY0dvBL61k6P0JaL+/m14v5MEnr0TWWvNAv2Yso7M0qQD+Ifvp7iR9Ilj4J7EnkMPvafBZ+KdMhK7EriH42XZn5tJn2LU+/9AQJuw+P+RuAHY78Fo35Ia8EqwHgU6w769NYF/fBb7FRyecHkwPu6Jl6flNzl7egw96T19hqODK+CQKPWN3OX/wFbFTQfiF78Ae/HeOTyzYkeixVCX4/j1+yfh3mOOz8UAnJR9ABt3LBPpS+IFPlgolMP4Orsofew9FAQVfzt2JL08wEf1q9U4F3J5Ixi/6C3j8umZffP9Zd0S2Fg19TKLQuwCmpdfxeeGW8v1nydxfA/pP85PhZ9A1t/f9bS82+Ixt6fjwr3Ak+OqglA5AZiKBF//Cvsv+psuP8KsEe6ClK1ALNoLcC8O+XEKfL4BgraaC7owPu+XXDQCtifL18xq+BPoAXNwJ0yr4C6jt0GOtE2FBzDToY3hseK9W0GNieMSigsB7RRQQdpIPQPwO+LTg68MecX0ngp2wcAS+E3xSWuA7VsETkacCJHS10Ohe2dDC5l7x7b/02xVoD8TxlSsSfBaxS53YATc+Cj7wNmJFcI/wcZG3FeA9zCxlYRPjs9hY+AvYbV+fJXzvjQw4E3TNF+wsydJpxOVjrygVDDvoPhd9adUnHVQDGuNPZeCnOXzJ3Dd7nj3c6iAxPBF66OEPOvG4BEYGnWTQvYy0UgJbx2fsUQtaTQuFz1id+ElDHw/psTKF3denAWmKewGu7R/Cj40Oe8EzErdnAGasE7HFnApMfzJ+vzZgx6I2eNi3fQDfGv/KiaqC5PwFDI6PRvjWFAueYI5PBzglQO3IPn864MdiL3Rm9AWAfscg3gj+DQYdE9PzGP8L6wvbx9diy3q3S9nRjysFjzv4WKaA0ef/CDl7RWSlJ/f1+wF4KmgS+NydYVtrgoEn6aD0jchKoTsbd0AJJyYSPoIdekwEXTG0FptAvhX41ibjryAFnOkfNfaKpQpw8OWR4Paaw6xlBz340Mv9GvPbpNHGU/i8kfj9FVACcgfB5/yEtaUCBfwEXOYDbvD94C74RQ/8Iwm8tujz/dsBl8WfDhhJ2wp9KvAU/f/xlRh5FT6xB9oqRs+Q4NuGZ5G2BdwZPfSPHl0+Gwe/URrgx9y3n9/gvZ+irw5SwUFBL/gbQwkv2CvaKbtdz79j/sWP2NGy+J3ojP9he/UB8QP6cQUpAPiYrLJAl1cM4v4Frz3XzElPrxr+hb4HmrGJ6R1c8P61w0ToO+g3DBnx26Pzy6SV8b2AD/2wgu6SniGgoymRneH999P5VOxT2PUCr3iVDnhxOICN6vzE9JiAXvB6yYbIxPOwYRSzP4z/Afif+ILf8gEwlvAH6or+UqsL/lbzRIYdcX2WHXBiw+4KUoLYHYHzQ7vwjW58TdnogldEz8jWDPZ41lYANEsmV6bH2k4VMOav8+OBAj/3BJ/BwCu4+An4/vhf5IUnHUDO4F3v4EsbT/4H8Es8BPIenjXDaEa2s6O/ghk+bgnwhY+yw29HXeDZRR8jNgl7TKqCfWIf5uKGX/L9rRdCCy/BZ5m+2L8xqcAKPuvB7JHgY8ETTLa8kMvo2K/jB36A7TRKBTz1BTSa9J5OJzHBVcJQe+Zg8wlArljBXzAEjwW/PRLwu83DDj9sYjXAss2eEkRuA45dwNEVxGSEb6NuBM/tJ5Nc3+8k5G9z4XsN+UFXAbo9T0OP/k8edBa51Aby0LMiVYBn8kwVhH7GEKg1xPh+g09amd6rGx5+os3BL48/99DCBN6RnmAncatcfvwJ/PJgAnAmevCSSauZhx7ApgbJFRwTbH6xxyQu/OqgC/2lBf9IBSTkgJM3MmHLVrh5nkD1YFL3v2WRW1Pf4tCzMNCMPKogHlUws4teTeQLgD3wpeCTa61xB12PX+yGzs7x36AHnMfgrOwnTA56nw6k+G81xof6ltsHnhYA9+kZgsxfPTzvHojX+AOoBjxRzm+Tgneu2WK/dqyqgQLMnSGX9Kw3Nujg2w4OPYPpAHTTuwFsejdxC3wZdPiFXvDegcdaz8Z/Jjgy+Jg++Ex8KeCvdf1j2PMUPwXk9qQRh58QOR++yeOnt/76yPjSIb41tbb1QvKkglvhl4SPnnmfbdHDXfheX0n4lXEHOT9T9FgvuQZd7lepG9P7/MA7YDOSKwh9Dp8n8ET4BH6GjQWeQC4XfknsquD5GX4N6KHnEXr4v8o8Lf6R+X5Ujsw1y/xe8jVjhd6rCrB4SkCTPMjfQDp4UgP2QH8JK2PVNqIoiOoDDGpMmqQVKgNiicPKYFRIrYghkMIqVQn1C0kgnT4kTap8Y86MhlztvpjMzJ23Ls99T3ijbCosoQQ5GygrJbN/xcEXdUr0gqcZDLxyTgudpLQC8MkJ/GBzvBN7nGP0AqLiD72nJHzFPwBqRP+DsZMbmX1zpGA9Zqiwy6qxPmkOBIfd1+/ow/Suk6yCG/2WwT+9YbIFOuL+kyygpQ9/g290Yo+1SexWvzRs4PiLLQScI5/F7wq7Iv7Di+8eQe62Qdecgm/6tPIGawUT+DphZ0YLeC5/+0aY9upb9gvg6svmcmW/TB8A4FQ2YF9j9qNfgGusg/Ap2AkKPMHn85kNuLj8U0boGeHHEwF+s4JZ8SvMM+B8ZQWy1BteJj3cvZht6AnQkHO4mRG9DTRFY9fLEXx2QFr4KrPXFuA/H84swfgnXgGdFUjGBzz06cJX2T5ngdc8V+DWmJ2jp3sZbpl4Lsrlwqg3pPC/2whmojE8yg5Mbnamu8V34VKhfxA9Fr508gpwCfYEI7pV/iWygAn7Nzt3n+byRZ+bZ0ycIUavCrv7GGcFgTc9ReROE5u+PNWZ2PATOfSqyRbmDJ6/UTUbcM3EzKhL4e+fdfnPPfBK/4VgsLUGDiraeLDRqRzHqwu/1B1fmK4zfp6Aju7QvRw60a8AXjXoSsn47QrmMtT6nM/fKPZIfgGCNz8zlR49BbeSgl25TPX96o3qO+jSkcQtPfVCOkdW1Q+gw4QVEAy/g12Fr7JLBlcC7lg+Sl4AmvD3z0Lve74QlQdw6QmwGSn3H3qGwrf4iqvwlc7BtQTMuYJ9JfaVTaRV0FudHD2A5YkIm6IT2D10raBdwIi/VpD7D71MJnef2Fbw2xcwmJ2PwBvYsQ4kXoVdVqnP8oFpVwB88EV/w14rQIJ3lWYT9FuXQHfZdfu7v/jxWMEfgi5nA7JS8u2jQwJzt4LaRmDjhBnjL7l9Zn5mBfPzfBl8BuWsXwJNtQswv6snr+LvhL/jND9V8FRp0GCTD7CnkdCZRjx+2CmINUYPPqKE7rKWCgM9O1hSS7EviT1VNhA3C4A6QXWi0BNT7xiJP4AW9s6Jws3hJzDUDobOA/uQlKDGBCtZAcGQ44JXL2VFH+CyAZjP5mbSr2wBk1pAT15lF/pO5qDFrQh/R2KyZigiesAdwyfQxy2+S3bwVGdniXXrS4bmtMFH1FyZ31P3V/x7/MoO5Jnw8U+573PyhdQGD3sePlFdwVWW2bEfQDxWR4p9D299Xelj1LBDXoZ3xYSdWHNBn65H0InVrsCD8wJ+irwH3eyE4dun2InGujDitnTv6ys4h3rg/pWhxffsBxHvNbbygFcEdn00O9gKH1GQ+0BUaZ7zXiYsgXdwT6jaRPsMZiJkAbL4Y4J3il+/UjJ+XgDcmrUHfln8VMng+/0geH3QTO7+IbPar7oHVhAXfVYgk60PXAq7vTS6tkDNaRt+joaf4QXo6m0p8HiHoeco/NKayGsm7NB77CFd+Bhq07OH8vUFEJidnDbgzJbogxidJaB/7oDYiBJ/mrHH4gXAHHRjR7vE+Exz/2Anoo9gjknJ2K5cfiT+B82ey9fPwNAdRZD5HbzdLuUcLnWxx2ArtYN5BZOxZuD7Nz+R0VMluNOQ4yjwRDI/fhrIExdP7FLHwG1z+bRfAE05GOZVoolrDclC+HfYCn4rryAeLwD1E/T4vZtDDjeFCn66AojXhINPQdMcrWDvGBtai9MDvL2igo+MnYrRgoieweSe8RZeXYGqFhD60nsZ7mvMnwOv369JlnArsGmKaAsa2PFA4TE8VufqOYLvQ+jqwmfc2UP4IV8QwGnvgNyF9s7+/zuYFbcLv1cDawOvw9cPvp1EoWYG2J9oxhE94ARNV0AEnrhqCUJPtVostwvgyYLkBeT6PWFX7Fbz2AsIvsHdGsDTu5SRVZ5HDbG9gfLAGJ/c2voodtvVyvS00D1jePCzAtAJVu7ou0VWgL0GJluYwhObzMJ/c/kUxOGGPH7UhF7sDGf0FHgS7SsYcYBPVA8coqQaeNe/6V020Ihm7hiIFwTzFUHuRq8/g1k9fONHwg89LXaoNaT8+ESB/Fjgpb3H/sy3yRUKfsHv3faN3m4f3j5s325dRBP8ZEFS3L2mnD3UDnCOCX4yC72PqR7lRFugvQZs8jUbkI3PUfDVH2XRG//6YZs86HxCTSh/bcVtk+I3do4I/MTkrrFMT5hWegEF3+IT29hK5NsPPPZHK/B995x8fYZacoMe+4sAHm8pTbGzhgVu2CdryArSpeBjMl0A+A15mTA47KGHPYmR9dnjIP3x8fMTjE8YcpoSswu73iqY+MgPgA8icCJ0DmnbgmOSHfwhrIxS0IaiIJqvgAoF/SlaLE2ggSrSDYhdRfe/lZ6ZDF7NM3Rm7r3P/p3Rtjshe7UdxKVuif8LNxV8UOFHQfdiww09S5cB+C9TAh59e/KnA1Pnhp/IBETvVrufux38O0IJqUB+V/s/Q1fktu8ds39zSUueyKORjZ1IPNQAL6jFLvzMsoVvMjG1d+B9gi4n6CiH2ynvNEYPfVsBwcTqip9g0O++OA0saxjv97+OOMc/vDDASuCFrSZYYNukEdxltfAmk/uBj3Bzj3FqCH/RY34C4neY9pcAfzXR5ct3sN8wx0b3wyn4UZuvXxoZV2D8krid4Df0jBJyVqP8Ao7wE/ND7Rj+iHck7Hmg8Lf4qSD8FAC+kxJQve5OOhB7MsKvyCM14L+tDA/4iWH7wSjhD/5pFR9wl6ALq1Jnp72DH1x9tFLBu9LCx38Xu3z1BR7dK+OvXyBzKAF6j8AJvvsnoOcCHZ94BpoJul/fNIgHWzMt0HGO4p8A57UFsR/3jOG5kDfoxCN+0nTQhd4b5ZRGGsAjBZjbMbw7gDxG7AjyzAn9hfbEsOdlfMPnzJliqDVxjrFRbt7mdg2z9spCxk/sV3XBX9NYHhnxW38TFP7AmzfHKnodAjB5rmjK8cLpIOwoJxKyrex57I/7PVv4TCujE0xK3Uf8J/P8tHKjasF2TiPo+ihsnEQpAebCn+Y1MXhiyNH80+Tg6qC0SwskNj0luAxM3vCzmx9Ct/7Vk3Dn1fJ7TtjL1ND7tapJzBy/i55tE3N/Y30zPctTCnzhS7tcvzXuYaHgx20B3z14JJae4xq9yBMcdp+zT6sJO3bATxObZ5QSFNsru/C93o3YVQFqO6h/ErWWBYBvG1s9UINWHq86e5tb0GdlHuijhj4yMDrhVpBX7Fk3m2yPDkYwy8VeHeB6NRWw5O6Nm2VsXU5scZizxn4u6XQOvoxYeRPpigFnT/FqCccc5TbN0IxSMj/R7LfGZm/DHhX8fNsOXEChIw6DBf5cfhDTR+I3/ih6YJGWj42yr4pNBdfrNHtiSKub7YUoQbkRxo+Z/8aKt7QgfDZpBTzzsYTO8JjIUahRajh7zvPCIeXFCTUrvmZmbKA5No9pLmK1BahziaC9WaaHmsXosSWiTw1ob5OmCOjj9yI6qO1GwUcw86ICDqgMqofpI9PD7TegvJFf4JIsf4yTAZve3ByWHXqUveVuMdkzkJeMv68Gmg4IJq8FSJxWoSexV9JK3FePwdmmb2RuXR24UVYexh8Mb/yih5oJP9vrqLOoIaftgMRWF/b/wRf9ioLNKUstvGXy66A16cHS2KCTrNCXQq+pCjylwOdhL3uwSbdGX9z68BWbXteJHgSLF4UfdMLytJogj+dAz0iCJoyMWL5rPbA3xv9cQnnl70P3Cv2VPO2cv3/9auq4GsCiZ2Hn+ng8BP+4OlqZV5nbm4DOIBaaMOikrMyP0mYOs91EtLCm4Pu0JXTFnlP8uqqAJXM8yPAEo3MyV0CySE3RBz8r+EaPbiQPbv0UeqDt56IDecvaxvkdNHqWsFBX375IOawcmB3Mth8aGuAaOR0E3jsT7OjiIQa7mJmVKQW9hRf9sOGaO0u28mmLaUAXZQdfU14UAGv5g8JOMDE+l4O0Ah/+y/Vxka8XL0zk4XIZOAwlsNgruh0Y9m3oh+EAPO7726Yf+psNcLGX/v93Yk9eaujW4eEmwkahPzOKp1W4WRQReIKMbHxObP6mBch7TA7zEe7QI7FvNj3e8OLy8VW3gGv5aD7x+7BdQLF/1kPz6qRld/I0M0e7NHhhrfAbmcFzanT6w6H3DHjDvc09pIm00KqqgLZtQYNJt87+yFnwf1HiAvYmhs7VK+QkDyYx72G4wJ5Y+TD0B8yRD95eaEMNbHlg5PUSvO2mA5fQreF/IQL2Zpkd5q8GdzRY8KzwBzr0peAfMBm4cmXAJAf0XMUV9Iw72Bw2vNIEs/DK7yA1NOo+ceN65SF4mDP25Qt+sGRwWcTgLf0hYYrdk10CF/ULp4b0oEsTfZook4+qnwF7tYB3cMTSDTi7eriwWcQmXp4feIFfTxK3HbTqPXafS9aVPlZbQClhUQCkdiJ4zA51DjIwKUPs5AH+0y5Df3j4x2kZJacNBjHYwXbjPrjjCQcIM3AJ7n+xflI1LMPPH0MlrXbtPklx2p6+MO8SE2uDIzFXGPnWapOHqPsh2EMX8MfMqvgtEj9+wk5mLsGp/3gFvr+0cBSDlqzFkrmqCi7bL0zyOH4Xv7Ng5ztI/t9DYueHbevjFJk5kMH2VHAz6e+SxyRQNTivxciuqcJuUsKihS+Kz9HW0P61wLQdZKuA8CH9N/TKODuTVSTrN94F8c+n8wlhquGKnRX5DIH8SuIzrs3EcIkSnB4mPkUY7iDs4HfZsxqGhPZq4jM+LOakrbg2BmDIyA4S2YLg9JVL+NJA52auN4EUsRAeXhfcBtICkVFWGmDa/EiUhQALhrvMcRgJXnmkAUhwnOFBlLCsyl4CKSEgsN35TWR7isUWpgfcZVzTguEi+t9CsVPAHUE1QVhT6b1CB84pXDQwFYQV3fsr9zUKEWD10schSvrCr7gNKbC93wJ6WkAL8hkXnSi8aJwYE72BYl7MR1zrsCGNcyP4rIIJpgNtlA6YFr8i8EoNw7eTI1tTwCUeynIpcQbUXdlPLNSBsk9eROa6Yk1uiPSQ8FN9EoiBnRZMb0rAnvdAARD1cCkCmXN+I63EFs9hrcSP9zEp/+bQutG/BoRbCTkWfEkJ2sjs1WBh4jMM/mXvB7fJ63oEFQQVPrElx980Wfck73bdWKLgw/dGWvMRiwtZoBYwcnV6qBrQQwENjuEFu6CE7iPRZZt2uHmMjWtDgBVNG9lZETzLAIYYH/UFAHtOlxCogh9LMFGI2gKSk+whJ+90UEOQK9gQrAMr2vAKjrGcmNOLH7/FDTlmUpsAb+D8S5Vg5gapod8EU0wBx3s6rw0dta0QyHxv1i16roqNYl0QNBOf52neZiXBUgJEO0gTMsDm6LZQM5C3eNSUOT8sGdvxuB4v63HDvJC5MUkPUaBrtwZH5yC+LbFn07b9FL+ue6Kdr+G+gOqAsDFUUGDlPbJWnhSeCtYNAzxiAS83hDFPMXsQVHwfqUDJuT0qId8Esu0WsYQS1isiBQTf8S5WE5EXA7gq4GBDlogg0Cq2FUjAwUMrNknPML1Xg097W8Xg0D/HZkJU0UXJ1mKDeI4RH3G0bePIENCaxxmwq4FCniZP0fD5zm+FDMkKg+L3sfb5EzbZWHQFfjeqBhYjbYgqxnVmzyOarfTAxBukhWDnc8iuJgy2CnjAJ8SJiLQqsWcfIzJBPG+Ql12J7RovlwCVGN9Fkoe5J6aPKgKZQ5MeFVfM888Nbk2DepXsJgoj3eWOb8y+oaRvAEciYvabsBk/17DUsQz/EqOW9Xa1fUqYB3oVD6HjBzwmaVTB43U5eeLncTYB+c09TMgUfAGs38OQL/6OUSypQRLnyDpEI8ZHYFML4U1EPJBSK8FhW0GQ3wjDyet8DWkhRWh6GOpHjURHz1T49iIoRBy8GnWOvMJVAZtJ/upBTbCQiJK+i4R/v4dkD2W5BHYwJLzWq3Bu6DOCq66Vw4LJ7TbGTyV2BYarIL6U+Cy0j/oyYGH/XwqLsUFEAQR/B4mOMBRaQuWvJ9JibkRrZGvcQpEqSq/V8M4XMWVpTKSH4cXYH5CQDNDNpIIKLVoJX7vejd4JrLX6DmVWTmY3fV2vN5ELDr28TLGeix+HD7l1kHhRDYhGVpA/9ReRKTizXSbgO5h7r1/9r8StAIeM2swRE9T77IN00B/god5UbNjHKAUPJ3z3N6KD5wV8tNmzbikz1o3CIaNHO5Gd/TNzwMT/wfh+E238uYiaNsb5b3tloNsgEMNQM/7/n3c1LsEXHeGG1K7TXtKQ0FaqTaBYdP27iHyM2I5GtxaqFN5aeXMSJS49jes02YxWse8zCTWOL0HCT1E5K5HiZyrch2XCCzWqXIsbbgBPyYrj0iP0TRIrEKPjwksnJDY/MG0vlIJnKtpyQ8qFFGNS9bwvgW9LzVqcySdPDIAuNA+safHBI2ltApe1M2PqgnSfIJN2rH08Sod2pRX0cv3SI17C31HszVUjfFSGLxv+KcF3azOyJV62bAB6uIVMZKnYW4aSRepxph8DE6IJ8Swkb0bcQw7nKWI/cJRICRSzQ2UjJF55zpUnQ/bCzGBQbfr2z93gT6MOyZ1mLH45hrKBwomxQS3URjTy32zyZOwLXkCYwDFWruKrMKXF3nkqmP3k4OU07dQPI+7Ce4RO6/1wTLybJUIj4RHT6n1IZP3vN2BAPH7jpmEQ9ff5vQbY/2xGliBsyKYAn21AaY6aGtnECncKH2rAjE1/W+M/t/kGwbO2XpPf9gAAAAAASUVORK5CYII=\"","/* 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) 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) 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,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 updateAllBlocks() {
44
+ const workspace = Blockly.getMainWorkspace();
45
+ if (workspace) {
46
+ if (vm.editingTarget) {
47
+ vm.emitWorkspaceUpdate();
48
+ }
49
+ const flyout = workspace.getFlyout();
50
+ if (flyout) {
51
+ const flyoutWorkspace = flyout.getWorkspace();
52
+ Blockly.Xml.clearWorkspaceAndLoadFromXml(Blockly.Xml.workspaceToDom(flyoutWorkspace), flyoutWorkspace);
53
+ workspace.getToolbox().refreshSelection();
54
+ workspace.toolboxRefreshEnabled_ = true;
55
+ }
56
+ }
57
+ }
58
+ function applyChanges() {
59
+ let paddingSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : addon.settings.get("paddingSize");
60
+ let cornerSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : addon.settings.get("cornerSize");
61
+ let notchSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : addon.settings.get("notchSize");
62
+ let multiplier = paddingSize / 100;
63
+ cornerSize = cornerSize / 100;
64
+ notchSize = notchSize / 100;
65
+ BlockSvg.SEP_SPACE_Y = 2 * GRID_UNIT * multiplier;
66
+ BlockSvg.MIN_BLOCK_X = 16 * GRID_UNIT * multiplier;
67
+ BlockSvg.MIN_BLOCK_X_OUTPUT = 12 * GRID_UNIT * multiplier;
68
+ BlockSvg.MIN_BLOCK_X_SHADOW_OUTPUT = 10 * GRID_UNIT * multiplier;
69
+ BlockSvg.MIN_BLOCK_Y = 12 * GRID_UNIT * multiplier;
70
+ BlockSvg.EXTRA_STATEMENT_ROW_Y = 8 * GRID_UNIT * multiplier;
71
+ BlockSvg.MIN_BLOCK_X_WITH_STATEMENT = 40 * GRID_UNIT * multiplier;
72
+ BlockSvg.MIN_BLOCK_Y_SINGLE_FIELD_OUTPUT = 8 * GRID_UNIT * multiplier;
73
+ BlockSvg.MIN_BLOCK_Y_REPORTER = 10 * GRID_UNIT * multiplier;
74
+ BlockSvg.MIN_STATEMENT_INPUT_HEIGHT = 6 * GRID_UNIT * multiplier;
75
+ BlockSvg.NOTCH_WIDTH = 8 * GRID_UNIT * multiplier;
76
+ BlockSvg.NOTCH_HEIGHT = 2 * GRID_UNIT * multiplier * notchSize;
77
+ BlockSvg.NOTCH_START_PADDING = 3 * GRID_UNIT; //* multiplier
78
+ BlockSvg.ICON_SEPARATOR_HEIGHT = 10 * GRID_UNIT * multiplier;
79
+ 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, " ");
80
+ 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, " ");
81
+ BlockSvg.NOTCH_SWITCH_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, " ") + "c ".concat(4 * (multiplier - 0.5), " 0 ").concat(8 * (multiplier - 0.5), " ").concat(-8 * (multiplier - 0.5) * notchSize, " ").concat(12 * (multiplier - 0.5), " ").concat(-8 * (multiplier - 0.5) * notchSize, " ") + "c ".concat(4 * (multiplier - 0.5), " 0 ").concat(8 * (multiplier - 0.5), " ").concat(8 * (multiplier - 0.5) * notchSize, " ").concat(12 * (multiplier - 0.5), " ").concat(8 * (multiplier - 0.5) * 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, " ");
82
+ BlockSvg.NOTCH_SWITCH_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, " ") + "c ".concat(-4 * (multiplier - 0.5), " 0 ").concat(-8 * (multiplier - 0.5), " ").concat(-8 * (multiplier - 0.5) * notchSize, " ").concat(-12 * (multiplier - 0.5), " ").concat(-8 * (multiplier - 0.5) * notchSize, " ") + "c ".concat(-4 * (multiplier - 0.5), " 0 ").concat(-8 * (multiplier - 0.5), " ").concat(8 * (multiplier - 0.5) * notchSize, " ").concat(-12 * (multiplier - 0.5), " ").concat(8 * (multiplier - 0.5) * 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, " ");
83
+ 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";
84
+ BlockSvg.INPUT_SHAPE_HEXAGONAL_WIDTH = 12 * GRID_UNIT * multiplier;
85
+ 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";
86
+ BlockSvg.INPUT_SHAPE_ROUND_WIDTH = 12 * GRID_UNIT * multiplier;
87
+ BlockSvg.INPUT_SHAPE_HEIGHT = 8 * GRID_UNIT * multiplier;
88
+ BlockSvg.FIELD_HEIGHT = 8 * GRID_UNIT * multiplier; // NOTE: Determines string input heights
89
+ BlockSvg.FIELD_WIDTH = 6 * GRID_UNIT * Math.min(multiplier, 1) + 10 * GRID_UNIT * Math.max(multiplier - 1, 0);
90
+ BlockSvg.FIELD_DEFAULT_CORNER_RADIUS = 4 * GRID_UNIT * multiplier;
91
+ BlockSvg.EDITABLE_FIELD_PADDING = 1.5 * GRID_UNIT * multiplier;
92
+ BlockSvg.BOX_FIELD_PADDING = 2 * GRID_UNIT * multiplier;
93
+ BlockSvg.DROPDOWN_ARROW_PADDING = 2 * GRID_UNIT * multiplier;
94
+ BlockSvg.FIELD_WIDTH_MIN_EDIT = 8 * GRID_UNIT * multiplier;
95
+ BlockSvg.INPUT_AND_FIELD_MIN_X = 12 * GRID_UNIT * multiplier;
96
+ BlockSvg.INLINE_PADDING_Y = 1 * GRID_UNIT * multiplier; // For when reporters are inside reporters
97
+ BlockSvg.SHAPE_IN_SHAPE_PADDING[1][0] = 5 * GRID_UNIT * multiplier;
98
+ BlockSvg.SHAPE_IN_SHAPE_PADDING[1][2] = 5 * GRID_UNIT * multiplier;
99
+ BlockSvg.SHAPE_IN_SHAPE_PADDING[1][3] = 5 * GRID_UNIT * multiplier;
100
+ var originalDropdownObject = BlocklyInstance.FieldDropdown.prototype.positionArrow;
101
+ BlocklyInstance.FieldDropdown.prototype.positionArrow = function (x) {
102
+ this.arrowY_ = 11 * multiplier;
103
+ return originalDropdownObject.call(this, x);
104
+ };
105
+
106
+ // Corner setting
107
+ BlockSvg.CORNER_RADIUS = 1 * GRID_UNIT * cornerSize * 100 / 100;
108
+ BlockSvg.TOP_LEFT_CORNER_START = "m 0," + BlockSvg.CORNER_RADIUS;
109
+ BlockSvg.TOP_LEFT_CORNER = "A " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,1 " + BlockSvg.CORNER_RADIUS + ",0";
110
+ BlockSvg.TOP_RIGHT_CORNER = "a " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,1 " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS;
111
+ BlockSvg.BOTTOM_RIGHT_CORNER = " a " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,1 -" + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS;
112
+ BlockSvg.BOTTOM_LEFT_CORNER = "a " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,1 -" + BlockSvg.CORNER_RADIUS + ",-" + BlockSvg.CORNER_RADIUS;
113
+ BlockSvg.INNER_TOP_LEFT_CORNER = " a " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,0 -" + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS;
114
+ BlockSvg.INNER_BOTTOM_LEFT_CORNER = "a " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,0 " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS;
115
+ 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);
116
+ BlockSvg.STATEMENT_INPUT_INNER_SPACE = 2.8 * GRID_UNIT - 0.9 * GRID_UNIT * cornerSize;
117
+ }
118
+ function applyAndUpdate() {
119
+ applyChanges(...arguments);
120
+ updateAllBlocks();
121
+ }
122
+ addon.settings.addEventListener("change", () => applyAndUpdate());
123
+ addon.self.addEventListener("disabled", () => {
124
+ // Scratch 3.0 blocks
125
+ applyAndUpdate(100, 100, 100);
126
+ });
127
+ addon.self.addEventListener("reenabled", () => applyAndUpdate());
128
+ applyAndUpdate();
129
+ })(window.Blockly);
130
+ });
131
+
132
+ /***/ })
133
+
134
+ }]);
135
+ //# 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 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 BlockSvg.NOTCH_SWITCH_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 `c ${4 * (multiplier - 0.5)} 0 ${8 * (multiplier - 0.5)} ${-8 * (multiplier - 0.5) * notchSize} ${12 * (multiplier - 0.5)} ${-8 * (multiplier - 0.5) * notchSize} ` +\n `c ${4 * (multiplier - 0.5)} 0 ${8 * (multiplier - 0.5)} ${8 * (multiplier - 0.5) * notchSize} ${12 * (multiplier - 0.5)} ${8 * (multiplier - 0.5) * 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 BlockSvg.NOTCH_SWITCH_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 `c ${-4 * (multiplier - 0.5)} 0 ${-8 * (multiplier - 0.5)} ${-8 * (multiplier - 0.5) * notchSize} ${-12 * (multiplier - 0.5)} ${-8 * (multiplier - 0.5) * notchSize} ` +\n `c ${-4 * (multiplier - 0.5)} 0 ${-8 * (multiplier - 0.5)} ${8 * (multiplier - 0.5) * notchSize} ${-12 * (multiplier - 0.5)} ${8 * (multiplier - 0.5) * 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\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_HEXAGONAL_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 BlockSvg.INPUT_SHAPE_ROUND_WIDTH = 12 * GRID_UNIT * multiplier;\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;AACA;AAEA;AAIA;AAHA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAQA;AAUA;AASA;AAWA;AAyBA;AACA;AAqBA;AACA;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":""}