@pinepaper.studio/mcp-server 1.6.28 → 1.6.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +27 -0
  2. package/SECURITY.md +2 -3
  3. package/dist/agent/export-manager.js +125 -125
  4. package/dist/assets/repositories/fontawesome.d.ts.map +1 -1
  5. package/dist/assets/repositories/fontawesome.js +2 -1
  6. package/dist/assets/repositories/fontawesome.js.map +1 -1
  7. package/dist/assets/repositories/iconify.d.ts.map +1 -1
  8. package/dist/assets/repositories/iconify.js +4 -3
  9. package/dist/assets/repositories/iconify.js.map +1 -1
  10. package/dist/browser/puppeteer-controller.js +38 -23
  11. package/dist/build-info.json +2 -2
  12. package/dist/cli.js +54 -54
  13. package/dist/execution/canvas-state.js +25 -25
  14. package/dist/i18n/locales/en.js +22 -22
  15. package/dist/i18n/locales/fil.js +44 -44
  16. package/dist/i18n/locales/is.js +22 -22
  17. package/dist/i18n/locales/ur.js +22 -22
  18. package/dist/index.js +5559 -5559
  19. package/dist/ontology/upstream-vocabulary.js +4 -4
  20. package/dist/tools/craft-tools.js +18 -18
  21. package/dist/tools/definitions.d.ts.map +1 -1
  22. package/dist/tools/definitions.js +2816 -2815
  23. package/dist/tools/definitions.js.map +1 -1
  24. package/dist/tools/effect-check.js +68 -68
  25. package/dist/tools/engine-methods.d.ts.map +1 -1
  26. package/dist/tools/engine-methods.js +1 -1
  27. package/dist/tools/engine-methods.js.map +1 -1
  28. package/dist/tools/handlers/font.js +22 -22
  29. package/dist/tools/handlers/generate.d.ts.map +1 -1
  30. package/dist/tools/handlers/generate.js +2 -1
  31. package/dist/tools/handlers/generate.js.map +1 -1
  32. package/dist/tools/handlers.js +16 -16
  33. package/dist/tools/lane.js +64 -64
  34. package/dist/tools/p5-compat/p5-helpers.js +341 -341
  35. package/dist/tools/timeline.js +82 -82
  36. package/dist/types/code-generator.d.ts.map +1 -1
  37. package/dist/types/code-generator.js +6616 -5859
  38. package/dist/types/code-generator.js.map +1 -1
  39. package/dist/types/schemas.d.ts +2 -0
  40. package/dist/types/schemas.d.ts.map +1 -1
  41. package/dist/types/schemas.js +2 -0
  42. package/dist/types/schemas.js.map +1 -1
  43. package/dist/utils/safe-fetch.d.ts +8 -0
  44. package/dist/utils/safe-fetch.d.ts.map +1 -1
  45. package/dist/utils/safe-fetch.js +125 -34
  46. package/dist/utils/safe-fetch.js.map +1 -1
  47. package/dist/vendor/design/device-mockup-generator.js +167 -150
  48. package/dist/vendor/design/recursive-subdivision-generator.js +107 -107
  49. package/dist/vendor/design/textile-weave-generator.js +429 -429
  50. package/dist/vendor/design/ui-kit-runtime.js +674 -674
  51. package/manifest.json +1 -1
  52. package/package.json +7 -4
@@ -17,358 +17,358 @@
17
17
  * Browser-side p5.js compatibility helpers.
18
18
  * This code is injected into the PinePaper page context and run there as a script.
19
19
  */
20
- export const P5_HELPERS = `
21
- (function() {
22
- // Prevent double-initialization
23
- if (window._p5Initialized) {
24
- console.log('[p5-compat] Already initialized');
25
- return;
26
- }
20
+ export const P5_HELPERS = ("\n(function() {\n // Prevent double-initialization\n if (window._p5Initialized) {\n console.log('[p5-compat] Already initialized');\n return;\n }\n\n // ==========================================================================\n // STATE MANAGEMENT\n // ==========================================================================\n\n window._p5State = {\n fillColor: '#ffffff',\n strokeColor: '#000000',\n strokeWidth: 1,\n rectMode: 'corner',\n ellipseMode: 'center'\n };\n\n // ==========================================================================\n // CONSTANTS\n // ==========================================================================\n\n window.PI =" +
21
+ " Math.PI;\n window.TWO_PI = Math.PI * 2;\n window.HALF_PI = Math.PI / 2;\n window.QUARTER_PI = Math.PI / 4;\n\n window.CENTER = 'center';\n window.CORNER = 'corner';\n\n // ==========================================================================\n // CANVAS PROPERTIES\n // ==========================================================================\n\n Object.defineProperty(window, 'width', {\n get: function() {\n return paper.view ? paper.view.size.width : 800;\n },\n configurable: true\n });\n\n Object.defineProperty(window, 'height', {\n get: function() {\n return paper.view ? paper.view.size.height : 600;\n },\n configurable: true\n });\n\n // =" +
22
+ "=========================================================================\n // MATH UTILITIES\n // ==========================================================================\n\n window.random = function(min, max) {\n if (arguments.length === 0) {\n return Math.random();\n } else if (arguments.length === 1) {\n if (Array.isArray(min)) {\n // random(array) - return random element\n return min[Math.floor(Math.random() * min.length)];\n }\n // random(max) - return 0 to max\n return Math.random() * min;\n } else {\n // random(min, max)\n return Math.random() * (max - min) + min;\n }\n };\n\n window.map = function(value, start1, s" +
23
+ "top1, start2, stop2) {\n return start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));\n };\n\n window.constrain = function(value, min, max) {\n return Math.min(Math.max(value, min), max);\n };\n\n window.dist = function(x1, y1, x2, y2) {\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n };\n\n window.lerp = function(start, stop, amount) {\n return start + (stop - start) * amount;\n };\n\n window.radians = function(degrees) {\n return degrees * Math.PI / 180;\n };\n\n window.degrees = function(radians) {\n return radians * 180 / Math.PI;\n };\n\n // ==========================================================================\n // " +
24
+ "STYLE FUNCTIONS\n // ==========================================================================\n\n /**\n * Parse color arguments into a valid color string.\n * Supports: fill(gray), fill(r,g,b), fill(r,g,b,a), fill('#hex')\n */\n function parseColor(args) {\n if (args.length === 0) return null;\n\n if (args.length === 1) {\n var val = args[0];\n if (typeof val === 'string') {\n return val;\n } else if (typeof val === 'number') {\n // Grayscale\n return 'rgb(' + val + ', ' + val + ', ' + val + ')';\n }\n } else if (args.length === 3) {\n // RGB\n return 'rgb(' + args[0] + ', ' + args[1] + ', ' + args[2] + ')';\n } else" +
25
+ " if (args.length === 4) {\n // RGBA (p5 uses 0-255 for alpha, CSS uses 0-1)\n return 'rgba(' + args[0] + ', ' + args[1] + ', ' + args[2] + ', ' + (args[3] / 255) + ')';\n }\n\n return null;\n }\n\n window.fill = function() {\n var color = parseColor(Array.prototype.slice.call(arguments));\n window._p5State.fillColor = color;\n };\n\n window.noFill = function() {\n window._p5State.fillColor = null;\n };\n\n window.stroke = function() {\n var color = parseColor(Array.prototype.slice.call(arguments));\n window._p5State.strokeColor = color;\n };\n\n window.noStroke = function() {\n window._p5State.strokeColor = null;\n };\n\n window.strokeWeight = fu" +
26
+ "nction(weight) {\n window._p5State.strokeWidth = weight;\n };\n\n window.background = function() {\n var color = parseColor(Array.prototype.slice.call(arguments));\n if (color && typeof app !== 'undefined' && app.setBackgroundColor) {\n app.setBackgroundColor(color);\n }\n };\n\n // ==========================================================================\n // MODE FUNCTIONS\n // ==========================================================================\n\n window.rectMode = function(mode) {\n window._p5State.rectMode = mode.toLowerCase();\n };\n\n window.ellipseMode = function(mode) {\n window._p5State.ellipseMode = mode.toLowerCase();\n };\n\n // ======" +
27
+ "====================================================================\n // SHAPE FUNCTIONS\n // ==========================================================================\n\n /**\n * Apply current style state to an item\n */\n function applyStyle(item) {\n if (window._p5State.fillColor) {\n item.fillColor = window._p5State.fillColor;\n }\n if (window._p5State.strokeColor) {\n item.strokeColor = window._p5State.strokeColor;\n item.strokeWidth = window._p5State.strokeWidth;\n }\n }\n\n /**\n * Register item with PinePaper's ItemRegistry\n */\n function registerItem(item, type) {\n if (typeof app !== 'undefined' && app.registerItem) {\n app.reg" +
28
+ "isterItem(item, type, { source: 'p5' });\n }\n return item;\n }\n\n /**\n * Draw a circle\n * circle(x, y, diameter)\n */\n window.circle = function(x, y, d) {\n var item = new paper.Path.Circle({\n center: [x, y],\n radius: d / 2\n });\n applyStyle(item);\n return registerItem(item, 'circle');\n };\n\n /**\n * Draw an ellipse\n * ellipse(x, y, width, [height])\n */\n window.ellipse = function(x, y, w, h) {\n h = h !== undefined ? h : w;\n var mode = window._p5State.ellipseMode;\n var center = mode === 'center' ? [x, y] : [x + w / 2, y + h / 2];\n\n var item = new paper.Path.Ellipse({\n center: center,\n size: [w, h]\n " +
29
+ "});\n applyStyle(item);\n return registerItem(item, 'ellipse');\n };\n\n /**\n * Draw a rectangle\n * rect(x, y, width, height, [cornerRadius])\n */\n window.rect = function(x, y, w, h, r) {\n var mode = window._p5State.rectMode;\n var point = mode === 'center' ? [x - w / 2, y - h / 2] : [x, y];\n\n var options = {\n point: point,\n size: [w, h]\n };\n\n if (r !== undefined && r > 0) {\n options.radius = r;\n }\n\n var item = new paper.Path.Rectangle(options);\n applyStyle(item);\n return registerItem(item, 'rectangle');\n };\n\n /**\n * Draw a line\n * line(x1, y1, x2, y2)\n */\n window.line = function(x1, y1, x2, y2) {\n " +
30
+ " var item = new paper.Path.Line({\n from: [x1, y1],\n to: [x2, y2]\n });\n // Lines typically don't have fill\n if (window._p5State.strokeColor) {\n item.strokeColor = window._p5State.strokeColor;\n item.strokeWidth = window._p5State.strokeWidth;\n }\n return registerItem(item, 'line');\n };\n\n /**\n * Draw a triangle\n * triangle(x1, y1, x2, y2, x3, y3)\n */\n window.triangle = function(x1, y1, x2, y2, x3, y3) {\n var item = new paper.Path({\n segments: [[x1, y1], [x2, y2], [x3, y3]],\n closed: true\n });\n applyStyle(item);\n return registerItem(item, 'triangle');\n };\n\n /**\n * Draw a quadrilateral\n * quad(x1, " +
31
+ "y1, x2, y2, x3, y3, x4, y4)\n */\n window.quad = function(x1, y1, x2, y2, x3, y3, x4, y4) {\n var item = new paper.Path({\n segments: [[x1, y1], [x2, y2], [x3, y3], [x4, y4]],\n closed: true\n });\n applyStyle(item);\n return registerItem(item, 'quad');\n };\n\n /**\n * Draw an arc\n * arc(x, y, width, height, startAngle, stopAngle)\n * Note: p5.js uses radians by default\n */\n window.arc = function(x, y, w, h, start, stop) {\n // Calculate the arc using Paper.js\n var cx = x;\n var cy = y;\n var rx = w / 2;\n var ry = h / 2;\n\n // Convert from p5's angle system to Paper.js\n // p5 uses radians where 0 is right, PI/2 is down\n v" +
32
+ "ar startDeg = start * 180 / Math.PI;\n var stopDeg = stop * 180 / Math.PI;\n\n // Create arc using path segments\n var item = new paper.Path.Arc({\n from: [\n cx + rx * Math.cos(start),\n cy + ry * Math.sin(start)\n ],\n through: [\n cx + rx * Math.cos((start + stop) / 2),\n cy + ry * Math.sin((start + stop) / 2)\n ],\n to: [\n cx + rx * Math.cos(stop),\n cy + ry * Math.sin(stop)\n ]\n });\n\n applyStyle(item);\n return registerItem(item, 'arc');\n };\n\n /**\n * Draw a point (tiny circle)\n * point(x, y)\n */\n window.point = function(x, y) {\n var size = window._p5State.strokeWidth || 1;" +
33
+ "\n var item = new paper.Path.Circle({\n center: [x, y],\n radius: size / 2\n });\n // Points use stroke color as fill\n if (window._p5State.strokeColor) {\n item.fillColor = window._p5State.strokeColor;\n }\n return registerItem(item, 'point');\n };\n\n // ==========================================================================\n // INITIALIZATION COMPLETE\n // ==========================================================================\n\n window._p5Initialized = true;\n console.log('[p5-compat] p5.js compatibility layer loaded (v1.3.1)');\n console.log('[p5-compat] Available: circle, ellipse, rect, line, triangle, quad, arc, point');\n console.log" +
34
+ "('[p5-compat] Style: fill, noFill, stroke, noStroke, strokeWeight, background');\n console.log('[p5-compat] Math: random, map, constrain, dist, lerp, radians, degrees');\n})();\n"
27
35
 
28
- // ==========================================================================
29
- // STATE MANAGEMENT
30
- // ==========================================================================
31
-
32
- window._p5State = {
33
- fillColor: '#ffffff',
34
- strokeColor: '#000000',
35
- strokeWidth: 1,
36
- rectMode: 'corner',
37
- ellipseMode: 'center'
38
- };
39
-
40
- // ==========================================================================
41
- // CONSTANTS
42
- // ==========================================================================
43
-
44
- window.PI = Math.PI;
45
- window.TWO_PI = Math.PI * 2;
46
- window.HALF_PI = Math.PI / 2;
47
- window.QUARTER_PI = Math.PI / 4;
48
-
49
- window.CENTER = 'center';
50
- window.CORNER = 'corner';
51
-
52
- // ==========================================================================
53
- // CANVAS PROPERTIES
54
- // ==========================================================================
55
-
56
- Object.defineProperty(window, 'width', {
57
- get: function() {
58
- return paper.view ? paper.view.size.width : 800;
59
- },
60
- configurable: true
61
- });
62
-
63
- Object.defineProperty(window, 'height', {
64
- get: function() {
65
- return paper.view ? paper.view.size.height : 600;
66
- },
67
- configurable: true
68
- });
69
-
70
- // ==========================================================================
71
- // MATH UTILITIES
72
- // ==========================================================================
73
-
74
- window.random = function(min, max) {
75
- if (arguments.length === 0) {
76
- return Math.random();
77
- } else if (arguments.length === 1) {
78
- if (Array.isArray(min)) {
79
- // random(array) - return random element
80
- return min[Math.floor(Math.random() * min.length)];
81
- }
82
- // random(max) - return 0 to max
83
- return Math.random() * min;
84
- } else {
85
- // random(min, max)
86
- return Math.random() * (max - min) + min;
87
- }
88
- };
89
-
90
- window.map = function(value, start1, stop1, start2, stop2) {
91
- return start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));
92
- };
93
-
94
- window.constrain = function(value, min, max) {
95
- return Math.min(Math.max(value, min), max);
96
- };
97
-
98
- window.dist = function(x1, y1, x2, y2) {
99
- return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
100
- };
101
-
102
- window.lerp = function(start, stop, amount) {
103
- return start + (stop - start) * amount;
104
- };
105
-
106
- window.radians = function(degrees) {
107
- return degrees * Math.PI / 180;
108
- };
109
-
110
- window.degrees = function(radians) {
111
- return radians * 180 / Math.PI;
112
- };
113
-
114
- // ==========================================================================
115
- // STYLE FUNCTIONS
116
- // ==========================================================================
117
-
118
- /**
119
- * Parse color arguments into a valid color string.
120
- * Supports: fill(gray), fill(r,g,b), fill(r,g,b,a), fill('#hex')
121
- */
122
- function parseColor(args) {
123
- if (args.length === 0) return null;
124
-
125
- if (args.length === 1) {
126
- var val = args[0];
127
- if (typeof val === 'string') {
128
- return val;
129
- } else if (typeof val === 'number') {
130
- // Grayscale
131
- return 'rgb(' + val + ', ' + val + ', ' + val + ')';
132
- }
133
- } else if (args.length === 3) {
134
- // RGB
135
- return 'rgb(' + args[0] + ', ' + args[1] + ', ' + args[2] + ')';
136
- } else if (args.length === 4) {
137
- // RGBA (p5 uses 0-255 for alpha, CSS uses 0-1)
138
- return 'rgba(' + args[0] + ', ' + args[1] + ', ' + args[2] + ', ' + (args[3] / 255) + ')';
139
- }
140
36
 
141
- return null;
142
- }
143
37
 
144
- window.fill = function() {
145
- var color = parseColor(Array.prototype.slice.call(arguments));
146
- window._p5State.fillColor = color;
147
- };
148
38
 
149
- window.noFill = function() {
150
- window._p5State.fillColor = null;
151
- };
152
39
 
153
- window.stroke = function() {
154
- var color = parseColor(Array.prototype.slice.call(arguments));
155
- window._p5State.strokeColor = color;
156
- };
157
40
 
158
- window.noStroke = function() {
159
- window._p5State.strokeColor = null;
160
- };
161
41
 
162
- window.strokeWeight = function(weight) {
163
- window._p5State.strokeWidth = weight;
164
- };
165
42
 
166
- window.background = function() {
167
- var color = parseColor(Array.prototype.slice.call(arguments));
168
- if (color && typeof app !== 'undefined' && app.setBackgroundColor) {
169
- app.setBackgroundColor(color);
170
- }
171
- };
172
-
173
- // ==========================================================================
174
- // MODE FUNCTIONS
175
- // ==========================================================================
176
-
177
- window.rectMode = function(mode) {
178
- window._p5State.rectMode = mode.toLowerCase();
179
- };
180
-
181
- window.ellipseMode = function(mode) {
182
- window._p5State.ellipseMode = mode.toLowerCase();
183
- };
184
-
185
- // ==========================================================================
186
- // SHAPE FUNCTIONS
187
- // ==========================================================================
188
-
189
- /**
190
- * Apply current style state to an item
191
- */
192
- function applyStyle(item) {
193
- if (window._p5State.fillColor) {
194
- item.fillColor = window._p5State.fillColor;
195
- }
196
- if (window._p5State.strokeColor) {
197
- item.strokeColor = window._p5State.strokeColor;
198
- item.strokeWidth = window._p5State.strokeWidth;
199
- }
200
- }
201
43
 
202
- /**
203
- * Register item with PinePaper's ItemRegistry
204
- */
205
- function registerItem(item, type) {
206
- if (typeof app !== 'undefined' && app.registerItem) {
207
- app.registerItem(item, type, { source: 'p5' });
208
- }
209
- return item;
210
- }
211
44
 
212
- /**
213
- * Draw a circle
214
- * circle(x, y, diameter)
215
- */
216
- window.circle = function(x, y, d) {
217
- var item = new paper.Path.Circle({
218
- center: [x, y],
219
- radius: d / 2
220
- });
221
- applyStyle(item);
222
- return registerItem(item, 'circle');
223
- };
224
-
225
- /**
226
- * Draw an ellipse
227
- * ellipse(x, y, width, [height])
228
- */
229
- window.ellipse = function(x, y, w, h) {
230
- h = h !== undefined ? h : w;
231
- var mode = window._p5State.ellipseMode;
232
- var center = mode === 'center' ? [x, y] : [x + w / 2, y + h / 2];
233
-
234
- var item = new paper.Path.Ellipse({
235
- center: center,
236
- size: [w, h]
237
- });
238
- applyStyle(item);
239
- return registerItem(item, 'ellipse');
240
- };
241
-
242
- /**
243
- * Draw a rectangle
244
- * rect(x, y, width, height, [cornerRadius])
245
- */
246
- window.rect = function(x, y, w, h, r) {
247
- var mode = window._p5State.rectMode;
248
- var point = mode === 'center' ? [x - w / 2, y - h / 2] : [x, y];
249
-
250
- var options = {
251
- point: point,
252
- size: [w, h]
253
- };
254
-
255
- if (r !== undefined && r > 0) {
256
- options.radius = r;
257
- }
258
45
 
259
- var item = new paper.Path.Rectangle(options);
260
- applyStyle(item);
261
- return registerItem(item, 'rectangle');
262
- };
263
-
264
- /**
265
- * Draw a line
266
- * line(x1, y1, x2, y2)
267
- */
268
- window.line = function(x1, y1, x2, y2) {
269
- var item = new paper.Path.Line({
270
- from: [x1, y1],
271
- to: [x2, y2]
272
- });
273
- // Lines typically don't have fill
274
- if (window._p5State.strokeColor) {
275
- item.strokeColor = window._p5State.strokeColor;
276
- item.strokeWidth = window._p5State.strokeWidth;
277
- }
278
- return registerItem(item, 'line');
279
- };
280
-
281
- /**
282
- * Draw a triangle
283
- * triangle(x1, y1, x2, y2, x3, y3)
284
- */
285
- window.triangle = function(x1, y1, x2, y2, x3, y3) {
286
- var item = new paper.Path({
287
- segments: [[x1, y1], [x2, y2], [x3, y3]],
288
- closed: true
289
- });
290
- applyStyle(item);
291
- return registerItem(item, 'triangle');
292
- };
293
-
294
- /**
295
- * Draw a quadrilateral
296
- * quad(x1, y1, x2, y2, x3, y3, x4, y4)
297
- */
298
- window.quad = function(x1, y1, x2, y2, x3, y3, x4, y4) {
299
- var item = new paper.Path({
300
- segments: [[x1, y1], [x2, y2], [x3, y3], [x4, y4]],
301
- closed: true
302
- });
303
- applyStyle(item);
304
- return registerItem(item, 'quad');
305
- };
306
-
307
- /**
308
- * Draw an arc
309
- * arc(x, y, width, height, startAngle, stopAngle)
310
- * Note: p5.js uses radians by default
311
- */
312
- window.arc = function(x, y, w, h, start, stop) {
313
- // Calculate the arc using Paper.js
314
- var cx = x;
315
- var cy = y;
316
- var rx = w / 2;
317
- var ry = h / 2;
318
-
319
- // Convert from p5's angle system to Paper.js
320
- // p5 uses radians where 0 is right, PI/2 is down
321
- var startDeg = start * 180 / Math.PI;
322
- var stopDeg = stop * 180 / Math.PI;
323
-
324
- // Create arc using path segments
325
- var item = new paper.Path.Arc({
326
- from: [
327
- cx + rx * Math.cos(start),
328
- cy + ry * Math.sin(start)
329
- ],
330
- through: [
331
- cx + rx * Math.cos((start + stop) / 2),
332
- cy + ry * Math.sin((start + stop) / 2)
333
- ],
334
- to: [
335
- cx + rx * Math.cos(stop),
336
- cy + ry * Math.sin(stop)
337
- ]
338
- });
339
-
340
- applyStyle(item);
341
- return registerItem(item, 'arc');
342
- };
343
-
344
- /**
345
- * Draw a point (tiny circle)
346
- * point(x, y)
347
- */
348
- window.point = function(x, y) {
349
- var size = window._p5State.strokeWidth || 1;
350
- var item = new paper.Path.Circle({
351
- center: [x, y],
352
- radius: size / 2
353
- });
354
- // Points use stroke color as fill
355
- if (window._p5State.strokeColor) {
356
- item.fillColor = window._p5State.strokeColor;
357
- }
358
- return registerItem(item, 'point');
359
- };
360
-
361
- // ==========================================================================
362
- // INITIALIZATION COMPLETE
363
- // ==========================================================================
364
-
365
- window._p5Initialized = true;
366
- console.log('[p5-compat] p5.js compatibility layer loaded (v1.3.1)');
367
- console.log('[p5-compat] Available: circle, ellipse, rect, line, triangle, quad, arc, point');
368
- console.log('[p5-compat] Style: fill, noFill, stroke, noStroke, strokeWeight, background');
369
- console.log('[p5-compat] Math: random, map, constrain, dist, lerp, radians, degrees');
370
- })();
371
- `;
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+
297
+
298
+
299
+
300
+
301
+
302
+
303
+
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+
348
+
349
+
350
+
351
+
352
+
353
+
354
+
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+ );
372
372
  /**
373
373
  * Generate code that initializes p5 helpers and executes user code
374
374
  */