From 8b9f86265c3a1e9011116e082dd9f16978ea152b Mon Sep 17 00:00:00 2001 From: benfry Date: Sun, 8 Apr 2012 18:07:42 +0000 Subject: [PATCH] moving synthesis by hand --- .../Synthesis_02_waves_01.pde | 23 + .../Synthesis_02_waves_02.pde | 27 + .../Synthesis_02_waves_03.pde | 70 ++ .../Synthesis_02_waves_04.pde | 34 + .../Synthesis_02_waves_05.pde | 37 + .../Synthesis_03_grids_01.pde | 20 + .../Synthesis_03_grids_02.pde | 30 + .../Synthesis_03_grids_03.pde | 30 + .../Synthesis_03_grids_04.pde | 36 + .../Synthesis_03_grids_05.pde | 42 ++ .../Synthesis_04_mandelbrot.pde | 47 ++ .../Synthesis_05_tennis.pde | 103 +++ .../Synthesis_06_cursor.pde | 304 ++++++++ .../data/NewsGothicBT-Bold-48.vlw | Bin 0 -> 179002 bytes .../Synthesis_07_typing.pde | 229 ++++++ .../data/TheSerif-Plain-128.vlw | Bin 0 -> 1131851 bytes .../data/TheSerif-Plain-96.vlw | Bin 0 -> 641509 bytes .../Synthesis_08_clock/Synthesis_08_clock.pde | 190 +++++ .../Synthesis_09_centipede.pde | 90 +++ .../Synthesis_10_chronodraw.pde | 236 ++++++ .../Synthesis_11_amoebaAbstract.pde | 175 +++++ .../Synthesis_12_robot/Synthesis_12_robot.pde | 88 +++ .../Synthesis_12_robot/data/battalpha.gif | Bin 0 -> 516 bytes .../Synthesis_12_robot/data/batteat.gif | Bin 0 -> 163 bytes .../Synthesis_12_robot/data/batteatalpha.gif | Bin 0 -> 754 bytes .../Synthesis_12_robot/data/headalpha.gif | Bin 0 -> 1616 bytes .../Synthesis_13_withoutTitle/Module.pde | 18 + .../Synthesis_13_withoutTitle/ModuleA.pde | 33 + .../Synthesis_13_withoutTitle/ModuleB.pde | 27 + .../Synthesis_13_withoutTitle.pde | 78 ++ .../Synthesis_13_withoutTitle/data/Thumbs.db | Bin 0 -> 11776 bytes .../data/down_down.gif | Bin 0 -> 63 bytes .../data/down_hi.gif | Bin 0 -> 63 bytes .../data/down_lo.gif | Bin 0 -> 63 bytes .../data/up_down.gif | Bin 0 -> 62 bytes .../Synthesis_13_withoutTitle/data/up_hi.gif | Bin 0 -> 62 bytes .../Synthesis_13_withoutTitle/data/up_lo.gif | Bin 0 -> 62 bytes .../Synthesis_14_pond/Synthesis_14_pond.pde | 671 ++++++++++++++++++ .../Synthesis/Synthesis_15_tree/Branch.pde | 69 ++ .../Synthesis/Synthesis_15_tree/Segment.pde | 156 ++++ .../Synthesis_15_tree/Synthesis_15_tree.pde | 102 +++ .../Synthesis_15_tree/data/treeData.txt | 391 ++++++++++ .../Synthesis_16_sodaprocessing/Button.pde | 35 + .../Synthesis_16_sodaprocessing/Control.pde | 48 ++ .../Synthesis_16_sodaprocessing/Mass.pde | 79 +++ .../Synthesis_16_sodaprocessing/Slider.pde | 48 ++ .../Synthesis_16_sodaprocessing/Spring.pde | 81 +++ .../Synthesis_16_sodaprocessing.pde | 329 +++++++++ 48 files changed, 3976 insertions(+) create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_01/Synthesis_02_waves_01.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_02/Synthesis_02_waves_02.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_03/Synthesis_02_waves_03.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_04/Synthesis_02_waves_04.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_05/Synthesis_02_waves_05.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_01/Synthesis_03_grids_01.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_02/Synthesis_03_grids_02.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_03/Synthesis_03_grids_03.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_04/Synthesis_03_grids_04.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_05/Synthesis_03_grids_05.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_04_mandelbrot/Synthesis_04_mandelbrot.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_05_tennis/Synthesis_05_tennis.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_06_cursor/Synthesis_06_cursor.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_06_cursor/data/NewsGothicBT-Bold-48.vlw create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_07_typing/Synthesis_07_typing.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_07_typing/data/TheSerif-Plain-128.vlw create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_07_typing/data/TheSerif-Plain-96.vlw create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_08_clock/Synthesis_08_clock.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_09_centipede/Synthesis_09_centipede.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_10_chronodraw/Synthesis_10_chronodraw.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_11_amoebaAbstract/Synthesis_11_amoebaAbstract.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_12_robot/Synthesis_12_robot.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_12_robot/data/battalpha.gif create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_12_robot/data/batteat.gif create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_12_robot/data/batteatalpha.gif create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_12_robot/data/headalpha.gif create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/Module.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/ModuleA.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/ModuleB.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/Synthesis_13_withoutTitle.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/Thumbs.db create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/down_down.gif create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/down_hi.gif create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/down_lo.gif create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/up_down.gif create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/up_hi.gif create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/up_lo.gif create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_14_pond/Synthesis_14_pond.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_15_tree/Branch.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_15_tree/Segment.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_15_tree/Synthesis_15_tree.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_15_tree/data/treeData.txt create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Button.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Control.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Mass.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Slider.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Spring.pde create mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Synthesis_16_sodaprocessing.pde diff --git a/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_01/Synthesis_02_waves_01.pde b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_01/Synthesis_02_waves_01.pde new file mode 100644 index 000000000..31d2dd90f --- /dev/null +++ b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_01/Synthesis_02_waves_01.pde @@ -0,0 +1,23 @@ +/** + * Synthesis 1: Form and Code + * Riley Waves by Casey Reas (www.processing.org) + * p. 151 + * + * Step 1, creating the basic form. +*/ + + +size(400, 400); +background(255); +float angle = 0.0; +float magnitude = 24.0; + +beginShape(TRIANGLE_STRIP); +for(int x=0; x<=width; x=x+8) { + float y = 50 + (sin(angle)* magnitude); + angle += PI/48.0; + float y2 = 70 + (sin(angle+PI/6)* magnitude); + vertex(x, y); + vertex(x, y2); +} +endShape(); diff --git a/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_02/Synthesis_02_waves_02.pde b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_02/Synthesis_02_waves_02.pde new file mode 100644 index 000000000..b923a3b55 --- /dev/null +++ b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_02/Synthesis_02_waves_02.pde @@ -0,0 +1,27 @@ +/** + * Synthesis 1: Form and Code + * Riley Waves by Casey Reas (www.processing.org) + * p. 151 + * + * Step 2, the basic form is drawn many times inside a for structure. +*/ + + +size(400, 400); +background(255); +float angle = 0.0; +int magnitude = 18; + +for(int i =- magnitude; i < height+magnitude; i = i+24) { + + beginShape(TRIANGLE_STRIP); + for(int x = 0; x <= width; x = x+8) { + float y = i + (sin(angle)* magnitude); + angle += PI/24.0; + float y2 = i+10 + (sin(angle+PI/12) * magnitude); + vertex(x, y); + vertex(x, y2); + } + endShape(); + +} diff --git a/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_03/Synthesis_02_waves_03.pde b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_03/Synthesis_02_waves_03.pde new file mode 100644 index 000000000..5932fa877 --- /dev/null +++ b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_03/Synthesis_02_waves_03.pde @@ -0,0 +1,70 @@ +/** + * Synthesis 1: Form and Code + * Riley Waves by Casey Reas (www.processing.org) + * p. 151 + * + * Step 3, values are modified to create a new pattern. +*/ + + +size(1200, 280); +background(255); +smooth(); +noStroke(); +float angle = 0.0; +float angle2 = 0.0; +int magnitude = 8; + +for(int i = -magnitude; i < height+magnitude; i = i+18) { + + angle2 = angle; + + fill(0); + beginShape(TRIANGLE_STRIP); + for(int x=0; x<=width; x=x+8) { + float y = i + (sin(angle)* magnitude); + angle += PI/24.0; + float y2 = i+4 + (sin(angle+PI/12)* magnitude); + vertex(x, y); + vertex(x, y2); + } + endShape(); + + fill(204); + beginShape(TRIANGLE_STRIP); + for(int x=0; x<=width; x=x+8) { + float y = i+4 + (sin(angle2+PI/12)* magnitude); + angle2 += PI/24.0; + float y2 = i+8 + (sin(angle2+PI/12)* magnitude); + vertex(x, y); + vertex(x, y2); + } + endShape(); + + /* + fill(0); + beginShape(TRIANGLE_STRIP); + for(int x=0; x<=width; x=x+8) { + float y = i + (sin(angle)* magnitude); + angle += PI/16.0; + float y2 = i+4 + (sin(angle+PI/24)* magnitude); + vertex(x, y); + vertex(x, y2); + } + endShape(); + + fill(204); + beginShape(TRIANGLE_STRIP); + for(int x=0; x<=width; x=x+8) { + float y = i+4 + (sin(angle2+PI/24)* magnitude); + angle2 += PI/16.0; + float y2 = i+8 + (sin(angle2+PI/24)* magnitude); + vertex(x, y); + vertex(x, y2); + } + endShape(); + */ +} + + +// save("Synthesis-2--1.tif"); diff --git a/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_04/Synthesis_02_waves_04.pde b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_04/Synthesis_02_waves_04.pde new file mode 100644 index 000000000..fb80ac2bd --- /dev/null +++ b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_04/Synthesis_02_waves_04.pde @@ -0,0 +1,34 @@ +/** + * Synthesis 1: Form and Code + * Riley Waves by Casey Reas (www.processing.org) + * p. 151 + * + * Step 3, values are modified to create a new pattern. +*/ + + +size(1200, 280); +background(255); +smooth(); +noStroke(); +fill(0); +float angle = 0.0; +int magnitude = 16; + +for(int i = -magnitude; i < width+magnitude; i = i+16) { + + fill(float(i)/width * 255); + + beginShape(TRIANGLE_STRIP); + for(int y = 0; y <= height; y = y+6) { + float x = i + (sin(angle)* magnitude); + angle += PI/22.0; + float x2 = i+8 + (sin(angle+PI/22)* magnitude); + vertex(x, y); + vertex(x2, y); + } + endShape(); + +} + +// saveFrame("Synthesis-2--2.tif"); diff --git a/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_05/Synthesis_02_waves_05.pde b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_05/Synthesis_02_waves_05.pde new file mode 100644 index 000000000..423453ad9 --- /dev/null +++ b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_05/Synthesis_02_waves_05.pde @@ -0,0 +1,37 @@ +/** + * Synthesis 1: Form and Code + * Riley Waves by Casey Reas (www.processing.org) + * p. 151 + * + * Step 3, values are modified to create a new pattern. +*/ + + +size(1200, 280); +background(255); +smooth(); +noStroke(); +//fill(0); +float angle = PI; +float angle2 = PI; +int magnitude = 3; + +for(int i = -magnitude; i < height+magnitude; i = i+12) { + + angle2 = angle; + + fill(0); + beginShape(TRIANGLE_STRIP); + for(int x = 0; x <= width; x = x+8) { + float y = i + (sin(angle)* magnitude); + angle += PI/24.0; + float y2 = i+4 + (sin(angle+PI/12)* magnitude); + vertex(x, y); + vertex(x, y2); + } + endShape(); + +} + + +// save("Synthesis-2--3.tif"); diff --git a/java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_01/Synthesis_03_grids_01.pde b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_01/Synthesis_03_grids_01.pde new file mode 100644 index 000000000..fe719e4f3 --- /dev/null +++ b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_01/Synthesis_03_grids_01.pde @@ -0,0 +1,20 @@ +/** + * Synthesis 1: Form and Code + * Wilson Grids by Casey Reas (www.processing.org) + * p. 152 + * + * Step 1, basic embedded for structure. +*/ + + +size(600, 600); +background(255); +int sqNum = 12; +int sqSize = width/sqNum; +int halfSize = sqSize/2; + +for (int y = halfSize; y < width; y = y+sqSize) { + for (int x = halfSize; x < height; x = x+sqSize) { + rect(x-halfSize+2, y-halfSize+2, sqSize-4, sqSize-4); + } +} diff --git a/java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_02/Synthesis_03_grids_02.pde b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_02/Synthesis_03_grids_02.pde new file mode 100644 index 000000000..8f5b4a361 --- /dev/null +++ b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_02/Synthesis_03_grids_02.pde @@ -0,0 +1,30 @@ +/** + * Synthesis 1: Form and Code + * Wilson Grids by Casey Reas (www.processing.org) + * p. 152 + * + * Step 2, textures inside the grid by adding a third for structure. +*/ + + +size(600, 600); +background(255); +int numSquares = 12; +int gap = 4; +int sqSize = (width-gap*2)/numSquares; +int halfSize = sqSize/2; +int offset = halfSize+gap; +int ydiv = sqSize/12; + +for(int y = 0; y < numSquares; y++) { + for(int x = 0; x < numSquares; x++) { + float xp = offset + (x*sqSize); + float yp = offset + (y*sqSize); + for(int i=0; i<=sqSize-gap*2; i=i+ydiv) { + float yy = i*halfSize+gap+i; + line(xp-halfSize+gap, yp-halfSize+gap+i, xp+halfSize-gap, yp-halfSize+gap+i); + } + } + +} + diff --git a/java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_03/Synthesis_03_grids_03.pde b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_03/Synthesis_03_grids_03.pde new file mode 100644 index 000000000..9d4d5f670 --- /dev/null +++ b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_03/Synthesis_03_grids_03.pde @@ -0,0 +1,30 @@ +/** + * Synthesis 1: Form and Code + * Wilson Grids by Casey Reas (www.processing.org) + * p. 152 + * + * Step 3, changing the size of each grid element. +*/ + + +size(600, 600); +background(0); +stroke(255, 204); +int numSquares = 6; +int gap = 8; +int sqSize = (width-gap*2)/numSquares; + +for (float y=0; y 2 ) { + co = 1 - k/float(accuracy); + break; // NOTE: This is new syntax!!! + } + } + stroke(color(255*co, 255*co, 255*co)); + point(i, j); + } +} + + +// save("Synthesis-04--" + zoom + ".tif"); diff --git a/java/examples/Books/Processing Handbook/Synthesis/Synthesis_05_tennis/Synthesis_05_tennis.pde b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_05_tennis/Synthesis_05_tennis.pde new file mode 100644 index 000000000..4dc267f43 --- /dev/null +++ b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_05_tennis/Synthesis_05_tennis.pde @@ -0,0 +1,103 @@ +/** + * Synthesis 2: Input and Response + * Tennis by Casey Reas (www.processing.org) + * p. 256 + * + * Only the right paddle works. As a challenge, try to + * add code to activate the left paddle. You can make decide to make + * it a one-player or two-player game. As an additional challenge, + * have the program keep score. + */ + + +int ballX; +int ballY; +int ballDir = 1; +int ballSize = 10; // Radius +float ballAngle = 0.0; // Direction + +// Global variables for the paddle +int paddleWidth = 20; +int paddleHeight = 40; + +int wallGap = 50; + +int netSegment; + +void setup() { + size(640, 480); + noStroke(); + ballY = height/2; + ballX = 0; + noCursor(); + netSegment = height/32; +} + +void draw() { + background(0); + + stroke(255); + // Draw Net + for(int i=0; i width+ballSize*2) { + ballX = -ballSize; + ballY = int(random(0, height-ballSize)); + ballAngle = 0; + println(ballX + ":" + ballY + ":" + ballAngle); + } + + if(ballX < -ballSize*2) { + ballX = width; + ballY = int(random(0, height-ballSize)); + ballAngle = 0; + println(ballX + ":" + ballY + ":" + ballAngle); + } + + // Constrain paddle to screen + float paddleY = constrain(mouseY, 0, height-paddleHeight); + + // Test to see if the ball is touching the paddle + float py = width-wallGap-ballSize; + if(ballX >= py && ( ballY+ballSize >= paddleY && ballY <= paddleY + paddleHeight)) { + + ballDir *= -1; + if(mouseY != pmouseY) { + ballAngle = (mouseY-pmouseY)/2.0; + ballAngle = constrain(ballAngle, -5, 5); + } + } + + // If ball hits back wall, reverse direction + if(ballX < 0) { + ballDir *= -1; + } + + // If the ball is touching top or bottom edge, reverse direction + if((ballY > height-ballSize) || (ballY < 0)) { + ballAngle = ballAngle * -1; + } + + // Draw ball + fill(255); + rect(ballX, ballY, ballSize, ballSize); + + // Draw the paddle + fill(153); + rect(width-wallGap, paddleY, paddleWidth, paddleHeight); + + // Draw the paddle + rect(wallGap, height-paddleY-paddleHeight, paddleWidth, paddleHeight); +} + + +void keyPressed() { + //saveFrame("pong-####.tif"); +} diff --git a/java/examples/Books/Processing Handbook/Synthesis/Synthesis_06_cursor/Synthesis_06_cursor.pde b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_06_cursor/Synthesis_06_cursor.pde new file mode 100644 index 000000000..ef52995ee --- /dev/null +++ b/java/examples/Books/Processing Handbook/Synthesis/Synthesis_06_cursor/Synthesis_06_cursor.pde @@ -0,0 +1,304 @@ +/** + * Synthesis 2: Input and Response + * Cursor by Peter Cho (www.typotopo.com) + * p. 257 + * + * There are four modes, each is a different + * way to use the input from the mouse to control + * the cursor(s). Click on a number to select that + * mode. + */ + + +PFont fontA; +int gx, gy; +int mode, nextmode; +int nummodes; +boolean forapplet = false; + +float mx, my, lastmx, lastmy; +float lastrot, lastsc; + +float bgx, bgy; + + +float p_x, p_y; +float p_fx, p_fy; +float p_v2, p_vx, p_vy; +float p_a2, p_ax, p_ay; +float p_mass, p_drag; + + +void setup() +{ + size(600, 600); + gx = width; + gy = height; + size(gx, gy); + colorMode(RGB, 1.0); + strokeWeight(1.3); + loop(); + smooth(); + strokeJoin(ROUND); + + init_particle(0.6, 0.9, width/2, height/2); + + fontA = loadFont("NewsGothicBT-Bold-48.vlw"); + nummodes = 4; + mode = 1; + + bgx = 0; + bgy = 0; + mx = gx/2; + my = gy/2; + + noCursor(); + + if (forapplet) { + cursor(CROSS); + } +} + + +void init_particle(float _mass, float _drag, float ox, float oy) +{ + p_x = ox; + p_y = oy; + p_v2 = 0.0f; + p_vx = 0.0f; + p_vy = 0.0f; + p_a2 = 0.0f; + p_ax = 0.0f; + p_ay = 0.0f; + p_mass = _mass; + p_drag = _drag; +} + +void iterate_particle(float fkx, float fky) +{ + // iterate for a single force acting on the particle + p_fx = fkx; + p_fy = fky; + p_a2 = p_fx*p_fx + p_fy*p_fy; + if (p_a2 < 0.0000001) return; + p_ax = p_fx/p_mass; + p_ay = p_fy/p_mass; + p_vx += p_ax; + p_vy += p_ay; + p_v2 = p_vx*p_vx + p_vy*p_vy; + if (p_v2 < 0.0000001) return; + p_vx *= (1.0 - p_drag); + p_vy *= (1.0 - p_drag); + p_x += p_vx; + p_y += p_vy; +} + +void drawCursor(float x, float y, float myscale, float myrot) { + // draw generic arrow cursor + if (forapplet) y -= gy/2; + pushMatrix(); + translate(x, y); + rotate(myrot); + scale(myscale, myscale); + beginShape(POLYGON); + vertex(7, 21); + vertex(4, 13); + vertex(1, 16); + vertex(0, 16); + vertex(0, 0); // tip of cursor shape + vertex(1, 0); + vertex(12, 11); + vertex(12, 12); + vertex(7, 12); + vertex(10, 20); + vertex(9, 21); + vertex(7, 21); + endShape(); + popMatrix(); +} + +void blurdot(float x, float y, float sc) { + ellipse(x, y, sc*5, sc*5); + ellipse(x, y, sc*23, sc*23); + ellipse(x, y, sc*57, sc*57); + ellipse(x, y, sc*93, sc*93); +} + +void drawBlurCursor(float x, float y, float myscale, float dotval) { + // draw generic arrow cursor + if (forapplet) y -= gy/2; + pushMatrix(); + translate(x, y); + scale(myscale, myscale); + float dotval2 = .5 + (1-dotval)*5; + dotval = .5 + (1-dotval)*9; + blurdot(7, 21, dotval2); + blurdot(1, 16, dotval); + blurdot(0, 8, dotval2); // midpt + blurdot(0, 0, dotval); // tip of cursor shape + blurdot(1, 0, dotval2); + blurdot(6, 6, dotval); // midpt + blurdot(12, 12, dotval2); + blurdot(10, 20, dotval); + popMatrix(); +} + + +int n = 1; +void keyPressed() { + if (key == '1') { + mode = 1; + } else if (key == '2') { + mode = 2; + } else if (key == '3') { + mode = 3; + } else if (key == '4') { + mode = 4; + } + + // saveFrame("cursor--" + mode + "-" + n + ".tif"); + n++; +} + +boolean isInside(float x, float y, float rx, float ry, float rw, float rh) { + return (x >= rx && x <= rx+rw && y >= ry && y <= ry+rh); +} + +void scrollbg(float x, float y) { + // scroll the bg + float amt = 30; + if (x < gx*.5) { + bgx += amt*(gx*.5 - x)*(gx*.5 - x)/(gx*gx); + } else if (x > gx - gx*.5) { + bgx -= amt*(x - (gx-gx*.5))*(x - (gx-gx*.5))/(gx*gx); + } + bgx = bgx % gx; + if (bgx < 0) bgx += gx; + + if (y < gy*.5) { + bgy += amt*(gy*.5 - y)*(gy*.5 - y)/(gy*gy); + } else if (y > gy - gy*.5) { + bgy -= amt*(y - (gy-gy*.5))*(y - (gy-gy*.5))/(gy*gy); + } + bgy = bgy % gy; + if (bgy < 0) bgy += gy; +} + +void draw() +{ + lastmx = mx; + lastmy = my; + + mx = mouseX; + my = mouseY; + + if (mode == 3) { + mx = mx*.01 + lastmx*.99; + my = my*.01 + lastmy*.99; + + } else if (mode == 4) { + mx = mx*.25 + lastmx*.75; + my = my*.25 + lastmy*.75; + + } else { + mx = mx*.5 + lastmx*.5; + my = my*.5 + lastmy*.5; + } + + iterate_particle(.15*(-p_x+mx), .15*(-p_y+my)); + scrollbg(p_x, p_y); + + background(.8,.8,.8); + // Set the font and its size (in units of pixels) + textFont(fontA, 24); + + float x, y; + int w=95, h=75; + for (int i=0; i>?G9n@}xse$}L_|b; zTFhip6jc;Or6`J`ilV59h&UKyq!1}7Duc*iE5;ZxGK^G=F(S6c7-M|rHF{jnde+)! zpYy(%Jem>YTIo`q_VH@3q(dIr}6@GLdwk96RI zJf8J(!L65Tv0Q&ZE|d$NNEh56mFw5!LYW~gxID}a0)w}f+#eG>;#ndW^0_)q)BjJN za2w@9o|emn@{IHM$ITBpr+GU6gwd8oG=H~W7|q`i!t`?ay97pA{OxifOu$atWPX>6 z%k1wK8p3f}oX*WPjcZc#sIRmbf3vR1icxSa}e@gJko4?y; zfxXOH1jf5{8p3qi-z)G!a@&N4{4SLXGJw6zepg`BHPk7*%ec(8n;+%;cN#1Yb$?p! z;6=H7Zm{R??-M`bK-wV(*z4I2fguOlZy4-yf4}*?PJqv8JB{|Y$rG|M?H>?7;y}54 zZm`FHJ58hWz0@Ko+p)Z;!wT2k*h(k*DP!72Izbz9_d>@Q_1%pBwCQe@6U> z17V^}0e>bJ+&?Cl$LH_CY5R;;D-Zv;(Q4JD{YHcCf{sG?9_Bw`e#GVR38?OX+`(Im z_D>oO?H%cf!#pT{l#A;@&^+(|l)yz@mkJK9!hoOH& z7(bH>?wDMt4=6*FD`@WiIRW7JbjEVWjaDnne_m)v1KthZF<_7Hg!w(4G3{S48p^tu zzmtMP{Qe$dxqq<+&CBzY(7=nlp?{3!{w4Ffz6QF=Q!FvVlVg3d4qpTqt%Y7w&$kYn+Uo~Fj!R0*6GlIjrMfy>m zD8D+n;Qlqa(0z%7wHcT%;ASm*>ABFw%x{f!s>DJic23BM#`LVtoIm(Q2jTw$Km<-Z$g` zBVBO+mR#%PLL4X;l)IP99f3X1pds#(TyX!kT)!q4>Y2--ZNU9yxex~~$m97lx!~@~ zg}x8%9Z%3aE&q<;y`JIea(x0f%7y$POwc^Oe^+3n#q}=A)YI87Fyg>fOv}F~IOIFd z1HyqDkPB_W+XKqQ)A{cUjC6Qf@bt9Y7Z~p~*1HYjhx-rYLONV_d1UWCFdFJK$`gDZ z-+w4D!oY=cL*4k9TyPKNLR=^t$ie*qK9c`Po+x9KN3pCQ2@YY^D(gYPBYxKtaa#V0 z;QyFhs7J610K0o4z(TbD_&v0zLfashhY8r-eeyA>F@Y*B_Cx z_Wt&{$)Oz~4{^QzPmKm$hBy&E>ImG|a=~AV_Mg3n_MZz4>2^859_9;^!#l)#LiqmP z|BD(lmm4zLugkM2_g@MQaiCs<2H4xfe%H=e`{@%ymL;D}z zLz@uVYPmd2z#iuRDDbL?2H0tn0;7yw4zSbyCxMY~q#fl9*lBMCM!KPoP`6{+{~Xbv zm*V`rdk^h@c@OOyp&{Lf4`If6_+Q13IM9w70Y~lqe=E|&Uy=)MN-oI#x?DxM|6Op1 z1MLVj!0!GJ0lch{Z@~U;X9Px=uFK=R|DW%n&Ax~Be+dn7c$k3wJj^w;GEz0)8UXmEhVmC$z}K2K*H z-y6Xf(+OU2Kl{sa125`2@)qU&XMaWfc(17MpBpR>xX*PW@a3NlEpQGJ@w$ZMb z240j2;`ciEGl9i@j<^=0;eEz5$h#cs9cX_@F0?_Er`6rh@je%#Azv{KVY=Ms0;B8^ zCen;BJ-*)%cp)0f5n(AF1{9E!w*#K{K;&b>>_J2yQ-!<6U!{=MXk21u& zhnqG8fr~UxXP?jzCeq>cT0pqpKsr(Wz#}j4TUu5j?3Hq%ERlY|7T+q=MU(}~ z02g3$tB?+~Ba|!Z5@@Ig;#NVQf%dsvF87(h;#T3^{!FcHB0w5&und~neEM)ztq-!3pJ1M;t@M3{1-e-cA7bk8P@~~0C_=bh3 z^q^wy3N#Ya2%i=7oYu`oyns{H9OHt%p=i8wCMd_XP0(qJqL83RIih+{eI^vr1Rbj4 zsGAdxbBacS%GOvSKCNbJ6oCZwMkE6t3Hob=wYo{Qb9YH73%ViUD!p5fECiH^mhXa0 zuoZ4DNEO1MCqh?-3}4_Q<;(KtpLKNxwjG=*EZ=A5&Og z>k&g|kGfgmIII4{0#%?s^G@Sti9Z&Odl8i?Ly+Ri>Im!omM}KWM~EsAs`F$OHbT5Z z@w|u-RUnH;lcaH-Q1FuQy)^}`2;LA^1v;KDx<*4977kH-;#7H|AIZB7NP(y{anOz< zc`AH(t(xv+aqWhrm5gy86W)1retD<*l5wLU-Op3uLnD5nXl+RQsyH-m76uv;>sgKq zakDTIG^D5?b8M;=3mAGu=)2+=Znjd(l9i8roAsK&Wc%|h1gVs*#NxiO`ymXp%Da0Pwq{sDf-j=f|3l$Lj~BvUc4ly< zGBfy9K~t@jDtatqJ&K+LZsur)6i6!YXoi4lc6UBQC#{0i=BK#h&Z5sOypmK)8aiNW z@)*fI8`38)b$)FK{EU)&S0yXi669s6TP8)^6S$HmV7spV8vqB5Btlc#Y0$3IxT~Zk9a%@Ycl} zc)Z_eSjkA5zK#onp-CG&{aEVTqf=BOMGj6y1YD@R$RtDaW<6^dRd$aFSllfGnjxgxX= zFcR3T>MI6S>I`XG^;apZeTp?CAR44*kC~E`LiYH30Y0KM?p@;DZ{Aa&rPo7FPX)FW zQnR%%fN7L!61jJ*VxZg+^cMis<*WWaM{CXQ4L&bmhL}Z(nmyMXu_am6&%)BNb63nI zvpJ_8q3WN^(v>8eE|1Jr=7z7gycc)hV)3b_b8BVj%cQ;*0wV6ocd(m(>IiwqE>cUW{{*x)=?=L>dstw zw+r}F4L?xdZFQ7Cue#LNY*daHtLVOy(sA$AuH8G*431lYB=ws0q#i{))M=A3PJi40 zcBs!Zy}igP{+%xMr-P7urSLYgR79`zlK5;%!Uiy`1AOmM;>JBsxr0Ub(e8&GH=SyL-aR5%_tPGi?OPX=J^RVOR?aO?kdsR0Z>p zrnk12lI6!H$cg*-@uiDd12bF%C8r}#0rWYs2z|NRJW?LnI|6P>`m}aYHR6!?6ILMN zE%#^>{=XnKbUl^eZ4%~5|h zj>9uZUN)-z^xOtv3~E#sth88;lW-P5htpYR&M z6^4{(``SW+_Cbdtf$N0#K%k%SCcxIwGyt9^9)okv`idX0_YDyo^Te_n!81}FmnPcM zplNF-j~3omh2y-a;qZVgIv!)*mBq^BGGby`HEH3p49@}0vW?3;dKb|ZVFYUWMhE4n0>er{Z|T_ieUiL0XJ zbL%`}dRi|}wrwI|JvtH616Is1BSIvsYo{N*%6@{p_lQJLs6b7+`Dt8`FuRPHi(=>0 z8Brh7Vc&}VFe2JwghQLQ-nWw=qmR)M**?cXdk!mgO z)J=UHw5ai*L35LF?}`Y!l=a>leR%1B-lUibCOfW_^-7pgD=^=WD1rDI1T&MOxJ}8; zFBnvHgOD0x_GIK3%m%S)jO~_8O z;wyCti}zy4VwVy`uN)+YzuVKFZD)kjz3Wa^7Cp!)bk#^li@$)a{?qi{zw?utV5LqLY6fEVMh&NoS%l0r9=jf*}^~5I-Tj1bzes6u(@+RYuFtgV6kyc3*!wQ?ATBz8H5CN2zQz z+UFasAeIiQ-*59Ayf%$G!k;I>Kj^;fDPzA=^v!gwDV5fpr8*i(>R6K}t)Xuveg_r% z{056Yk?v94HH@j^QRy1>553e!q>$7AoCq!k!{kRg+PyAmTM@As*Fmef;m-&g(rV@nZC-dzYz4(Q6M3 z`_?rem{+_q?8}uNraU*h{&*bQXS?Q%H|sZrcfa*1Gkc=|OxcDJu90A7!rf|!dDl@B z`?Q>q8kn+5F4!bF&k$PU00d?tzA9j=sy>B3=$%PuIM9o>GyC%P5i@FlUw(=8R})aV z;^uM(``D1Ix11jG*BJ2W3?>{{*E1xbH)0$d)3B$`ZLd#C8@jAa(Oa#TW_aDZk2QR? zYG*fGJA+iwu}RIiH#})-_=H$MTVGJsERv0yvZ08PV6k5&c3GdY+w=!<^;`D)29E9! zjI#MHvaTH^&u`iTxA#;^y&cqq&?Ejdy_A{lIecz+S<c8R}osAoc zQg*UR9*@#Qkfu#v6<()_e9k(eQY{rXLkNQ=X^)GOoy6eX8V&OEgnyraN{jUPhP)o08JTZmU-#I>0be^gzv(@les7&~zL&VW*Zo zvgMbfc9Gs&o27cu{u@tbWQ}61@6@Ucn?VB%D?>PR#3FHjc&>IW7BB{sXwi#Yk;2gd z0xVFrSR_>xPP3Almr)zImj#id=;Gp7V>P8&>t2g(m5yZw5y5%iL>*D|RgZ{HD2BEk z~k12;C@y_*OL|LtH zsI3u2yHs26$fpfqy|I9$G1fqz|I(@@MgtttHQS`p4B@hYCBD{>gBW!<*!?P@x^Rq z?)B|9$5Y*(F)K;-UD>>jDgu@98@md2h>p{zj8T*1K@O#!IoNl$pni9IUDDLSF}co( zY4M~s*lv7G>6K!OZa#8rw98Y6{Yv6ayFWb7DBjy@KwI}dks%CXu~(Y|Sud3r;Uq$J zueMR+oys$d@3`Xc0l()t6qvbT#h*_~$E2PNH8|ST|CZCLi_(XSN!ZDLW;p3mG1;Jc zaQ(f)0 zYcNMMMuSc$en(Pj>($*!H>@GEbu}DfCcrcd+nKB6X-?J5cL;t=!ztVjCJ9?n0bgEg z`$}Z5*}09_=pnPpaF5-*95KDI^aTm)+59KGhfA8-E1jh=(r&qt#|0I5Aa6ljW}eyt z{q!TnXJb~|=Tu=OjH`??R@jUsBktHvXSpPN*Re@L>vOoI4WzO>5YB2iw~}6c_Bwv~ zwE7R3oG(yVe#?zs(&_yjrKH)*=Yoi@V9r(CZrp0%gTp|Xvh1|wCB`>+B34B@v3x<| z3~odBgPHmHxuLMLB?S6$f&P#p1FkUsctQmfuIFd_16{0(?0ejA&w38xijxn?F|r>o zu-gW!Z=!0W9DB&#U1V3&Dy?|Sck))UXEv7+?h(J%`Ruud=z#*-XFawQ@J%pHqb-t7 z?q)EBX@I1jEu^XlPLjP?1f?;>e^XRjoRd$hieO0DeG84J#Xje-O}POZI_F{$tYu;z zM4SpE;uS7Q;4I-xjwlq_PqcoT6dc$%SC6~VaTr;0^zi0t3B2oOcxo~w_h z%9Zle!z*o(j%w&MV?;xI_odgjRWBJuxDPjLLRYdH2ebf_x}IQKGbZR-Vk z(x<@LAaY9m(ie9qP~L2mwR~Tvr2NK|VpC?jSPc5H$~LnTpB`%1X*QeLaQlJmq(r3D=X``aEZOmswGLl`}T~5_OF%ux+dYUYA6yT?05>RRcI3bDQ|A zj+u=#$eP;{;!QXPnW7Z|+r->q4S%j%A2Y!gYGOOBSgrWljJZ{#$|nm4j|fa2Yfeg= zF8GTmCuSq&z#DJil>tHC!>xhsD0u(Gpp-8q<7Bk&)PZ z<(qq*St|+wd{@Au`OeSp8t~80_nnjCjNdz|@4cDIW2$=AAI|Mwis$(!xg;=I9 zt#@`jBatWVh1TN<`{rU+JzbV>?D2s}F*?a6UHVMT2ebk-a72G}2F)B8nohrBu<88$ z-2oebmRl}7(Y-QY9awVmr3t5x_Eo29Yp)BxJ-6Cr!n5)Chzk!MsutdS-G#roxHbqm z(0D8~@TVP)%${Fdbp@Q^GHB6}7aDVh$w3>hE>H)RtNuu>{@!!)L7utP{fIpuB=heH z^!brod&`xKOw?S?%-uBKH_F_#oZ@G=N_%l6*H?IqQWLH&R0qF)Pu*4dFM4Dd zv^;&U%QfdJGd2<9O&u8Q@Yk-1cq3-(dRKdjk?HXg&zCT-J`ULo$g|C*x(;?X_a7)_ zSZfE#Gnceq;H%&iqU;E0?zl6=+$~axT$P~_9b1nj_AN)eK;(H!<=#g1a23-KF_oxc zA4g)e%->>6VveSNIesPVPfj_9Jhy9Xvubi0`kJC{L`(^z+Z&^#2N1U=MzP}NIx1z# zHx255SndPEOhYaaA0L(FadF%EyTjAv`SR>&|AoDaGeQAsJo>~n0h2rbxT9bSQKBgx z-&)ROYxJqyi%{0nT9M`lyZ5Za3vbx6{|f8h=*E2HEA)krpU!EMWYaB#UTKecTQC5e zJzX8wI<+7ot5Ua0Jzo_IJ6yVgfJ3<3QAK)d=2aw6(aY9-tcJ3>; zz1186vuI2hw25Iz|6-xol^+V=r9jx(R(9fPD)`kx3sjdOvZ&*#_#>| z=nj!}xRU*P3BKx^BB4ikIup#yOa}#fRea_iv0 z0kb7rEZ_yzdqzChP^U~35o9C&PVwFKI4}Z7**Ys4Or{&r2^=@p^#Ygcqfn7J4<;$W zGE!xEJ2`$7V(zeWN=Wx&hoBd4CZ)RXAM(E*~+`}u5P zhrl)^-vp)qTEaLg&zodL8yaR}_Ua(w9`IXHSEo=HFiHQGtSgbPXIo39&9@~)fz#f- z9S`xG=D-la?#w zBVjedEqB%z*jC5yOI(bGcm&h%m!8)E*VkMqN!;%yB&hOj2NR&^*#yw{r zGl-F#H(6RsW}6NjHusqR=Fd2v}bpsuk-FJr9i30 z-|`xd+QoBd#^DS6APt2knp)LCn&#i4O?4hk29&8I2q^%CnWigkle4vYV=2vo_C`)g z$Fnd^$z^Oz>Az8`wM~k$)uG(3E77&LQnkfuiSJS37-jU%Wji%E>$OhBXZ4&`_Aixj zFoGil^*uCk{F&Wi4a!auL&qa^HB=b%vO#0no}Mtn%HnZ#N1t~%B`D1-p#AWrbL@`I z;8j#~Q`N!~0wb(}msk$3swsluYAatvHG^t|Q`LCIXm`a9xSC^7B5hknrPA#em3TWRn6NUY z7eS4w%&A`*JAr9Q8Of zt)*pq{Z;hk2%u`eC*4jJ0mhZMN)^Enb5(?uDj?^s@tN5HYFy(C*&JcnJ{SYyWE&BI z;$3?GA`1R#yonlwo2rDW36D$YZB52B_}{wYHaH@)>%1S!z4(Mdked# z`ISY2ubH~}5F~8hcIq!CBUs?t&?UHxz=3$`om)n*7AnSrx{T081RF&ZlqEN8jH1Mn z*6WtRl*)|K@jYZPMgqR%MN%LX$0 z`F5vZJc*kYgKE(f;SsYhnuh5=;;Y~3Oh}Y{t|$hCwGj=QN$!H!yPF9+;M`HJE5>de zlxUN^3|ad$3WfW5lDYyS1I%oxVS0Efs;mbQw%R2bta4T(tMGzgDx%t*F};UmbwA_H zAhjFPw1!b-`=R`(nM_2WdyFh+NEpLSlH~1Fxx*xRrySF{u`d6G`0-~KT9GcR3;r2| zU~v9kI{);n+jf(|Lcr%7a0AH(0_jtqu{djpUGjS^1K*yO7P73}DwLj2!}VFCXO9*n z_DJT>Agf_kKQesu9r;mLF-Dy`iqPm*+d{mOD%Vj9Gq?Q6ZQ0gPnH{>_;W>;VD9?`f zU)qzk5h2yef7$Zk68I~^}bj5L5Bf4Hg>IHGM#B;^# z!=)9~Qum1(s(xRt_D>c`i~aq}hOa2V(z3S8)8@zN9S#=^p49C7-1Crsc=^pe6rqN}8w#!H7>D1KgH%ok&v!vmxhC#ICFGoFP*qFm05xd!*g&-V_%!S{!{>T3kIA}qpex^w}wbhcd-%VdBkkiICe|d8$S+wV&OTi#5jb^?) zBmr%(GK~l`3L}zT_7Vee^mw2p+ie(X#1~C%87*nL;U>EbX1Ypth_WR-S#hd=qMXjX zywiapmzP>3PDTsa9xjaMC&~{|2KiF_arr*I?c7-MmsI0_Ty^3@rzWa%7S$(=mcUP? zG-Pw3yLzU1R{TwzU$u#_G1>Du#tl0*tJ9yfi1AQ4URQU-`n%4(p=-6QZ}izN^NV%Y zR4^oEMs!UMbpmNwmI+Sov&3z>HZ0%VyuNctCz-1X*QSzg1Ql;$5*Upf>{KaAaYm`K zL3j(KcKT&*s7SJJsvl_hc_}U@*^ZGM=@@-xwZ^1XGzV=dIF}6C#Nh+JNQ#Eb>>5o& zE`@9P4%(fP1!$jqMbqXXKrT2sTKqReGD zgXW9*0{%IPx2mN^8b(NS!;wC@O97cB=!2C&Iwawkk#1s6(irT0-DPY>LJbnbaDrZr ztBiyiB+d-VKJ^$$VHwoe+L&_YNl6#|vfdO5%A}GdtRA{Mtsv!}2tuq#T5fGpc1ILR zK46jxTt!-K_UEQ*lCAv9zj&&o!Xk+&3$dOvXQPP0YN;B@R5novxiN~v}! zS-Jeu9#}KToGFAjHP~X4xxtuZux~yBm+jQabGbGHgO8AN9PzK1Zs#cC(Kha*dIU8Q{Cbe?t76EkopoiCYkVuk}<ka*O}mOKMbD?6`=(49zAp;;j~sb4zHF{})l zKS_^L?B*X8>oVsnAP*E7G;6y3Tla}z6Iwn5E+-C194A0{DnNnZBK-JbSm!4?s~I%y zvhkRk8}VifA#j&qr~Ys;)w)q&;8HgCeRC^sk>My1GyGmdEwUm5x54P=<*eaF26nes zfo2=2Vz>f~cFJE#9;$L7hfxI)PFn`A04fo-ciQf?Dh8iN@*Vrt4Ble*Xn@6%6yyfV z%r`8=V24)>l3pW(q*sIZa$yEG>h%jV=>En@qvxWCeu63FIDh%`{&SRcn+H{t2|M<| zkeBhD{xv8QRyfr%(eDTgp<(&nTtuNAgH5OEBFY0Lh3rO@r(AKqUoA6b8$_rS;{43= zZ@r$~D73Qu)ZVh2quAyaW;dcpZ8XCZ%{7h(^_1qSW;ZXBY@;8WXA2ZN_yneLk-{Gl z;ip@%7Dv2pSgz%-wMpsPuiTg(v4zA zl*aR(PHB7_1(cHsbGm`SWs+nl;0R=tjSEurSHKZ9lS!IpB7De?GPo`%##5XfjzaSf z-@IJpeCO`|cXG(wyZ)}K{abs7qo{}5;$W7>B?+#6-?}3kUdAFZf}^_YKmxFT8Rr>B z&EzPCNv?j4cb|*g+#%~RJ8rladeF~?n6Y+~Y_~GQ9%bsPc-!wzla-Z``vhZy#ddZ* zNNl@zZcSz#`78Bp1lad#0_A3JzRmV?_BdXj+D(cPpnZ1si3fQscX!N;X~{`$VO-Cr z`OI_|xXdb<=D0e0tr~)D3iZ{1T&UhqZ6sEZv{q~f=oE+^?0XYrS;5>~pX5G$Sld~Vg+;(s7X_jN-a1Kk)h>qhW;HH;V)R)Ub>Z{HW z>a%7mRWQB6XvH#j#raDE#z zYk_1rcjyzrOCmhKe~|>y(EWDjH6<9{)Bh$_9k6^(7+j4W7-s;`)$W2_+LUCW3iVSo z-wE#ws!fKKHF{zF@L2-VpMX|(!@ju^iljzA{D?`AX~0??@itQD>)raz_r%t=+Wef` z9;V;!waP@A$U%d}q9y)EBjPwl|YH?FMZWtbnF%%C773RPS=Xg<7+t zH<`KGsWR%6=V&7%o*TN1!MIrvkG(WtQHeuN97-|{4HR5 zz+~l%TI-g#Bn_rVS4LDy>L=j#_Ae{-Fjpx^2FfbkJkly|i|c>x#Bkg1o$VA_Y2{-- z`Sofye`!l8S#rQqlulVUTD!JSGM&kiHw~W{ zeEFi)y71>&`E2OI134{0_EQ{|wt0cPF3SXDch=~IsL2@^c?(jLRTqZmyx26J%G}h$ zo9#MnBynWP4A3AOMexVKbu56zhzyp-yZ|NIH=nT+nqBNN%x~SsFMY6<|B?;lrZEat zf6C?~-idr@5OOP^nqrvwYRbYgHnOhX2JUIQoDZ$E@hi_ySl1|)ff%So6#WxYk!w?|4zn>^-k1yY?2XPh{*Te-uBOpcf5KBaU<7z6c$ zkrh5DjOplMyNDP%D05-U4?Z*U{v@H&zV9Cdm`(f44^7VoWT1R=C6uux5Rd-bttw7U zv^Am_$V^YHs-j$CI;M|#^v+?gKxS=^i47dP0ZY25#alaLLT&@V+Y4w#=2pHAG6KwB z3&ox^Uh#2)a+Et=L^cnEuO^lByeT6s>zarHv>#R)d58b>NI1;)a=}F%&t1&AJg3Oq z&L~NjGL%7$6v`Gw0tbiW*ix~q`)RHKHLUq$?NzA_-GSc?hPk_p%ghDPk1J;EED7Oo zlVt0(V(!=vCS(^a`j&>)o5pz1eurt^@OUdd$<^SC0I6_E(iFkROC7{p@kQ+ zDtG$Bwq!zPi%s7l$LWl6l9-1l_#n$zW%k0VRN9GIk`>|v<8D^k$k1x@?zmGsfWWE_-P)SS;qYkzCfSY zcO_C1IC*10!KmQD95%~mV6Iioy>HI803-g!(5ncK_AzjA;0Txj1?QX&my1Au{y z*QA%)MujNBn%wMEK@nkcUpkN_I4rJY)s@MWy&Q}nt5p_Zb_Sw<-6WN=kqO@A$qVC^ zyN;o>>LS*lP(3WU;T%j)_y(BoXBJ0h?VyH4YN?vK zF%_+CuwMuAx5#VB<=bN0>mubPLcDeh_X%Py1NM^*y?iLdeC2}Q9Tv2@Q-aF-HT zu{gimLX?i|@?~oESQD(toiA}kK=lQa8>;A_2CNCzF^%T1*@Wo|f+ z2Y1IY!3Vc1VJ=Go4|J7-FZ)5!ifReIc1U^qVqU)g_9;*+Kf*jKY2j4hmBIxE zxtnoO+n7FII-@jg5jJx?y_kG{ZkkSFvY~!yl%#=u_o(>UQYS)*`^iR!5<7jo!-b^H z(n5Y+IugZdK4lwCFgn@tX8#UztUixh8ppCiGWrs2v>=C~bxGWP8C7WPyn$-t6)u zQ5_raMmtThYso5h8_!)xCR({JG{26mDQ(F}-UJ?4i7tysw$bUyc7|+St}?78YPG-DqOv*DWCh>qUSZ`sdKYR7+pm@=8%}!C0<;fR04^pV=|NVu)za{^1U!#&N z+@IQ=nbuT)0;ys?R5?^tjdJG1h(dpyxvzvfXWyb9&0CryMVZc`46K=Nk?E=>6U{qG zimKxId1Z3?2x$u@iRN2OgyF0J1VTJHnRQh%qNDOM-9?%8KZgvAk9^v`J)Z9%bGDea zjaBi;I5wXjD8yVD{5&$S-t+m9fy1}NQ!VqV?8`zD+(M2oP^q85kE~C$)H9t@&KlEF zsaLYkxW?EwX`s!XzR)3CCIVhZ1?59j?h5N>!O|4dS_wCAS&Df{7tt;UudoDd;%&({N6cia8?oWrXMb;U?i%Mj<+(~BWDJdHuWhHGf^#fp2*N&oz4tIRTs!d%1FB33%Hg0uMW&GGIDI}5givC zaNC~+uL82e>P8+TUk^4K)BOG8JL*Zbxw~@rQiMVrC+Vhb!i6}_*&YXzIO3QFZ(77@ zqe;n?Y>IJOxXFQ8;%M9tub0ymIf)_YyCmiAyK_Ez_^r7ShB)|6mOOUOcc)9Y6qZ!% z@1L2kyuN)v>b^};IK`642Ssxz@%;F)D|<%fD${)(oK3Oxp5i-@U*&8@j)?8y1NRCB zV42q;{4&wu==m!A>tgcc@?=rRIBBPh_YPmbedjc0Si}p5{#=|*h7u?Dhl=geyVn(; z&F(K?8H82$5CUuOT!ELdTlNEQZET&&7DM0^Sur-%>?vDxmR>4_&U_m9sd36Cl-_0O zEE!g&@b{C6qfJReyTx+E%8cRIUF?^fUp>=eD*-5XL^G}W*(CL;FG=Cam|ArN;n+HDojRGmXLvyRp| zr9W;++UXmT^ZT3668`mp9Tig8>xwCfY)V~w_ zk55@fl)^V#pK$?Vx#e-SkrXd*PHJ)s)86+KseOCKt`m^odX`&W*Gr zb&TmeWj9ZQ=a#MhrMEYglC@`9q0cAw=MN2qx3`iOR?ZAr*^Z!CvX1q=;G0JrBVA%P z0&BVQWOlwX^Wd!Ym`qE!Qzm!~_(@<(9evZ4xsjfg-ky;7&DQeLiXX`@$X3^ylCMji zw=ei|=(W4A7UhtsO;M+la{lS^V-wChroe03rj56WHgy;lG>Bz=r=fyW63YsI1PFD+ zj_G5IBaOFM<;h#D^Y6nl1h!2CPF@)wip%N-u~dhL3TfcdOtx%IURz;Nt(1jpTR28p zIt_Qo>nkhcQj$v!`>RTluSw3`<>0@m96~)3!`2whGXN3q8ZiawCU$b$6R=|D-Wi{t zpX$TEm-XEf+j4DaZhr2~?dTWw>$6mhd6VCrt0bpXc5_sl5aB_=^1Nq@ACKAQ#8z@D zU!rTJdb#R{xY15uuFF7`McY+yfGM-uw*QqpD0^Xkc7816vBb`MDVEv5sY3Q>cKZLxIvaQ!A#y20O8a-P1wDY-@%(j z`3pmcje+Fj)yydB6IDte6i(83r0<(@3dzluGy-LSue?eZM&-v$qnhY;nbzQJC?Zi0gZ}< zQObcCJ$u+YTGm2R(%EjE{sTr-E_Ik(PUZKDQ~Eq>*rm_Zdnvi4&-9jjCSAX!lUbI-t2Ppy zyF*_es!H}54e<+x=lt0hR_jjQ8Jd{+UI1X{-4h2M&!x@qRer-b=Lk{9;hpIbg7jW5$k?QlC z?>Te7KIfLj5jm+RkHp%7Oy1HEGM;zKSaY}-LS%V!Lc@pWq7!*Q!lD6o1ECTLXqSSz zf|4O^gW#DO%4$tM_V=!sBBL5*}4j7UsJ`5 z#B&fYSu4QfThs&#wl$OpUYlPw&83+mp^`jVL?92TV0t(vC}@|&++eP(=YVy2go zVY!gX^#xkT#SV`T9{RR&Q?BsD-7AUS0Kj5TSVNDrngR}ML zygB9TrZ%}iPPy;b7;Uf-uxk~|HxXK7!n(uikYSmA)1e`R+F17Z#Soa%Vr;ZeSfR4m z9&5_F^d7J_No9*_w^^f_7@+S*NGDG;SMOb5ICg(kSL0oXEp1pfKIM(}Pb4SZ2#fbx z$bjy`NO^v`|1eu#KD}N_KVB^NW_ddE&(=E=<;ujJZ83JukdL ze@~-jJ^f}^Ru0qawQR_`PvLwCkwU^xl%k2>d|4*b=SHpvowDqHD4!QBgq5xUKqzA} zqr~Zuz$iGg5&}vrdhIaY?2~^6?8fG%P7&1lZJqk6$Epal?Jl;0p0boRXbU3kf{DZqWZanHHE zg^fh~Jx)B?Ag3#6u&aEPLga6HVXp0dsJ3>un~DtF)AoUVxt#pm9!cy6PUi=W!CwVC zs4M1;w7kUrC@UQC*-Q>_;IuJc+$~%ISc=2w7skZA%OzM2HBJFFob5JC@*1NJtbfjm4 zfaKE-E<2~Fq-t`wOT!5E%r^CQGj3mMwol*JalTlFICQGT8dvFOEVk9-4AFR+t~ApFfq_$vn>MY~0Co^3eVA(9y*e{A?fr)p z^(E~dG=*euh3q5EdYcCzL7;Zbp;m-b!a%$QW;k2HpgIEd zYY&bXi-$?nYrU;B7}F@?3AN-kd?QBUVKbxbyKDnwGZ@m;YJH1(dRSuIT;du@`gpi5 z<=DZq(#$fp)Y^CUgW&K}pY#3!6X zlXVHcd5lD!0>YOb*>@tEENv}Mfj@&6!QO!{zW{P+nR^wVK3iZDRhnvWYhFp>0HVu;{xy zq>OUnks4lmIuI1wmPB(OzUw`>-?u}Ex-=ONG!=3?3R=JNN$b_H_;;gY&ao04Z>MpW zV$lZsLMx(M3W@F%*Nun65PB?}nl${@$sDVZ5LC;YLSS&#Zo$NABsgvM>y#|F&;;d; z%o1rW*bL2FYqH8^MMzDUKhlBK$lDbQS@(Q;O061s8?&EUpz>r+tC18a9rBw#ci%lt zlxyJBA6g<~cHMjTpUw59Dxm)ViM| zM4Gl03E^POs-+{yNmoZgJkDt3-W6DR#?3QO$}1du72fd%RTk3J)U5|DJ#KoZg-Ff0 z6n&G{Nv)x#Oz@JfsED-YWYGjbeMf5)i4yHnh;5-?;S0$sEk^q|V6!4Cs|O-RU%